summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2023-10-31 14:56:37 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2023-10-31 14:56:37 +0000
commite9933d0eb2edf34309e07f08be1db66afae45936 (patch)
tree3a6c4cc9271c6f7f7c24feff0d1aea286eed0a06
parentInitial commit. (diff)
downloadreadline-upstream.tar.xz
readline-upstream.zip
Adding upstream version 8.2.upstream/8.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--CHANGELOG1450
-rw-r--r--CHANGES1941
-rw-r--r--COPYING674
-rw-r--r--INSTALL310
-rw-r--r--MANIFEST171
-rw-r--r--Makefile.in610
-rw-r--r--NEWS485
-rw-r--r--README196
-rw-r--r--USAGE37
-rw-r--r--aclocal.m42267
-rw-r--r--ansi_stdlib.h54
-rw-r--r--bind.c3082
-rw-r--r--callback.c378
-rw-r--r--chardefs.h165
-rw-r--r--colors.c320
-rw-r--r--colors.h126
-rw-r--r--compat.c106
-rw-r--r--complete.c2992
-rw-r--r--config.h.in311
-rwxr-xr-xconfigure9219
-rw-r--r--configure.ac345
-rw-r--r--display.c3583
-rw-r--r--doc/Makefile.in272
-rw-r--r--doc/fdl.texi506
-rw-r--r--doc/history.0505
-rw-r--r--doc/history.3687
-rw-r--r--doc/history.dvibin0 -> 72280 bytes
-rw-r--r--doc/history.html1751
-rw-r--r--doc/history.info1426
-rw-r--r--doc/history.pdfbin0 -> 204504 bytes
-rw-r--r--doc/history.ps6666
-rw-r--r--doc/history.texi85
-rw-r--r--doc/history_3.ps896
-rw-r--r--doc/hstech.texi602
-rw-r--r--doc/hsuser.texi533
-rw-r--r--doc/readline.01175
-rw-r--r--doc/readline.31597
-rw-r--r--doc/readline.dvibin0 -> 333112 bytes
-rw-r--r--doc/readline.html6286
-rw-r--r--doc/readline.info5320
-rw-r--r--doc/readline.pdfbin0 -> 406480 bytes
-rw-r--r--doc/readline.ps12656
-rw-r--r--doc/readline_3.ps1782
-rw-r--r--doc/rlman.texi84
-rw-r--r--doc/rltech.texi2815
-rw-r--r--doc/rluser.texi2488
-rw-r--r--doc/rluserman.dvibin0 -> 118796 bytes
-rw-r--r--doc/rluserman.html2529
-rw-r--r--doc/rluserman.info2087
-rw-r--r--doc/rluserman.pdfbin0 -> 237019 bytes
-rw-r--r--doc/rluserman.ps7574
-rw-r--r--doc/rluserman.texi70
-rw-r--r--doc/texi2dvi1996
-rw-r--r--doc/texi2html5428
-rw-r--r--doc/texinfo.tex11045
-rw-r--r--doc/version.texi11
-rw-r--r--emacs_keymap.c872
-rw-r--r--examples/Inputrc81
-rw-r--r--examples/Makefile.in193
-rw-r--r--examples/autoconf/BASH_CHECK_LIB_TERMCAP41
-rw-r--r--examples/autoconf/RL_LIB_READLINE_VERSION119
-rw-r--r--examples/autoconf/wi_LIB_READLINE76
-rw-r--r--examples/excallback.c200
-rw-r--r--examples/fileman.c506
-rw-r--r--examples/hist_erasedups.c121
-rw-r--r--examples/hist_purgecmd.c151
-rw-r--r--examples/histexamp.c128
-rw-r--r--examples/manexamp.c111
-rw-r--r--examples/readlinebuf.h139
-rw-r--r--examples/rl-callbacktest.c115
-rw-r--r--examples/rl-fgets.c374
-rw-r--r--examples/rl-test-timeout6
-rw-r--r--examples/rl-timeout.c245
-rw-r--r--examples/rl.c166
-rw-r--r--examples/rlbasic.c37
-rw-r--r--examples/rlcat.c187
-rw-r--r--examples/rlevent.c181
-rw-r--r--examples/rlfe/ChangeLog37
-rw-r--r--examples/rlfe/Makefile.in184
-rw-r--r--examples/rlfe/README78
-rw-r--r--examples/rlfe/config.h.in383
-rwxr-xr-xexamples/rlfe/configure5637
-rw-r--r--examples/rlfe/configure.in442
-rw-r--r--examples/rlfe/extern.h40
-rw-r--r--examples/rlfe/os.h531
-rw-r--r--examples/rlfe/pty.c388
-rw-r--r--examples/rlfe/rlfe.c792
-rw-r--r--examples/rlfe/screen.h2
-rw-r--r--examples/rlkeymaps.c61
-rw-r--r--examples/rlptytest.c354
-rw-r--r--examples/rltest.c101
-rw-r--r--examples/rlversion.c49
-rw-r--r--examples/rlwrap-0.30.tar.gzbin0 -> 184033 bytes
-rw-r--r--funmap.c273
-rw-r--r--histexpand.c1718
-rw-r--r--histfile.c833
-rw-r--r--histlib.h92
-rw-r--r--history.c614
-rw-r--r--history.h291
-rw-r--r--history.pc.in11
-rw-r--r--histsearch.c287
-rw-r--r--input.c1000
-rw-r--r--isearch.c893
-rw-r--r--keymaps.c174
-rw-r--r--keymaps.h100
-rw-r--r--kill.c900
-rw-r--r--m4/codeset.m424
-rw-r--r--macro.c334
-rw-r--r--mbutil.c524
-rw-r--r--misc.c781
-rw-r--r--nls.c344
-rw-r--r--parens.c184
-rw-r--r--parse-colors.c440
-rw-r--r--parse-colors.h46
-rw-r--r--patchlevel3
-rw-r--r--posixdir.h71
-rw-r--r--posixjmp.h46
-rw-r--r--posixselect.h47
-rw-r--r--posixstat.h162
-rw-r--r--posixtime.h84
-rw-r--r--readline.c1575
-rw-r--r--readline.h986
-rw-r--r--readline.pc.in12
-rw-r--r--rlconf.h79
-rw-r--r--rldefs.h166
-rw-r--r--rlmbutil.h225
-rw-r--r--rlprivate.h633
-rw-r--r--rlshell.h33
-rw-r--r--rlstdc.h57
-rw-r--r--rltty.c995
-rw-r--r--rltty.h80
-rw-r--r--rltypedefs.h100
-rw-r--r--rlwinsize.h58
-rw-r--r--savestring.c40
-rw-r--r--search.c707
-rw-r--r--shell.c214
-rw-r--r--shlib/Makefile.in501
-rw-r--r--signals.c754
-rw-r--r--support/config.guess1754
-rw-r--r--support/config.rpath684
-rw-r--r--support/config.sub1890
-rw-r--r--support/install.sh247
-rw-r--r--support/mkdirs47
-rw-r--r--support/mkdist140
-rw-r--r--support/mkinstalldirs111
-rw-r--r--support/shlib-install174
-rw-r--r--support/shobj-conf553
-rw-r--r--support/wcwidth.c313
-rw-r--r--tcap.h60
-rw-r--r--terminal.c939
-rw-r--r--text.c1888
-rw-r--r--tilde.c493
-rw-r--r--tilde.h68
-rw-r--r--undo.c365
-rw-r--r--util.c577
-rw-r--r--vi_keymap.c875
-rw-r--r--vi_mode.c2415
-rw-r--r--xfree.c49
-rw-r--r--xmalloc.c75
-rw-r--r--xmalloc.h45
160 files changed, 152075 insertions, 0 deletions
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..b2fcb53
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,1450 @@
+[Readline-specific changelog. Descriptions of changes to the source are
+ found in the bash changelog.]
+
+ 6/9
+ ---
+Makefile.in
+ - quote value of ${INSTALL_DATA} when passing it to makes in
+ subdirectories
+
+ 7/1
+ ---
+Makefile.in
+ - don't pass INSTALL_DATA to a make in the `doc' subdirectory; let
+ autoconf set the value itself in the Makefile
+ - removed a stray `-' before $(RANLIB) in the `install' recipe
+
+doc/Makefile.in
+ - add a VPATH assignment so the documentation is not remade if it's
+ already up-to-date in the distribution
+
+configure.in
+ - call AC_SUBST(LOCAL_LDFLAGS), since Makefile.in contains
+ @LOCAL_LDFLAGS@
+
+ 7/9
+ ---
+
+config.h.in
+ - add define lines for STRUCT_WINSIZE_IN_SYS_IOCTL and
+ STRUCT_WINSIZE_IN_TERMIOS
+
+configure.in
+ - call BASH_STRUCT_WINSIZE to look for the definition of
+ `struct winsize'
+
+ 7/17
+ ----
+configure.in
+ - call AC_MINIX
+
+config.h.in
+ - add define line for AC_MINIX
+
+ 7/18
+ ----
+Makefile.in
+ - add `install-shared' and `uninstall-shared' targets
+
+ 8/4
+ ---
+Makefile.in
+ - install and uninstall libhistory.a in the `install' and
+ `uninstall' targets
+
+ 9/4
+ ---
+configure.in
+ - bumped LIBVERSION up to 2.1.1, indicating that this is patch
+ level 1 to release 2.1
+
+
+ 9/16
+ ----
+Makefile.in
+ - `make distclean' now descends into the `examples' subdir
+
+doc/Makefile.in
+ - the `distclean' and `maintainer-clean' targets should remove
+ Makefile
+
+examples/Makefile.in
+ - added the various clean targets
+
+ 4/2
+ ---
+configure.in
+ - bumped LIBVERSION up to 2.2
+
+ 4/18
+ ----
+[readline-2.2 released]
+
+ 4/20
+ ----
+Makefile.in
+ - make `libhistory.a' a dependency of `install'
+ - fixed a typo in the recipe for `install' that copied libreadline.a
+ to libhistory.old right after installing it
+
+ 4/27
+ ----
+doc/Makefile.in
+ - install {readline,history}.info out of the source directory if
+ they are not found in the current (build) directory -- only an
+ issue if the libraries are built in a different directory than
+ the source directory
+
+ 5/1
+ ---
+support/shobj-conf
+ - script from the bash distribution to do shared object and library
+ configuration
+
+shlib/Makefile.in
+ - new directory and makefile to handle building shared versions of
+ libreadline and libhistory, controlled by support/shobj-conf
+
+ 5/7
+ ---
+doc/Makefile.in
+ - set SHELL to /bin/sh, rather than relying on make to be correct
+
+ 5/14
+ ----
+savestring.c
+ - new file, moved from shell.c, for backwards compatibility
+
+Makefile.in, shlib/Makefile.in
+ - make sure savestring.c is compiled and added to libreadline and
+ libhistory
+
+[THERE ARE NO MORE #ifdef SHELL LINES IN THE C SOURCE FILES.]
+
+ 5/15
+ ----
+README
+ - updated description of shared library creation for the new scheme
+
+[THERE ARE NO MORE #ifdef SHELL LINES IN ANY OF THE SOURCE FILES.]
+
+Makefile.in
+ - bumped SHLIB_MAJOR up to 4 since we've augmented the library
+ API
+ - rlconf.h is now one of the installed headers, so applications can
+ find out whether things like vi-mode are available in the installed
+ libreadline
+
+ 5/20
+ ----
+configure.in
+ - changed RL_LIBRARY_VERSION to 4.0 to match the version of the
+ installed shared libraries
+
+ 6/5
+ ---
+rlstdc.h
+ - new file
+
+Makefile.in
+ - rlstdc.h is now one of the installed headers
+
+ 8/3
+ ---
+shlib/Makefile.in
+ - made the suffix rule that creates xx.so from xx.c write the
+ compiler output to `a.o', which is then mv'd to xx.so, because
+ some compilers (Sun WSpro 4.2, for example) don't allow any
+ suffixes other than `.o' for `cc -c' (not even `a.out')
+
+ 9/15
+ ----
+
+Makefile.in
+ - AR and ARFLAGS are now substituted by configure, used in recipes
+ that build the libraries
+
+configure.in
+ - use AC_CHECK_PROG to check for ar
+ - set ARFLAGS if it has not already been set in the environment
+
+ 10/5
+ ----
+Makefile.in
+ - removed savestring.o from object file list
+
+ 10/28
+ -----
+shlib/Makefile.in
+ - don't use a fixed filename in the .c.so suffix rule to avoid
+ problems with parallel makes
+
+ 12/21
+ -----
+support/shlib-install
+ - new script to install shared readline and history libraries
+
+shlib/Makefile.in
+ - changed to call shlib-install for install and uninstall targets
+
+[readline-4.0-beta1 frozen]
+
+ 12/22
+ -----
+configure.in
+ - call AC_SUBST for SHOBJ_XLDFLAGS and SHLIB_LIBS
+
+shlib/Makefile.in
+ - SHOBJ_XLDFLAGS and SHLIB_LIBS are now substituted by configure
+ - add $(SHLIB_LIBS) at end of command line that builds the shared
+ libraries (currently needed only by AIX 4.2)
+
+ 12/31
+ -----
+MANIFEST, MANIFEST.doc
+ - the TOC html files are no longer generated and no longer part of
+ the distribution
+
+ 2/18/1999
+ ---------
+configure.in
+ - set MAKE_SHELL to /bin/sh and substitute into the Makefiles
+
+Makefile.in,{doc,examples,shlib}/Makefile.in
+ - set SHELL from @MAKE_SHELL@
+
+[readline-4.0 released]
+
+ 3/11
+ ----
+doc/Makefile.in
+ - removed references to HTMLTOC, since separate HTML table-of-contents
+ files are no longer created
+
+examples/Makefile.in
+ - remove `*.exe' in clean target for MS-DOS
+
+Makefile.in
+ - make `readline' target depend on ./libreadline.a
+ - configure now substitutes TERMCAP_LIB into Makefile.in
+ - use ${TERMCAP_LIB} instead of -ltermcap in recipe for `readline'
+ - clean target now removes readline and readline.exe in case they
+ get built
+
+configure.in
+ - use `pwd.exe' to set BUILD_DIR on MS-DOS DJGPP
+
+ 3/15
+ ----
+support/shlib-install
+ - Irix 5.x and Irix 6.x should install shared libraries like Solaris 2
+ - changes for installing on hp-ux 1[01].x
+
+ 3/23
+ ----
+configure.in
+ - make sure that the $CC argument to shobj-conf is quoted
+
+ 4/8
+ ---
+
+xmalloc.h, rlprivate.h, rlshell.h
+ - new files
+
+Makefile.in,shlib/Makefile.in
+ - add dependencies on xmalloc.h, rlshell.h
+ - add xmalloc.h, rlprivate.h, rlshell.h to list of header files
+
+MANIFEST
+ - add xmalloc.h, rlprivate.h, rlshell.h
+
+ 4/9
+ ---
+Makefile.in,shlib/Makefile.in
+ - add dependencies on rlprivate.h
+
+ 4/13
+ ----
+doc/Makefile.in
+ - add variable, PSDVI, which is the desired resolution of the
+ generated postscript files. Set to 300 because I don't have
+ any 600-dpi printers
+ - set LANGUAGE= before calling makeinfo, so messages are in English
+ - add rluserman.{info,dvi,ps,html} to appropriate variables
+ - add rules to create rluserman.{info,dvi,ps,html}
+ - install and uninstall rluserman.info, but don't update the directory
+ file in $(infodir) yet
+
+MANIFEST
+ - add doc/rluserman.{texinfo,info,dvi,ps,html}
+
+ 4/30
+ ----
+configure.in
+ - updated library version to 4.1
+
+ 5/3
+ ---
+configure.in
+ - SHLIB_MAJOR and SHLIB_MINOR shared library version numbers are
+ constructed from $LIBRARY_VERSION and substituted into Makefiles
+
+ 5/5
+ ---
+support/shlib-install
+ - OSF/1 installs shared libraries like Solaris
+
+Makefile.in
+ - broke the header file install and uninstall into two new targets:
+ install-headers and uninstall-headers
+ - install and uninstall depend on install-headers and uninstall-headers
+ respectively
+ - changed install-shared and uninstall-shared targets to depend on
+ install-headers and uninstall-headers, respectively, so users may
+ choose to install only the shared libraries. I'm not sure about
+ the uninstall one yet -- maybe it should check whether or not
+ the static libraries are installed and not remove the header files
+ if they are
+
+ 9/3
+ ---
+configure.in, config.h.in
+ - added test for memmove (for later use)
+ - changed version to 4.1-beta1
+
+ 9/13
+ ----
+examples/rlfe.c
+ - Per Bothner's `rlfe' readline front-end program
+
+examples/Makefile.in
+ - added rules to build rlfe
+
+ 9/21
+ ----
+support/shlib-install
+ - changes to handle FreeBSD-3.x elf or a.out shared libraries, which
+ have different semantics and need different naming conventions
+
+ 1/24/2000
+ ---------
+doc/Makefile.in
+ - remove *.bt and *.bts on `make clean'
+
+ 2/4
+ ---
+
+
+configure.in
+ - changed LIBVERSION to 4.1-beta5
+
+ 3/17/2000
+ ---------
+[readline-4.1 released]
+
+ 3/23
+ ----
+Makefile.in
+ - remove the `-t' argument to ranlib in the install recipe; some
+ ranlibs don't have it and attempt to create a file named `-t'
+
+ 3/27
+ ----
+support/shlib-install
+ - install shared libraries unwritable by anyone on HP-UX
+ - changed symlinks to relative pathnames on all platforms
+
+shlib/Makefile.in
+ - added missing `includedir' assignment, substituted by configure
+
+Makefile.in
+ - added missing @SET_MAKE@ so configure can set $MAKE appropriately
+
+configure.in
+ - add call to AC_PROG_MAKE_SET
+
+ 8/30
+ ----
+shlib/Makefile.in
+ - change the soname bound into the shared libraries, so it includes
+ only the major version number. If it includes the minor version,
+ programs depending on it must be rebuilt (which may or may not be
+ a bad thing)
+
+ 9/6
+ ---
+examples/rlfe.c
+ - add -l option to log input and output (-a option appends to logfile)
+ - add -n option to set readline application name
+ - add -v, -h options for version and help information
+ - change a few things because getopt() is now used to parse arguments
+
+ 9/12
+ ----
+support/shlib-install
+ - fix up the libname on HPUX 11
+
+ 10/18
+ -----
+configure.in
+ - changed library version to 4.2-alpha
+
+ 10/30
+ -----
+configure.in
+ - add -fsigned-char to LOCAL_CFLAGS for Linux running on the IBM
+ S/390
+
+Makefile.in
+ - added new file, rltypedefs.h, installed by default with `make install'
+
+ 11/2
+ ----
+compat.c
+ - new file, with backwards-compatibility function definitions
+
+Makefile.in,shlib/Makefile.in
+ - make sure that compat.o/compat.so are built and linked apppropriately
+
+support/shobj-conf
+ - picked up bash version, which means that shared libs built on
+ linux and BSD/OS 4.x will have an soname that does not include
+ the minor version number
+
+ 11/13
+ -----
+examples/rlfe.c
+ - rlfe can perform filename completion for relative pathnames in the
+ inferior process's context if the OS supports /proc/PID/cwd (linux
+ does it OK, Solaris is slightly warped, none of the BSDs have it)
+
+ 11/17/2000
+ ----------
+[readline-4.2-alpha released]
+
+ 11/27
+ -----
+Makefile.in,shlib/Makefile.in
+ - added dependencies for rltypedefs.h
+
+shlib/Makefile.in
+ - changed dependencies on histlib.h to $(topdir)/histlib.h
+
+ 1/22
+ ----
+configure.in
+ - changed release version to 4.2-beta
+
+ 2/2
+ ---
+examples/Makefile.in
+ - build histexamp as part of the examples
+
+ 2/5
+ ---
+doc/Makefile.in
+ - don't remove the dvi, postscript, html, info, and text `objects'
+ on a `make distclean', only on a `make maintainer-clean'
+
+ 3/6
+ ---
+doc/history.{0,3}, doc/history_3.ps
+ - new manual page for history library
+
+doc/Makefile.in
+ - rules to install and uninstall history.3 in ${man3dir}
+ - rules to build history.0 and history_3.ps
+
+ 4/2
+ ---
+configure.in
+ - changed LIBVERSION to `4.2'
+
+ 4/5
+ ---
+[readline-4.2 frozen]
+
+ 4/9
+ ---
+[readline-4.2 released]
+
+ 5/2
+ ---
+Makefile.in,{doc,examples,shlib}/Makefile.in
+ - added support for DESTDIR installation root prefix, to support
+ building packages
+
+doc/Makefile.in
+ - add an info `dir' file entry for rluserman.info on `make install'
+ - change man1ext to `.1' and man3ext to `.3'
+ - install man pages with a $(man3ext) extension in the target directory
+ - add support for installing html documentation if `htmldir' has a
+ value
+
+Makefile.in
+ - on `make install', install from the `shlib' directory, too
+ - on `make uninstall', uninstall in the `doc' and `shlib'
+ subdirectories, too
+
+support/shlib-install
+ - add `freebsdelf*', `freebsdaout*', Hurd, `sysv4*', `sysv5*', `dgux*'
+ targets for symlink creation
+
+ 5/7
+ ---
+configure.in, config.h.in
+ - check for <limits.h>, define HAVE_LIMITS_H if found
+
+ 5/8
+ ---
+aclocal.m4
+ - pick up change to BASH_CHECK_LIB_TERMCAP that adds check for
+ libtinfo (termcap-specific portion of ncurses-5.2)
+
+ 5/9
+ ---
+configure.in
+ - call AC_C_CONST to find out whether or not the compiler supports
+ `const'
+
+config.h.in
+ - placeholder for `const' define, if any
+
+ 5/10
+ ----
+configure.in
+ - fix AC_CHECK_PROG(ar, ...) test to specify right value for the
+ case where ar is not found; should produce a better error message
+
+ 5/14
+ ----
+configure.in,config.h.in
+ - check for vsnprintf, define HAVE_VSNPRINTF if found
+
+ 5/21
+ ----
+configure.in, config.h.in
+ - add checks for size_t, ssize_t
+
+ 5/30
+ ----
+configure.in
+ - update autoconf to version 2.50, use in AC_PREREQ
+ - changed AC_INIT to new flavor
+ - added AC_CONFIG_SRCDIR
+ - AC_CONFIG_HEADER -> AC_CONFIG_HEADERS
+ - call AC_C_PROTOTYPES
+ - AC_RETSIGTYPE -> AC_TYPE_SIGNAL
+
+ 8/22
+ ----
+configure.in
+ - updated the version number to 4.2a
+
+Makefile.in,shlib/Makefile.in
+ - make sure tilde.o is built -DREADLINE_LIBRARY when being built as
+ part of the standalone library, so it picks up the right include
+ files
+
+ 8/23
+ ----
+support/shlib-install
+ - support for Darwin/MacOS X shared library installation
+
+ 9/24
+ ----
+examples/readlinebuf.h
+ - a new file, a C++ streambuf interface that uses readline for I/O.
+ Donated by Dimitris Vyzovitis <vyzo@media.mit.edu>
+
+ 10/9
+ ----
+configure.in
+ - replaced call to BASH_HAVE_TIOCGWINSZ with AC_HEADER_TIOCGWINSZ
+
+[readline-4.2a-beta1 frozen]
+
+ 10/15
+ -----
+configure.in, config.h.in
+ - check for <memory.h>, define HAVE_MEMORY_H if found
+ - check for <strings.h>, define HAVE_STRINGS_H if found
+
+ 10/18
+ -----
+configure.in, config.h.in
+ - check for isascii, define HAVE_ISASCII if found
+
+configure.in
+ - changed the macro names from bash as appropriate:
+ BASH_SIGNAL_CHECK -> BASH_SYS_SIGNAL_VINTAGE
+ BASH_REINSTALL_SIGHANDLERS -> BASH_SYS_REINSTALL_SIGHANDLERS
+ BASH_MISC_SPEED_T -> BASH_CHECK_SPEED_T
+
+ 10/22
+ -----
+configure.in
+ - check for isxdigit with AC_CHECK_FUNCS
+
+config.h.in
+ - new define for HAVE_ISXDIGIT
+
+ 10/29
+ -----
+configure.in, config.h.in
+ - check for strpbrk with AC_CHECK_FUNCS, define HAVE_STRPBRK if found
+
+ 11/1
+ ----
+Makefile.in
+ - make sure DESTDIR is passed to install and uninstall makes in
+ subdirectories
+ - when saving old copies of installed libraries, make sure we use
+ DESTDIR for the old installation tree
+
+[readline-4.2a-rc1 frozen]
+
+ 11/2
+ ----
+Makefile.in, shlib/Makefile.in
+ - don't put -I$(includedir) into CFLAGS
+
+ 11/15
+ -----
+[readline-4.2a released]
+
+ 11/20
+ -----
+examples/rlcat.c
+ - new file
+
+examples/Makefile.in
+ - changes for rlcat
+
+ 11/28
+ -----
+configure.in
+ - default TERMCAP_LIB to -lcurses if $prefer_curses == yes (as when
+ --with-curses is supplied)
+
+examples/Makefile.in
+ - substitute @LDFLAGS@ in LDFLAGS assignment
+
+ 11/29
+ -----
+config.h.in
+ - add necessary defines for multibyte include files and functions
+ - add code to define HANDLE_MULTIBYTE if prerequisites are met
+
+configure.in
+ - call BASH_CHECK_MULTIBYTE
+
+ 12/14
+ -----
+config.h.in
+ - add #undef PROTOTYPES, filled in by AC_C_PROTOTYPES
+
+ 12/17
+ -----
+config.h.in
+ - moved HANDLE_MULTIBYTE code to rlmbutil.h
+
+rlmbutil.h, mbutil.c
+ - new files
+
+Makefile.in, shlib/Makefile.in
+ - added rules for mbutil.c
+
+ 12/20
+ -----
+configure.in
+ - added --enable-shared, --enable-static options to configure to
+ say which libraries are built by default (both default to yes)
+ - if SHLIB_STATUS == 'unsupported', turn off default shared library
+ building
+ - substitute new STATIC_TARGET, SHARED_TARGET, STATIC_INSTALL_TARGET,
+ and SHARED_INSTALL_TARGET
+
+Makefile.in
+ - `all' target now depends on (substituted) @STATIC_TARGET@ and
+ @SHARED_TARGET@
+ - `install' target now depends on (substituted) @STATIC_INSTALL_TARGET@
+ and @SHARED_INSTALL_TARGET@
+
+INSTALL, README
+ - updated with new info about --enable-shared and --enable-static
+
+ 1/10/2002
+ ---------
+configure.in
+ - bumped the library version number to 4.3
+
+ 1/24
+ ----
+Makefile.in,shlib/Makefile.in
+ - changes for new file, text.c, with character and text handling
+ functions from readline.c
+
+ 2/20
+ ----
+{configure.config.h}.in
+ - call AC_C_CHAR_UNSIGNED, define __CHAR_UNSIGNED__ if chars are
+ unsigned by default
+
+ 5/20
+ ----
+doc/Makefile.in
+ - new maybe-clean target that removes the generated documentation if
+ the build directory differs from the source directory
+ - distclean target now depends on maybe-clean
+
+ 7/17
+ ----
+[readline-4.3 released]
+
+ 7/18
+ ----
+shlib/Makefile.in
+ - fix bad dependency: text.so: terminal.c, make it depend on text.c
+
+ 8/7
+ ---
+support/shlib-install
+ - break `linux' out into its own stanza: it seems that linux
+ distributions are all moving to the following scheme:
+
+ libreadline.so.4.3 installed version
+ libreadline.so.4 -> libreadline.so.4.3 symlink
+ libreadline.so -> libreadline.so.4 symlink
+
+ 10/29
+ -----
+support/shlib-install
+ - change INSTALL_LINK[12] to use `&&' instead of `;' so it only
+ tries the link if the cd succeeds; put ${echo} in there, too
+ - use $LN instead of `ln -s' so it works on machines without symlinks
+ - change special linux stanza to use cd before ln also
+ - change to use $INSTALL_LINK1 and $INSTALL_LINK2 appropriately
+ instead of explicit commands in various stanzas
+
+ 2/1
+ ---
+config.h.in
+ - add HAVE_MBRTOWC and HAVE_MBRLEN
+ - add NO_MULTIBYTE_SUPPORT for new configure argument
+ - add STDC_HEADERS
+
+configure.in
+ - new argument --enable-multibyte (enabled by default), allows
+ multibyte support to be turned off even on systems that support it
+ - add check for ansi stdc headers with call to AC_HEADER_STDC
+
+ 2/3
+ ---
+configure.in
+ - add call to BASH_FUNC_CTYPE_NONASCII
+
+config.h.in
+ - add CTYPE_NON_ASCII
+
+ 2/20
+ ----
+
+doc/manvers.texinfo
+ - renamed to version.texi to match other GNU software
+ - UPDATE-MONTH variable is now `UPDATED-MONTH'
+
+doc/{hist,rlman,rluserman}.texinfo
+ - include version.texi
+
+doc/{rltech,rluser,hstech,hsuser}.texi
+ - changed the suffix from `texinfo' to `texi'
+
+doc/Makefile.in
+ - made appropriate changes for {{rl,hs}tech,{rl,hs}user}.texi
+
+doc/{rlman,rluserman}.texinfo
+ - changed the suffix from `texinfo' to `texi'
+
+doc/hist.texinfo
+ - renamed to history.texi to be more consistent
+
+ 6/11
+ ----
+shlib/Makefile.in
+ - have configure substitute value of `@LDFLAGS@' into the assignment
+ to SHLIB_XLDFLAGS
+
+ 6/16
+ ----
+configure.in
+ - readline and history libraries are now at version 5.0
+
+ 8/18
+ ----
+support/shlib-install
+ - support for FreeBSD-gnu (from Robert Millan)
+
+ 12/4
+ ----
+Makefile.in
+ - add variables for localedir and the PACKAGE_* variables, auto-set
+ by configure
+
+ 12/9
+ ----
+Makefile.in
+ - use mkinstalldirs instead of mkdirs
+
+ 4/22
+ ----
+Makefile.in
+ - separate doc install/uninstall out into two new targets:
+ install-doc and uninstall-doc
+ - make install-doc and uninstall-doc prerequisites of appropriate
+ install and uninstall targets
+
+examples/rl-fgets.c
+ - new example from Harold Levy that wraps fgets replacement functions
+ that call readline in a shared library that can be interposed with
+ LD_PRELOAD
+
+ 7/27
+ ----
+[readline-5.0 released]
+
+ 11/15
+ -----
+examples/rlfe/{ChangeLog,Makefile.in,README,config.h.in,configure,configure.in,extern.h,os.h,pty.c,rlfe.c,screen.h}
+ - new version of rlfe, rlfe-0.4, from Per Bothner; now a standalone
+ application
+
+ 11/16
+ -----
+shlib/Makefile.in
+ - substitute TERMCAP_LIB in from configure
+
+configure.in
+ - if SHLIB_LIBS doesn't include a termcap library (curses, ncurses,
+ termcap, termlib), append the value of $TERMCAP_LIB to it
+
+ 11/30
+ -----
+configure.in
+ - take out change from 11/16; it doesn't work for some systems (e.g.,
+ SunOS 4.x and Solaris 2.6)
+ - add support for --enable-purify configure argument
+ - pass TERMCAP_LIB in environment when calling shobj-conf
+
+examples/Makefile.in
+ - add support for building examples with purify
+
+ 1/23/2005
+ ---------
+configure.in
+ - set BUILD_DIR to contain backslashes to escape any spaces in the
+ directory name -- this is what make will accept in targets and
+ prerequisites, so it's better than trying to use double quotes
+
+ 2/25
+ ----
+configure.in
+ - change check for sys/ptem.h to include sys/stream.h if present, to
+ avoid the `present but cannot be compiled' messages on Solaris and
+ SVR4.2 (does anyone still use SVR4.2?)
+
+ 5/7
+ ---
+configure.in
+ - add cross-compiling support from the bash configure.in, which cygwin
+ and mingw have apparently adopted
+ - add check for pwd.h, fcntl.h
+ - add checks for fcntl, kill system calls
+ - add checks for getpw{ent,nam,uid} C library functions
+ - pass a compile-time option through to Makefiles if cross-compiling
+
+config.h.in
+ - add HAVE_PWD_H for <pwd.h>, HAVE_FCNTL_H for <fcntl.h>
+ - add HAVE_FCNTL, HAVE_KILL for respective system calls
+ - add HAVE_GETPW{ENT,NAM,UID} for passwd functions
+
+Makefile.in,shlib/Makefile.in
+ - @CROSS_COMPILE@ is substituted into DEFS (equal to -DCROSS_COMPILING
+ if bash is being cross-compiled)
+
+ 8/2
+ ---
+examples/Makefile.in
+ - use $(READLINE_LIB) instead of -lreadline to get around MacOS X 10.4's
+ preference for (incompatible) shared libraries over static libraries
+ in the load path
+
+ 8/11
+ ----
+support/shobj-conf
+ - new variable: SHLIB_LIBPREF, prefix for shared library name (defaults
+ to `lib'
+ - new variable: SHLIB_DLLVERSION, used on Cygwin to set the library
+ version number
+ - new variable: SHLIB_DOT, separator character between library name and
+ suffix and version information (defaults to `.')
+ - new stanza for cygwin to generate windows-compatible dll
+
+support/shlib-install
+ - add new option `-b bindir' for systems like cygwin/windows that
+ require it
+ - new stanza for cygwin that installs a dll into $bindir and an implied
+ link library into $libdir
+
+configure.in
+ - substitute new variables from shobj-conf
+
+shlib/Makefile.in
+ - substitute bindir, SHLIB_DOT, SHLIB_LIBPREF, SHLIB_DLLVERSION from
+ configure
+ - pass `-b $(bindir)' to shlib-install for install and uninstall targets
+ - library names now use $SHLIB_LIBPREF and $SHLIB_DOT
+
+INSTALL,README
+ - document new SHLIB_DOT, SHLIB_LIBPREF, and SHLIB_DLLVERSION variables
+
+ 10/4
+ ----
+[readline-5.1-beta1 frozen]
+
+ 12/1
+ ----
+configure.in
+ - changed release status to `release'
+
+[readline-5.1 frozen]
+
+ 12/9
+ ----
+[readline-5.1 released]
+
+ 12/14
+ -----
+examples/rlfe/Makefile.in
+ - add @LIBS@ to LIBS assignment to pick up extra libraries from
+ configure
+
+ 1/3/2006
+ --------
+support/shlib-install
+ - Install shared libraries with execute bit set on Linux
+
+ 6/9
+ ---
+[readline-5.2-alpha frozen]
+
+ 6/26
+ ----
+configure.in
+ - set CROSS_COMPILE to the empty string by default, so we don't inherit
+ a random value from the environment
+
+ 7/8
+ ---
+[readline-5.2-alpha released]
+
+
+[readline-5.2-beta released]
+
+ 9/12
+ ----
+config.h.in
+ - add defines for wcscoll, iswctype, iswupper, iswlower, towupper,
+ towlower functions
+ - replace define for wctomb with one for wcrtomb
+ - add defines for wchar_t, wint_t, wctype_t types
+
+ 10/11
+ -----
+[readline-5.2 released]
+
+ 11/9
+ ----
+examples/rlfe/{configure.in,Makefile.in,config.h.in,rlfe.c,pty.c}
+ - portability fixes from Mike Frysinger <vapier@gentoo.org>
+
+ 11/21
+ -----
+Makefile.in
+ - add `install-examples' and `uninstall-examples' targets
+
+examples/Makefile.in
+ - add correct variables to build examples on Windows
+ - add appropriate rules to install and uninstall example sources in
+ $(datadir)/readline
+
+ 11/27
+ -----
+config.h.in
+ - move #undef of HAVE_STRCOLL out of config.h.in, since autoconf tries
+ to substitute it based on configure tests
+
+ 4/27/2007
+ ---------
+examples/autoconf
+ - new directory with example autoconf macros to detect readline and
+ return information about the installed version
+
+ 6/13
+ ----
+support/shlib-install
+ - changes to support AIX 5.x shared library installation
+
+ 3/20/2008
+ ---------
+support/shlib-install
+ - add support for NetBSD and Interix shared library installation
+
+ 4/22
+ ----
+support/wcwidth.c
+ - updated implementation from 2007-05
+
+ 7/18
+ ----
+support/shlib-install
+ - support for mingw32, contributed by Carlo Bramix <carlo.bramix@libero.it>
+
+ 8/4
+ ---
+configure.in
+ - changed to readline-6.0
+
+ 8/18
+ ----
+support/config.{guess,sub}
+ - updated to newer versions from autoconf-2.62 distribution
+
+ 3/5/2009
+ --------
+support/shlib-install
+ - take a new -V host_vendor argument
+ - add ${host_vendor} to string tested in case statement for symlink
+ creation section
+ - add support for FreeBSD/gentoo, which uses Linux library naming
+ scheme
+ - change FreeBSD symlink rules, since FreeBSD 7+ has only ELF shared
+ libraries. DragonflyBSD rules are the same. Fix from Timothy
+ Redaelli <drizzt@gentoo.org>
+
+shlib/Makefile.in
+ - add definition of host_vendor, substituted by configure
+ - add -V host_vendor argument to all invocations of shlib-install.
+ Fix from Timothy Redaelli <drizzt@gentoo.org>
+
+ 3/10
+ ----
+configure.in
+ - add call to AC_SYS_LARGEFILE for readdir and largefile support on
+ Linux
+
+config.h.in
+ - add _FILE_OFFSET_BITS define
+
+ 4/19
+ ----
+Makefile.in
+ - add targets for making and installing documentation required by GNU
+ coding standards. Fix from Joseph Myers <joseph@codesourcery.com>
+
+posixselect.h
+ - pick up from bash. Inspired by Mike Frysinger <vapier@gentoo.org>
+
+ 10/28
+ -----
+support/shlib-install
+ - decrease the default version of FreeBSD that installs shared libraries
+ to 4.x. Advice from Peter Jeremy <peterjeremy@acm.org>
+
+ 12/18
+ -----
+[readline-6.1-rc1 released]
+
+ 12/23
+ -----
+doc/Makefile.in
+ - make sure $(topdir) is not ".." before removing all of the formatted
+ documentation in `make distclean'. $(topdir) is set to `..' if
+ readline is being built in the source directory. Fixes problem
+ noticed by THOUMIN Damien <thoumin@ipanematech.com>
+
+ 12/29
+ -----
+[readline-6.1 frozen]
+
+ 2/5/2010
+ --------
+examples/Makefile.in
+ - make sure to install example C files using $(srcdir)/$$f in case
+ we're building outside the source directory. Bug report and fix
+ from Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ 7/25
+ ----
+xfree.c
+ - new file with xfree() implementation, moved from xmalloc.c
+
+ 12/28
+ -----
+{examples,shlib}/Makefile.in
+ - Cygwin-based changes from Eric Blake <eblake@redhat.com>
+
+ 3/26/2011
+ ---------
+Makefile.in
+ - don't ignore failures when building, installing, or cleaning in
+ the shlib subdirectory. Sample patch from Mike Frysinger
+ <vapier@gentoo.org>
+
+shlib/Makefile.in
+ - split the install and uninstall targets into install-supported and
+ install-unsupported targets that depend on the value of
+ SHLIB_STATUS
+
+ 4/2
+ ---
+{,shlib}/Makefile.in
+ - add dependency for callback.o/callback.so on xmalloc.h. From
+ Jan Kratochvil <jan.kratochvil@redhat.com>
+
+{,doc,examples,shlib}/Makefile.in
+ - fix typo: htm target should be html. From Jan Kratochvil
+ <jan.kratochvil@redhat.com>
+ - remove `.' from VPATH. From Jan Kratochvil
+ <jan.kratochvil@redhat.com>
+
+examples/rlfe/configure.in
+ - quote AC_PROGRAM_SOURCE. From Jan Kratochvil
+ <jan.kratochvil@redhat.com>
+
+ 5/17
+ ----
+config.h.in
+ - WCWIDTH_BROKEN: new define, picked up from bash, defined on systems
+ where wcwidth returns 1 for Unicode combining characters
+
+ 11/28
+ -----
+support/shlib-install
+ - make sure solaris2 systems make the installed shared library
+ executable. ldd warns about it otherwise. Bug and fix from
+ Tim Mooney <tim.mooney@ndsu.edu>
+
+examples/hist_erasedups.c
+ - new example program, shows how to erase duplicates from the history
+ list
+
+examples/hist_purgecmd.c
+ - new example program, shows how to remove all entries matching a
+ string or pattern from the history list
+
+ 1/12/2012
+ ---------
+colors.[ch],parse-colors.[ch]}
+ - new files, part of color infrastructure support
+
+Makefile.in,shlib/Makefile.in
+ - arrange to have colors.o and parse-colors.o added to library
+ (static and shared versions)
+
+{configure,config.h}.in
+ - check for stdbool.h, define HAVE_STDBOOL_H if found
+
+rldefs.h
+ - COLOR_SUPPORT: if defined, compile in colors.c and parse-colors.c
+ for color support
+
+ 1/18
+ ----
+
+{configure,config.h}.in
+ - new check: check for AUDIT_USER_TTY defined in <linux/audit.h>,
+ define HAVE_DECL_AUDIT_USER_TTY if both are found
+
+ 8/7
+ ---
+configure.in
+ - AC_CANONICAL_BUILD: call to set the build_xxx variables
+ - use $build_os instead of $host_os to decide when DJGPP should run
+ `pwd.exe' to figure out the build directory. Report and fix from
+ Yao Qi <yao@codesourcery.com>
+
+ 8/29
+ ----
+configure.ac
+ - new name for configure.in
+
+MANIFEST,Makefile.in
+ - configure.in -> configure.ac
+
+ 1/5/2013
+ --------
+configure.ac
+ - move version number up to 6.3
+
+ 1/31
+ ----
+configure.ac
+ - use AC_CHECK_TOOL instead of AC_CHECK_PROG to check for ar, since it
+ will find $host-prefixed versions of utilities. Report and fix from
+ Mike Frysinger <vapier@gentoo.org>
+
+ 3/4
+ ---
+Makefile.in
+ - PACKAGE_TARNAME, docdir: new variables substituted by autoconf
+ - OTHER_DOCS,OTHER_INSTALLED_DOCS: new variables with auxiliary
+ documentation files to be installed into $(docdir)
+ - install: add new rule to install $(OTHER_DOCS)
+ - uninstall: add new rule to uninstall $(docdir)/$(OTHER_INSTALLED_DOCS)
+
+ 4/29
+ ----
+Makefile.in
+ - installdirs: make sure to create $(DESTDIR)$(docdir). Report from
+ <hiroo.hayashi@computer.org>
+
+ 1/27/2014
+ ---------
+Makefile.in
+ - install-examples: should not depend on `shared', since the examples
+ themselves are not built using shared libraries. Report from
+ <hiroo.hayashi@computer.org>
+
+support/shobj-conf
+ - [from bash] darwin: changed the install_name embedded into the
+ shared library to contain only the major version number, not the
+ minor one. The idea is that the minor versions should all be API/ABI
+ compatible, and it is better to link automatically with the latest
+ one. Idea from Max Horn <max@quendi.de>
+
+ 2/26/2014
+ ---------
+[readline-6.3 released]
+
+ 3/14
+ ----
+shlib/Makefile.in
+ - fix typo in dependency list for vi_mode.so: it should not depend on
+ just $(topdir). Report and fix from Natanael Copa
+ <ncopa@alpinelinux.org>
+
+ 4/15
+ ----
+{.,shlib,examples}/Makefile.in
+ - make sure $(INCLUDES) appears before $(CPPFLAGS) in the various
+ CFLAGS assignments so readline looks in its own source and build
+ directories (INCLUDES) before some directories specified by the
+ user or builder (CPPFLAGS). Report and fix from Max Horn
+ <max@quendi.de>
+
+ 6/2
+ ---
+config.h.in
+ - use correct symbols: HAVE_STRUCT_DIRENT_D_INO, HAVE_STRUCT_DIRENT_D_FILENO
+ HAVE_STRUCT_DIRENT_D_NAMLEN. They don't really matter, but they are
+ what posixdir.h looks for. Report from Ross Burton <ross.burton@intel.com>
+
+ 6/11
+ ----
+readline.pc.in
+ - new file, config file for pkgconfig. Patch to add from Jirka Klimes
+ <jklimes@redhat.com>
+
+{MANIFEST,configure.ac,Makefile.in}
+ - readline.pc: changes to create file for pkgconfig
+
+ 10/13
+ -----
+doc/Makefile.in
+ - readline.pdf, history.pdf, rluserman.pdf: use texi2dvi --pdf to generate
+ these. Suggestion from Siep Kroonenberg <siepo@cybercomm.nl>
+
+ 11/29
+ -----
+config.h.in
+ - HAVE_PSELECT: define if pselect(2) available
+
+configure.ac
+ - check for pselect(2), define HAVE_PSELECT if found
+
+ 12/29
+ -----
+configure.ac
+ - bump version number up to 6.4
+
+ 1/6/2015
+ --------
+configure.ac,config.h.in
+ - look for ncurses/termcap.h, define HAVE_NCURSES_TERMCAP_H
+
+ 4/20
+ ----
+configure.ac
+ - add template definitions set by AC_USE_SYSTEM_EXTENSIONS from a report
+ from Andreas Schwab <schwab@linux-m68k.org>
+
+ 4/24
+ ----
+configure.ac,config.h.in
+ - add check for sys/ioctl.h to AC_CHECK_HEADERS, define HAVE_SYS_IOCTL_H
+ if found
+
+ 5/29
+ ----
+configure.ac
+ - bump library version to 7.0 because of addition of rl_callback_sigcleanup
+
+ 8/26
+ ----
+configure.ac,Makefile.in,examples/Makefile.in
+ - remove references to purify
+
+ 11/21
+ -----
+configure.ac,config.h.in
+ - fnmatch: check for libc function, define HAVE_FNMATCH if found. Now
+ used by vi-mode history search functions
+
+ 7/12
+ ----
+Makefile.in,examples/Makefile.in
+ - add support for building with address sanitizer, using new target
+ `asan'
+
+ 4/23/2018
+ ---------
+configure.ac
+ - TERMCAP_PKG_CONFIG_LIB: new variable, defined from TERMCAP_LIB,
+ defaults to termcap
+
+readline.pc.in
+ - change Requires.private to use TERMCAP_PKG_CONFIG_LIB instead of
+ hardcoded `tinfo'. Report and fix from Thomas Petazzoni
+ <thomas.petazzoni@bootlin.com>
+
+ 5/4
+ ---
+Makefile.in
+ - new targets to install and uninstall the `readline.pc' pkgconfig
+ file
+ - install-{static,shared}: add install-pc to the list of prereqs
+ - uninstall{,-shared}: add uninstall-pc to list of prereqs. Change
+ from Thomas Petazzoni <thomas.petazzoni@bootlin.com>
+
+configure.ac,Makefile.in
+ - add new configure option to optionally disable installing the
+ source code examples. From Thomas Petazzoni <thomas.petazzoni@bootlin.com>
+
+ 5/23
+ ----
+Makefile.in
+ - install-pc: make sure we install readline.pc into an existing
+ pkgconfig directory. Report from ilove zfs <ilovezfs@icloud.com>
+
+ 5/24
+ ----
+Makefile.in
+ - installdirs: create $(pkgconfigdir) if it doesn't exist
+
+
+ 4/8/2019
+ --------
+readline.pc.in
+ - change CFLAGS to include ${includedir} instead of ${includedir}/readline,
+ to support the recommended `#include <readline/readline.h>'. Report
+ and fix from Andrea Bolognani <abologna@redhat.com>
+
+ 5/13
+ ----
+configure.ac
+ - hpux: add -DTGETENT_BROKEN to LOCAL_CFLAGS
+
+ 8/28
+ ----
+configure.ac
+ - hpux: add -DTGETFLAG_BROKEN to LOCAL_CFLAGS
+
+ 9/6
+ ---
+examples/autoconf/RL_LIB_READLINE_VERSION
+ - include <stdlib.h> in the AC_TRY_RUN block to accommodate compilers
+ that treat functions without an existing prototype as fatal errors.
+ Report and fix from Florian Weimer <fweimer@redhat.com>
+
+ 12/13
+ -----
+support/shlib-install
+ - remove old code for FreeBSD and Dragonfly; they are ELF-only now and
+ can use the same code as Linux. Fix from
+ Baptiste Daroussin <bapt@FreeBSD.org>
+
+ 5/20/2020
+ ---------
+configure.ac
+ - bumped version number up to 8.1
+
+ 6/15
+ ----
+configure.ac
+ - add -Wno-parentheses -Wno-format-security to CFLAGS if gcc (or clang)
+ is the compiler
+
+ 10/29
+ -----
+configure.ac
+ - --enable-bracketed-paste-default: new invocation option, toggles the
+ default value of enable-bracketed-paste (on by default)
+
+INSTALL
+ - document new --enable-bracketed-paste-default configure option
+
+ 12/4
+ ----
+[readline-8.1 frozen]
+
+ 8/17/2021
+ ---------
+configure.ac
+ - use `:+' when testing the value of $GCC, since autoconf seems to
+ set it to the empty string if gcc isn't the compiler. Reported by
+ Osipov, Michael (LDA IT PLM) <michael.osipov@siemens.com>
+
+ 9/2
+ ---
+configure.ac
+ - AC_HELP_STRING -> AS_HELP_STRING
+ - AC_OUTPUT: split into AC_CONFIG_FILES and AC_CONFIG_COMMANDS, call
+ AC_OUTPUT without any parameters
+
+ 9/3
+ ---
+configure.ac, config.h.in
+ - AC_TYPE_SIGNAL,BASH_TYPE_SIGHANDLER: remove calls, remove mention of
+ RETSIGTYPE and VOID_SIGHANDLER
+ - AC_HEADER_TIME: removed
+ - AC_USE_SYSTEM_EXTENSIONS: use instead of AC_AIX and AC_MINIX
+ - AC_HEADER_STDC: removed
+ - BASH_FUNC_CTYPE_NONASCII: removed
+
+ 11/25
+ -----
+history.pc.in
+ - pkgconfig file for history library. From Siteshwar Vashisht
+ <svashisht@redhat.com>
+
+configure.ac,MANIFEST,Makefile.in
+ - support for creating history.pc
+
+ 3/29/2022
+ ---------
+configure.ac
+ - new option: --with-shared-termcap-library: use to force the shared
+ readline library to be linked against a shared termcap/curses library
+ that configure finds. If the argument begins with `-l', use that
+ library instead; updated INSTALL accordingly
diff --git a/CHANGES b/CHANGES
new file mode 100644
index 0000000..eb54caa
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,1941 @@
+This document details the changes between this version, readline-8.2, and
+the previous version, readline-8.1.
+
+1. Changes to Readline
+
+a. Fixed a problem with cleaning up active marks when using callback mode.
+
+b. Fixed a problem with arithmetic comparison operators checking the version.
+
+c. Fixed a problem that could cause readline not to build on systems without
+ POSIX signal functions.
+
+d. Fixed a bug that could cause readline to crash if the application removed
+ the callback line handler before readline read all typeahead.
+
+e. Added additional checks for read errors in the middle of readline commands.
+
+f. Fixed a redisplay problem that occurred when switching from the digit-
+ argument prompt `(arg: N)' back to the regular prompt and the regular
+ prompt contained invisible characters.
+
+g. Fixed a problem with restoring the prompt when aborting an incremental
+ search.
+
+h. Fix a problem with characters > 128 not being displayed correctly in certain
+ single-byte encodings.
+
+i. Fixed a problem with unix-filename-rubout that caused it to delete too much
+ when applied to a pathname consisting only of one or more slashes.
+
+j. Fixed a display problem that caused the prompt to be wrapped incorrectly if
+ the screen changed dimensions during a call to readline() and the prompt
+ became longer than the screen width.
+
+k. Fixed a problem that caused the \r output by turning off bracketed paste
+ to overwrite the line if terminal echo was disabled.
+
+l. Fixed a bug that could cause colored-completion-prefix to not display if
+ completion-prefix-display-length was set.
+
+m. Fixed a problem with line wrapping prompts when a group of invisible
+ characters runs to the right edge of the screen and the prompt extends
+ longer then the screen width.
+
+n. Fixed a couple problems that could cause rl_end to be set incorrectly by
+ transpose-words.
+
+o. Prevent some display problems when running a command as the result of a
+ trap or one bound using `bind -x' and the command generates output.
+
+p. Fixed an issue with multi-line prompt strings that have one or more
+ invisible characters at the end of a physical line.
+
+q. Fixed an issue that caused a history line's undo list to be cleared when
+ it should not have been.
+
+r. When replacing a history entry, make sure the existing entry has a non-NULL
+ timestamp before copying it; it may have been added by the application, not
+ the history library.
+
+2. New Features in Readline
+
+a. There is now an HS_HISTORY_VERSION containing the version number of the
+ history library for applications to use.
+
+b. History expansion better understands multiple history expansions that may
+ contain strings that would ordinarily inhibit history expansion (e.g.,
+ `abc!$!$').
+
+c. There is a new framework for readline timeouts, including new public
+ functions to set timeouts and query how much time is remaining before a
+ timeout hits, and a hook function that can trigger when readline times
+ out. There is a new state value to indicate a timeout.
+
+d. Automatically bind termcap key sequences for page-up and page-down to
+ history-search-backward and history-search-forward, respectively.
+
+e. There is a new `fetch-history' bindable command that retrieves the history
+ entry corresponding to its numeric argument. Negative arguments count back
+ from the end of the history.
+
+f. `vi-undo' is now a bindable command.
+
+g. There is a new option: `enable-active-region'. This separates control of
+ the active region and bracketed-paste. It has the same default value as
+ bracketed-paste, and enabling bracketed paste enables the active region.
+ Users can now turn off the active region while leaving bracketed paste
+ enabled.
+
+h. rl_completer_word_break_characters is now `const char *' like
+ rl_basic_word_break_characters.
+
+i. Readline looks in $LS_COLORS for a custom filename extension
+ (*.readline-colored-completion-prefix) and uses that as the default color
+ for the common prefix displayed when `colored-completion-prefix' is set.
+
+j. Two new bindable string variables: active-region-start-color and
+ active-region-end-color. The first sets the color used to display the
+ active region; the second turns it off. If set, these are used in place
+ of terminal standout mode.
+
+k. New readline state (RL_STATE_EOF) and application-visible variable
+ (rl_eof_found) to allow applications to detect when readline reads EOF
+ before calling the deprep-terminal hook.
+
+l. There is a new configuration option: --with-shared-termcap-library, which
+ forces linking the shared readline library with the shared termcap (or
+ curses/ncurses/termlib) library so applications don't have to do it.
+
+m. Readline now checks for changes to locale settings (LC_ALL/LC_CTYPE/LANG)
+ each time it is called, and modifies the appropriate locale-specific display
+ and key binding variables when the locale changes.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-8.1, and
+the previous version, readline-8.0.
+
+1. Changes to Readline
+
+a. There are a number of fixes that were found as the result of fuzzing with
+ random input.
+
+b. Changed the revert-all-at-newline behavior to make sure to start at the end
+ of the history list when doing it, instead of the line where the user hit
+ return.
+
+c. When parsing `set' commands from the inputrc file or an application, readline
+ now allows trailing whitespace.
+
+d. Fixed a bug that left a file descriptor open to the history file if the
+ file size was 0.
+
+e. Fixed a problem with binding key sequences containing meta characters.
+
+f. Fixed a bug that caused the wrong line to be displayed if the user tried to
+ move back beyond the beginning of the history list, or forward past the end
+ of the history list.
+
+g. If readline catches SIGTSTP, it now sets a hook that allows the calling
+ application to handle it if it desires.
+
+h. Fixed a redisplay problem with a prompt string containing embedded newlines.
+
+i. Fixed a problem with completing filenames containing invalid multibyte
+ sequences when case-insensitive comparisons are enabled.
+
+j. Fixed a redisplay problem with prompt strings containing invisible multibyte
+ characters.
+
+k. Fixed a problem with multibyte characters mapped to editing commands that
+ modify the search string in incremental search.
+
+l. Fixed a bug with maintaining the key sequence while resolving a bound
+ command in the presence of ambiguous sequences (sequences with a common
+ prefix), in most cases while attempting to unbind it.
+
+m. Fixed several buffer overflows found as the result of fuzzing.
+
+n. Reworked backslash handling when translating key sequences for key binding
+ to be more uniform and consistent, which introduces a slight backwards
+ incompatibility.
+
+o. Fixed a bug with saving the history that resulted in errors not being
+ propagated to the calling application when the history file is not writable.
+
+p. Readline only calls chown(2) on a newly-written history file if it really
+ needs to, instead of having it be a no-op.
+
+q. Readline now behaves better when operate-and-get-next is used when the
+ history list is `full': when there are already $HISTSIZE entries.
+
+r. Fixed a bug that could cause vi redo (`.') of a replace command not to work
+ correctly in the C or POSIX locale.
+
+s. Fixed a bug with vi-mode digit arguments that caused the last command to be
+ set incorrectly. This prevents yank-last-arg from working as intended, for
+ example.
+
+t. Make sure that all undo groups are closed when leaving vi insertion mode.
+
+u. Make sure that the vi-mode `C' and `c' commands enter insert mode even if
+ the motion command doesn't have any effect.
+
+v. Fixed several potential memory leaks in the callback mode context handling.
+
+w. If readline is handling a SIGTTOU, make sure SIGTTOU is blocked while
+ executing the terminal cleanup code, since it's no longer run in a signal
+ handling context.
+
+x. Fixed a bug that could cause an application with an application-specific
+ redisplay function to crash if the line data structures had not been
+ initialized.
+
+y. Terminals that are named "dumb" or unknown do not enable bracketed paste
+ by default.
+
+z. Ensure that disabling bracketed paste turns off highlighting the incremental
+ search string when the search is successful.
+
+2. New Features in Readline
+
+a. If a second consecutive completion attempt produces matches where the first
+ did not, treat it as a new completion attempt and insert a match as
+ appropriate.
+
+b. Bracketed paste mode works in more places: incremental search strings, vi
+ overstrike mode, character search, and reading numeric arguments.
+
+c. Readline automatically switches to horizontal scrolling if the terminal has
+ only one line.
+
+d. Unbinding all key sequences bound to a particular readline function now
+ descends into keymaps for multi-key sequences.
+
+e. rl-clear-display: new bindable command that clears the screen and, if
+ possible, the scrollback buffer (bound to emacs mode M-C-l by default).
+
+f. New active mark and face feature: when enabled, it will highlight the text
+ inserted by a bracketed paste (the `active region') and the text found by
+ incremental and non-incremental history searches. This is tied to bracketed
+ paste and can be disabled by turning off bracketed paste.
+
+g. Readline sets the mark in several additional commands.
+
+h. Bracketed paste mode is enabled by default. There is a configure-time
+ option (--enable-bracketed-paste-default) to set the default to on or off.
+
+i. Readline tries to take advantage of the more regular structure of UTF-8
+ characters to identify the beginning and end of characters when moving
+ through the line buffer.
+
+j. The bindable operate-and-get-next command (and its default bindings) are
+ now part of readline instead of a bash-specific addition.
+
+k. The signal cleanup code now blocks SIGINT while processing after a SIGINT.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-8.0, and the
+previous version, readline-7.0.
+
+1. Changes to Readline
+
+a. Added a guard to prevent nested macros from causing an infinite expansion
+ loop.
+
+b. Instead of allocating enough history list entries to hold the maximum list
+ size, cap the number allocated initially.
+
+c. Added a strategy to avoid allocating huge amounts of memory if a block of
+ history entries without timestamps occurs after a block with timestamps.
+
+d. Added support for keyboard timeouts when an ESC character is the last
+ character in a macro.
+
+e. There are several performance improvements when in a UTF-8 locale.
+
+f. Readline does a better job of preserving the original set of blocked
+ signals when using pselect() to wait for input.
+
+g. Fixed a bug that caused multibyte characters in macros to be mishandled.
+
+h. Fixed several bugs in the code that calculates line breaks when expanding
+ prompts that span several lines, contain multibyte characters, and contain
+ invisible character seqeuences.
+
+i. Fixed several bugs in cursor positioning when displaying lines with prompts
+ containing invisible characters and multibyte characters.
+
+j. When performing case-insensitive completion, Readline no longer sorts the
+ list of matches unless directed to do so.
+
+k. Fixed a problem with key sequences ending with a backslash.
+
+l. Fixed out-of-bounds and free memory read errors found via fuzzing.
+
+m. Fixed several cases where the mark was set to an invalid value.
+
+n. Fixed a problem with the case-changing operators in the case where the
+ lower and upper case versions of a character do not have the same number
+ of bytes.
+
+o. Handle incremental and non-incremental search character reads returning EOF.
+
+p. Handle the case where a failing readline command at the end of a multi-key
+ sequence could be misinterpreted.
+
+q. The history library now prints a meaningful error message if the history
+ file isn't a regular file.
+
+r. Fixed a problem with vi-mode redo (`.') on a command when trying to replace
+ a multibyte character.
+
+s. The key binding code now attempts to remove a keymap if a key unbinding
+ leaves it empty.
+
+t. Fixed a line-wrapping issue that caused problems for some terminal
+ emulators.
+
+u. If there is a key bound to the tty's VDISCARD special character, readline
+ disables VDISCARD while it is active.
+
+v. Fixed a problem with exiting bracketed paste mode on terminals that assume
+ the bracketed paste mode character sequence contains visible characters.
+
+w. Fixed a bug that could cause a key binding command to refer to an
+ uninitialized variable.
+
+x. Added more UTF-8-specific versions of multibyte functions, and optimized
+ existing functions if the current locale uses UTF-8 encoding.
+
+y. Fixed a problem with bracketed-paste inserting more than one character and
+ interacting with other readline functions.
+
+z. Fixed a bug that caused the history library to attempt to append a history
+ line to a non-existent history entry.
+
+aa. If using bracketed paste mode, output a newline after the \r that is the
+ last character of the mode disable string to avoid overwriting output.
+
+bb. Fixes to the vi-mode `b', `B', `w', `W', `e', and `E' commands to better
+ handle multibyte characters.
+
+cc. Fixed a redisplay problem that caused an extra newline to be generated on
+ accept-line when the line length is exactly the screenwidth.
+
+dd. Fixed a bug with adding multibyte characters to an incremental search
+ string.
+
+ee. Fixed a bug with redoing text insertions in vi mode.
+
+ff. Fixed a bug with pasting text into an incremental search string if bracketed
+ paste mode is enabled. ESC cannot be one of the incremental search
+ terminator characters for this to work.
+
+gg. Fixed a bug with anchored search patterns when performing searches in vi
+ mode.
+
+2. New Features in Readline
+
+a. Non-incremental vi-mode search (`N', `n') can search for a shell pattern, as
+ Posix specifies (uses fnmatch(3) if available).
+
+b. There are new `next-screen-line' and `previous-screen-line' bindable
+ commands, which move the cursor to the same column in the next, or previous,
+ physical line, respectively.
+
+c. There are default key bindings for control-arrow-key key combinations.
+
+d. A negative argument (-N) to `quoted-insert' means to insert the next N
+ characters using quoted-insert.
+
+e. New public function: rl_check_signals(), which allows applications to
+ respond to signals that readline catches while waiting for input using
+ a custom read function.
+
+f. There is new support for conditionally testing the readline version in an
+ inputrc file, with a full set of arithmetic comparison operators available.
+
+g. There is a simple variable comparison facility available for use within an
+ inputrc file. Allowable operators are equality and inequality; string
+ variables may be compared to a value; boolean variables must be compared to
+ either `on' or `off'; variable names are separated from the operator by
+ whitespace.
+
+h. The history expansion library now understands command and process
+ substitution and extended globbing and allows them to appear anywhere in a
+ word.
+
+i. The history library has a new variable that allows applications to set the
+ initial quoting state, so quoting state can be inherited from a previous
+ line.
+
+j. Readline now allows application-defined keymap names; there is a new public
+ function, rl_set_keymap_name(), to do that.
+
+k. The "Insert" keypad key, if available, now puts readline into overwrite
+ mode.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-7.0, and the
+previous version, readline-6.3.
+
+1. Changes to Readline
+
+a. A bug that caused vi-mode `.' to be unable to redo `c', `d', and `y'
+ commands with modifiers was fixed.
+
+b. Fixed a bug that caused callback mode to dump core when reading a
+ multiple-key sequence (e.g., arrow keys).
+
+c. Fixed a bug that caused the redisplay code to erase some of the line when
+ using horizontal scrolling with incremental search.
+
+d. Readline's input handler now performs signal processing if read(2) is
+ interrupted by SIGALRM or SIGVTALRM.
+
+e. Fixed a problem with revert-all-at-newline freeing freed memory.
+
+f. Clarified the documentation for the history_quotes_inhibit_expansion
+ variable to note that it inhibits scanning for the history comment
+ character and that it only affects double-quoted strings.
+
+g. Fixed an off-by-one error in the prompt printed when performing searches.
+
+h. Use pselect(2), if available, to wait for input before calling read(2), so
+ a SIGWINCH can interrupt it, since it doesn't interrupt read(2).
+
+i. Some memory leaks caused by signals interrupting filename completion have
+ been fixed.
+
+j. Reading EOF twice on a non-empty line causes EOF to be returned, rather
+ than the partial line. This can cause partial lines to be executed on
+ SIGHUP, for example.
+
+k. Fixed a bug concerning deleting multibyte characters from the search
+ string while performing an incremental search.
+
+l. Fixed a bug with tilde expanding directory names in filename completion.
+
+m. Fixed a bug that did not allow binding sequences beginning with a `\'.
+
+n. Fixed a redisplay bug involving incorrect line wrapping when the prompt
+ contains a multibyte character in the last screen column.
+
+o. Fixed a bug that caused history expansion to disregard characters that are
+ documented to delimit a history event specifier without requiring `:'.
+
+p. Fixed a bug that could cause reading past the end of a string when reading
+ the value when binding the set of isearch terminators.
+
+q. Fixed a bug that caused readline commands that depend on knowing which
+ key invoked them to misbehave when dispatching key sequences that are
+ prefixes of other key bindings.
+
+r. Paren matching now works in vi insert mode.
+
+s. Colored completion prefixes are now displayed using a different color, less
+ likely to collide with files.
+
+t. Fixed a bug that caused vi-mode character search to misbehave when
+ running in callback mode.
+
+u. Fixed a bug that caused output to be delayed when input is coming from a
+ macro in vi-mode.
+
+v. Fixed a bug that caused the vi-mode `.' command to misbehave when redoing
+ a multi-key key sequence via a macro.
+
+w. Fixed a bug that caused problems with applications that supply their own
+ input function when performing completion.
+
+x. When read returns -1/EIO when attempting to read a key, return an error
+ instead of line termination back to the caller.
+
+y. Updated tty auditing feature based on patch from Red Hat.
+
+z. Fixed a bug that could cause the history library to crash on overflows
+ introduced by malicious editing of timestamps in the history file.
+
+aa. The history file writing functions only attempt to create and use a backup
+ history file if the history file exists and is a regular file.
+
+bb. Fixed an out-of-bounds read in readline's internal tilde expansion interface.
+
+cc. Fixed several redisplay bugs with prompt strings containing multibyte
+ and non-visible characters whose physical length is longer than the screen
+ width.
+
+dd. Fixed a redisplay bug with prompt strings containing invisible characters
+ whose physical length exceeds the screen width and using incremental search.
+
+ee. Readline prints more descriptive error messages when it encounters errors
+ while reading an inputrc file.
+
+ff. Fixed a bug in the character insertion code that attempts to optimize
+ typeahead when it reads a character that is not bound to self-insert and
+ resets the key sequence state.
+
+gg. When refreshing the line as the result of a key sequence, Readline attempts
+ to redraw only the last line of a multiline prompt.
+
+hh. Fixed an issue that caused completion of git commands to display
+ incorrectly when using colored-completion-prefix.
+
+ii. Fixed several redisplay bugs having to do with multibyte characters and
+ invisible characters in prompt strings.
+
+jj. Fixed a bug that caused mode strings to be displayed incorrectly if the
+ prompt was shorter than the mode string.
+
+2. New Features in Readline
+
+a. The history truncation code now uses the same error recovery mechanism as
+ the history writing code, and restores the old version of the history file
+ on error. The error recovery mechanism handles symlinked history files.
+
+b. There is a new bindable variable, `enable-bracketed-paste', which enables
+ support for a terminal's bracketed paste mode.
+
+c. The editing mode indicators can now be strings and are user-settable
+ (new `emacs-mode-string', `vi-cmd-mode-string' and `vi-ins-mode-string'
+ variables). Mode strings can contain invisible character sequences.
+ Setting mode strings to null strings restores the defaults.
+
+d. Prompt expansion adds the mode string to the last line of a multi-line
+ prompt (one with embedded newlines).
+
+e. There is a new bindable variable, `colored-completion-prefix', which, if
+ set, causes the common prefix of a set of possible completions to be
+ displayed in color.
+
+f. There is a new bindable command `vi-yank-pop', a vi-mode version of emacs-
+ mode yank-pop.
+
+g. The redisplay code underwent several efficiency improvements for multibyte
+ locales.
+
+h. The insert-char function attempts to batch-insert all pending typeahead
+ that maps to self-insert, as long as it is coming from the terminal.
+
+i. rl_callback_sigcleanup: a new application function that can clean up and
+ unset any state set by readline's callback mode. Intended to be used
+ after a signal.
+
+j. If an incremental search string has its last character removed with DEL, the
+ resulting empty search string no longer matches the previous line.
+
+k. If readline reads a history file that begins with `#' (or the value of
+ the history comment character) and has enabled history timestamps, the history
+ entries are assumed to be delimited by timestamps. This allows multi-line
+ history entries.
+
+l. Readline now throws an error if it parses a key binding without a terminating
+ `:' or whitespace.
+
+m. The default binding for ^W in vi mode now uses word boundaries specified
+ by Posix (vi-unix-word-rubout is bindable command name).
+
+n. rl_clear_visible_line: new application-callable function; clears all
+ screen lines occupied by the current visible readline line.
+
+o. rl_tty_set_echoing: application-callable function that controls whether
+ or not readline thinks it is echoing terminal output.
+
+p. Handle >| and strings of digits preceding and following redirection
+ specifications as single tokens when tokenizing the line for history
+ expansion.
+
+q. Fixed a bug with displaying completions when the prefix display length
+ is greater than the length of the completions to be displayed.
+
+r. The :p history modifier now applies to the entire line, so any expansion
+ specifying :p causes the line to be printed instead of expanded.
+
+s. New application-callable function: rl_pending_signal(): returns the signal
+ number of any signal readline has caught but not yet handled.
+
+t. New application-settable variable: rl_persistent_signal_handlers: if set
+ to a non-zero value, readline will enable the readline-6.2 signal handler
+ behavior in callback mode: handlers are installed when
+ rl_callback_handler_install is called and removed removed when a complete
+ line has been read.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-6.3, and the
+previous version, readline-6.2.
+
+1. Changes to Readline
+
+a. Fixed a bug that did not allow the `dd', `cc', or `yy' vi editing mode
+ commands to work on the entire line.
+
+b. Fixed a bug that caused redisplay problems with prompts longer than 128
+ characters and history searches.
+
+c. Fixed a bug that caused readline to try and run code to modify its idea
+ of the screen size in a signal handler context upon receiving a SIGWINCH.
+
+d. Fixed a bug that caused the `meta' key to be enabled beyond the duration
+ of an individual call top readline().
+
+e. Added a workaround for a wcwidth bug in Mac OS X that caused readline's
+ redisplay to mishandle zero-width combining characters.
+
+f. Fixed a bug that caused readline to `forget' part of a key sequence when
+ a multiple-key sequence caused it to break out of an incremental search.
+
+g. Fixed bugs that caused readline to execute code in a signal handler
+ context if interrupted while reading from the file system during completion.
+
+h. Fixed a bug that caused readline to `forget' part of a key sequence when
+ reading an unbound multi-character key sequence.
+
+i. Fixed a bug that caused Readline's signal handlers to be installed beyond
+ the bounds of a single call to readline().
+
+j. Fixed a bug that caused the `.' command to not redo the most recent `R'
+ command in vi mode.
+
+k. Fixed a bug that caused ignoring case in completion matches to result in
+ readline using the wrong match.
+
+l. Paren matching now works in vi insert mode.
+
+m. Fix menu-completion to make show-all-if-ambiguous and menu-complete-display-prefix
+ work together.
+
+n. Fixed a bug that didn't allow the `cc', `dd', or `yy' commands to be redone
+ in vi editing mode.
+
+o. Fixed a bug that caused the filename comparison code to not compare
+ multibyte characters correctly when using case-sensitive or case-mapping
+ comparisons.
+
+p. Fixed the input reading loop to call the input hook function only when there
+ is no terminal input available.
+
+q. Fixed a bug that caused binding a macro to a multi-character key sequence
+ where the sequence and macro value share a common prefix to not perform
+ the macro replacement.
+
+r. Fixed several redisplay errors with multibyte characters and prompts
+ containing invisible characters when using horizontal scrolling.
+
+s. Fixed a bug that caused redisplay errors when trying to overwrite
+ existing characters using multibyte characters.
+
+t. Fixed a bug in vi mode that caused the arrow keys to set the saved last
+ vi-mode command to the wrong value.
+
+u. Fixed a bug that caused double-quoted strings to be scanned incorrectly
+ when being used as the value of a readline variable assignment.
+
+v. Fixed a bug with vi mode that prevented `.' from repeating a command
+ entered on a previous line (command).
+
+w. Fixed a bug that could cause completion to core dump if it was interrupted
+ by a signal.
+
+x. Fixed a bug that could cause readline to crash and seg fault attempting to
+ expand an empty history entry.
+
+y. Fixed a bug that caused display problems with multi-line prompts containing
+ invisible characters on multiple lines.
+
+z. Fixed a bug that caused effects made by undoing changes to a history line to
+ be discarded.
+
+2. New Features in Readline
+
+a. Readline is now more responsive to SIGHUP and other fatal signals when
+ reading input from the terminal or performing word completion but no
+ longer attempts to run any not-allowable functions from a signal handler
+ context.
+
+b. There are new bindable commands to search the history for the string of
+ characters between the beginning of the line and the point
+ (history-substring-search-forward, history-substring-search-backward)
+
+c. Readline allows quoted strings as the values of variables when setting
+ them with `set'. As a side effect, trailing spaces and tabs are ignored
+ when setting a string variable's value.
+
+d. The history library creates a backup of the history file when writing it
+ and restores the backup on a write error.
+
+e. New application-settable variable: rl_filename_stat_hook: a function called
+ with a filename before using it in a call to stat(2). Bash uses it to
+ expand shell variables so things like $HOME/Downloads have a slash
+ appended.
+
+f. New bindable function `print-last-kbd-macro', prints the most-recently-
+ defined keyboard macro in a reusable format.
+
+g. New user-settable variable `colored-stats', enables use of colored text
+ to denote file types when displaying possible completions (colored analog
+ of visible-stats).
+
+h. New user-settable variable `keyseq-timout', acts as an inter-character
+ timeout when reading input or incremental search strings.
+
+i. New application-callable function: rl_clear_history. Clears the history list
+ and frees all readline-associated private data.
+
+j. New user-settable variable, show-mode-in-prompt, adds a characters to the
+ beginning of the prompt indicating the current editing mode.
+
+k. New application-settable variable: rl_input_available_hook; function to be
+ called when readline needs to check whether there is data available on its
+ input source. The default hook checks rl_instream.
+
+l. Readline calls an application-set event hook (rl_signal_event_hook) after
+ it gets a signal while reading input (read returns -1/EINTR but readline
+ does not handle the signal immediately) to allow the application to handle
+ or otherwise note it. Not currently called for SIGHUP or SIGTERM.
+
+m. If the user-settable variable `history-size' is set to a value less than
+ 0, the history list size is unlimited.
+
+n. When creating shared libraries on Mac OS X, the pathname written into the
+ library (install_name) no longer includes the minor version number.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-6.2,
+and the previous version, readline-6.1.
+
+1. Changes to Readline
+
+a. Fixed a bug that caused the unconverted filename to be added to the list of
+ completions when the application specified filename conversion functions.
+
+b. Fixed a bug that caused the wrong filename to be passed to opendir when the
+ application has specified a filename dequoting function.
+
+c. Fixed a bug when repeating a character search in vi mode in the case where
+ there was no search to repeat.
+
+d. When show-all-if-ambiguous is set, the completion routines no longer insert
+ a common match prefix that is shorter than the text being completed.
+
+e. The full set of vi editing commands may now be used in callback mode.
+
+f. Fixed a bug that caused readline to not update its idea of the terminal
+ dimensions while running in `no-echo' mode.
+
+h. Fixed a bug that caused readline to dump core if an application called
+ rl_prep_terminal without setting rl_instream.
+
+i. Fixed a bug that caused meta-prefixed characters bound to incremental
+ search forward or backward to not be recognized if they were typed
+ subsequently.
+
+j. The incremental search code treats key sequences that map to the same
+ functions as (default) ^G, ^W, and ^Y as equivalent to those characters.
+
+k. Fixed a bug in menu-complete that caused it to misbehave with large
+ negative argument.
+
+l. Fixed a bug that caused vi-mode yank-last-arg to ring the bell when invoked
+ at the end of the line.
+
+m. Fixed a bug that made an explicit argument of 0 to yank-last-arg behave
+ as if it were a negative argument.
+
+n. Fixed a bug that caused directory names in words to be completed to not
+ be dequoted correctly.
+
+2. New Features in Readline
+
+a. The history library does not try to write the history filename in the
+ current directory if $HOME is unset. This closes a potential security
+ problem if the application does not specify a history filename.
+
+b. New bindable variable `completion-display-width' to set the number of
+ columns used when displaying completions.
+
+c. New bindable variable `completion-case-map' to cause case-insensitive
+ completion to treat `-' and `_' as identical.
+
+d. There are new bindable vi-mode command names to avoid readline's case-
+ insensitive matching not allowing them to be bound separately.
+
+e. New bindable variable `menu-complete-display-prefix' causes the menu
+ completion code to display the common prefix of the possible completions
+ before cycling through the list, instead of after.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-6.1,
+and the previous version, readline-6.0.
+
+1. Changes to Readline
+
+a. The SIGWINCH signal handler now avoids calling the redisplay code if
+ one arrives while in the middle of redisplay.
+
+b. Changes to the timeout code to make sure that timeout values greater
+ than one second are handled better.
+
+c. Fixed a bug in the redisplay code that was triggered by a prompt
+ containing invisible characters exactly the width of the screen.
+
+d. Fixed a bug in the redisplay code encountered when running in horizontal
+ scroll mode.
+
+e. Fixed a bug that prevented menu completion from properly completing
+ filenames.
+
+f. Fixed a redisplay bug caused by a multibyte character causing a line to
+ wrap.
+
+g. Fixed a bug that caused key sequences of two characters to not be
+ recognized when a longer sequence identical in the first two characters
+ was bound.
+
+h. Fixed a bug that caused history expansion to be attempted on $'...'
+ single-quoted strings.
+
+i. Fixed a bug that caused incorrect redisplay when the prompt contained
+ multibyte characters in an `invisible' sequence bracketed by \[ and
+ \].
+
+j. Fixed a bug that caused history expansion to short-circuit after
+ encountering a multibyte character.
+
+k. Fixed a bug that caused applications using the callback interface to not
+ react to SIGINT (or other signals) until another character arrived.
+
+2. New Features in Readline
+
+a. New bindable function: menu-complete-backward.
+
+b. In the vi insertion keymap, C-n is now bound to menu-complete by default,
+ and C-p to menu-complete-backward.
+
+c. When in vi command mode, repeatedly hitting ESC now does nothing, even
+ when ESC introduces a bound key sequence. This is closer to how
+ historical vi behaves.
+
+d. New bindable function: skip-csi-sequence. Can be used as a default to
+ consume key sequences generated by keys like Home and End without having
+ to bind all keys.
+
+e. New application-settable function: rl_filename_rewrite_hook. Can be used
+ to rewrite or modify filenames read from the file system before they are
+ compared to the word to be completed.
+
+f. New bindable variable: skip-completed-text, active when completing in the
+ middle of a word. If enabled, it means that characters in the completion
+ that match characters in the remainder of the word are "skipped" rather
+ than inserted into the line.
+
+g. The pre-readline-6.0 version of menu completion is available as
+ "old-menu-complete" for users who do not like the readline-6.0 version.
+
+h. New bindable variable: echo-control-characters. If enabled, and the
+ tty ECHOCTL bit is set, controls the echoing of characters corresponding
+ to keyboard-generated signals.
+
+i. New bindable variable: enable-meta-key. Controls whether or not readline
+ sends the smm/rmm sequences if the terminal indicates it has a meta key
+ that enables eight-bit characters.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-6.0,
+and the previous version, readline-5.2.
+
+1. Changes to Readline
+
+a. Fixed a number of redisplay errors in environments supporting multibyte
+ characters.
+
+b. Fixed bugs in vi command mode that caused motion commands to inappropriately
+ set the mark.
+
+c. When using the arrow keys in vi insertion mode, readline allows movement
+ beyond the current end of the line (unlike command mode).
+
+d. Fixed bugs that caused readline to loop when the terminal has been taken
+ away and reads return -1/EIO.
+
+e. Fixed bugs in redisplay occurring when displaying prompts containing
+ invisible characters.
+
+f. Fixed a bug that caused the completion append character to not be reset to
+ the default after an application-specified completion function changed it.
+
+g. Fixed a problem that caused incorrect positioning of the cursor while in
+ emacs editing mode when moving forward at the end of a line while using
+ a locale supporting multibyte characters.
+
+h. Fixed an off-by-one error that caused readline to drop every 511th
+ character of buffered input.
+
+i. Fixed a bug that resulted in SIGTERM not being caught or cleaned up.
+
+j. Fixed redisplay bugs caused by multiline prompts with invisible characters
+ or no characters following the final newline.
+
+k. Fixed redisplay bug caused by prompts consisting solely of invisible
+ characters.
+
+l. Fixed a bug in the code that buffers characters received very quickly in
+ succession which caused characters to be dropped.
+
+m. Fixed a bug that caused readline to reference uninitialized data structures
+ if it received a SIGWINCH before completing initialization.
+
+n. Fixed a bug that caused the vi-mode `last command' to be set incorrectly
+ and therefore unrepeatable.
+
+o. Fixed a bug that caused readline to disable echoing when it was being used
+ with an output file descriptor that was not a terminal.
+
+p. Readline now blocks SIGINT while manipulating internal data structures
+ during redisplay.
+
+q. Fixed a bug in redisplay that caused readline to segfault when pasting a
+ very long line (over 130,000 characters).
+
+r. Fixed bugs in redisplay when using prompts with no visible printing
+ characters.
+
+s. Fixed a bug that caused redisplay errors when using prompts with invisible
+ characters and numeric arguments to a command in a multibyte locale.
+
+t. Fixed a bug that caused redisplay errors when using prompts with invisible
+ characters spanning more than two physical screen lines.
+
+2. New Features in Readline
+
+a. A new variable, rl_sort_completion_matches; allows applications to inhibit
+ match list sorting (but beware: some things don't work right if
+ applications do this).
+
+b. A new variable, rl_completion_invoking_key; allows applications to discover
+ the key that invoked rl_complete or rl_menu_complete.
+
+c. The functions rl_block_sigint and rl_release_sigint are now public and
+ available to calling applications who want to protect critical sections
+ (like redisplay).
+
+d. The functions rl_save_state and rl_restore_state are now public and
+ available to calling applications; documented rest of readline's state
+ flag values.
+
+e. A new user-settable variable, `history-size', allows setting the maximum
+ number of entries in the history list.
+
+f. There is a new implementation of menu completion, with several improvements
+ over the old; the most notable improvement is a better `completions
+ browsing' mode.
+
+g. The menu completion code now uses the rl_menu_completion_entry_function
+ variable, allowing applications to provide their own menu completion
+ generators.
+
+h. There is support for replacing a prefix of a pathname with a `...' when
+ displaying possible completions. This is controllable by setting the
+ `completion-prefix-display-length' variable. Matches with a common prefix
+ longer than this value have the common prefix replaced with `...'.
+
+i. There is a new `revert-all-at-newline' variable. If enabled, readline will
+ undo all outstanding changes to all history lines when `accept-line' is
+ executed.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-5.2,
+and the previous version, readline-5.1.
+
+1. Changes to Readline
+
+a. Fixed a problem that caused segmentation faults when using readline in
+ callback mode and typing consecutive DEL characters on an empty line.
+
+b. Fixed several redisplay problems with multibyte characters, all having to
+ do with the different code paths and variable meanings between single-byte
+ and multibyte character redisplay.
+
+c. Fixed a problem with key sequence translation when presented with the
+ sequence \M-\C-x.
+
+d. Fixed a problem that prevented the `a' command in vi mode from being
+ undone and redone properly.
+
+e. Fixed a problem that prevented empty inserts in vi mode from being undone
+ properly.
+
+f. Fixed a problem that caused readline to initialize with an incorrect idea
+ of whether or not the terminal can autowrap.
+
+g. Fixed output of key bindings (like bash `bind -p') to honor the setting of
+ convert-meta and use \e where appropriate.
+
+h. Changed the default filename completion function to call the filename
+ dequoting function if the directory completion hook isn't set. This means
+ that any directory completion hooks need to dequote the directory name,
+ since application-specific hooks need to know how the word was quoted,
+ even if no other changes are made.
+
+i. Fixed a bug with creating the prompt for a non-interactive search string
+ when there are non-printing characters in the primary prompt.
+
+j. Fixed a bug that caused prompts with invisible characters to be redrawn
+ multiple times in a multibyte locale.
+
+k. Fixed a bug that could cause the key sequence scanning code to return the
+ wrong function.
+
+l. Fixed a problem with the callback interface that caused it to fail when
+ using multi-character keyboard macros.
+
+m. Fixed a bug that could cause a core dump when an edited history entry was
+ re-executed under certain conditions.
+
+n. Fixed a bug that caused readline to reference freed memory when attmpting
+ to display a portion of the prompt.
+
+o. Fixed a bug with prompt redisplay in a multi-byte locale to avoid redrawing
+ the prompt and input line multiple times.
+
+p. Fixed history expansion to not be confused by here-string redirection.
+
+q. Readline no longer treats read errors by converting them to newlines, as
+ it does with EOF. This caused partial lines to be returned from readline().
+
+r. Fixed a redisplay bug that occurred in multibyte-capable locales when the
+ prompt was one character longer than the screen width.
+
+2. New Features in Readline
+
+a. Calling applications can now set the keyboard timeout to 0, allowing
+ poll-like behavior.
+
+b. The value of SYS_INPUTRC (configurable at compilation time) is now used as
+ the default last-ditch startup file.
+
+c. The history file reading functions now allow windows-like \r\n line
+ terminators.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-5.1,
+and the previous version, readline-5.0.
+
+1. Changes to Readline
+
+a. Fixed a bug that caused multiliine prompts to be wrapped and displayed
+ incorrectly.
+
+b. Fixed a bug that caused ^P/^N in emacs mode to fail to display the current
+ line correctly.
+
+c. Fixed a problem in computing the number of invisible characters on the first
+ line of a prompt whose length exceeds the screen width.
+
+d. Fixed vi-mode searching so that failure preserves the current line rather
+ than the last line in the history list.
+
+e. Fixed the vi-mode `~' command (change-case) to have the correct behavior at
+ end-of-line when manipulating multibyte characters.
+
+f. Fixed the vi-mode `r' command (change-char) to have the correct behavior at
+ end-of-line when manipulating multibyte characters.
+
+g. Fixed multiple bugs in the redisplay of multibyte characters: displaying
+ prompts longer than the screen width containing multibyte characters,
+
+h. Fix the calculation of the number of physical characters in the prompt
+ string when it contains multibyte characters.
+
+i. A non-zero value for the `rl_complete_suppress_append' variable now causes
+ no `/' to be appended to a directory name.
+
+j. Fixed forward-word and backward-word to work when words contained
+ multibyte characters.
+
+k. Fixed a bug in finding the delimiter of a `?' substring when performing
+ history expansion in a locale that supports multibyte characters.
+
+l. Fixed a memory leak caused by not freeing the timestamp in a history entry.
+
+m. Fixed a bug that caused "\M-x" style key bindings to not obey the setting
+ of the `convert-meta' variable.
+
+n. Fixed saving and restoring primary prompt when prompting for incremental
+ and non-incremental searches; search prompts now display multibyte
+ characters correctly.
+
+o. Fixed a bug that caused keys originally bound to self-insert but shadowed
+ by a multi-character key sequence to not be inserted.
+
+p. Fixed code so rl_prep_term_function and rl_deprep_term_function aren't
+ dereferenced if NULL (matching the documentation).
+
+q. Extensive changes to readline to add enough state so that commands
+ requiring additional characters (searches, multi-key sequences, numeric
+ arguments, commands requiring an additional specifier character like
+ vi-mode change-char, etc.) work without synchronously waiting for
+ additional input.
+
+r. Lots of changes so readline builds and runs on MinGW.
+
+s. Readline no longer tries to modify the terminal settings when running in
+ callback mode.
+
+t. The Readline display code no longer sets the location of the last invisible
+ character in the prompt if the \[\] sequence is empty.
+
+u. The `change-case' command now correctly changes the case of multibyte
+ characters.
+
+v. Changes to the shared library construction scripts to deal with Windows
+ DLL naming conventions for Cygwin.
+
+w. Fixed the redisplay code to avoid core dumps resulting from a poorly-timed
+ SIGWINCH.
+
+x. Fixed the non-incremental search code in vi mode to dispose of any current
+ undo list when copying a line from the history into the current editing
+ buffer.
+
+y. Fixed a bug that caused reversing the incremental search direction to
+ not work correctly.
+
+z. Fixed the vi-mode `U' command to only undo up to the first time insert mode
+ was entered, as Posix specifies.
+
+aa. Fixed a bug in the vi-mode `r' command that left the cursor in the wrong
+ place.
+
+bb. Fixed a redisplay bug caused by moving the cursor vertically to a line
+ with invisible characters in the prompt in a multibyte locale.
+
+cc. Fixed a bug that could cause the terminal special chars to be bound in the
+ wrong keymap in vi mode.
+
+2. New Features in Readline
+
+a. The key sequence sent by the keypad `delete' key is now automatically
+ bound to delete-char.
+
+b. A negative argument to menu-complete now cycles backward through the
+ completion list.
+
+c. A new bindable readline variable: bind-tty-special-chars. If non-zero,
+ readline will bind the terminal special characters to their readline
+ equivalents when it's called (on by default).
+
+d. New bindable command: vi-rubout. Saves deleted text for possible
+ reinsertion, as with any vi-mode `text modification' command; `X' is bound
+ to this in vi command mode.
+
+e. If the rl_completion_query_items is set to a value < 0, readline never
+ asks the user whether or not to view the possible completions.
+
+f. The `C-w' binding in incremental search now understands multibyte
+ characters.
+
+g. New application-callable auxiliary function, rl_variable_value, returns
+ a string corresponding to a readline variable's value.
+
+h. When parsing inputrc files and variable binding commands, the parser
+ strips trailing whitespace from values assigned to boolean variables
+ before checking them.
+
+i. A new external application-controllable variable that allows the LINES
+ and COLUMNS environment variables to set the window size regardless of
+ what the kernel returns.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-5.0,
+and the previous version, readline-4.3.
+
+1. Changes to Readline
+
+a. Fixes to avoid core dumps because of null pointer references in the
+ multibyte character code.
+
+b. Fix to avoid infinite recursion caused by certain key combinations.
+
+c. Fixed a bug that caused the vi-mode `last command' to be set incorrectly.
+
+d. Readline no longer tries to read ahead more than one line of input, even
+ when more is available.
+
+e. Fixed the code that adjusts the point to not mishandle null wide
+ characters.
+
+f. Fixed a bug in the history expansion `g' modifier that caused it to skip
+ every other match.
+
+g. Fixed a bug that caused the prompt to overwrite previous output when the
+ output doesn't contain a newline and the locale supports multibyte
+ characters. This same change fixes the problem of readline redisplay
+ slowing down dramatically as the line gets longer in multibyte locales.
+
+h. History traversal with arrow keys in vi insertion mode causes the cursor
+ to be placed at the end of the new line, like in emacs mode.
+
+i. The locale initialization code does a better job of using the right
+ precedence and defaulting when checking the appropriate environment
+ variables.
+
+j. Fixed the history word tokenizer to handle <( and >( better when used as
+ part of bash.
+
+k. The overwrite mode code received several bug fixes to improve undo.
+
+l. Many speedups to the multibyte character redisplay code.
+
+m. The callback character reading interface should not hang waiting to read
+ keyboard input.
+
+n. Fixed a bug with redoing vi-mode `s' command.
+
+o. The code that initializes the terminal tracks changes made to the terminal
+ special characters with stty(1) (or equivalent), so that these changes
+ are reflected in the readline bindings. New application-callable function
+ to make it work: rl_tty_unset_default_bindings().
+
+p. Fixed a bug that could cause garbage to be inserted in the buffer when
+ changing character case in vi mode when using a multibyte locale.
+
+q. Fixed a bug in the redisplay code that caused problems on systems
+ supporting multibyte characters when moving between history lines when the
+ new line has more glyphs but fewer bytes.
+
+r. Undo and redo now work better after exiting vi insertion mode.
+
+s. Make sure system calls are restarted after a SIGWINCH is received using
+ SA_RESTART.
+
+t. Improvements to the code that displays possible completions when using
+ multibyte characters.
+
+u. Fixed a problem when parsing nested if statements in inputrc files.
+
+v. The completer now takes multibyte characters into account when looking for
+ quoted substrings on which to perform completion.
+
+w. The history search functions now perform better bounds checking on the
+ history list.
+
+x. Change to history expansion functions to treat `^' as equivalent to word
+ one, as the documentation states.
+
+y. Some changes to the display code to improve display and redisplay of
+ multibyte characters.
+
+z. Changes to speed up the multibyte character redisplay code.
+
+aa. Fixed a bug in the vi-mode `E' command that caused it to skip over the
+ last character of a word if invoked while point was on the word's
+ next-to-last character.
+
+bb. Fixed a bug that could cause incorrect filename quoting when
+ case-insensitive completion was enabled and the word being completed
+ contained backslashes quoting word break characters.
+
+cc. Fixed a bug in redisplay triggered when the prompt string contains
+ invisible characters.
+
+dd. Fixed some display (and other) bugs encountered in multibyte locales
+ when a non-ascii character was the last character on a line.
+
+ee. Fixed some display bugs caused by multibyte characters in prompt strings.
+
+ff. Fixed a problem with history expansion caused by non-whitespace characters
+ used as history word delimiters.
+
+gg. Fixed a problem that could cause readline to refer to freed memory when
+ moving between history lines while doing searches.
+
+hh. Improvements to the code that expands and displays prompt strings
+ containing multibyte characters.
+
+ii. Fixed a problem with vi-mode not correctly remembering the numeric argument
+ to the last `c'hange command for later use with `.'.
+
+jj. Fixed a bug in vi-mode that caused multi-digit count arguments to work
+ incorrectly.
+
+kk. Fixed a problem in vi-mode that caused the last text modification command
+ to not be remembered across different command lines.
+
+ll. Fixed problems with changing characters and changing case at the end of
+ the line.
+
+mm. Fixed a problem with readline saving the contents of the current line
+ before beginning a non-interactive search.
+
+nn. Fixed a problem with EOF detection when using rl_event_hook.
+
+oo. Fixed a problem with the vi mode `p' and `P' commands ignoring numeric
+ arguments.
+
+2. New Features in Readline
+
+a. History expansion has a new `a' modifier equivalent to the `g' modifier
+ for compatibility with the BSD csh.
+
+b. History expansion has a new `G' modifier equivalent to the BSD csh `g'
+ modifier, which performs a substitution once per word.
+
+c. All non-incremental search operations may now undo the operation of
+ replacing the current line with the history line.
+
+d. The text inserted by an `a' command in vi mode can be reinserted with
+ `.'.
+
+e. New bindable variable, `show-all-if-unmodified'. If set, the readline
+ completer will list possible completions immediately if there is more
+ than one completion and partial completion cannot be performed.
+
+f. There is a new application-callable `free_history_entry()' function.
+
+g. History list entries now contain timestamp information; the history file
+ functions know how to read and write timestamp information associated
+ with each entry.
+
+h. Four new key binding functions have been added:
+
+ rl_bind_key_if_unbound()
+ rl_bind_key_if_unbound_in_map()
+ rl_bind_keyseq_if_unbound()
+ rl_bind_keyseq_if_unbound_in_map()
+
+i. New application variable, rl_completion_quote_character, set to any
+ quote character readline finds before it calls the application completion
+ function.
+
+j. New application variable, rl_completion_suppress_quote, settable by an
+ application completion function. If set to non-zero, readline does not
+ attempt to append a closing quote to a completed word.
+
+k. New application variable, rl_completion_found_quote, set to a non-zero
+ value if readline determines that the word to be completed is quoted.
+ Set before readline calls any application completion function.
+
+l. New function hook, rl_completion_word_break_hook, called when readline
+ needs to break a line into words when completion is attempted. Allows
+ the word break characters to vary based on position in the line.
+
+m. New bindable command: unix-filename-rubout. Does the same thing as
+ unix-word-rubout, but adds `/' to the set of word delimiters.
+
+n. When listing completions, directories have a `/' appended if the
+ `mark-directories' option has been enabled.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-4.3,
+and the previous version, readline-4.2a.
+
+1. Changes to Readline
+
+a. Fixed output of comment-begin character when listing variable values.
+
+b. Added some default key bindings for common escape sequences produced by
+ HOME and END keys.
+
+c. Fixed the mark handling code to be more emacs-compatible.
+
+d. A bug was fixed in the code that prints possible completions to keep it
+ from printing empty strings in certain circumstances.
+
+e. Change the key sequence printing code to print ESC as M\- if ESC is a
+ meta-prefix character -- it's easier for users to understand than \e.
+
+f. Fixed unstifle_history() to return values that match the documentation.
+
+g. Fixed the event loop (rl_event_hook) to handle the case where the input
+ file descriptor is invalidated.
+
+h. Fixed the prompt display code to work better when the application has a
+ custom redisplay function.
+
+i. Changes to make reading and writing the history file a little faster, and
+ to cope with huge history files without calling abort(3) from xmalloc.
+
+j. The vi-mode `S' and `s' commands are now undone correctly.
+
+k. Fixed a problem which caused the display to be messed up when the last
+ line of a multi-line prompt (possibly containing invisible characters)
+ was longer than the screen width.
+
+2. New Features in Readline
+
+a. Support for key `subsequences': allows, e.g., ESC and ESC-a to both
+ be bound to readline functions. Now the arrow keys may be used in vi
+ insert mode.
+
+b. When listing completions, and the number of lines displayed is more than
+ the screen length, readline uses an internal pager to display the results.
+ This is controlled by the `page-completions' variable (default on).
+
+c. New code to handle editing and displaying multibyte characters.
+
+d. The behavior introduced in bash-2.05a of deciding whether or not to
+ append a slash to a completed name that is a symlink to a directory has
+ been made optional, controlled by the `mark-symlinked-directories'
+ variable (default is the 2.05a behavior).
+
+e. The `insert-comment' command now acts as a toggle if given a numeric
+ argument: if the first characters on the line don't specify a
+ comment, insert one; if they do, delete the comment text
+
+f. New application-settable completion variable:
+ rl_completion_mark_symlink_dirs, allows an application's completion
+ function to temporarily override the user's preference for appending
+ slashes to names which are symlinks to directories.
+
+g. New function available to application completion functions:
+ rl_completion_mode, to tell how the completion function was invoked
+ and decide which argument to supply to rl_complete_internal (to list
+ completions, etc.).
+
+h. Readline now has an overwrite mode, toggled by the `overwrite-mode'
+ bindable command, which could be bound to `Insert'.
+
+i. New application-settable completion variable:
+ rl_completion_suppress_append, inhibits appending of
+ rl_completion_append_character to completed words.
+
+j. New key bindings when reading an incremental search string: ^W yanks
+ the currently-matched word out of the current line into the search
+ string; ^Y yanks the rest of the current line into the search string,
+ DEL or ^H deletes characters from the search string.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-4.2a,
+and the previous version, readline-4.2.
+
+1. Changes to Readline
+
+a. More `const' and type casting fixes.
+
+b. Changed rl_message() to use vsnprintf(3) (if available) to fix buffer
+ overflow problems.
+
+c. The completion code no longer appends a `/' or ` ' to a match when
+ completing a symbolic link that resolves to a directory name, unless
+ the match does not add anything to the word being completed. This
+ means that a tab will complete the word up to the full name, but not
+ add anything, and a subsequent tab will add a slash.
+
+d. Fixed a trivial typo that made the vi-mode `dT' command not work.
+
+e. Fixed the tty code so that ^S and ^Q can be inserted with rl_quoted_insert.
+
+f. Fixed the tty code so that ^V works more than once.
+
+g. Changed the use of __P((...)) for function prototypes to PARAMS((...))
+ because the use of __P in typedefs conflicted g++ and glibc.
+
+h. The completion code now attempts to do a better job of preserving the
+ case of the word the user typed if ignoring case in completions.
+
+i. Readline defaults to not echoing the input and lets the terminal
+ initialization code enable echoing if there is a controlling terminal.
+
+j. The key binding code now processes only two hex digits after a `\x'
+ escape sequence, and the documentation was changed to note that the
+ octal and hex escape sequences result in an eight-bit value rather
+ than strict ASCII.
+
+k. Fixed a few places where negative array subscripts could have occurred.
+
+l. Fixed the vi-mode code to use a better method to determine the bounds of
+ the array used to hold the marks, and to avoid out-of-bounds references.
+
+m. Fixed the defines in chardefs.h to work better when chars are signed.
+
+n. Fixed configure.in to use the new names for bash autoconf macros.
+
+o. Readline no longer attempts to define its own versions of some ctype
+ macros if they are implemented as functions in libc but not as macros in
+ <ctype.h>.
+
+p. Fixed a problem where rl_backward could possibly set point to before
+ the beginning of the line.
+
+q. Fixed Makefile to not put -I/usr/include into CFLAGS, since it can cause
+ include file problems.
+
+2. New Features in Readline
+
+a. Added extern declaration for rl_get_termcap to readline.h, making it a
+ public function (it was always there, just not in readline.h).
+
+b. New #defines in readline.h: RL_READLINE_VERSION, currently 0x0402,
+ RL_VERSION_MAJOR, currently 4, and RL_VERSION_MINOR, currently 2.
+
+c. New readline variable: rl_readline_version, mirrors RL_READLINE_VERSION.
+
+d. New bindable boolean readline variable: match-hidden-files. Controls
+ completion of files beginning with a `.' (on Unix). Enabled by default.
+
+e. The history expansion code now allows any character to terminate a
+ `:first-' modifier, like csh.
+
+f. The incremental search code remembers the last search string and uses
+ it if ^R^R is typed without a search string.
+
+h. New bindable variable `history-preserve-point'. If set, the history
+ code attempts to place the user at the same location on each history
+ line retrieved with previous-history or next-history.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-4.2,
+and the previous version, readline-4.1.
+
+1. Changes to Readline
+
+a. When setting the terminal attributes on systems using `struct termio',
+ readline waits for output to drain before changing the attributes.
+
+b. A fix was made to the history word tokenization code to avoid attempts to
+ dereference a null pointer.
+
+c. Readline now defaults rl_terminal_name to $TERM if the calling application
+ has left it unset, and tries to initialize with the resultant value.
+
+d. Instead of calling (*rl_getc_function)() directly to get input in certain
+ places, readline now calls rl_read_key() consistently.
+
+e. Fixed a bug in the completion code that allowed a backslash to quote a
+ single quote inside a single-quoted string.
+
+f. rl_prompt is no longer assigned directly from the argument to readline(),
+ but uses memory allocated by readline. This allows constant strings to
+ be passed to readline without problems arising when the prompt processing
+ code wants to modify the string.
+
+g. Fixed a bug that caused non-interactive history searches to return the
+ wrong line when performing multiple searches backward for the same string.
+
+h. Many variables, function arguments, and function return values are now
+ declared `const' where appropriate, to improve behavior when linking with
+ C++ code.
+
+i. The control character detection code now works better on systems where
+ `char' is unsigned by default.
+
+j. The vi-mode numeric argument is now capped at 999999, just like emacs mode.
+
+k. The Function, CPFunction, CPPFunction, and VFunction typedefs have been
+ replaced with a set of specific prototyped typedefs, though they are
+ still in the readline header files for backwards compatibility.
+
+m. Nearly all of the (undocumented) internal global variables in the library
+ now have an _rl_ prefix -- there were a number that did not, like
+ screenheight, screenwidth, alphabetic, etc.
+
+n. The ding() convenience function has been renamed to rl_ding(), though the
+ old function is still defined for backwards compatibility.
+
+o. The completion convenience functions filename_completion_function,
+ username_completion_function, and completion_matches now have an rl_
+ prefix, though the old names are still defined for backwards compatibility.
+
+p. The functions shared by readline and bash (linkage is satisfied from bash
+ when compiling with bash, and internally otherwise) now have an sh_ prefix.
+
+q. Changed the shared library creation procedure on Linux and BSD/OS 4.x so
+ that the `soname' contains only the major version number rather than the
+ major and minor numbers.
+
+r. Fixed a redisplay bug that occurred when the prompt spanned more than one
+ physical line and contained invisible characters.
+
+s. Added a missing `includedir' variable to the Makefile.
+
+t. When installing the shared libraries, make sure symbolic links are relative.
+
+u. Added configure test so that it can set `${MAKE}' appropriately.
+
+v. Fixed a bug in rl_forward that could cause the point to be set to before
+ the beginning of the line in vi mode.
+
+w. Fixed a bug in the callback read-char interface to make it work when a
+ readline function pushes some input onto the input stream with
+ rl_execute_next (like the incremental search functions).
+
+x. Fixed a file descriptor leak in the history file manipulation code that
+ was tripped when attempting to truncate a non-regular file (like
+ /dev/null).
+
+y. Changes to make all of the exported readline functions declared in
+ readline.h have an rl_ prefix (rltty_set_default_bindings is now
+ rl_tty_set_default_bindings, crlf is now rl_crlf, etc.)
+
+z. The formatted documentation included in the base readline distribution
+ is no longer removed on a `make distclean'.
+
+aa. Some changes were made to avoid gcc warnings with -Wall.
+
+bb. rl_get_keymap_by_name now finds keymaps case-insensitively, so
+ `set keymap EMACS' works.
+
+cc. The history file writing and truncation functions now return a useful
+ status on error.
+
+dd. Fixed a bug that could cause applications to dereference a NULL pointer
+ if a NULL second argument was passed to history_expand().
+
+ee. If a hook function assigned to rl_event_hook sets rl_done to a non-zero
+ value, rl_read_key() now immediately returns '\n' (which is assumed to
+ be bound to accept-line).
+
+2. New Features in Readline
+
+a. The blink timeout for paren matching is now settable by applications,
+ via the rl_set_paren_blink_timeout() function.
+
+b. _rl_executing_macro has been renamed to rl_executing_macro, which means
+ it's now part of the public interface.
+
+c. Readline has a new variable, rl_readline_state, which is a bitmap that
+ encapsulates the current state of the library; intended for use by
+ callbacks and hook functions.
+
+d. rlfe has a new -l option to log input and output (-a appends to logfile),
+ a new -n option to set the readline application name, and -v and -h
+ options for version and help information.
+
+e. rlfe can now perform filename completion for the inferior process if the
+ OS has a /proc/<PID>/cwd that can be read with readlink(2) to get the
+ inferior's current working directory.
+
+f. A new file, rltypedefs.h, contains the new typedefs for function pointers
+ and is installed by `make install'.
+
+g. New application-callable function rl_set_prompt(const char *prompt):
+ expands its prompt string argument and sets rl_prompt to the result.
+
+h. New application-callable function rl_set_screen_size(int rows, int cols):
+ public method for applications to set readline's idea of the screen
+ dimensions.
+
+i. The history example program (examples/histexamp.c) is now built as one
+ of the examples.
+
+j. The documentation has been updated to cover nearly all of the public
+ functions and variables declared in readline.h.
+
+k. New function, rl_get_screen_size (int *rows, int *columns), returns
+ readline's idea of the screen dimensions.
+
+l. The timeout in rl_gather_tyi (readline keyboard input polling function)
+ is now settable via a function (rl_set_keyboard_input_timeout()).
+
+m. Renamed the max_input_history variable to history_max_entries; the old
+ variable is maintained for backwards compatibility.
+
+n. The list of characters that separate words for the history tokenizer is
+ now settable with a variable: history_word_delimiters. The default
+ value is as before.
+
+o. There is a new history.3 manual page documenting the history library.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-4.1,
+and the previous version, readline-4.0.
+
+1. Changes to Readline
+
+a. Changed the HTML documents so that the table-of-contents is no longer
+ a separate file.
+
+b. Changes to the shared object configuration for: Irix 5.x, Irix 6.x,
+ OSF/1.
+
+c. The shared library major and minor versions are now constructed
+ automatically by configure and substituted into the makefiles.
+
+d. It's now possible to install the shared libraries separately from the
+ static libraries.
+
+e. The history library tries to truncate the history file only if it is a
+ regular file.
+
+f. A bug that caused _rl_dispatch to address negative array indices on
+ systems with signed chars was fixed.
+
+g. rl-yank-nth-arg now leaves the history position the same as when it was
+ called.
+
+h. Changes to the completion code to handle MS-DOS drive-letter:pathname
+ filenames.
+
+i. Completion is now case-insensitive by default on MS-DOS.
+
+j. Fixes to the history file manipulation code for MS-DOS.
+
+k. Readline attempts to bind the arrow keys to appropriate defaults on MS-DOS.
+
+l. Some fixes were made to the redisplay code for better operation on MS-DOS.
+
+m. The quoted-insert code will now insert tty special chars like ^C.
+
+n. A bug was fixed that caused the display code to reference memory before
+ the start of the prompt string.
+
+o. More support for __EMX__ (OS/2).
+
+p. A bug was fixed in readline's signal handling that could cause infinite
+ recursion in signal handlers.
+
+q. A bug was fixed that caused the point to be less than zero when rl_forward
+ was given a very large numeric argument.
+
+r. The vi-mode code now gets characters via the application-settable value
+ of rl_getc_function rather than calling rl_getc directly.
+
+s. The history file code now uses O_BINARY mode when reading and writing
+ the history file on cygwin32.
+
+t. Fixed a bug in the redisplay code for lines with more than 256 line
+ breaks.
+
+u. A bug was fixed which caused invisible character markers to not be
+ stripped from the prompt string if the terminal was in no-echo mode.
+
+v. Readline no longer tries to get the variables it needs for redisplay
+ from the termcap entry if the calling application has specified its
+ own redisplay function. Readline treats the terminal as `dumb' in
+ this case.
+
+w. Fixes to the SIGWINCH code so that a multiple-line prompt with escape
+ sequences is redrawn correctly.
+
+x. Changes to the install and install-shared targets so that the libraries
+ and header files are installed separately.
+
+2. New Features in Readline
+
+a. A new Readline `user manual' is in doc/rluserman.texinfo.
+
+b. Parentheses matching is now always compiled into readline, and enabled
+ or disabled when the value of the `blink-matching-paren' variable is
+ changed.
+
+c. MS-DOS systems now use ~/_inputrc as the last-ditch inputrc filename.
+
+d. MS-DOS systems now use ~/_history as the default history file.
+
+e. history-search-{forward,backward} now leave the point at the end of the
+ line when the string to search for is empty, like
+ {reverse,forward}-search-history.
+
+f. history-search-{forward,backward} now leave the last history line found
+ in the readline buffer if the second or subsequent search fails.
+
+g. New function for use by applications: rl_on_new_line_with_prompt, used
+ when an application displays the prompt itself before calling readline().
+
+h. New variable for use by applications: rl_already_prompted. An application
+ that displays the prompt itself before calling readline() must set this to
+ a non-zero value.
+
+i. A new variable, rl_gnu_readline_p, always 1. The intent is that an
+ application can verify whether or not it is linked with the `real'
+ readline library or some substitute.
+
+j. Per Bothner's `rlfe' (pronounced `Ralphie') readline front-end program
+ is included in the examples subdirectory, though it is not built
+ by default.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-4.0,
+and the previous version, readline-2.2.
+
+1. Changes to Readline
+
+a. The version number is now 4.0, to match the major and minor version
+ numbers on the shared readline and history libraries. Future
+ releases will maintain the identical numbering.
+
+b. Fixed a typo in the `make install' recipe that copied libreadline.a
+ to libhistory.old right after installing it.
+
+c. The readline and history info files are now installed out of the source
+ directory if they are not found in the build directory.
+
+d. The library no longer exports a function named `savestring' -- backwards
+ compatibility be damned.
+
+e. There is no longer any #ifdef SHELL code in the source files.
+
+f. Some changes were made to the key binding code to fix memory leaks and
+ better support Win32 systems.
+
+g. Fixed a silly typo in the paren matching code -- it's microseconds, not
+ milliseconds.
+
+h. The readline library should be compilable by C++ compilers.
+
+i. The readline.h public header file now includes function prototypes for
+ all readline functions, and some changes were made to fix errors in the
+ source files uncovered by the use of prototypes.
+
+j. The maximum numeric argument is now clamped at 1000000.
+
+k. Fixes to rl_yank_last_arg to make it behave better.
+
+l. Fixed a bug in the display code that caused core dumps if the prompt
+ string length exceeded 1024 characters.
+
+m. The menu completion code was fixed to properly insert a single completion
+ if there is only one match.
+
+n. A bug was fixed that caused the display code to improperly display tabs
+ after newlines.
+
+o. A fix was made to the completion code in which a typo caused the wrong
+ value to be passed to the function that computed the longest common
+ prefix of the list of matches.
+
+p. The completion code now checks the value of rl_filename_completion_desired,
+ which is set by application-supplied completion functions to indicate
+ that filename completion is being performed, to decide whether or not to
+ call an application-supplied `ignore completions' function.
+
+q. Code was added to the history library to catch history substitutions
+ using `&' without a previous history substitution or search having been
+ performed.
+
+
+2. New Features in Readline
+
+a. There is a new script, support/shobj-conf, to do system-specific shared
+ object and library configuration. It generates variables for configure
+ to substitute into makefiles. The README file provides a detailed
+ explanation of the shared library creation process.
+
+b. Shared libraries and objects are now built in the `shlib' subdirectory.
+ There is a shlib/Makefile.in to control the build process. `make shared'
+ from the top-level directory is still the right way to build shared
+ versions of the libraries.
+
+c. rlconf.h is now installed, so applications can find out which features
+ have been compiled into the installed readline and history libraries.
+
+d. rlstdc.h is now an installed header file.
+
+e. Many changes to the signal handling:
+ o Readline now catches SIGQUIT and cleans up the tty before returning;
+ o A new variable, rl_catch_signals, is available to application writers
+ to indicate to readline whether or not it should install its own
+ signal handlers for SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP,
+ SIGTTIN, and SIGTTOU;
+ o A new variable, rl_catch_sigwinch, is available to application
+ writers to indicate to readline whether or not it should install its
+ own signal handler for SIGWINCH, which will chain to the calling
+ applications's SIGWINCH handler, if one is installed;
+ o There is a new function, rl_free_line_state, for application signal
+ handlers to call to free up the state associated with the current
+ line after receiving a signal;
+ o There is a new function, rl_cleanup_after_signal, to clean up the
+ display and terminal state after receiving a signal;
+ o There is a new function, rl_reset_after_signal, to reinitialize the
+ terminal and display state after an application signal handler
+ returns and readline continues
+
+f. There is a new function, rl_resize_terminal, to reset readline's idea of
+ the screen size after a SIGWINCH.
+
+g. New public functions: rl_save_prompt and rl_restore_prompt. These were
+ previously private functions with a `_' prefix. These functions are
+ used when an application wants to write a message to the `message area'
+ with rl_message and have the prompt restored correctly when the message
+ is erased.
+
+h. New function hook: rl_pre_input_hook, called just before readline starts
+ reading input, after initialization.
+
+i. New function hook: rl_display_matches_hook, called when readline would
+ display the list of completion matches. The new function
+ rl_display_match_list is what readline uses internally, and is available
+ for use by application functions called via this hook.
+
+j. New bindable function, delete-char-or-list, like tcsh.
+
+k. A new variable, rl_erase_empty_line, which, if set by an application using
+ readline, will cause readline to erase, prompt and all, lines on which the
+ only thing typed was a newline.
+
+l. There is a new script, support/shlib-install, to install and uninstall
+ the shared readline and history libraries.
+
+m. A new bindable variable, `isearch-terminators', which is a string
+ containing the set of characters that should terminate an incremental
+ search without being executed as a command.
+
+n. A new bindable function, forward-backward-delete-char.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-2.2,
+and the previous version, readline-2.1.
+
+1. Changes to Readline
+
+a. Added a missing `extern' to a declaration in readline.h that kept
+ readline from compiling cleanly on some systems.
+
+b. The history file is now opened with mode 0600 when it is written for
+ better security.
+
+c. Changes were made to the SIGWINCH handling code so that prompt redisplay
+ is done better.
+
+d. ^G now interrupts incremental searches correctly.
+
+e. A bug that caused a core dump when the set of characters to be quoted
+ when completing words was empty was fixed.
+
+f. Fixed a problem in the readline test program rltest.c that caused a core
+ dump.
+
+g. The code that handles parser directives in inputrc files now displays
+ more error messages.
+
+h. The history expansion code was fixed so that the appearance of the
+ history comment character at the beginning of a word inhibits history
+ expansion for that word and the rest of the input line.
+
+i. The code that prints completion listings now behaves better if one or
+ more of the filenames contains non-printable characters.
+
+j. The time delay when showing matching parentheses is now 0.5 seconds.
+
+
+2. New Features in Readline
+
+a. There is now an option for `iterative' yank-last-arg handline, so a user
+ can keep entering `M-.', yanking the last argument of successive history
+ lines.
+
+b. New variable, `print-completions-horizontally', which causes completion
+ matches to be displayed across the screen (like `ls -x') rather than up
+ and down the screen (like `ls').
+
+c. New variable, `completion-ignore-case', which causes filename completion
+ and matching to be performed case-insensitively.
+
+d. There is a new bindable command, `magic-space', which causes history
+ expansion to be performed on the current readline buffer and a space to
+ be inserted into the result.
+
+e. There is a new bindable command, `menu-complete', which enables tcsh-like
+ menu completion (successive executions of menu-complete insert a single
+ completion match, cycling through the list of possible completions).
+
+f. There is a new bindable command, `paste-from-clipboard', for use on Win32
+ systems, to insert the text from the Win32 clipboard into the editing
+ buffer.
+
+g. The key sequence translation code now understands printf-style backslash
+ escape sequences, including \NNN octal escapes. These escape sequences
+ may be used in key sequence definitions or macro values.
+
+h. An `$include' inputrc file parser directive has been added.
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..293ef70
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,310 @@
+Basic Installation
+==================
+
+These are installation instructions for Readline-8.2.
+
+The simplest way to compile readline is:
+
+ 1. `cd' to the directory containing the readline source code and type
+ `./configure' to configure readline for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes some time. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile readline and build the static readline
+ and history libraries. If supported, the shared readline and history
+ libraries will be built also. See below for instructions on compiling
+ the other parts of the distribution. Typing `make everything' will
+ cause the static and shared libraries (if supported) and the example
+ programs to be built.
+
+ 3. Type `make install' to install the static readline and history
+ libraries, the readline include files, the documentation, and, if
+ supported, the shared readline and history libraries.
+
+ 4. You can remove the created libraries and object files from the
+ build directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile readline for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the readline developers, and should be used with care.
+
+The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It
+uses those values to create a `Makefile' in the build directory,
+and Makefiles in the `doc', `shlib', and `examples'
+subdirectories. It also creates a `config.h' file containing
+system-dependent definitions. Finally, it creates a shell script
+`config.status' that you can run in the future to recreate the
+current configuration, a file `config.cache' that saves the
+results of its tests to speed up reconfiguring, and a file
+`config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+If you need to do unusual things to compile readline, please try
+to figure out how `configure' could check whether to do them, and
+mail diffs or instructions to <bug-readline@gnu.org> so they can
+be considered for the next release. If at some point
+`config.cache' contains results you don't want to keep, you may
+remove or edit it.
+
+The file `configure.in' is used to create `configure' by a
+program called `autoconf'. You only need `configure.in' if you
+want to change it or regenerate `configure' using a newer version
+of `autoconf'. The readline `configure.in' requires autoconf
+version 2.69 or newer.
+
+Compilers and Options
+=====================
+
+Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+You can compile readline for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile readline for one architecture at a
+time in the source code directory. After you have installed
+readline for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+Installation Names
+==================
+
+By default, `make install' will install the readline libraries in
+`/usr/local/lib', the include files in
+`/usr/local/include/readline', the man pages in `/usr/local/man',
+and the info files in `/usr/local/info'. You can specify an
+installation prefix other than `/usr/local' by giving `configure'
+the option `--prefix=PATH' or by supplying a value for the
+DESTDIR variable when running `make install'.
+
+You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.
+If you give `configure' the option `--exec-prefix=PATH', the
+readline Makefiles will use PATH as the prefix for installing the
+libraries. Documentation and other data files will still use the
+regular prefix.
+
+Specifying the System Type
+==========================
+
+There may be some features `configure' can not figure out
+automatically, but need to determine by the type of host readline
+will run on. Usually `configure' can figure that out, but if it
+prints a message saying it can not guess the host type, give it
+the `--host=TYPE' option. TYPE can either be a short name for
+the system type, such as `sun4', or a canonical name with three
+fields: CPU-COMPANY-SYSTEM (e.g., i386-unknown-freebsd4.2).
+
+See the file `config.sub' for the possible values of each field.
+
+Sharing Defaults
+================
+
+If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: the readline `configure' looks for a site script, but not
+all `configure' scripts do.
+
+Operation Controls
+==================
+
+`configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
+Optional Features
+=================
+
+The readline `configure' recognizes two `--with-PACKAGE' options:
+
+`--with-curses'
+ This tells readline that it can find the termcap library functions
+ (tgetent, et al.) in the curses library, rather than a separate
+ termcap library. Readline uses the termcap functions, but does not
+ usually link with the termcap or curses library itself, allowing
+ applications which link with readline the to choose an appropriate
+ library. This option tells readline to link the example programs with
+ the curses library rather than libtermcap.
+
+`--with-shared-termcap-library'
+ This tells the readline build process to link the shared version of
+ libreadline against a shared version of the curses or termcap library
+ (see the description of SHLIB_LIBS below under `Shared Libraries').
+ This relieves the application of having to link with curses or termcap
+ itself, but does not allow the application to choose which library to
+ use. This is only effective on systems that build shared libraries (see
+ below; the default for shared libraries is `yes').
+
+`configure' also recognizes several `--enable-FEATURE' options:
+
+`--enable-bracketed-paste-default'
+ Enable bracketed paste by default, so the initial value of the
+ `enable-bracketed-paste' Readline variable is `on'. The default
+ is `yes'.
+
+`--enable-install-examples'
+ Install the readline example programs as part of `make install'.
+
+`--enable-multibyte'
+ Build with support for multibyte characters enabled on systems with the
+ necessary framework (locale definitions, C library functions, etc.). The
+ default is `yes'.
+
+`--enable-shared'
+ Build the shared libraries by default on supported platforms. The
+ default is `yes'.
+
+`--enable-static'
+ Build the static libraries by default. The default is `yes'.
+
+Shared Libraries
+================
+
+There is support for building shared versions of the readline and
+history libraries. The configure script creates a Makefile in
+the `shlib' subdirectory, and typing `make shared' will cause
+shared versions of the readline and history libraries to be built
+on supported platforms.
+
+If `configure' is given the `--enable-shared' option, it will attempt
+to build the shared libraries by default on supported platforms. This
+option is enabled by default.
+
+Configure calls the script support/shobj-conf to test whether or
+not shared library creation is supported and to generate the values
+of variables that are substituted into shlib/Makefile. If you
+try to build shared libraries on an unsupported platform, `make'
+will display a message asking you to update support/shobj-conf for
+your platform.
+
+If you need to update support/shobj-conf, you will need to create
+a `stanza' for your operating system and compiler. The script uses
+the value of host_os and ${CC} as determined by configure. For
+instance, FreeBSD 4.2 with any version of gcc is identified as
+`freebsd4.2-gcc*'.
+
+In the stanza for your operating system-compiler pair, you will need to
+define several variables. They are:
+
+SHOBJ_CC The C compiler used to compile source files into shareable
+ object files. This is normally set to the value of ${CC}
+ by configure, and should not need to be changed.
+
+SHOBJ_CFLAGS Flags to pass to the C compiler ($SHOBJ_CC) to create
+ position-independent code. If you are using gcc, this
+ should probably be set to `-fpic'.
+
+SHOBJ_LD The link editor to be used to create the shared library from
+ the object files created by $SHOBJ_CC. If you are using
+ gcc, a value of `gcc' will probably work.
+
+SHOBJ_LDFLAGS Flags to pass to SHOBJ_LD to enable shared object creation.
+ If you are using gcc, `-shared' may be all that is necessary.
+ These should be the flags needed for generic shared object
+ creation.
+
+SHLIB_XLDFLAGS Additional flags to pass to SHOBJ_LD for shared library
+ creation. Many systems use the -R option to the link
+ editor to embed a path within the library for run-time
+ library searches. A reasonable value for such systems would
+ be `-R$(libdir)'.
+
+SHLIB_LIBS Any additional libraries that shared libraries should be
+ linked against when they are created.
+
+SHLIB_LIBPREF The prefix to use when generating the filename of the shared
+ library. The default is `lib'; Cygwin uses `cyg'.
+
+SHLIB_LIBSUFF The suffix to add to `libreadline' and `libhistory' when
+ generating the filename of the shared library. Many systems
+ use `so'; HP-UX uses `sl'.
+
+SHLIB_LIBVERSION The string to append to the filename to indicate the version
+ of the shared library. It should begin with $(SHLIB_LIBSUFF),
+ and possibly include version information that allows the
+ run-time loader to load the version of the shared library
+ appropriate for a particular program. Systems using shared
+ libraries similar to SunOS 4.x use major and minor library
+ version numbers; for those systems a value of
+ `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' is appropriate.
+ Systems based on System V Release 4 don't use minor version
+ numbers; use `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' on those systems.
+ Other Unix versions use different schemes.
+
+SHLIB_DLLVERSION The version number for shared libraries that determines API
+ compatibility between readline versions and the underlying
+ system. Used only on Cygwin. Defaults to $SHLIB_MAJOR, but
+ can be overridden at configuration time by defining DLLVERSION
+ in the environment.
+
+SHLIB_DOT The character used to separate the name of the shared library
+ from the suffix and version information. The default is `.';
+ systems like Cygwin which don't separate version information
+ from the library name should set this to the empty string.
+
+SHLIB_STATUS Set this to `supported' when you have defined the other
+ necessary variables. Make uses this to determine whether
+ or not shared library creation should be attempted. If
+ shared libraries are not supported, this will be set to
+ `unsupported'.
+
+You should look at the existing stanzas in support/shobj-conf for ideas.
+
+Once you have updated support/shobj-conf, re-run configure and type
+`make shared' or `make'. The shared libraries will be created in the
+shlib subdirectory.
+
+If shared libraries are created, `make install' will install them.
+You may install only the shared libraries by running `make
+install-shared' from the top-level build directory. Running `make
+install' in the shlib subdirectory will also work. If you don't want
+to install any created shared libraries, run `make install-static'.
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..db689b3
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,171 @@
+#
+# Master distribution manifest for the standalone readline distribution
+#
+doc d
+examples d
+examples/autoconf d
+examples/rlfe d
+support d
+shlib d
+m4 d
+COPYING f
+README f
+MANIFEST f
+INSTALL f
+CHANGELOG f
+CHANGES f
+NEWS f
+USAGE f
+aclocal.m4 f
+config.h.in f
+configure f 755
+configure.ac f
+m4/codeset.m4 f
+Makefile.in f
+readline.pc.in f
+history.pc.in f
+ansi_stdlib.h f
+chardefs.h f
+colors.h f
+history.h f
+histlib.h f
+keymaps.h f
+parse-colors.h f
+posixdir.h f
+posixjmp.h f
+posixselect.h f
+posixstat.h f
+posixtime.h f
+readline.h f
+rlconf.h f
+rldefs.h f
+rlmbutil.h f
+rlprivate.h f
+rlshell.h f
+rlstdc.h f
+rltty.h f
+rltypedefs.h f
+rlwinsize.h f
+tcap.h f
+tilde.h f
+xmalloc.h f
+bind.c f
+callback.c f
+colors.c f
+compat.c f
+complete.c f
+display.c f
+emacs_keymap.c f
+funmap.c f
+input.c f
+isearch.c f
+keymaps.c f
+kill.c f
+macro.c f
+mbutil.c f
+misc.c f
+nls.c f
+parens.c f
+parse-colors.c f
+readline.c f
+rltty.c f
+savestring.c f
+search.c f
+shell.c f
+signals.c f
+terminal.c f
+text.c f
+tilde.c f
+undo.c f
+util.c f
+vi_keymap.c f
+vi_mode.c f
+xfree.c f
+xmalloc.c f
+history.c f
+histexpand.c f
+histfile.c f
+histsearch.c f
+patchlevel f
+shlib/Makefile.in f
+support/config.guess f
+support/config.rpath f
+support/config.sub f
+support/install.sh f
+support/mkdirs f
+support/mkdist f
+support/mkinstalldirs f
+support/shobj-conf f
+support/shlib-install f
+support/wcwidth.c f
+doc/Makefile.in f
+doc/texinfo.tex f
+doc/version.texi f
+doc/fdl.texi f
+doc/rlman.texi f
+doc/rltech.texi f
+doc/rluser.texi f
+doc/rluserman.texi f
+doc/history.texi f
+doc/hstech.texi f
+doc/hsuser.texi f
+doc/readline.3 f
+doc/history.3 f
+doc/texi2dvi f
+doc/texi2html f
+examples/Makefile.in f
+examples/excallback.c f
+examples/fileman.c f
+examples/manexamp.c f
+examples/readlinebuf.h f
+examples/rl-fgets.c f
+examples/rlbasic.c f
+examples/rlcat.c f
+examples/rlevent.c f
+examples/rlkeymaps.c f
+examples/rltest.c f
+examples/rl-callbacktest.c f
+examples/rl-timeout.c f
+examples/rl-test-timeout f
+examples/rl.c f
+examples/rlptytest.c f
+examples/rlversion.c f
+examples/histexamp.c f
+examples/hist_erasedups.c f
+examples/hist_purgecmd.c f
+examples/Inputrc f
+examples/autoconf/BASH_CHECK_LIB_TERMCAP f
+examples/autoconf/RL_LIB_READLINE_VERSION f
+examples/autoconf/wi_LIB_READLINE f
+examples/rlfe/ChangeLog f
+examples/rlfe/Makefile.in f
+examples/rlfe/README f
+examples/rlfe/config.h.in f
+examples/rlfe/configure f 755
+examples/rlfe/configure.in f
+examples/rlfe/extern.h f
+examples/rlfe/os.h f
+examples/rlfe/pty.c f
+examples/rlfe/rlfe.c f
+examples/rlfe/screen.h f
+examples/rlwrap-0.30.tar.gz f
+# formatted documentation, from MANIFEST.doc
+doc/readline.ps f
+doc/history.ps f
+doc/rluserman.ps f
+doc/readline.dvi f
+doc/history.dvi f
+doc/rluserman.dvi f
+doc/readline.info f
+doc/history.info f
+doc/rluserman.info f
+doc/readline.html f
+doc/history.html f
+doc/rluserman.html f
+doc/readline.0 f
+doc/history.0 f
+doc/readline_3.ps f
+doc/history_3.ps f
+doc/history.pdf f
+doc/readline.pdf f
+doc/rluserman.pdf f
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..2120daa
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,610 @@
+## -*- text -*- ##
+# Master Makefile for the GNU readline library.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# 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/>.
+
+RL_LIBRARY_VERSION = @LIBVERSION@
+RL_LIBRARY_NAME = readline
+
+PACKAGE = @PACKAGE_NAME@
+VERSION = @PACKAGE_VERSION@
+
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+BUILD_DIR = @BUILD_DIR@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+CC = @CC@
+RANLIB = @RANLIB@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+RM = rm -f
+CP = cp
+MV = mv
+
+@SET_MAKE@
+SHELL = @MAKE_SHELL@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+datarootdir = @datarootdir@
+
+bindir = @bindir@
+libdir = @libdir@
+mandir = @mandir@
+includedir = @includedir@
+datadir = @datadir@
+localedir = @localedir@
+pkgconfigdir = ${libdir}/pkgconfig
+
+infodir = @infodir@
+
+docdir = @docdir@
+
+man3dir = $(mandir)/man3
+
+# Support an alternate destination root directory for package building
+DESTDIR =
+
+# Programs to make tags files.
+ETAGS = etags
+CTAGS = ctags -w
+
+CFLAGS = @CFLAGS@
+LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' @BRACKETED_PASTE@
+CPPFLAGS = @CPPFLAGS@
+
+DEFS = @DEFS@ @CROSS_COMPILE@
+LOCAL_DEFS = @LOCAL_DEFS@
+
+TERMCAP_LIB = @TERMCAP_LIB@
+
+# For libraries which include headers from other libraries.
+INCLUDES = -I. -I$(srcdir)
+
+XCCFLAGS = $(ASAN_CFLAGS) $(DEFS) $(LOCAL_DEFS) $(INCLUDES) $(CPPFLAGS)
+CCFLAGS = $(XCCFLAGS) $(LOCAL_CFLAGS) $(CFLAGS)
+
+# could add -Werror here
+GCC_LINT_FLAGS = -ansi -Wall -Wshadow -Wpointer-arith -Wcast-qual \
+ -Wwrite-strings -Wstrict-prototypes \
+ -Wmissing-prototypes -Wno-implicit -pedantic
+GCC_LINT_CFLAGS = $(XCCFLAGS) $(GCC_LINT_FLAGS) @CFLAGS@ @LOCAL_CFLAGS@
+
+ASAN_XCFLAGS = -fsanitize=address -fno-omit-frame-pointer
+ASAN_XLDFLAGS = -fsanitize=address
+
+install_examples = @EXAMPLES_INSTALL_TARGET@
+
+.c.o:
+ ${RM} $@
+ $(CC) -c $(CCFLAGS) $<
+
+# The name of the main library target.
+LIBRARY_NAME = libreadline.a
+STATIC_LIBS = libreadline.a libhistory.a
+
+# The C code source files for this library.
+CSOURCES = $(srcdir)/readline.c $(srcdir)/funmap.c $(srcdir)/keymaps.c \
+ $(srcdir)/vi_mode.c $(srcdir)/parens.c $(srcdir)/rltty.c \
+ $(srcdir)/complete.c $(srcdir)/bind.c $(srcdir)/isearch.c \
+ $(srcdir)/display.c $(srcdir)/signals.c $(srcdir)/emacs_keymap.c \
+ $(srcdir)/vi_keymap.c $(srcdir)/util.c $(srcdir)/kill.c \
+ $(srcdir)/undo.c $(srcdir)/macro.c $(srcdir)/input.c \
+ $(srcdir)/callback.c $(srcdir)/terminal.c $(srcdir)/xmalloc.c $(srcdir)/xfree.c \
+ $(srcdir)/history.c $(srcdir)/histsearch.c $(srcdir)/histexpand.c \
+ $(srcdir)/histfile.c $(srcdir)/nls.c $(srcdir)/search.c \
+ $(srcdir)/shell.c $(srcdir)/savestring.c $(srcdir)/tilde.c \
+ $(srcdir)/text.c $(srcdir)/misc.c $(srcdir)/compat.c \
+ $(srcdir)/mbutil.c
+
+# The header files for this library.
+HSOURCES = $(srcdir)/readline.h $(srcdir)/rldefs.h $(srcdir)/chardefs.h \
+ $(srcdir)/keymaps.h $(srcdir)/history.h $(srcdir)/histlib.h \
+ $(srcdir)/posixstat.h $(srcdir)/posixdir.h $(srcdir)/posixjmp.h \
+ $(srcdir)/tilde.h $(srcdir)/rlconf.h $(srcdir)/rltty.h \
+ $(srcdir)/ansi_stdlib.h $(srcdir)/tcap.h $(srcdir)/rlstdc.h \
+ $(srcdir)/xmalloc.h $(srcdir)/rlprivate.h $(srcdir)/rlshell.h \
+ $(srcdir)/rltypedefs.h $(srcdir)/rlmbutil.h \
+ $(srcdir)/colors.h $(srcdir)/parse-colors.h
+
+HISTOBJ = history.o histexpand.o histfile.o histsearch.o shell.o mbutil.o
+TILDEOBJ = tilde.o
+COLORSOBJ = colors.o parse-colors.o
+OBJECTS = readline.o vi_mode.o funmap.o keymaps.o parens.o search.o \
+ rltty.o complete.o bind.o isearch.o display.o signals.o \
+ util.o kill.o undo.o macro.o input.o callback.o terminal.o \
+ text.o nls.o misc.o $(HISTOBJ) $(TILDEOBJ) $(COLORSOBJ) \
+ xmalloc.o xfree.o compat.o
+
+# The texinfo files which document this library.
+DOCSOURCE = doc/rlman.texinfo doc/rltech.texinfo doc/rluser.texinfo
+DOCOBJECT = doc/readline.dvi
+DOCSUPPORT = doc/Makefile
+DOCUMENTATION = $(DOCSOURCE) $(DOCOBJECT) $(DOCSUPPORT)
+
+CREATED_MAKEFILES = Makefile doc/Makefile examples/Makefile shlib/Makefile
+CREATED_CONFIGURE = config.status config.h config.cache config.log \
+ stamp-config stamp-h readline.pc history.pc
+CREATED_TAGS = TAGS tags
+
+INSTALLED_HEADERS = readline.h chardefs.h keymaps.h history.h tilde.h \
+ rlstdc.h rlconf.h rltypedefs.h
+
+OTHER_DOCS = $(srcdir)/CHANGES $(srcdir)/INSTALL $(srcdir)/README
+OTHER_INSTALLED_DOCS = CHANGES INSTALL README
+
+##########################################################################
+TARGETS = @STATIC_TARGET@ @SHARED_TARGET@
+INSTALL_TARGETS = @STATIC_INSTALL_TARGET@ @SHARED_INSTALL_TARGET@
+
+all: $(TARGETS)
+
+everything: all examples
+
+asan:
+ ${MAKE} ${MFLAGS} ASAN_CFLAGS='${ASAN_XCFLAGS}' ASAN_LDFLAGS='${ASAN_XLDFLAGS}' everything
+
+static: $(STATIC_LIBS)
+
+libreadline.a: $(OBJECTS)
+ $(RM) $@
+ $(AR) $(ARFLAGS) $@ $(OBJECTS)
+ -test -n "$(RANLIB)" && $(RANLIB) $@
+
+libhistory.a: $(HISTOBJ) xmalloc.o xfree.o
+ $(RM) $@
+ $(AR) $(ARFLAGS) $@ $(HISTOBJ) xmalloc.o xfree.o
+ -test -n "$(RANLIB)" && $(RANLIB) $@
+
+# Since tilde.c is shared between readline and bash, make sure we compile
+# it with the right flags when it's built as part of readline
+tilde.o: tilde.c
+ rm -f $@
+ $(CC) $(CCFLAGS) -DREADLINE_LIBRARY -c $(srcdir)/tilde.c
+
+readline: $(OBJECTS) readline.h rldefs.h chardefs.h ./libreadline.a
+ $(CC) $(CCFLAGS) -DREADLINE_LIBRARY -o $@ $(top_srcdir)/examples/rl.c ./libreadline.a ${TERMCAP_LIB}
+
+lint: force
+ $(MAKE) $(MFLAGS) CCFLAGS='$(GCC_LINT_CFLAGS)' static
+
+Makefile makefile: config.status $(srcdir)/Makefile.in
+ CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status
+
+Makefiles makefiles: config.status $(srcdir)/Makefile.in
+ @for mf in $(CREATED_MAKEFILES); do \
+ CONFIG_FILES=$$mf CONFIG_HEADERS= $(SHELL) ./config.status ; \
+ done
+
+config.status: configure
+ $(SHELL) ./config.status --recheck
+
+config.h: stamp-h
+
+stamp-h: config.status $(srcdir)/config.h.in
+ CONFIG_FILES= CONFIG_HEADERS=config.h ./config.status
+ echo > $@
+
+#$(srcdir)/configure: $(srcdir)/configure.ac ## Comment-me-out in distribution
+# cd $(srcdir) && autoconf ## Comment-me-out in distribution
+
+
+shared: force
+ -test -d shlib || mkdir shlib
+ ( cd shlib ; ${MAKE} ${MFLAGS} all )
+
+documentation: force
+ -test -d doc || mkdir doc
+ -( cd doc && $(MAKE) $(MFLAGS) )
+
+examples: force
+ -test -d examples || mkdir examples
+ -(cd examples && ${MAKE} ${MFLAGS} all )
+
+force:
+
+install: $(INSTALL_TARGETS)
+
+install-headers: installdirs ${INSTALLED_HEADERS}
+ for f in ${INSTALLED_HEADERS}; do \
+ $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(includedir)/readline ; \
+ done
+
+uninstall-headers:
+ -test -n "$(includedir)" && cd $(DESTDIR)$(includedir)/readline && \
+ ${RM} ${INSTALLED_HEADERS}
+
+maybe-uninstall-headers: uninstall-headers
+
+install-pc: installdirs
+ -$(INSTALL_DATA) $(BUILD_DIR)/readline.pc $(DESTDIR)$(pkgconfigdir)/readline.pc
+ -$(INSTALL_DATA) $(BUILD_DIR)/history.pc $(DESTDIR)$(pkgconfigdir)/history.pc
+
+uninstall-pc:
+ -test -n "$(pkgconfigdir)" && cd $(DESTDIR)$(pkgconfigdir) && \
+ ${RM} readline.pc history.pc
+
+maybe-uninstall-pc: uninstall-pc
+
+install-static: installdirs $(STATIC_LIBS) install-headers install-doc ${install_examples} install-pc
+ -$(MV) $(DESTDIR)$(libdir)/libreadline.a $(DESTDIR)$(libdir)/libreadline.old
+ $(INSTALL_DATA) libreadline.a $(DESTDIR)$(libdir)/libreadline.a
+ -test -n "$(RANLIB)" && $(RANLIB) $(DESTDIR)$(libdir)/libreadline.a
+ -$(MV) $(DESTDIR)$(libdir)/libhistory.a $(DESTDIR)$(libdir)/libhistory.old
+ $(INSTALL_DATA) libhistory.a $(DESTDIR)$(libdir)/libhistory.a
+ -test -n "$(RANLIB)" && $(RANLIB) $(DESTDIR)$(libdir)/libhistory.a
+
+installdirs: $(srcdir)/support/mkinstalldirs
+ -$(SHELL) $(srcdir)/support/mkinstalldirs $(DESTDIR)$(includedir) \
+ $(DESTDIR)$(includedir)/readline $(DESTDIR)$(libdir) \
+ $(DESTDIR)$(infodir) $(DESTDIR)$(man3dir) $(DESTDIR)$(docdir) \
+ $(DESTDIR)$(pkgconfigdir)
+
+uninstall: uninstall-headers uninstall-doc uninstall-examples uninstall-pc
+ -test -n "$(DESTDIR)$(libdir)" && cd $(DESTDIR)$(libdir) && \
+ ${RM} libreadline.a libreadline.old libhistory.a libhistory.old $(SHARED_LIBS)
+ -( cd shlib; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall )
+
+install-shared: installdirs install-headers shared install-doc install-pc
+ ( cd shlib ; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} install )
+
+uninstall-shared: maybe-uninstall-headers maybe-uninstall-pc
+ -( cd shlib; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall )
+
+install-examples: installdirs install-headers
+ -( cd examples ; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} install )
+
+uninstall-examples: maybe-uninstall-headers
+ -( cd examples; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall )
+
+install-doc: installdirs
+ $(INSTALL_DATA) $(OTHER_DOCS) $(DESTDIR)$(docdir)
+ -( if test -d doc ; then \
+ cd doc && \
+ ${MAKE} ${MFLAGS} infodir=$(infodir) DESTDIR=${DESTDIR} install; \
+ fi )
+
+uninstall-doc:
+ -( cd $(DESTDIR)$(docdir) && ${RM} ${OTHER_INSTALLED_DOCS} )
+ -( if test -d doc ; then \
+ cd doc && \
+ ${MAKE} ${MFLAGS} infodir=$(infodir) DESTDIR=${DESTDIR} uninstall; \
+ fi )
+
+TAGS: force
+ -( cd $(srcdir) && $(ETAGS) $(CSOURCES) $(HSOURCES) )
+
+tags: force
+ -( cd $(srcdir) && $(CTAGS) $(CSOURCES) $(HSOURCES) )
+
+clean: force
+ $(RM) $(OBJECTS) $(STATIC_LIBS)
+ $(RM) readline readline.exe
+ ( cd shlib && $(MAKE) $(MFLAGS) $@ )
+ -( cd doc && $(MAKE) $(MFLAGS) $@ )
+ -( cd examples && $(MAKE) $(MFLAGS) $@ )
+
+mostlyclean: clean
+ ( cd shlib && $(MAKE) $(MFLAGS) $@ )
+ -( cd doc && $(MAKE) $(MFLAGS) $@ )
+ -( cd examples && $(MAKE) $(MFLAGS) $@ )
+
+distclean maintainer-clean: clean
+ ( cd shlib && $(MAKE) $(MFLAGS) $@ )
+ -( cd doc && $(MAKE) $(MFLAGS) $@ )
+ -( cd examples && $(MAKE) $(MFLAGS) $@ )
+ $(RM) Makefile
+ $(RM) $(CREATED_CONFIGURE)
+ $(RM) $(CREATED_TAGS)
+
+readline.pc: config.status $(srcdir)/readline.pc.in
+ $(SHELL) config.status
+
+history.pc: config.status $(srcdir)/history.pc.in
+ $(SHELL) config.status
+
+info dvi html pdf ps:
+ -( cd doc && $(MAKE) $(MFLAGS) $@ )
+
+install-info:
+install-dvi:
+install-html:
+install-pdf:
+install-ps:
+check:
+installcheck:
+
+dist: force
+ @echo Readline distributions are created using $(srcdir)/support/mkdist.
+ @echo Here is a sample of the necessary commands:
+ @echo bash $(srcdir)/support/mkdist -m $(srcdir)/MANIFEST -s $(srcdir) -r $(RL_LIBRARY_NAME) $(RL_LIBRARY_VERSION)
+ @echo tar cf $(RL_LIBRARY_NAME)-${RL_LIBRARY_VERSION}.tar ${RL_LIBRARY_NAME}-$(RL_LIBRARY_VERSION)
+ @echo gzip $(RL_LIBRARY_NAME)-$(RL_LIBRARY_VERSION).tar
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+# Dependencies
+bind.o: ansi_stdlib.h posixstat.h
+bind.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+bind.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+bind.o: history.h
+callback.o: rlconf.h
+callback.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+callback.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+compat.o: ${BUILD_DIR}/config.h
+compat.o: rlstdc.h rltypedefs.h
+complete.o: ansi_stdlib.h posixdir.h posixstat.h
+complete.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+complete.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+display.o: ansi_stdlib.h posixstat.h
+display.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+display.o: tcap.h
+display.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+display.o: history.h rlstdc.h
+funmap.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+funmap.o: rlconf.h ansi_stdlib.h rlstdc.h
+funmap.o: ${BUILD_DIR}/config.h
+histexpand.o: ansi_stdlib.h
+histexpand.o: history.h histlib.h rlstdc.h rltypedefs.h
+histexpand.o: ${BUILD_DIR}/config.h
+histfile.o: ansi_stdlib.h
+histfile.o: history.h histlib.h rlstdc.h rltypedefs.h
+histfile.o: ${BUILD_DIR}/config.h
+history.o: ansi_stdlib.h
+history.o: history.h histlib.h rlstdc.h rltypedefs.h
+history.o: ${BUILD_DIR}/config.h
+histsearch.o: ansi_stdlib.h
+histsearch.o: history.h histlib.h rlstdc.h rltypedefs.h
+histsearch.o: ${BUILD_DIR}/config.h
+input.o: ansi_stdlib.h
+input.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+input.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+isearch.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+isearch.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+isearch.o: ansi_stdlib.h history.h rlstdc.h
+keymaps.o: emacs_keymap.c vi_keymap.c
+keymaps.o: keymaps.h rltypedefs.h chardefs.h rlconf.h ansi_stdlib.h
+keymaps.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+keymaps.o: ${BUILD_DIR}/config.h rlstdc.h
+kill.o: ansi_stdlib.h
+kill.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+kill.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+kill.o: history.h rlstdc.h
+macro.o: ansi_stdlib.h
+macro.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+macro.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+macro.o: history.h rlstdc.h
+mbutil.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+mbutil.o: readline.h keymaps.h rltypedefs.h chardefs.h rlstdc.h
+misc.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+misc.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+misc.o: history.h rlstdc.h ansi_stdlib.h
+nls.o: ansi_stdlib.h
+nls.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+nls.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+nls.o: history.h rlstdc.h
+parens.o: rlconf.h
+parens.o: ${BUILD_DIR}/config.h
+parens.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+readline.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+readline.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+readline.o: history.h rlstdc.h
+readline.o: posixstat.h ansi_stdlib.h posixjmp.h
+rltty.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+rltty.o: rltty.h
+rltty.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+savestring.o: ${BUILD_DIR}/config.h
+search.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+search.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+search.o: ansi_stdlib.h history.h rlstdc.h
+shell.o: ${BUILD_DIR}/config.h
+shell.o: ansi_stdlib.h
+signals.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+signals.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+signals.o: history.h rlstdc.h
+terminal.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+terminal.o: tcap.h
+terminal.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+terminal.o: history.h rlstdc.h
+text.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+text.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+text.o: history.h rlstdc.h ansi_stdlib.h
+tilde.o: ansi_stdlib.h
+tilde.o: ${BUILD_DIR}/config.h
+tilde.o: tilde.h
+undo.o: ansi_stdlib.h
+undo.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+undo.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+undo.o: history.h rlstdc.h
+util.o: posixjmp.h ansi_stdlib.h
+util.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+util.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+vi_mode.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+vi_mode.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+vi_mode.o: history.h ansi_stdlib.h rlstdc.h
+xfree.o: ${BUILD_DIR}/config.h
+xfree.o: ansi_stdlib.h
+xmalloc.o: ${BUILD_DIR}/config.h
+xmalloc.o: ansi_stdlib.h
+
+colors.o: ${BUILD_DIR}/config.h colors.h
+colors.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+colors.o: rlconf.h
+colors.o: ansi_stdlib.h posixstat.h
+parse-colors.o: ${BUILD_DIR}/config.h colors.h parse-colors.h
+parse-colors.o: rldefs.h rlconf.h
+parse-colors.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+
+bind.o: rlshell.h
+histfile.o: rlshell.h
+nls.o: rlshell.h
+readline.o: rlshell.h
+shell.o: rlshell.h
+terminal.o: rlshell.h
+histexpand.o: rlshell.h
+
+bind.o: rlprivate.h
+callback.o: rlprivate.h
+complete.o: rlprivate.h
+display.o: rlprivate.h
+input.o: rlprivate.h
+isearch.o: rlprivate.h
+kill.o: rlprivate.h
+macro.o: rlprivate.h
+mbutil.o: rlprivate.h
+misc.o: rlprivate.h
+nls.o: rlprivate.h
+parens.o: rlprivate.h
+readline.o: rlprivate.h
+rltty.o: rlprivate.h
+search.o: rlprivate.h
+signals.o: rlprivate.h
+terminal.o: rlprivate.h
+text.o: rlprivate.h
+undo.o: rlprivate.h
+util.o: rlprivate.h
+vi_mode.o: rlprivate.h
+colors.o: rlprivate.h
+parse-colors.o: rlprivate.h
+
+bind.o: xmalloc.h
+callback.o: xmalloc.h
+complete.o: xmalloc.h
+display.o: xmalloc.h
+funmap.o: xmalloc.h
+histexpand.o: xmalloc.h
+histfile.o: xmalloc.h
+history.o: xmalloc.h
+input.o: xmalloc.h
+isearch.o: xmalloc.h
+keymaps.o: xmalloc.h
+kill.o: xmalloc.h
+macro.o: xmalloc.h
+mbutil.o: xmalloc.h
+misc.o: xmalloc.h
+readline.o: xmalloc.h
+savestring.o: xmalloc.h
+search.o: xmalloc.h
+shell.o: xmalloc.h
+terminal.o: xmalloc.h
+text.o: xmalloc.h
+tilde.o: xmalloc.h
+undo.o: xmalloc.h
+util.o: xmalloc.h
+vi_mode.o: xmalloc.h
+xfree.o: xmalloc.h
+xmalloc.o: xmalloc.h
+colors.o: xmalloc.h
+parse-colors.o: xmalloc.h
+
+complete.o: rlmbutil.h
+display.o: rlmbutil.h
+histexpand.o: rlmbutil.h
+input.o: rlmbutil.h
+isearch.o: rlmbutil.h
+mbutil.o: rlmbutil.h
+misc.o: rlmbutil.h
+readline.o: rlmbutil.h
+search.o: rlmbutil.h
+text.o: rlmbutil.h
+vi_mode.o: rlmbutil.h
+
+bind.o: $(srcdir)/bind.c
+callback.o: $(srcdir)/callback.c
+compat.o: $(srcdir)/compat.c
+complete.o: $(srcdir)/complete.c
+display.o: $(srcdir)/display.c
+funmap.o: $(srcdir)/funmap.c
+input.o: $(srcdir)/input.c
+isearch.o: $(srcdir)/isearch.c
+keymaps.o: $(srcdir)/keymaps.c $(srcdir)/emacs_keymap.c $(srcdir)/vi_keymap.c
+kill.o: $(srcdir)/kill.c
+macro.o: $(srcdir)/macro.c
+mbutil.o: $(srcdir)/mbutil.c
+misc.o: $(srcdir)/misc.c
+nls.o: $(srcdir)/nls.c
+parens.o: $(srcdir)/parens.c
+readline.o: $(srcdir)/readline.c
+rltty.o: $(srcdir)/rltty.c
+savestring.o: $(srcdir)/savestring.c
+search.o: $(srcdir)/search.c
+shell.o: $(srcdir)/shell.c
+signals.o: $(srcdir)/signals.c
+terminal.o: $(srcdir)/terminal.c
+text.o: $(srcdir)/text.c
+tilde.o: $(srcdir)/tilde.c
+undo.o: $(srcdir)/undo.c
+util.o: $(srcdir)/util.c
+vi_mode.o: $(srcdir)/vi_mode.c
+xfree.o: $(srcdir)/xfree.c
+xmalloc.o: $(srcdir)/xmalloc.c
+
+colors.o: $(srcdir)/parse-colors.c
+parse-colors.o: $(srcdir)/parse-colors.c
+
+histexpand.o: $(srcdir)/histexpand.c
+histfile.o: $(srcdir)/histfile.c
+history.o: $(srcdir)/history.c
+histsearch.o: $(srcdir)/histsearch.c
+
+bind.o: bind.c
+callback.o: callback.c
+compat.o: compat.c
+complete.o: complete.c
+display.o: display.c
+funmap.o: funmap.c
+input.o: input.c
+isearch.o: isearch.c
+keymaps.o: keymaps.c emacs_keymap.c vi_keymap.c
+kill.o: kill.c
+macro.o: macro.c
+mbutil.o: mbutil.c
+misc.o: misc.c
+nls.o: nls.c
+parens.o: parens.c
+readline.o: readline.c
+rltty.o: rltty.c
+savestring.o: savestring.c
+search.o: search.c
+shell.o: shell.c
+signals.o: signals.c
+terminal.o: terminal.c
+text.o: text.c
+tilde.o: tilde.c
+undo.o: undo.c
+util.o: util.c
+vi_mode.o: vi_mode.c
+xfree.o: xfree.c
+xmalloc.o: xmalloc.c
+
+histexpand.o: histexpand.c
+histfile.o: histfile.c
+history.o: history.c
+histsearch.o: histsearch.c
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..1d88606
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,485 @@
+This is a terse description of the new features added to readline-8.2 since
+the release of readline-8.1.
+
+New Features in Readline
+
+a. There is now an HS_HISTORY_VERSION containing the version number of the
+ history library for applications to use.
+
+b. History expansion better understands multiple history expansions that may
+ contain strings that would ordinarily inhibit history expansion (e.g.,
+ `abc!$!$').
+
+c. There is a new framework for readline timeouts, including new public
+ functions to set timeouts and query how much time is remaining before a
+ timeout hits, and a hook function that can trigger when readline times
+ out. There is a new state value to indicate a timeout.
+
+d. Automatically bind termcap key sequences for page-up and page-down to
+ history-search-backward and history-search-forward, respectively.
+
+e. There is a new `fetch-history' bindable command that retrieves the history
+ entry corresponding to its numeric argument. Negative arguments count back
+ from the end of the history.
+
+f. `vi-undo' is now a bindable command.
+
+g. There is a new option: `enable-active-region'. This separates control of
+ the active region and bracketed-paste. It has the same default value as
+ bracketed-paste, and enabling bracketed paste enables the active region.
+ Users can now turn off the active region while leaving bracketed paste
+ enabled.
+
+h. rl_completer_word_break_characters is now `const char *' like
+ rl_basic_word_break_characters.
+
+i. Readline looks in $LS_COLORS for a custom filename extension
+ (*.readline-colored-completion-prefix) and uses that as the default color
+ for the common prefix displayed when `colored-completion-prefix' is set.
+
+j. Two new bindable string variables: active-region-start-color and
+ active-region-end-color. The first sets the color used to display the
+ active region; the second turns it off. If set, these are used in place
+ of terminal standout mode.
+
+k. New readline state (RL_STATE_EOF) and application-visible variable
+ (rl_eof_found) to allow applications to detect when readline reads EOF
+ before calling the deprep-terminal hook.
+
+l. There is a new configuration option: --with-shared-termcap-library, which
+ forces linking the shared readline library with the shared termcap (or
+ curses/ncurses/termlib) library so applications don't have to do it.
+
+m. Readline now checks for changes to locale settings (LC_ALL/LC_CTYPE/LANG)
+ each time it is called, and modifies the appropriate locale-specific display
+ and key binding variables when the locale changes.
+
+-------------------------------------------------------------------------------
+This is a terse description of the new features added to readline-8.1 since
+the release of readline-8.0.
+
+New Features in Readline
+
+a. If a second consecutive completion attempt produces matches where the first
+ did not, treat it as a new completion attempt and insert a match as
+ appropriate.
+
+b. Bracketed paste mode works in more places: incremental search strings, vi
+ overstrike mode, character search, and reading numeric arguments.
+
+c. Readline automatically switches to horizontal scrolling if the terminal has
+ only one line.
+
+d. Unbinding all key sequences bound to a particular readline function now
+ descends into keymaps for multi-key sequences.
+
+e. rl-clear-display: new bindable command that clears the screen and, if
+ possible, the scrollback buffer (bound to emacs mode M-C-l by default).
+
+f. New active mark and face feature: when enabled, it will highlight the text
+ inserted by a bracketed paste (the `active region') and the text found by
+ incremental and non-incremental history searches. This is tied to bracketed
+ paste and can be disabled by turning off bracketed paste.
+
+g. Readline sets the mark in several additional commands.
+
+h. Bracketed paste mode is enabled by default. There is a configure-time
+ option (--enable-bracketed-paste-default) to set the default to on or off.
+
+i. Readline tries to take advantage of the more regular structure of UTF-8
+ characters to identify the beginning and end of characters when moving
+ through the line buffer.
+
+j. The bindable operate-and-get-next command (and its default bindings) are
+ now part of readline instead of a bash-specific addition.
+
+k. The signal cleanup code now blocks SIGINT while processing after a SIGINT.
+
+-------------------------------------------------------------------------------
+This is a terse description of the new features added to readline-8.0 since
+the release of readline-7.0.
+
+New Features in Readline
+
+a. Non-incremental vi-mode search (`N', `n') can search for a shell pattern, as
+ Posix specifies (uses fnmatch(3) if available).
+
+b. There are new `next-screen-line' and `previous-screen-line' bindable
+ commands, which move the cursor to the same column in the next, or previous,
+ physical line, respectively.
+
+c. There are default key bindings for control-arrow-key key combinations.
+
+d. A negative argument (-N) to `quoted-insert' means to insert the next N
+ characters using quoted-insert.
+
+e. New public function: rl_check_signals(), which allows applications to
+ respond to signals that readline catches while waiting for input using
+ a custom read function.
+
+f. There is new support for conditionally testing the readline version in an
+ inputrc file, with a full set of arithmetic comparison operators available.
+
+g. There is a simple variable comparison facility available for use within an
+ inputrc file. Allowable operators are equality and inequality; string
+ variables may be compared to a value; boolean variables must be compared to
+ either `on' or `off'; variable names are separated from the operator by
+ whitespace.
+
+h. The history expansion library now understands command and process
+ substitution and extended globbing and allows them to appear anywhere in a
+ word.
+
+i. The history library has a new variable that allows applications to set the
+ initial quoting state, so quoting state can be inherited from a previous
+ line.
+
+j. Readline now allows application-defined keymap names; there is a new public
+ function, rl_set_keymap_name(), to do that.
+
+k. The "Insert" keypad key, if available, now puts readline into overwrite
+ mode.
+
+-------------------------------------------------------------------------------
+This is a terse description of the new features added to readline-7.0 since
+the release of readline-6.3.
+
+New Features in Readline
+
+a. The history truncation code now uses the same error recovery mechanism as
+ the history writing code, and restores the old version of the history file
+ on error. The error recovery mechanism handles symlinked history files.
+
+b. There is a new bindable variable, `enable-bracketed-paste', which enables
+ support for a terminal's bracketed paste mode.
+
+c. The editing mode indicators can now be strings and are user-settable
+ (new `emacs-mode-string', `vi-cmd-mode-string' and `vi-ins-mode-string'
+ variables). Mode strings can contain invisible character sequences.
+ Setting mode strings to null strings restores the defaults.
+
+d. Prompt expansion adds the mode string to the last line of a multi-line
+ prompt (one with embedded newlines).
+
+e. There is a new bindable variable, `colored-completion-prefix', which, if
+ set, causes the common prefix of a set of possible completions to be
+ displayed in color.
+
+f. There is a new bindable command `vi-yank-pop', a vi-mode version of emacs-
+ mode yank-pop.
+
+g. The redisplay code underwent several efficiency improvements for multibyte
+ locales.
+
+h. The insert-char function attempts to batch-insert all pending typeahead
+ that maps to self-insert, as long as it is coming from the terminal.
+
+i. rl_callback_sigcleanup: a new application function that can clean up and
+ unset any state set by readline's callback mode. Intended to be used
+ after a signal.
+
+j. If an incremental search string has its last character removed with DEL, the
+ resulting empty search string no longer matches the previous line.
+
+k. If readline reads a history file that begins with `#' (or the value of
+ the history comment character) and has enabled history timestamps, the history
+ entries are assumed to be delimited by timestamps. This allows multi-line
+ history entries.
+
+l. Readline now throws an error if it parses a key binding without a terminating
+ `:' or whitespace.
+
+m. The default binding for ^W in vi mode now uses word boundaries specified
+ by Posix (vi-unix-word-rubout is bindable command name).
+
+n. rl_clear_visible_line: new application-callable function; clears all
+ screen lines occupied by the current visible readline line.
+
+o. rl_tty_set_echoing: application-callable function that controls whether
+ or not readline thinks it is echoing terminal output.
+
+p. Handle >| and strings of digits preceding and following redirection
+ specifications as single tokens when tokenizing the line for history
+ expansion.
+
+q. Fixed a bug with displaying completions when the prefix display length
+ is greater than the length of the completions to be displayed.
+
+r. The :p history modifier now applies to the entire line, so any expansion
+ specifying :p causes the line to be printed instead of expanded.
+
+s. New application-callable function: rl_pending_signal(): returns the signal
+ number of any signal readline has caught but not yet handled.
+
+t. New application-settable variable: rl_persistent_signal_handlers: if set
+ to a non-zero value, readline will enable the readline-6.2 signal handler
+ behavior in callback mode: handlers are installed when
+ rl_callback_handler_install is called and removed removed when a complete
+ line has been read.
+
+-------------------------------------------------------------------------------
+This is a terse description of the new features added to readline-6.3 since
+the release of readline-6.2.
+
+New Features in Readline
+
+a. Readline is now more responsive to SIGHUP and other fatal signals when
+ reading input from the terminal or performing word completion but no
+ longer attempts to run any not-allowable functions from a signal handler
+ context.
+
+b. There are new bindable commands to search the history for the string of
+ characters between the beginning of the line and the point
+ (history-substring-search-forward, history-substring-search-backward)
+
+c. Readline allows quoted strings as the values of variables when setting
+ them with `set'. As a side effect, trailing spaces and tabs are ignored
+ when setting a string variable's value.
+
+d. The history library creates a backup of the history file when writing it
+ and restores the backup on a write error.
+
+e. New application-settable variable: rl_filename_stat_hook: a function called
+ with a filename before using it in a call to stat(2). Bash uses it to
+ expand shell variables so things like $HOME/Downloads have a slash
+ appended.
+
+f. New bindable function `print-last-kbd-macro', prints the most-recently-
+ defined keyboard macro in a reusable format.
+
+g. New user-settable variable `colored-stats', enables use of colored text
+ to denote file types when displaying possible completions (colored analog
+ of visible-stats).
+
+h. New user-settable variable `keyseq-timout', acts as an inter-character
+ timeout when reading input or incremental search strings.
+
+i. New application-callable function: rl_clear_history. Clears the history list
+ and frees all readline-associated private data.
+
+j. New user-settable variable, show-mode-in-prompt, adds a characters to the
+ beginning of the prompt indicating the current editing mode.
+
+k. New application-settable variable: rl_input_available_hook; function to be
+ called when readline detects there is data available on its input file
+ descriptor.
+
+l. Readline calls an application-set event hook (rl_event_hook) after it gets
+ a signal while reading input (read returns -1/EINTR but readline does not
+ handle the signal immediately) to allow the application to handle or
+ otherwise note it.
+
+m. If the user-settable variable `history-size' is set to a value less than
+ 0, the history list size is unlimited.
+
+n. New application-settable variable: rl_signal_event_hook; function that is
+ called when readline is reading terminal input and read(2) is interrupted
+ by a signal. Currently not called for SIGHUP or SIGTERM.
+
+-------------------------------------------------------------------------------
+This is a terse description of the new features added to readline-6.2 since
+the release of readline-6.1.
+
+a. The history library does not try to write the history filename in the
+ current directory if $HOME is unset. This closes a potential security
+ problem if the application does not specify a history filename.
+
+b. New bindable variable `completion-display-width' to set the number of
+ columns used when displaying completions.
+
+c. New bindable variable `completion-case-map' to cause case-insensitive
+ completion to treat `-' and `_' as identical.
+
+d. There are new bindable vi-mode command names to avoid readline's case-
+ insensitive matching not allowing them to be bound separately.
+
+e. New bindable variable `menu-complete-display-prefix' causes the menu
+ completion code to display the common prefix of the possible completions
+ before cycling through the list, instead of after.
+
+-------------------------------------------------------------------------------
+This is a terse description of the new features added to readline-6.1 since
+the release of readline-6.0.
+
+New Features in Readline
+
+a. New bindable function: menu-complete-backward.
+
+b. In the vi insertion keymap, C-n is now bound to menu-complete by default,
+ and C-p to menu-complete-backward.
+
+c. When in vi command mode, repeatedly hitting ESC now does nothing, even
+ when ESC introduces a bound key sequence. This is closer to how
+ historical vi behaves.
+
+d. New bindable function: skip-csi-sequence. Can be used as a default to
+ consume key sequences generated by keys like Home and End without having
+ to bind all keys.
+
+e. New application-settable function: rl_filename_rewrite_hook. Can be used
+ to rewrite or modify filenames read from the file system before they are
+ compared to the word to be completed.
+
+f. New bindable variable: skip-completed-text, active when completing in the
+ middle of a word. If enabled, it means that characters in the completion
+ that match characters in the remainder of the word are "skipped" rather
+ than inserted into the line.
+
+g. The pre-readline-6.0 version of menu completion is available as
+ "old-menu-complete" for users who do not like the readline-6.0 version.
+
+h. New bindable variable: echo-control-characters. If enabled, and the
+ tty ECHOCTL bit is set, controls the echoing of characters corresponding
+ to keyboard-generated signals.
+
+i. New bindable variable: enable-meta-key. Controls whether or not readline
+ sends the smm/rmm sequences if the terminal indicates it has a meta key
+ that enables eight-bit characters.
+
+-------------------------------------------------------------------------------
+This is a terse description of the new features added to readline-6.0 since
+the release of readline-5.2.
+
+New Features in Readline
+
+a. A new variable, rl_sort_completion_matches; allows applications to inhibit
+ match list sorting (but beware: some things don't work right if
+ applications do this).
+
+b. A new variable, rl_completion_invoking_key; allows applications to discover
+ the key that invoked rl_complete or rl_menu_complete.
+
+c. The functions rl_block_sigint and rl_release_sigint are now public and
+ available to calling applications who want to protect critical sections
+ (like redisplay).
+
+d. The functions rl_save_state and rl_restore_state are now public and
+ available to calling applications; documented rest of readline's state
+ flag values.
+
+e. A new user-settable variable, `history-size', allows setting the maximum
+ number of entries in the history list.
+
+f. There is a new implementation of menu completion, with several improvements
+ over the old; the most notable improvement is a better `completions
+ browsing' mode.
+
+g. The menu completion code now uses the rl_menu_completion_entry_function
+ variable, allowing applications to provide their own menu completion
+ generators.
+
+h. There is support for replacing a prefix of a pathname with a `...' when
+ displaying possible completions. This is controllable by setting the
+ `completion-prefix-display-length' variable. Matches with a common prefix
+ longer than this value have the common prefix replaced with `...'.
+
+i. There is a new `revert-all-at-newline' variable. If enabled, readline will
+ undo all outstanding changes to all history lines when `accept-line' is
+ executed.
+
+-------------------------------------------------------------------------------
+This is a terse description of the new features added to readline-5.2 since
+the release of readline-5.1.
+
+New Features in Readline
+
+a. Calling applications can now set the keyboard timeout to 0, allowing
+ poll-like behavior.
+
+b. The value of SYS_INPUTRC (configurable at compilation time) is now used as
+ the default last-ditch startup file.
+
+c. The history file reading functions now allow windows-like \r\n line
+ terminators.
+
+-------------------------------------------------------------------------------
+This is a terse description of the new features added to readline-5.1 since
+the release of readline-5.0.
+
+New Features in Readline
+
+a. The key sequence sent by the keypad `delete' key is now automatically
+ bound to delete-char.
+
+b. A negative argument to menu-complete now cycles backward through the
+ completion list.
+
+c. A new bindable readline variable: bind-tty-special-chars. If non-zero,
+ readline will bind the terminal special characters to their readline
+ equivalents when it's called (on by default).
+
+d. New bindable command: vi-rubout. Saves deleted text for possible
+ reinsertion, as with any vi-mode `text modification' command; `X' is bound
+ to this in vi command mode.
+
+e. If the rl_completion_query_items is set to a value < 0, readline never
+ asks the user whether or not to view the possible completions.
+
+f. New application-callable auxiliary function, rl_variable_value, returns
+ a string corresponding to a readline variable's value.
+
+g. When parsing inputrc files and variable binding commands, the parser
+ strips trailing whitespace from values assigned to boolean variables
+ before checking them.
+
+h. A new external application-controllable variable that allows the LINES
+ and COLUMNS environment variables to set the window size regardless of
+ what the kernel returns.
+
+
+-------------------------------------------------------------------------------
+This is a terse description of the new features added to readline-5.0 since
+the release of readline-4.3.
+
+New Features in Readline
+
+a. History expansion has a new `a' modifier equivalent to the `g' modifier
+ for compatibility with the BSD csh.
+
+b. History expansion has a new `G' modifier equivalent to the BSD csh `g'
+ modifier, which performs a substitution once per word.
+
+c. All non-incremental search operations may now undo the operation of
+ replacing the current line with the history line.
+
+d. The text inserted by an `a' command in vi mode can be reinserted with
+ `.'.
+
+e. New bindable variable, `show-all-if-unmodified'. If set, the readline
+ completer will list possible completions immediately if there is more
+ than one completion and partial completion cannot be performed.
+
+f. There is a new application-callable `free_history_entry()' function.
+
+g. History list entries now contain timestamp information; the history file
+ functions know how to read and write timestamp information associated
+ with each entry.
+
+h. Four new key binding functions have been added:
+
+ rl_bind_key_if_unbound()
+ rl_bind_key_if_unbound_in_map()
+ rl_bind_keyseq_if_unbound()
+ rl_bind_keyseq_if_unbound_in_map()
+
+i. New application variable, rl_completion_quote_character, set to any
+ quote character readline finds before it calls the application completion
+ function.
+
+j. New application variable, rl_completion_suppress_quote, settable by an
+ application completion function. If set to non-zero, readline does not
+ attempt to append a closing quote to a completed word.
+
+k. New application variable, rl_completion_found_quote, set to a non-zero
+ value if readline determines that the word to be completed is quoted.
+ Set before readline calls any application completion function.
+
+l. New function hook, rl_completion_word_break_hook, called when readline
+ needs to break a line into words when completion is attempted. Allows
+ the word break characters to vary based on position in the line.
+
+m. New bindable command: unix-filename-rubout. Does the same thing as
+ unix-word-rubout, but adds `/' to the set of word delimiters.
+
+n. When listing completions, directories have a `/' appended if the
+ `mark-directories' option has been enabled.
diff --git a/README b/README
new file mode 100644
index 0000000..83cdb23
--- /dev/null
+++ b/README
@@ -0,0 +1,196 @@
+Introduction
+============
+
+This is the Gnu Readline library, version 8.2.
+
+The Readline library provides a set of functions for use by applications
+that allow users to edit command lines as they are typed in. Both
+Emacs and vi editing modes are available. The Readline library includes
+additional functions to maintain a list of previously-entered command
+lines, to recall and perhaps reedit those lines, and perform csh-like
+history expansion on previous commands.
+
+The history facilities are also placed into a separate library, the
+History library, as part of the build process. The History library
+may be used without Readline in applications which desire its
+capabilities.
+
+The Readline library is free software, distributed under the terms of
+the [GNU] General Public License as published by the Free Software
+Foundation, version 3 of the License. For more information, see the
+file COPYING.
+
+To build the library, try typing `./configure', then `make'. The
+configuration process is automated, so no further intervention should
+be necessary. Readline builds with `gcc' by default if it is
+available. If you want to use `cc' instead, type
+
+ CC=cc ./configure
+
+if you are using a Bourne-style shell. If you are not, the following
+may work:
+
+ env CC=cc ./configure
+
+Read the file INSTALL in this directory for more information about how
+to customize and control the build process.
+
+The file rlconf.h contains C preprocessor defines that enable and disable
+certain Readline features.
+
+The special make target `everything' will build the static and shared
+libraries (if the target platform supports them) and the examples.
+
+Examples
+========
+
+There are several example programs that use Readline features in the
+examples directory. The `rl' program is of particular interest. It
+is a command-line interface to Readline, suitable for use in shell
+scripts in place of `read'.
+
+Shared Libraries
+================
+
+There is skeletal support for building shared versions of the
+Readline and History libraries. The configure script creates
+a Makefile in the `shlib' subdirectory, and typing `make shared'
+will cause shared versions of the Readline and History libraries
+to be built on supported platforms.
+
+If `configure' is given the `--enable-shared' option, it will attempt
+to build the shared libraries by default on supported platforms.
+
+Configure calls the script support/shobj-conf to test whether or
+not shared library creation is supported and to generate the values
+of variables that are substituted into shlib/Makefile. If you
+try to build shared libraries on an unsupported platform, `make'
+will display a message asking you to update support/shobj-conf for
+your platform.
+
+If you need to update support/shobj-conf, you will need to create
+a `stanza' for your operating system and compiler. The script uses
+the value of host_os and ${CC} as determined by configure. For
+instance, FreeBSD 4.2 with any version of gcc is identified as
+`freebsd4.2-gcc*'.
+
+In the stanza for your operating system-compiler pair, you will need to
+define several variables. They are:
+
+SHOBJ_CC The C compiler used to compile source files into shareable
+ object files. This is normally set to the value of ${CC}
+ by configure, and should not need to be changed.
+
+SHOBJ_CFLAGS Flags to pass to the C compiler ($SHOBJ_CC) to create
+ position-independent code. If you are using gcc, this
+ should probably be set to `-fpic'.
+
+SHOBJ_LD The link editor to be used to create the shared library from
+ the object files created by $SHOBJ_CC. If you are using
+ gcc, a value of `gcc' will probably work.
+
+SHOBJ_LDFLAGS Flags to pass to SHOBJ_LD to enable shared object creation.
+ If you are using gcc, `-shared' may be all that is necessary.
+ These should be the flags needed for generic shared object
+ creation.
+
+SHLIB_XLDFLAGS Additional flags to pass to SHOBJ_LD for shared library
+ creation. Many systems use the -R option to the link
+ editor to embed a path within the library for run-time
+ library searches. A reasonable value for such systems would
+ be `-R$(libdir)'.
+
+SHLIB_LIBS Any additional libraries that shared libraries should be
+ linked against when they are created.
+
+SHLIB_LIBPREF The prefix to use when generating the filename of the shared
+ library. The default is `lib'; Cygwin uses `cyg'.
+
+SHLIB_LIBSUFF The suffix to add to `libreadline' and `libhistory' when
+ generating the filename of the shared library. Many systems
+ use `so'; HP-UX uses `sl'.
+
+SHLIB_LIBVERSION The string to append to the filename to indicate the version
+ of the shared library. It should begin with $(SHLIB_LIBSUFF),
+ and possibly include version information that allows the
+ run-time loader to load the version of the shared library
+ appropriate for a particular program. Systems using shared
+ libraries similar to SunOS 4.x use major and minor library
+ version numbers; for those systems a value of
+ `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' is appropriate.
+ Systems based on System V Release 4 don't use minor version
+ numbers; use `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' on those systems.
+ Other Unix versions use different schemes.
+
+SHLIB_DLLVERSION The version number for shared libraries that determines API
+ compatibility between readline versions and the underlying
+ system. Used only on Cygwin. Defaults to $SHLIB_MAJOR, but
+ can be overridden at configuration time by defining DLLVERSION
+ in the environment.
+
+SHLIB_DOT The character used to separate the name of the shared library
+ from the suffix and version information. The default is `.';
+ systems like Cygwin which don't separate version information
+ from the library name should set this to the empty string.
+
+SHLIB_STATUS Set this to `supported' when you have defined the other
+ necessary variables. Make uses this to determine whether
+ or not shared library creation should be attempted.
+
+You should look at the existing stanzas in support/shobj-conf for ideas.
+
+Once you have updated support/shobj-conf, re-run configure and type
+`make shared'. The shared libraries will be created in the shlib
+subdirectory.
+
+If shared libraries are created, `make install' will install them.
+You may install only the shared libraries by running `make
+install-shared' from the top-level build directory. Running `make
+install' in the shlib subdirectory will also work. If you don't want
+to install any created shared libraries, run `make install-static'.
+
+Documentation
+=============
+
+The documentation for the Readline and History libraries appears in
+the `doc' subdirectory. There are three texinfo files and a
+Unix-style manual page describing the facilities available in the
+Readline library. The texinfo files include both user and
+programmer's manuals. HTML versions of the manuals appear in the
+`doc' subdirectory as well.
+
+Usage
+=====
+
+Our position on the use of Readline through a shared-library linking
+mechanism is that there is no legal difference between shared-library
+linking and static linking--either kind of linking combines various
+modules into a single larger work. The conditions for using Readline
+in a larger work are stated in section 3 of the GNU GPL.
+
+Reporting Bugs
+==============
+
+Bug reports for Readline should be sent to:
+
+ bug-readline@gnu.org
+
+When reporting a bug, please include the following information:
+
+ * the version number and release status of Readline (e.g., 4.2-release)
+ * the machine and OS that it is running on
+ * a list of the compilation flags or the contents of `config.h', if
+ appropriate
+ * a description of the bug
+ * a recipe for recreating the bug reliably
+ * a fix for the bug if you have one!
+
+If you would like to contact the Readline maintainer directly, send mail
+to bash-maintainers@gnu.org.
+
+Since Readline is developed along with bash, the bug-bash@gnu.org mailing
+list (mirrored to the Usenet newsgroup gnu.bash.bug) often contains
+Readline bug reports and fixes.
+
+Chet Ramey
+chet.ramey@case.edu
diff --git a/USAGE b/USAGE
new file mode 100644
index 0000000..edc9f54
--- /dev/null
+++ b/USAGE
@@ -0,0 +1,37 @@
+From rms@gnu.org Thu Jul 22 20:37:55 1999
+Flags: 10
+Return-Path: rms@gnu.org
+Received: from arthur.INS.CWRU.Edu (root@arthur.INS.CWRU.Edu [129.22.8.215]) by odin.INS.CWRU.Edu with ESMTP (8.8.6+cwru/CWRU-2.4-ins)
+ id UAA25349; Thu, 22 Jul 1999 20:37:54 -0400 (EDT) (from rms@gnu.org for <chet@odin.INS.CWRU.Edu>)
+Received: from nike.ins.cwru.edu (root@nike.INS.CWRU.Edu [129.22.8.219]) by arthur.INS.CWRU.Edu with ESMTP (8.8.8+cwru/CWRU-3.6)
+ id UAA05311; Thu, 22 Jul 1999 20:37:51 -0400 (EDT) (from rms@gnu.org for <chet@po.cwru.edu>)
+Received: from pele.santafe.edu (pele.santafe.edu [192.12.12.119]) by nike.ins.cwru.edu with ESMTP (8.8.7/CWRU-2.5-bsdi)
+ id UAA13350; Thu, 22 Jul 1999 20:37:50 -0400 (EDT) (from rms@gnu.org for <chet@nike.ins.cwru.edu>)
+Received: from wijiji.santafe.edu (wijiji [192.12.12.5])
+ by pele.santafe.edu (8.9.1/8.9.1) with ESMTP id SAA10831
+ for <chet@nike.ins.cwru.edu>; Thu, 22 Jul 1999 18:37:47 -0600 (MDT)
+Received: (from rms@localhost)
+ by wijiji.santafe.edu (8.9.1b+Sun/8.9.1) id SAA01089;
+ Thu, 22 Jul 1999 18:37:46 -0600 (MDT)
+Date: Thu, 22 Jul 1999 18:37:46 -0600 (MDT)
+Message-Id: <199907230037.SAA01089@wijiji.santafe.edu>
+X-Authentication-Warning: wijiji.santafe.edu: rms set sender to rms@gnu.org using -f
+From: Richard Stallman <rms@gnu.org>
+To: chet@nike.ins.cwru.edu
+Subject: Use of Readline
+Reply-to: rms@gnu.org
+
+I think Allbery's suggestion is a good one. So please add this text
+in a suitable place. Please don't put it in the GPL itself; that
+should be the same as the GPL everywhere else. Putting it in the
+README and/or the documentation would be a good idea.
+
+
+======================================================================
+Our position on the use of Readline through a shared-library linking
+mechanism is that there is no legal difference between shared-library
+linking and static linking--either kind of linking combines various
+modules into a single larger work. The conditions for using Readline
+in a larger work are stated in section 3 of the GNU GPL.
+
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..cc97bd4
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,2267 @@
+dnl
+dnl Bash specific tests
+dnl
+dnl Some derived from PDKSH 5.1.3 autoconf tests
+dnl
+dnl Copyright (C) 1987-2021 Free Software Foundation, Inc.
+dnl
+
+dnl
+dnl Check for <inttypes.h>. This is separated out so that it can be
+dnl AC_REQUIREd.
+dnl
+dnl BASH_HEADER_INTTYPES
+AC_DEFUN(BASH_HEADER_INTTYPES,
+[
+ AC_CHECK_HEADERS(inttypes.h)
+])
+
+dnl
+dnl check for typedef'd symbols in header files, but allow the caller to
+dnl specify the include files to be checked in addition to the default
+dnl
+dnl This could be changed to use AC_COMPILE_IFELSE instead of AC_EGREP_CPP
+dnl
+dnl BASH_CHECK_TYPE(TYPE, HEADERS, DEFAULT[, VALUE-IF-FOUND])
+AC_DEFUN(BASH_CHECK_TYPE,
+[
+AC_REQUIRE([BASH_HEADER_INTTYPES])
+AC_MSG_CHECKING(for $1)
+AC_CACHE_VAL(bash_cv_type_$1,
+[AC_EGREP_CPP($1, [#include <sys/types.h>
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#if HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+$2
+], bash_cv_type_$1=yes, bash_cv_type_$1=no)])
+AC_MSG_RESULT($bash_cv_type_$1)
+ifelse($#, 4, [if test $bash_cv_type_$1 = yes; then
+ AC_DEFINE($4)
+ fi])
+if test $bash_cv_type_$1 = no; then
+ AC_DEFINE_UNQUOTED($1, $3)
+fi
+])
+
+dnl
+dnl BASH_CHECK_DECL(FUNC)
+dnl
+dnl Check for a declaration of FUNC in stdlib.h and inttypes.h like
+dnl AC_CHECK_DECL
+dnl
+AC_DEFUN(BASH_CHECK_DECL,
+[
+AC_REQUIRE([BASH_HEADER_INTTYPES])
+AC_CHECK_DECLS([$1])
+])
+
+AC_DEFUN(BASH_DECL_PRINTF,
+[AC_MSG_CHECKING(for declaration of printf in <stdio.h>)
+AC_CACHE_VAL(bash_cv_printf_declared,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdio.h>
+#ifdef __STDC__
+typedef int (*_bashfunc)(const char *, ...);
+#else
+typedef int (*_bashfunc)();
+#endif
+#include <stdlib.h>
+int
+main()
+{
+_bashfunc pf;
+pf = (_bashfunc) printf;
+exit(pf == 0);
+}
+]])], [bash_cv_printf_declared=yes], [bash_cv_printf_declared=no],
+ [AC_MSG_WARN(cannot check printf declaration if cross compiling -- defaulting to yes)
+ bash_cv_printf_declared=yes]
+)])
+AC_MSG_RESULT($bash_cv_printf_declared)
+if test $bash_cv_printf_declared = yes; then
+AC_DEFINE(PRINTF_DECLARED)
+fi
+])
+
+AC_DEFUN(BASH_DECL_SBRK,
+[AC_MSG_CHECKING(for declaration of sbrk in <unistd.h>)
+AC_CACHE_VAL(bash_cv_sbrk_declared,
+[AC_EGREP_HEADER(sbrk, unistd.h,
+ bash_cv_sbrk_declared=yes, bash_cv_sbrk_declared=no)])
+AC_MSG_RESULT($bash_cv_sbrk_declared)
+if test $bash_cv_sbrk_declared = yes; then
+AC_DEFINE(SBRK_DECLARED)
+fi
+])
+
+dnl
+dnl Check for sys_siglist[] or _sys_siglist[]
+dnl
+AC_DEFUN(BASH_DECL_UNDER_SYS_SIGLIST,
+[AC_MSG_CHECKING([for _sys_siglist in signal.h or unistd.h])
+AC_CACHE_VAL(bash_cv_decl_under_sys_siglist,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif]], [[ char *msg = _sys_siglist[2]; ]])],
+ [bash_cv_decl_under_sys_siglist=yes], [bash_cv_decl_under_sys_siglist=no],
+ [AC_MSG_WARN(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)])])dnl
+AC_MSG_RESULT($bash_cv_decl_under_sys_siglist)
+if test $bash_cv_decl_under_sys_siglist = yes; then
+AC_DEFINE(UNDER_SYS_SIGLIST_DECLARED)
+fi
+])
+
+AC_DEFUN(BASH_UNDER_SYS_SIGLIST,
+[AC_REQUIRE([BASH_DECL_UNDER_SYS_SIGLIST])
+AC_MSG_CHECKING([for _sys_siglist in system C library])
+AC_CACHE_VAL(bash_cv_under_sys_siglist,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#ifndef UNDER_SYS_SIGLIST_DECLARED
+extern char *_sys_siglist[];
+#endif
+int
+main()
+{
+char *msg = (char *)_sys_siglist[2];
+exit(msg == 0);
+}
+]])],
+ [bash_cv_under_sys_siglist=yes], [bash_cv_under_sys_siglist=no],
+ [AC_MSG_WARN(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)
+ bash_cv_under_sys_siglist=no]
+)])
+AC_MSG_RESULT($bash_cv_under_sys_siglist)
+if test $bash_cv_under_sys_siglist = yes; then
+AC_DEFINE(HAVE_UNDER_SYS_SIGLIST)
+fi
+])
+
+dnl this defines HAVE_DECL_SYS_SIGLIST
+AC_DEFUN([BASH_DECL_SYS_SIGLIST],
+[AC_CHECK_DECLS([sys_siglist],,,
+[#include <signal.h>
+/* NetBSD declares sys_siglist in unistd.h. */
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+])
+])
+
+AC_DEFUN(BASH_SYS_SIGLIST,
+[AC_REQUIRE([BASH_DECL_SYS_SIGLIST])
+AC_MSG_CHECKING([for sys_siglist in system C library])
+AC_CACHE_VAL(bash_cv_sys_siglist,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#if !HAVE_DECL_SYS_SIGLIST
+extern char *sys_siglist[];
+#endif
+int
+main()
+{
+char *msg = sys_siglist[2];
+exit(msg == 0);
+}
+]])], [bash_cv_sys_siglist=yes], [bash_cv_sys_siglist=no],
+ [AC_MSG_WARN(cannot check for sys_siglist if cross compiling -- defaulting to no)
+ bash_cv_sys_siglist=no]
+)])
+AC_MSG_RESULT($bash_cv_sys_siglist)
+if test $bash_cv_sys_siglist = yes; then
+AC_DEFINE(HAVE_SYS_SIGLIST)
+fi
+])
+
+dnl Check for the various permutations of sys_siglist and make sure we
+dnl compile in siglist.o if they're not defined
+AC_DEFUN(BASH_CHECK_SYS_SIGLIST, [
+AC_REQUIRE([BASH_SYS_SIGLIST])
+AC_REQUIRE([BASH_DECL_UNDER_SYS_SIGLIST])
+AC_REQUIRE([BASH_FUNC_STRSIGNAL])
+if test "$bash_cv_sys_siglist" = no && test "$bash_cv_under_sys_siglist" = no && test "$bash_cv_have_strsignal" = no; then
+ SIGLIST_O=siglist.o
+else
+ SIGLIST_O=
+fi
+AC_SUBST([SIGLIST_O])
+])
+
+dnl Check for sys_errlist[] and sys_nerr, check for declaration
+AC_DEFUN(BASH_SYS_ERRLIST,
+[AC_MSG_CHECKING([for sys_errlist and sys_nerr])
+AC_CACHE_VAL(bash_cv_sys_errlist,
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <errno.h>
+]],[[
+extern char *sys_errlist[];
+extern int sys_nerr;
+char *msg = sys_errlist[sys_nerr - 1];
+]] )],
+[bash_cv_sys_errlist=yes], [bash_cv_sys_errlist=no]
+)])
+AC_MSG_RESULT($bash_cv_sys_errlist)
+if test $bash_cv_sys_errlist = yes; then
+AC_DEFINE(HAVE_SYS_ERRLIST)
+fi
+])
+
+dnl
+dnl Check if dup2() does not clear the close on exec flag
+dnl
+AC_DEFUN(BASH_FUNC_DUP2_CLOEXEC_CHECK,
+[AC_MSG_CHECKING(if dup2 fails to clear the close-on-exec flag)
+AC_CACHE_VAL(bash_cv_dup2_broken,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <fcntl.h>
+#include <stdlib.h>
+int
+main()
+{
+ int fd1, fd2, fl;
+ fd1 = open("/dev/null", 2);
+ if (fcntl(fd1, 2, 1) < 0)
+ exit(1);
+ fd2 = dup2(fd1, 1);
+ if (fd2 < 0)
+ exit(2);
+ fl = fcntl(fd2, 1, 0);
+ /* fl will be 1 if dup2 did not reset the close-on-exec flag. */
+ exit(fl != 1);
+}
+]])], [bash_cv_dup2_broken=yes], [bash_cv_dup2_broken=no],
+ [AC_MSG_WARN(cannot check dup2 if cross compiling -- defaulting to no)
+ bash_cv_dup2_broken=no]
+)])
+AC_MSG_RESULT($bash_cv_dup2_broken)
+if test $bash_cv_dup2_broken = yes; then
+AC_DEFINE(DUP2_BROKEN)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_STRSIGNAL,
+[AC_MSG_CHECKING([for the existence of strsignal])
+AC_CACHE_VAL(bash_cv_have_strsignal,
+[AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[#include <sys/types.h>
+#include <signal.h>
+#include <string.h>]],
+[[char *s = (char *)strsignal(2);]])],
+ [bash_cv_have_strsignal=yes], [bash_cv_have_strsignal=no])])
+AC_MSG_RESULT($bash_cv_have_strsignal)
+if test $bash_cv_have_strsignal = yes; then
+AC_DEFINE(HAVE_STRSIGNAL)
+fi
+])
+
+dnl Check to see if opendir will open non-directories (not a nice thing)
+AC_DEFUN(BASH_FUNC_OPENDIR_CHECK,
+[AC_REQUIRE([AC_HEADER_DIRENT])dnl
+AC_MSG_CHECKING(if opendir() opens non-directories)
+AC_CACHE_VAL(bash_cv_opendir_not_robust,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+#include <stdlib.h>
+int
+main()
+{
+DIR *dir;
+int fd, err;
+err = mkdir("bash-aclocal", 0700);
+if (err < 0) {
+ perror("mkdir");
+ exit(1);
+}
+unlink("bash-aclocal/not_a_directory");
+fd = open("bash-aclocal/not_a_directory", O_WRONLY|O_CREAT|O_EXCL, 0666);
+write(fd, "\n", 1);
+close(fd);
+dir = opendir("bash-aclocal/not_a_directory");
+unlink("bash-aclocal/not_a_directory");
+rmdir("bash-aclocal");
+exit (dir == 0);
+}
+]])], [bash_cv_opendir_not_robust=yes], [bash_cv_opendir_not_robust=no],
+ [AC_MSG_WARN(cannot check opendir if cross compiling -- defaulting to no)
+ bash_cv_opendir_not_robust=no]
+)])
+AC_MSG_RESULT($bash_cv_opendir_not_robust)
+if test $bash_cv_opendir_not_robust = yes; then
+AC_DEFINE(OPENDIR_NOT_ROBUST)
+fi
+])
+
+dnl
+dnl A signed 16-bit integer quantity
+dnl
+AC_DEFUN(BASH_TYPE_BITS16_T,
+[
+if test "$ac_cv_sizeof_short" = 2; then
+ AC_CHECK_TYPE(bits16_t, short)
+elif test "$ac_cv_sizeof_char" = 2; then
+ AC_CHECK_TYPE(bits16_t, char)
+else
+ AC_CHECK_TYPE(bits16_t, short)
+fi
+])
+
+dnl
+dnl An unsigned 16-bit integer quantity
+dnl
+AC_DEFUN(BASH_TYPE_U_BITS16_T,
+[
+if test "$ac_cv_sizeof_short" = 2; then
+ AC_CHECK_TYPE(u_bits16_t, unsigned short)
+elif test "$ac_cv_sizeof_char" = 2; then
+ AC_CHECK_TYPE(u_bits16_t, unsigned char)
+else
+ AC_CHECK_TYPE(u_bits16_t, unsigned short)
+fi
+])
+
+dnl
+dnl A signed 32-bit integer quantity
+dnl
+AC_DEFUN(BASH_TYPE_BITS32_T,
+[
+if test "$ac_cv_sizeof_int" = 4; then
+ AC_CHECK_TYPE(bits32_t, int)
+elif test "$ac_cv_sizeof_long" = 4; then
+ AC_CHECK_TYPE(bits32_t, long)
+else
+ AC_CHECK_TYPE(bits32_t, int)
+fi
+])
+
+dnl
+dnl An unsigned 32-bit integer quantity
+dnl
+AC_DEFUN(BASH_TYPE_U_BITS32_T,
+[
+if test "$ac_cv_sizeof_int" = 4; then
+ AC_CHECK_TYPE(u_bits32_t, unsigned int)
+elif test "$ac_cv_sizeof_long" = 4; then
+ AC_CHECK_TYPE(u_bits32_t, unsigned long)
+else
+ AC_CHECK_TYPE(u_bits32_t, unsigned int)
+fi
+])
+
+AC_DEFUN(BASH_TYPE_PTRDIFF_T,
+[
+if test "$ac_cv_sizeof_int" = "$ac_cv_sizeof_char_p"; then
+ AC_CHECK_TYPE(ptrdiff_t, int)
+elif test "$ac_cv_sizeof_long" = "$ac_cv_sizeof_char_p"; then
+ AC_CHECK_TYPE(ptrdiff_t, long)
+elif test "$ac_cv_type_long_long" = yes && test "$ac_cv_sizeof_long_long" = "$ac_cv_sizeof_char_p"; then
+ AC_CHECK_TYPE(ptrdiff_t, [long long])
+else
+ AC_CHECK_TYPE(ptrdiff_t, int)
+fi
+])
+
+dnl
+dnl A signed 64-bit quantity
+dnl
+AC_DEFUN(BASH_TYPE_BITS64_T,
+[
+if test "$ac_cv_sizeof_char_p" = 8; then
+ AC_CHECK_TYPE(bits64_t, char *)
+elif test "$ac_cv_sizeof_double" = 8; then
+ AC_CHECK_TYPE(bits64_t, double)
+elif test -n "$ac_cv_type_long_long" && test "$ac_cv_sizeof_long_long" = 8; then
+ AC_CHECK_TYPE(bits64_t, [long long])
+elif test "$ac_cv_sizeof_long" = 8; then
+ AC_CHECK_TYPE(bits64_t, long)
+else
+ AC_CHECK_TYPE(bits64_t, double)
+fi
+])
+
+AC_DEFUN(BASH_SIZEOF_RLIMIT,
+[AC_MSG_CHECKING(for size of struct rlimit fields)
+AC_CACHE_VAL(bash_cv_sizeof_rlim_cur,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <stdlib.h>
+#include <sys/resource.h>
+main()
+{
+struct rlimit r;
+exit(sizeof (r.rlim_cur));
+}
+]])], [bash_cv_sizeof_rlim_cur=$?], [bash_cv_sizeof_rlim_cur=$?],
+ [AC_MSG_WARN(cannot check size of rlimit fields if cross compiling -- defaulting to long)
+ bash_cv_sizeof_rlim_cur=$ac_cv_sizeof_long]
+)])
+AC_MSG_RESULT($bash_cv_sizeof_rlim_cur)
+])
+
+AC_DEFUN(BASH_SIZEOF_QUAD_T,
+[AC_MSG_CHECKING(for size of quad_t)
+AC_CACHE_VAL(bash_cv_sizeof_quad_t,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <stdlib.h>
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+main()
+{
+#if HAVE_QUAD_T
+quad_t x;
+exit(sizeof (x));
+#else
+exit (0);
+#endif
+}
+]])], [bash_cv_sizeof_quad_t=$?], [bash_cv_sizeof_quad_t=$?],
+ [AC_MSG_WARN(cannot check size of quad_t if cross compiling -- defaulting to 0)
+ bash_cv_sizeof_quad_t=0]
+)])
+AC_MSG_RESULT($bash_cv_sizeof_quad_t)
+])
+
+dnl
+dnl Type of struct rlimit fields: updated to check POSIX rlim_t and
+dnl if it doesn't exist determine the best guess based on sizeof(r.rlim_cur)
+dnl
+AC_DEFUN(BASH_TYPE_RLIMIT,
+[AC_MSG_CHECKING(for type of struct rlimit fields)
+AC_CACHE_VAL(bash_cv_type_rlimit,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/resource.h>]],
+[[rlim_t xxx;]]
+)],
+ [bash_cv_type_rlimit=rlim_t], [
+BASH_SIZEOF_RLIMIT
+BASH_SIZEOF_QUAD_T
+if test $bash_cv_sizeof_rlim_cur = $ac_cv_sizeof_long; then
+ bash_cv_type_rlimit='unsigned long'
+elif test $bash_cv_sizeof_rlim_cur = $ac_cv_sizeof_long_long; then
+ bash_cv_type_rlimit='unsigned long long'
+elif test $bash_cv_sizeof_rlim_cur = $ac_cv_sizeof_int; then
+ bash_cv_type_rlimit='unsigned int'
+elif test $bash_cv_sizeof_rlim_cur = $bash_cv_sizeof_quad_t; then
+ bash_cv_type_rlimit='quad_t'
+else
+ bash_cv_type_rlimit='unsigned long'
+fi
+]
+)])
+AC_MSG_RESULT($bash_cv_type_rlimit)
+AC_DEFINE_UNQUOTED([RLIMTYPE], [$bash_cv_type_rlimit])
+])
+
+AC_DEFUN(BASH_TYPE_SIG_ATOMIC_T,
+[AC_CACHE_CHECK([for sig_atomic_t in signal.h], ac_cv_have_sig_atomic_t,
+[AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[ #include <signal.h> ]],
+ [[ sig_atomic_t x; ]])],
+ [ac_cv_have_sig_atomic_t=yes],[ac_cv_have_sig_atomic_t=no])])
+if test "$ac_cv_have_sig_atomic_t" = "no"
+then
+ BASH_CHECK_TYPE(sig_atomic_t, [#include <signal.h>], int)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_LSTAT,
+[dnl Cannot use AC_CHECK_FUNCS(lstat) because Linux defines lstat() as an
+dnl inline function in <sys/stat.h>.
+AC_CACHE_CHECK([for lstat], bash_cv_func_lstat,
+[AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ ]],
+ [[ lstat(".",(struct stat *)0); ]])],
+ [bash_cv_func_lstat=yes],[bash_cv_func_lstat=no])])
+if test $bash_cv_func_lstat = yes; then
+ AC_DEFINE(HAVE_LSTAT)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_INET_ATON,
+[
+AC_CACHE_CHECK([for inet_aton], bash_cv_func_inet_aton,
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+struct in_addr ap;]], [[ inet_aton("127.0.0.1", &ap); ]])],
+[bash_cv_func_inet_aton=yes], [bash_cv_func_inet_aton=no])])
+if test $bash_cv_func_inet_aton = yes; then
+ AC_DEFINE(HAVE_INET_ATON)
+else
+ AC_LIBOBJ(inet_aton)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_GETENV,
+[AC_MSG_CHECKING(to see if getenv can be redefined)
+AC_CACHE_VAL(bash_cv_getenv_redef,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <stdlib.h>
+#ifndef __STDC__
+# ifndef const
+# define const
+# endif
+#endif
+char *
+getenv (name)
+#if defined (__linux__) || defined (__bsdi__) || defined (convex)
+ const char *name;
+#else
+ char const *name;
+#endif /* !__linux__ && !__bsdi__ && !convex */
+{
+return "42";
+}
+int
+main()
+{
+char *s;
+/* The next allows this program to run, but does not allow bash to link
+ when it redefines getenv. I'm not really interested in figuring out
+ why not. */
+#if defined (NeXT)
+exit(1);
+#endif
+s = getenv("ABCDE");
+exit(s == 0); /* force optimizer to leave getenv in */
+}
+]])], [bash_cv_getenv_redef=yes], [bash_cv_getenv_redef=no],
+ [AC_MSG_WARN(cannot check getenv redefinition if cross compiling -- defaulting to yes)
+ bash_cv_getenv_redef=yes]
+)])
+AC_MSG_RESULT($bash_cv_getenv_redef)
+if test $bash_cv_getenv_redef = yes; then
+AC_DEFINE(CAN_REDEFINE_GETENV)
+fi
+])
+
+# We should check for putenv before calling this
+AC_DEFUN(BASH_FUNC_STD_PUTENV,
+[
+AC_REQUIRE([AC_C_PROTOTYPES])
+AC_CACHE_CHECK([for standard-conformant putenv declaration], bash_cv_std_putenv,
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#if HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+#ifndef __STDC__
+# ifndef const
+# define const
+# endif
+#endif
+#ifdef PROTOTYPES
+extern int putenv (char *);
+#else
+extern int putenv ();
+#endif
+]], [[return (putenv == 0);]] )],
+[bash_cv_std_putenv=yes], [bash_cv_std_putenv=no]
+)])
+if test $bash_cv_std_putenv = yes; then
+AC_DEFINE(HAVE_STD_PUTENV)
+fi
+])
+
+# We should check for unsetenv before calling this
+AC_DEFUN(BASH_FUNC_STD_UNSETENV,
+[
+AC_REQUIRE([AC_C_PROTOTYPES])
+AC_CACHE_CHECK([for standard-conformant unsetenv declaration], bash_cv_std_unsetenv,
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#if HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+#ifndef __STDC__
+# ifndef const
+# define const
+# endif
+#endif
+#ifdef PROTOTYPES
+extern int unsetenv (const char *);
+#else
+extern int unsetenv ();
+#endif
+]], [[return (unsetenv == 0);]] )],
+[bash_cv_std_unsetenv=yes], [bash_cv_std_unsetenv=no]
+)])
+if test $bash_cv_std_unsetenv = yes; then
+AC_DEFINE(HAVE_STD_UNSETENV)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_ULIMIT_MAXFDS,
+[AC_MSG_CHECKING(whether ulimit can substitute for getdtablesize)
+AC_CACHE_VAL(bash_cv_ulimit_maxfds,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdlib.h>
+#ifdef HAVE_ULIMIT_H
+#include <ulimit.h>
+#endif
+int
+main()
+{
+long maxfds = ulimit(4, 0L);
+exit (maxfds == -1L);
+}
+]])], [bash_cv_ulimit_maxfds=yes], [bash_cv_ulimit_maxfds=no],
+ [AC_MSG_WARN(cannot check ulimit if cross compiling -- defaulting to no)
+ bash_cv_ulimit_maxfds=no]
+)])
+AC_MSG_RESULT($bash_cv_ulimit_maxfds)
+if test $bash_cv_ulimit_maxfds = yes; then
+AC_DEFINE(ULIMIT_MAXFDS)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_GETCWD,
+[AC_MSG_CHECKING([if getcwd() will dynamically allocate memory with 0 size])
+AC_CACHE_VAL(bash_cv_getcwd_malloc,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+
+int
+main()
+{
+ char *xpwd;
+ xpwd = getcwd(0, 0);
+ exit (xpwd == 0);
+}
+]])], [bash_cv_getcwd_malloc=yes], [bash_cv_getcwd_malloc=no],
+ [AC_MSG_WARN(cannot check whether getcwd allocates memory when cross-compiling -- defaulting to no)
+ bash_cv_getcwd_malloc=no]
+)])
+AC_MSG_RESULT($bash_cv_getcwd_malloc)
+if test $bash_cv_getcwd_malloc = no; then
+AC_DEFINE(GETCWD_BROKEN)
+AC_LIBOBJ(getcwd)
+fi
+])
+
+dnl
+dnl This needs BASH_CHECK_SOCKLIB, but since that's not called on every
+dnl system, we can't use AC_PREREQ. Only called if we need the socket library
+dnl
+AC_DEFUN(BASH_FUNC_GETHOSTBYNAME,
+[if test "X$bash_cv_have_gethostbyname" = "X"; then
+_bash_needmsg=yes
+else
+AC_MSG_CHECKING(for gethostbyname in socket library)
+_bash_needmsg=
+fi
+AC_CACHE_VAL(bash_cv_have_gethostbyname,
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <netdb.h>
+]], [[
+struct hostent *hp;
+hp = gethostbyname("localhost");
+]] )],
+[bash_cv_have_gethostbyname=yes], [bash_cv_have_gethostbyname=no]
+)])
+if test "X$_bash_needmsg" = Xyes; then
+ AC_MSG_CHECKING(for gethostbyname in socket library)
+fi
+AC_MSG_RESULT($bash_cv_have_gethostbyname)
+if test "$bash_cv_have_gethostbyname" = yes; then
+AC_DEFINE(HAVE_GETHOSTBYNAME)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_FNMATCH_EXTMATCH,
+[AC_MSG_CHECKING(if fnmatch does extended pattern matching with FNM_EXTMATCH)
+AC_CACHE_VAL(bash_cv_fnm_extmatch,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <fnmatch.h>
+
+int
+main()
+{
+#ifdef FNM_EXTMATCH
+ return (0);
+#else
+ return (1);
+#endif
+}
+]])], [bash_cv_fnm_extmatch=yes], [bash_cv_fnm_extmatch=no],
+ [AC_MSG_WARN(cannot check FNM_EXTMATCH if cross compiling -- defaulting to no)
+ bash_cv_fnm_extmatch=no]
+)])
+AC_MSG_RESULT($bash_cv_fnm_extmatch)
+if test $bash_cv_fnm_extmatch = yes; then
+AC_DEFINE(HAVE_LIBC_FNM_EXTMATCH)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_POSIX_SETJMP,
+[AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE])
+AC_MSG_CHECKING(for presence of POSIX-style sigsetjmp/siglongjmp)
+AC_CACHE_VAL(bash_cv_func_sigsetjmp,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/types.h>
+#include <signal.h>
+#include <setjmp.h>
+#include <stdlib.h>
+
+int
+main()
+{
+#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS)
+exit (1);
+#else
+
+int code;
+sigset_t set, oset, nset;
+sigjmp_buf xx;
+
+/* get the mask */
+sigemptyset(&set);
+sigemptyset(&oset);
+
+sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset);
+/* paranoia -- make sure SIGINT is not blocked */
+sigdelset (&oset, SIGINT);
+sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
+
+/* save it */
+code = sigsetjmp(xx, 1);
+if (code)
+{
+ sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &nset);
+ /* could compare nset to oset here, but we just look for SIGINT */
+ if (sigismember (&nset, SIGINT))
+ exit(1);
+ exit(0);
+}
+
+/* change it so that SIGINT is blocked */
+sigaddset(&set, SIGINT);
+sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL);
+
+/* and siglongjmp */
+siglongjmp(xx, 10);
+exit(1);
+#endif
+}
+]])], [bash_cv_func_sigsetjmp=present], [bash_cv_func_sigsetjmp=missing],
+ [AC_MSG_WARN(cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to $bash_cv_posix_signals)
+ if test "$bash_cv_posix_signals" = "yes" ; then
+ bash_cv_func_sigsetjmp=present
+ else
+ bash_cv_func_sigsetjmp=missing
+ fi]
+)])
+AC_MSG_RESULT($bash_cv_func_sigsetjmp)
+if test $bash_cv_func_sigsetjmp = present; then
+AC_DEFINE(HAVE_POSIX_SIGSETJMP)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_STRCOLL,
+[AC_MSG_CHECKING(whether or not strcoll and strcmp differ)
+AC_CACHE_VAL(bash_cv_func_strcoll_broken,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdio.h>
+#if defined (HAVE_LOCALE_H)
+#include <locale.h>
+#endif
+#include <string.h>
+#include <stdlib.h>
+
+int
+main(c, v)
+int c;
+char *v[];
+{
+ int r1, r2;
+ char *deflocale, *defcoll;
+
+#ifdef HAVE_SETLOCALE
+ deflocale = setlocale(LC_ALL, "");
+ defcoll = setlocale(LC_COLLATE, "");
+#endif
+
+#ifdef HAVE_STRCOLL
+ /* These two values are taken from tests/glob-test. */
+ r1 = strcoll("abd", "aXd");
+#else
+ r1 = 0;
+#endif
+ r2 = strcmp("abd", "aXd");
+
+ /* These two should both be greater than 0. It is permissible for
+ a system to return different values, as long as the sign is the
+ same. */
+
+ /* Exit with 1 (failure) if these two values are both > 0, since
+ this tests whether strcoll(3) is broken with respect to strcmp(3)
+ in the default locale. */
+ exit (r1 > 0 && r2 > 0);
+}
+]])], [bash_cv_func_strcoll_broken=yes], [bash_cv_func_strcoll_broken=no],
+ [AC_MSG_WARN(cannot check strcoll if cross compiling -- defaulting to no)
+ bash_cv_func_strcoll_broken=no]
+)])
+AC_MSG_RESULT($bash_cv_func_strcoll_broken)
+if test $bash_cv_func_strcoll_broken = yes; then
+AC_DEFINE(STRCOLL_BROKEN)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_PRINTF_A_FORMAT,
+[AC_MSG_CHECKING([for printf floating point output in hex notation])
+AC_CACHE_VAL(bash_cv_printf_a_format,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+int
+main()
+{
+ double y = 0.0;
+ char abuf[1024];
+
+ sprintf(abuf, "%A", y);
+ exit(strchr(abuf, 'P') == (char *)0);
+}
+]])], [bash_cv_printf_a_format=yes], [bash_cv_printf_a_format=no],
+ [AC_MSG_WARN(cannot check printf if cross compiling -- defaulting to no)
+ bash_cv_printf_a_format=no]
+)])
+AC_MSG_RESULT($bash_cv_printf_a_format)
+if test $bash_cv_printf_a_format = yes; then
+AC_DEFINE(HAVE_PRINTF_A_FORMAT)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_TERMIOS_LDISC,
+[
+AC_CHECK_MEMBER(struct termios.c_line, AC_DEFINE(TERMIOS_LDISC), ,[
+#include <sys/types.h>
+#include <termios.h>
+])
+])
+
+AC_DEFUN(BASH_STRUCT_TERMIO_LDISC,
+[
+AC_CHECK_MEMBER(struct termio.c_line, AC_DEFINE(TERMIO_LDISC), ,[
+#include <sys/types.h>
+#include <termio.h>
+])
+])
+
+dnl
+dnl Like AC_STRUCT_ST_BLOCKS, but doesn't muck with LIBOBJS
+dnl
+dnl sets bash_cv_struct_stat_st_blocks
+dnl
+dnl unused for now; we'll see how AC_CHECK_MEMBERS works
+dnl
+AC_DEFUN(BASH_STRUCT_ST_BLOCKS,
+[
+AC_MSG_CHECKING([for struct stat.st_blocks])
+AC_CACHE_VAL(bash_cv_struct_stat_st_blocks,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/stat.h>
+]], [[
+int
+main()
+{
+static struct stat a;
+if (a.st_blocks) return 0;
+return 0;
+}
+]])], [bash_cv_struct_stat_st_blocks=yes], [bash_cv_struct_stat_st_blocks=no])
+])
+AC_MSG_RESULT($bash_cv_struct_stat_st_blocks)
+if test "$bash_cv_struct_stat_st_blocks" = "yes"; then
+AC_DEFINE(HAVE_STRUCT_STAT_ST_BLOCKS)
+fi
+])
+
+AC_DEFUN([BASH_CHECK_LIB_TERMCAP],
+[
+if test "X$bash_cv_termcap_lib" = "X"; then
+_bash_needmsg=yes
+else
+AC_MSG_CHECKING(which library has the termcap functions)
+_bash_needmsg=
+fi
+AC_CACHE_VAL(bash_cv_termcap_lib,
+[AC_CHECK_FUNC(tgetent, bash_cv_termcap_lib=libc,
+ [AC_CHECK_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap,
+ [AC_CHECK_LIB(tinfo, tgetent, bash_cv_termcap_lib=libtinfo,
+ [AC_CHECK_LIB(curses, tgetent, bash_cv_termcap_lib=libcurses,
+ [AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses,
+ [AC_CHECK_LIB(ncursesw, tgetent, bash_cv_termcap_lib=libncursesw,
+ bash_cv_termcap_lib=gnutermcap)])])])])])])
+if test "X$_bash_needmsg" = "Xyes"; then
+AC_MSG_CHECKING(which library has the termcap functions)
+fi
+AC_MSG_RESULT(using $bash_cv_termcap_lib)
+if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then
+LDFLAGS="$LDFLAGS -L./lib/termcap"
+TERMCAP_LIB="./lib/termcap/libtermcap.a"
+TERMCAP_DEP="./lib/termcap/libtermcap.a"
+elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then
+TERMCAP_LIB=-ltermcap
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libtinfo; then
+TERMCAP_LIB=-ltinfo
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libncurses; then
+TERMCAP_LIB=-lncurses
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libc; then
+TERMCAP_LIB=
+TERMCAP_DEP=
+else
+# we assume ncurses is installed somewhere the linker can find it
+TERMCAP_LIB=-lncurses
+TERMCAP_DEP=
+fi
+])
+
+dnl
+dnl Check for the presence of getpeername in libsocket.
+dnl If libsocket is present, check for libnsl and add it to LIBS if
+dnl it's there, since most systems with libsocket require linking
+dnl with libnsl as well. This should only be called if getpeername
+dnl was not found in libc.
+dnl
+dnl NOTE: IF WE FIND GETPEERNAME, WE ASSUME THAT WE HAVE BIND/CONNECT
+dnl AS WELL
+dnl
+AC_DEFUN(BASH_CHECK_LIB_SOCKET,
+[
+if test "X$bash_cv_have_socklib" = "X"; then
+_bash_needmsg=
+else
+AC_MSG_CHECKING(for socket library)
+_bash_needmsg=yes
+fi
+AC_CACHE_VAL(bash_cv_have_socklib,
+[AC_CHECK_LIB(socket, getpeername,
+ bash_cv_have_socklib=yes, bash_cv_have_socklib=no, -lnsl)])
+if test "X$_bash_needmsg" = Xyes; then
+ AC_MSG_RESULT($bash_cv_have_socklib)
+ _bash_needmsg=
+fi
+if test $bash_cv_have_socklib = yes; then
+ # check for libnsl, add it to LIBS if present
+ if test "X$bash_cv_have_libnsl" = "X"; then
+ _bash_needmsg=
+ else
+ AC_MSG_CHECKING(for libnsl)
+ _bash_needmsg=yes
+ fi
+ AC_CACHE_VAL(bash_cv_have_libnsl,
+ [AC_CHECK_LIB(nsl, t_open,
+ bash_cv_have_libnsl=yes, bash_cv_have_libnsl=no)])
+ if test "X$_bash_needmsg" = Xyes; then
+ AC_MSG_RESULT($bash_cv_have_libnsl)
+ _bash_needmsg=
+ fi
+ if test $bash_cv_have_libnsl = yes; then
+ LIBS="-lsocket -lnsl $LIBS"
+ else
+ LIBS="-lsocket $LIBS"
+ fi
+ AC_DEFINE(HAVE_LIBSOCKET)
+ AC_DEFINE(HAVE_GETPEERNAME)
+fi
+])
+
+dnl like _AC_STRUCT_DIRENT(MEMBER) but public
+AC_DEFUN(BASH_STRUCT_DIRENT,
+[
+AC_REQUIRE([AC_HEADER_DIRENT])
+AC_CHECK_MEMBERS(struct dirent.$1, bash_cv_dirent_has_$1=yes, bash_cv_dirent_has_$1=no,
+[[
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+]])
+])
+
+AC_DEFUN(BASH_STRUCT_DIRENT_D_INO,
+[AC_REQUIRE([AC_HEADER_DIRENT])
+AC_MSG_CHECKING(for struct dirent.d_ino)
+AC_CACHE_VAL(bash_cv_dirent_has_d_ino, [BASH_STRUCT_DIRENT([d_ino])])
+AC_MSG_RESULT($bash_cv_dirent_has_d_ino)
+if test $bash_cv_dirent_has_d_ino = yes; then
+AC_DEFINE(HAVE_STRUCT_DIRENT_D_INO)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_DIRENT_D_FILENO,
+[AC_REQUIRE([AC_HEADER_DIRENT])
+AC_MSG_CHECKING(for struct dirent.d_fileno)
+AC_CACHE_VAL(bash_cv_dirent_has_d_fileno, [BASH_STRUCT_DIRENT([d_fileno])])
+AC_MSG_RESULT($bash_cv_dirent_has_d_fileno)
+if test $bash_cv_dirent_has_d_fileno = yes; then
+AC_DEFINE(HAVE_STRUCT_DIRENT_D_FILENO)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_DIRENT_D_NAMLEN,
+[AC_REQUIRE([AC_HEADER_DIRENT])
+AC_MSG_CHECKING(for struct dirent.d_namlen)
+AC_CACHE_VAL(bash_cv_dirent_has_d_namlen, [BASH_STRUCT_DIRENT([d_namlen])])
+AC_MSG_RESULT($bash_cv_dirent_has_d_namlen)
+if test $bash_cv_dirent_has_d_namlen = yes; then
+AC_DEFINE(HAVE_STRUCT_DIRENT_D_NAMLEN)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_TIMEVAL,
+[AC_MSG_CHECKING(for struct timeval in sys/time.h and time.h)
+AC_CACHE_VAL(bash_cv_struct_timeval,
+[AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+ ]],
+ [[static struct timeval x; x.tv_sec = x.tv_usec;]]
+ )],
+ bash_cv_struct_timeval=yes,
+ bash_cv_struct_timeval=no)
+])
+AC_MSG_RESULT($bash_cv_struct_timeval)
+if test $bash_cv_struct_timeval = yes; then
+ AC_DEFINE(HAVE_TIMEVAL)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_TIMEZONE,
+[AC_MSG_CHECKING(for struct timezone in sys/time.h and time.h)
+AC_CACHE_VAL(bash_cv_struct_timezone,
+[
+AC_EGREP_HEADER(struct timezone, sys/time.h,
+ bash_cv_struct_timezone=yes,
+ AC_EGREP_HEADER(struct timezone, time.h,
+ bash_cv_struct_timezone=yes,
+ bash_cv_struct_timezone=no))
+])
+AC_MSG_RESULT($bash_cv_struct_timezone)
+if test $bash_cv_struct_timezone = yes; then
+ AC_DEFINE(HAVE_STRUCT_TIMEZONE)
+fi
+])
+
+AC_DEFUN(BASH_CHECK_WINSIZE_IOCTL,
+[AC_CACHE_VAL(bash_cv_struct_winsize_ioctl,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/ioctl.h>
+]],
+[[
+struct winsize x;
+if (sizeof (x) > 0) return (0);
+]] )], [bash_cv_struct_winsize_ioctl=yes], [bash_cv_struct_winsize_ioctl=no])
+])
+])
+
+AC_DEFUN(BASH_CHECK_WINSIZE_TERMIOS,
+[AC_CACHE_VAL(bash_cv_struct_winsize_termios,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/termios.h>
+]],
+[[
+struct winsize x;
+if (sizeof (x) > 0) return (0);
+]] )], [bash_cv_struct_winsize_termios=yes], [bash_cv_struct_winsize_termios=no])
+])
+])
+
+AC_DEFUN(BASH_STRUCT_WINSIZE,
+[AC_MSG_CHECKING(for struct winsize in sys/ioctl.h and termios.h)
+AC_CACHE_VAL(bash_cv_struct_winsize_header,
+[
+BASH_CHECK_WINSIZE_IOCTL
+BASH_CHECK_WINSIZE_TERMIOS
+
+if test $bash_cv_struct_winsize_ioctl = yes; then
+ bash_cv_struct_winsize_header=ioctl_h
+elif test $bash_cv_struct_winsize_termios = yes; then
+ bash_cv_struct_winsize_header=termios_h
+else
+ bash_cv_struct_winsize_header=other
+fi
+])
+if test $bash_cv_struct_winsize_header = ioctl_h; then
+ AC_MSG_RESULT(sys/ioctl.h)
+ AC_DEFINE(STRUCT_WINSIZE_IN_SYS_IOCTL)
+elif test $bash_cv_struct_winsize_header = termios_h; then
+ AC_MSG_RESULT(termios.h)
+ AC_DEFINE(STRUCT_WINSIZE_IN_TERMIOS)
+else
+ AC_MSG_RESULT(not found)
+fi
+])
+
+AC_DEFUN(BASH_HAVE_POSIX_SIGNALS,
+[AC_CACHE_VAL(bash_cv_posix_signals,
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <signal.h>
+]], [[
+ sigset_t ss;
+ struct sigaction sa;
+ sigemptyset(&ss); sigsuspend(&ss);
+ sigaction(SIGINT, &sa, (struct sigaction *) 0);
+ sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0);
+]] )],
+[bash_cv_posix_signals=yes], [bash_cv_posix_signals=no]
+)])
+])
+
+AC_DEFUN(BASH_HAVE_BSD_SIGNALS,
+[AC_CACHE_VAL(bash_cv_bsd_signals,
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <signal.h>
+]], [[
+int mask = sigmask(SIGINT);
+sigsetmask(mask); sigblock(mask); sigpause(mask);
+]] )],
+[bash_cv_bsd_signals=yes], [bash_cv_bsd_signals=no]
+)])
+])
+
+AC_DEFUN(BASH_HAVE_SYSV_SIGNALS,
+[AC_CACHE_VAL(bash_cv_sysv_signals,
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <signal.h>
+void foo() { }
+]], [[
+int mask = sigmask(SIGINT);
+sigset(SIGINT, foo); sigrelse(SIGINT);
+sighold(SIGINT); sigpause(SIGINT);
+]] )],
+[bash_cv_sysv_signals=yes], [bash_cv_sysv_signals=no]
+)])
+])
+
+dnl Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7)
+AC_DEFUN(BASH_SYS_SIGNAL_VINTAGE,
+[AC_MSG_CHECKING(for type of signal functions)
+AC_CACHE_VAL(bash_cv_signal_vintage,
+[
+BASH_HAVE_POSIX_SIGNALS
+if test $bash_cv_posix_signals = yes; then
+ bash_cv_signal_vintage=posix
+else
+ BASH_HAVE_BSD_SIGNALS
+ if test $bash_cv_bsd_signals = yes; then
+ bash_cv_signal_vintage=4.2bsd
+ else
+ BASH_HAVE_SYSV_SIGNALS
+ if test $bash_cv_sysv_signals = yes; then
+ bash_cv_signal_vintage=svr3
+ else
+ bash_cv_signal_vintage=v7
+ fi
+ fi
+fi
+])
+AC_MSG_RESULT($bash_cv_signal_vintage)
+if test "$bash_cv_signal_vintage" = posix; then
+AC_DEFINE(HAVE_POSIX_SIGNALS)
+elif test "$bash_cv_signal_vintage" = "4.2bsd"; then
+AC_DEFINE(HAVE_BSD_SIGNALS)
+elif test "$bash_cv_signal_vintage" = svr3; then
+AC_DEFINE(HAVE_USG_SIGHOLD)
+fi
+])
+
+dnl Check if the pgrp of setpgrp() can't be the pid of a zombie process.
+AC_DEFUN(BASH_SYS_PGRP_SYNC,
+[AC_REQUIRE([AC_FUNC_GETPGRP])
+AC_MSG_CHECKING(whether pgrps need synchronization)
+AC_CACHE_VAL(bash_cv_pgrp_pipe,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/wait.h>
+#endif
+#include <stdlib.h>
+int
+main()
+{
+# ifdef GETPGRP_VOID
+# define getpgID() getpgrp()
+# else
+# define getpgID() getpgrp(0)
+# define setpgid(x,y) setpgrp(x,y)
+# endif
+ int pid1, pid2, fds[2];
+ int status;
+ char ok;
+
+ switch (pid1 = fork()) {
+ case -1:
+ exit(1);
+ case 0:
+ setpgid(0, getpid());
+ exit(0);
+ }
+ setpgid(pid1, pid1);
+
+ sleep(2); /* let first child die */
+
+ if (pipe(fds) < 0)
+ exit(2);
+
+ switch (pid2 = fork()) {
+ case -1:
+ exit(3);
+ case 0:
+ setpgid(0, pid1);
+ ok = getpgID() == pid1;
+ write(fds[1], &ok, 1);
+ exit(0);
+ }
+ setpgid(pid2, pid1);
+
+ close(fds[1]);
+ if (read(fds[0], &ok, 1) != 1)
+ exit(4);
+ wait(&status);
+ wait(&status);
+ exit(ok ? 0 : 5);
+}
+]])], [bash_cv_pgrp_pipe=no], [bash_cv_pgrp_pipe=yes],
+ [AC_MSG_WARN(cannot check pgrp synchronization if cross compiling -- defaulting to no)
+ bash_cv_pgrp_pipe=no]
+)])
+AC_MSG_RESULT($bash_cv_pgrp_pipe)
+if test $bash_cv_pgrp_pipe = yes; then
+AC_DEFINE(PGRP_PIPE)
+fi
+])
+
+AC_DEFUN(BASH_SYS_REINSTALL_SIGHANDLERS,
+[AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE])
+AC_MSG_CHECKING([if signal handlers must be reinstalled when invoked])
+AC_CACHE_VAL(bash_cv_must_reinstall_sighandlers,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+
+typedef void sigfunc();
+
+volatile int nsigint;
+
+#ifdef HAVE_POSIX_SIGNALS
+sigfunc *
+set_signal_handler(sig, handler)
+ int sig;
+ sigfunc *handler;
+{
+ struct sigaction act, oact;
+ act.sa_handler = handler;
+ act.sa_flags = 0;
+ sigemptyset (&act.sa_mask);
+ sigemptyset (&oact.sa_mask);
+ sigaction (sig, &act, &oact);
+ return (oact.sa_handler);
+}
+#else
+#define set_signal_handler(s, h) signal(s, h)
+#endif
+
+void
+sigint(s)
+int s;
+{
+ nsigint++;
+}
+
+int
+main()
+{
+ nsigint = 0;
+ set_signal_handler(SIGINT, sigint);
+ kill((int)getpid(), SIGINT);
+ kill((int)getpid(), SIGINT);
+ exit(nsigint != 2);
+}
+]])], [bash_cv_must_reinstall_sighandlers=no], [bash_cv_must_reinstall_sighandlers=yes],
+ [AC_MSG_WARN(cannot check signal handling if cross compiling -- defaulting to no)
+ bash_cv_must_reinstall_sighandlers=no]
+)])
+AC_MSG_RESULT($bash_cv_must_reinstall_sighandlers)
+if test $bash_cv_must_reinstall_sighandlers = yes; then
+AC_DEFINE(MUST_REINSTALL_SIGHANDLERS)
+fi
+])
+
+dnl check that some necessary job control definitions are present
+AC_DEFUN(BASH_SYS_JOB_CONTROL_MISSING,
+[AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE])
+AC_MSG_CHECKING(for presence of necessary job control definitions)
+AC_CACHE_VAL(bash_cv_job_control_missing,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <signal.h>
+
+/* add more tests in here as appropriate */
+
+/* signal type */
+#if !defined (HAVE_POSIX_SIGNALS) && !defined (HAVE_BSD_SIGNALS)
+#error
+#endif
+
+/* signals and tty control. */
+#if !defined (SIGTSTP) || !defined (SIGSTOP) || !defined (SIGCONT)
+#error
+#endif
+
+/* process control */
+#if !defined (WNOHANG) || !defined (WUNTRACED)
+#error
+#endif
+
+/* Posix systems have tcgetpgrp and waitpid. */
+#if defined (_POSIX_VERSION) && !defined (HAVE_TCGETPGRP)
+#error
+#endif
+
+#if defined (_POSIX_VERSION) && !defined (HAVE_WAITPID)
+#error
+#endif
+
+/* Other systems have TIOCSPGRP/TIOCGPRGP and wait3. */
+#if !defined (_POSIX_VERSION) && !defined (HAVE_WAIT3)
+#error
+#endif
+
+]], [[ int x; ]] )],
+[bash_cv_job_control_missing=present], [bash_cv_job_control_missing=missing]
+)])
+AC_MSG_RESULT($bash_cv_job_control_missing)
+if test $bash_cv_job_control_missing = missing; then
+AC_DEFINE(JOB_CONTROL_MISSING)
+fi
+])
+
+dnl check whether named pipes are present
+dnl this requires a previous check for mkfifo, but that is awkward to specify
+AC_DEFUN(BASH_SYS_NAMED_PIPES,
+[AC_MSG_CHECKING(for presence of named pipes)
+AC_CACHE_VAL(bash_cv_sys_named_pipes,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Add more tests in here as appropriate. */
+int
+main()
+{
+int fd, err;
+
+#if defined (HAVE_MKFIFO)
+exit (0);
+#endif
+
+#if !defined (S_IFIFO) && (defined (_POSIX_VERSION) && !defined (S_ISFIFO))
+exit (1);
+#endif
+
+#if defined (NeXT)
+exit (1);
+#endif
+err = mkdir("bash-aclocal", 0700);
+if (err < 0) {
+ perror ("mkdir");
+ exit(1);
+}
+fd = mknod ("bash-aclocal/sh-np-autoconf", 0666 | S_IFIFO, 0);
+if (fd == -1) {
+ rmdir ("bash-aclocal");
+ exit (1);
+}
+close(fd);
+unlink ("bash-aclocal/sh-np-autoconf");
+rmdir ("bash-aclocal");
+exit(0);
+}
+]])], [bash_cv_sys_named_pipes=present], [bash_cv_sys_named_pipes=missing],
+ [AC_MSG_WARN(cannot check for named pipes if cross-compiling -- defaulting to missing)
+ bash_cv_sys_named_pipes=missing]
+)])
+AC_MSG_RESULT($bash_cv_sys_named_pipes)
+if test $bash_cv_sys_named_pipes = missing; then
+AC_DEFINE(NAMED_PIPES_MISSING)
+fi
+])
+
+AC_DEFUN(BASH_SYS_DEFAULT_MAIL_DIR,
+[AC_MSG_CHECKING(for default mail directory)
+AC_CACHE_VAL(bash_cv_mail_dir,
+[if test -d /var/mail; then
+ bash_cv_mail_dir=/var/mail
+ elif test -d /var/spool/mail; then
+ bash_cv_mail_dir=/var/spool/mail
+ elif test -d /usr/mail; then
+ bash_cv_mail_dir=/usr/mail
+ elif test -d /usr/spool/mail; then
+ bash_cv_mail_dir=/usr/spool/mail
+ else
+ bash_cv_mail_dir=unknown
+ fi
+])
+AC_MSG_RESULT($bash_cv_mail_dir)
+AC_DEFINE_UNQUOTED(DEFAULT_MAIL_DIRECTORY, "$bash_cv_mail_dir")
+])
+
+AC_DEFUN(BASH_HAVE_TIOCGWINSZ,
+[AC_MSG_CHECKING(for TIOCGWINSZ in sys/ioctl.h)
+AC_CACHE_VAL(bash_cv_tiocgwinsz_in_ioctl,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/ioctl.h>]], [[int x = TIOCGWINSZ;]] )],
+ [bash_cv_tiocgwinsz_in_ioctl=yes], [bash_cv_tiocgwinsz_in_ioctl=no]
+)])
+AC_MSG_RESULT($bash_cv_tiocgwinsz_in_ioctl)
+if test $bash_cv_tiocgwinsz_in_ioctl = yes; then
+AC_DEFINE(GWINSZ_IN_SYS_IOCTL)
+fi
+])
+
+AC_DEFUN(BASH_HAVE_TIOCSTAT,
+[AC_MSG_CHECKING(for TIOCSTAT in sys/ioctl.h)
+AC_CACHE_VAL(bash_cv_tiocstat_in_ioctl,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/ioctl.h>]], [[int x = TIOCSTAT;]] )],
+ [bash_cv_tiocstat_in_ioctl=yes], [bash_cv_tiocstat_in_ioctl=no]
+)])
+AC_MSG_RESULT($bash_cv_tiocstat_in_ioctl)
+if test $bash_cv_tiocstat_in_ioctl = yes; then
+AC_DEFINE(TIOCSTAT_IN_SYS_IOCTL)
+fi
+])
+
+AC_DEFUN(BASH_HAVE_FIONREAD,
+[AC_MSG_CHECKING(for FIONREAD in sys/ioctl.h)
+AC_CACHE_VAL(bash_cv_fionread_in_ioctl,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/ioctl.h>]], [[int x = FIONREAD;]] )],
+ [bash_cv_fionread_in_ioctl=yes], [bash_cv_fionread_in_ioctl=no]
+)])
+AC_MSG_RESULT($bash_cv_fionread_in_ioctl)
+if test $bash_cv_fionread_in_ioctl = yes; then
+AC_DEFINE(FIONREAD_IN_SYS_IOCTL)
+fi
+])
+
+dnl
+dnl See if speed_t is declared in <sys/types.h>. Some versions of linux
+dnl require a definition of speed_t each time <termcap.h> is included,
+dnl but you can only get speed_t if you include <termios.h> (on some
+dnl versions) or <sys/types.h> (on others).
+dnl
+AC_DEFUN(BASH_CHECK_SPEED_T,
+[AC_MSG_CHECKING(for speed_t in sys/types.h)
+AC_CACHE_VAL(bash_cv_speed_t_in_sys_types,
+[AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>]],
+ [[speed_t x;]])],
+ [bash_cv_speed_t_in_sys_types=yes],[bash_cv_speed_t_in_sys_types=no])])
+AC_MSG_RESULT($bash_cv_speed_t_in_sys_types)
+if test $bash_cv_speed_t_in_sys_types = yes; then
+AC_DEFINE(SPEED_T_IN_SYS_TYPES)
+fi
+])
+
+AC_DEFUN(BASH_CHECK_GETPW_FUNCS,
+[AC_MSG_CHECKING(whether getpw functions are declared in pwd.h)
+AC_CACHE_VAL(bash_cv_getpw_declared,
+[AC_EGREP_CPP(getpwuid,
+[
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <pwd.h>
+],
+bash_cv_getpw_declared=yes,bash_cv_getpw_declared=no)])
+AC_MSG_RESULT($bash_cv_getpw_declared)
+if test $bash_cv_getpw_declared = yes; then
+AC_DEFINE(HAVE_GETPW_DECLS)
+fi
+])
+
+AC_DEFUN(BASH_CHECK_DEV_FD,
+[AC_MSG_CHECKING(whether /dev/fd is available)
+AC_CACHE_VAL(bash_cv_dev_fd,
+[bash_cv_dev_fd=""
+if test -d /dev/fd && (exec test -r /dev/fd/0 < /dev/null) ; then
+# check for systems like FreeBSD 5 that only provide /dev/fd/[012]
+ if (exec test -r /dev/fd/3 3</dev/null) ; then
+ bash_cv_dev_fd=standard
+ else
+ bash_cv_dev_fd=absent
+ fi
+fi
+if test -z "$bash_cv_dev_fd" ; then
+ if test -d /proc/self/fd && (exec test -r /proc/self/fd/0 < /dev/null) ; then
+ bash_cv_dev_fd=whacky
+ else
+ bash_cv_dev_fd=absent
+ fi
+fi
+])
+AC_MSG_RESULT($bash_cv_dev_fd)
+if test $bash_cv_dev_fd = "standard"; then
+ AC_DEFINE(HAVE_DEV_FD)
+ AC_DEFINE(DEV_FD_PREFIX, "/dev/fd/")
+elif test $bash_cv_dev_fd = "whacky"; then
+ AC_DEFINE(HAVE_DEV_FD)
+ AC_DEFINE(DEV_FD_PREFIX, "/proc/self/fd/")
+fi
+])
+
+AC_DEFUN(BASH_CHECK_DEV_STDIN,
+[AC_MSG_CHECKING(whether /dev/stdin stdout stderr are available)
+AC_CACHE_VAL(bash_cv_dev_stdin,
+[if (exec test -r /dev/stdin < /dev/null) ; then
+ bash_cv_dev_stdin=present
+ else
+ bash_cv_dev_stdin=absent
+ fi
+])
+AC_MSG_RESULT($bash_cv_dev_stdin)
+if test $bash_cv_dev_stdin = "present"; then
+ AC_DEFINE(HAVE_DEV_STDIN)
+fi
+])
+
+
+AC_DEFUN(BASH_CHECK_RLIMIT,
+[AC_CACHE_VAL(bash_cv_rlimit,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/resource.h>
+]],
+[[
+ int f;
+ f = RLIMIT_DATA;
+]] )],
+[bash_cv_rlimit=yes], [bash_cv_rlimit=no]
+)])
+])
+
+dnl
+dnl Check if HPUX needs _KERNEL defined for RLIMIT_* definitions
+dnl
+AC_DEFUN(BASH_CHECK_KERNEL_RLIMIT,
+[AC_MSG_CHECKING([whether $host_os needs _KERNEL for RLIMIT defines])
+AC_CACHE_VAL(bash_cv_kernel_rlimit,
+[BASH_CHECK_RLIMIT
+if test $bash_cv_rlimit = no; then
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#define _KERNEL
+#include <sys/resource.h>
+#undef _KERNEL
+]],
+[[
+ int f;
+ f = RLIMIT_DATA;
+]] )], [bash_cv_kernel_rlimit=yes], [bash_cv_kernel_rlimit=no] )
+fi
+])
+AC_MSG_RESULT($bash_cv_kernel_rlimit)
+if test $bash_cv_kernel_rlimit = yes; then
+AC_DEFINE(RLIMIT_NEEDS_KERNEL)
+fi
+])
+
+dnl
+dnl Check for 64-bit off_t -- used for malloc alignment
+dnl
+dnl C does not allow duplicate case labels, so the compile will fail if
+dnl sizeof(off_t) is > 4.
+dnl
+AC_DEFUN(BASH_CHECK_OFF_T_64,
+[AC_CACHE_CHECK(for 64-bit off_t, bash_cv_off_t_64,
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/types.h>
+]],[[
+switch (0) case 0: case (sizeof (off_t) <= 4):;
+]] )], [bash_cv_off_t_64=no], [bash_cv_off_t_64=yes]
+))
+if test $bash_cv_off_t_64 = yes; then
+ AC_DEFINE(HAVE_OFF_T_64)
+fi])
+
+AC_DEFUN(BASH_CHECK_RTSIGS,
+[AC_MSG_CHECKING(for unusable real-time signals due to large values)
+AC_CACHE_VAL(bash_cv_unusable_rtsigs,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <signal.h>
+#include <stdlib.h>
+
+#ifndef NSIG
+# define NSIG 64
+#endif
+
+int
+main ()
+{
+ int n_sigs = 2 * NSIG;
+#ifdef SIGRTMIN
+ int rtmin = SIGRTMIN;
+#else
+ int rtmin = 0;
+#endif
+
+ exit(rtmin < n_sigs);
+}
+]])], [bash_cv_unusable_rtsigs=yes], [bash_cv_unusable_rtsigs=no],
+ [AC_MSG_WARN(cannot check real-time signals if cross compiling -- defaulting to yes)
+ bash_cv_unusable_rtsigs=yes]
+)])
+AC_MSG_RESULT($bash_cv_unusable_rtsigs)
+if test $bash_cv_unusable_rtsigs = yes; then
+AC_DEFINE(UNUSABLE_RT_SIGNALS)
+fi
+])
+
+dnl
+dnl check for availability of multibyte characters and functions
+dnl
+dnl geez, I wish I didn't have to check for all of this stuff separately
+dnl
+AC_DEFUN(BASH_CHECK_MULTIBYTE,
+[
+AC_CHECK_HEADERS(wctype.h)
+AC_CHECK_HEADERS(wchar.h)
+AC_CHECK_HEADERS(langinfo.h)
+
+AC_CHECK_HEADERS(mbstr.h)
+
+AC_CHECK_FUNC(mbrlen, AC_DEFINE(HAVE_MBRLEN))
+AC_CHECK_FUNC(mbscasecmp, AC_DEFINE(HAVE_MBSCMP))
+AC_CHECK_FUNC(mbscmp, AC_DEFINE(HAVE_MBSCMP))
+AC_CHECK_FUNC(mbsnrtowcs, AC_DEFINE(HAVE_MBSNRTOWCS))
+AC_CHECK_FUNC(mbsrtowcs, AC_DEFINE(HAVE_MBSRTOWCS))
+
+AC_REPLACE_FUNCS(mbschr)
+
+AC_CHECK_FUNC(wcrtomb, AC_DEFINE(HAVE_WCRTOMB))
+AC_CHECK_FUNC(wcscoll, AC_DEFINE(HAVE_WCSCOLL))
+AC_CHECK_FUNC(wcsdup, AC_DEFINE(HAVE_WCSDUP))
+AC_CHECK_FUNC(wcwidth, AC_DEFINE(HAVE_WCWIDTH))
+AC_CHECK_FUNC(wctype, AC_DEFINE(HAVE_WCTYPE))
+
+AC_REPLACE_FUNCS(wcswidth)
+
+dnl checks for both mbrtowc and mbstate_t
+AC_FUNC_MBRTOWC
+if test $ac_cv_func_mbrtowc = yes; then
+ AC_DEFINE(HAVE_MBSTATE_T)
+fi
+
+AC_CHECK_FUNCS(iswlower iswupper towlower towupper iswctype)
+
+AC_REQUIRE([AM_LANGINFO_CODESET])
+
+dnl check for wchar_t in <wchar.h>
+AC_CACHE_CHECK([for wchar_t in wchar.h], bash_cv_type_wchar_t,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
+[#include <wchar.h>]],
+[[
+ wchar_t foo;
+ foo = 0;
+]] )], [bash_cv_type_wchar_t=yes], [bash_cv_type_wchar_t=no]
+)])
+if test $bash_cv_type_wchar_t = yes; then
+ AC_DEFINE(HAVE_WCHAR_T, 1, [systems should define this type here])
+fi
+
+dnl check for wctype_t in <wctype.h>
+AC_CACHE_CHECK([for wctype_t in wctype.h], bash_cv_type_wctype_t,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
+[#include <wctype.h>]],
+[[
+ wctype_t foo;
+ foo = 0;
+]] )], [bash_cv_type_wctype_t=yes], [bash_cv_type_wctype_t=no]
+)])
+if test $bash_cv_type_wctype_t = yes; then
+ AC_DEFINE(HAVE_WCTYPE_T, 1, [systems should define this type here])
+fi
+
+dnl check for wint_t in <wctype.h>
+AC_CACHE_CHECK([for wint_t in wctype.h], bash_cv_type_wint_t,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
+[#include <wctype.h>]],
+[[
+ wint_t foo;
+ foo = 0;
+]] )], [bash_cv_type_wint_t=yes], [bash_cv_type_wint_t=no]
+)])
+if test $bash_cv_type_wint_t = yes; then
+ AC_DEFINE(HAVE_WINT_T, 1, [systems should define this type here])
+fi
+
+dnl check for broken wcwidth
+AC_CACHE_CHECK([for wcwidth broken with unicode combining characters],
+bash_cv_wcwidth_broken,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <locale.h>
+#include <wchar.h>
+
+int
+main(c, v)
+int c;
+char **v;
+{
+ int w;
+
+ setlocale(LC_ALL, "en_US.UTF-8");
+ w = wcwidth (0x0301);
+ exit (w == 0); /* exit 0 if wcwidth broken */
+}
+]])], [bash_cv_wcwidth_broken=yes], [bash_cv_wcwidth_broken=no],
+ [bash_cv_wcwidth_broken=no]
+)])
+if test "$bash_cv_wcwidth_broken" = yes; then
+ AC_DEFINE(WCWIDTH_BROKEN, 1, [wcwidth is usually not broken])
+fi
+
+if test "$am_cv_func_iconv" = yes; then
+ OLDLIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL $LIBICONV"
+ AC_CHECK_FUNCS(locale_charset)
+ LIBS="$OLDLIBS"
+fi
+
+AC_CHECK_SIZEOF(wchar_t, 4)
+
+])
+
+dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB
+dnl require:
+dnl AC_PROG_CC
+dnl BASH_CHECK_LIB_TERMCAP
+
+AC_DEFUN([RL_LIB_READLINE_VERSION],
+[
+AC_REQUIRE([BASH_CHECK_LIB_TERMCAP])
+
+AC_MSG_CHECKING([version of installed readline library])
+
+# What a pain in the ass this is.
+
+# save cpp and ld options
+_save_CFLAGS="$CFLAGS"
+_save_LDFLAGS="$LDFLAGS"
+_save_LIBS="$LIBS"
+
+# Don't set ac_cv_rl_prefix if the caller has already assigned a value. This
+# allows the caller to do something like $_rl_prefix=$withval if the user
+# specifies --with-installed-readline=PREFIX as an argument to configure
+
+if test -z "$ac_cv_rl_prefix"; then
+test "x$prefix" = xNONE && ac_cv_rl_prefix=$ac_default_prefix || ac_cv_rl_prefix=${prefix}
+fi
+
+eval ac_cv_rl_includedir=${ac_cv_rl_prefix}/include
+eval ac_cv_rl_libdir=${ac_cv_rl_prefix}/lib
+
+LIBS="$LIBS -lreadline ${TERMCAP_LIB}"
+CFLAGS="$CFLAGS -I${ac_cv_rl_includedir}"
+LDFLAGS="$LDFLAGS -L${ac_cv_rl_libdir}"
+
+AC_CACHE_VAL(ac_cv_rl_version,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <readline/readline.h>
+#include <stdlib.h>
+
+extern int rl_gnu_readline_p;
+
+int
+main()
+{
+ FILE *fp;
+ fp = fopen("conftest.rlv", "w");
+ if (fp == 0)
+ exit(1);
+ if (rl_gnu_readline_p != 1)
+ fprintf(fp, "0.0\n");
+ else
+ fprintf(fp, "%s\n", rl_library_version ? rl_library_version : "0.0");
+ fclose(fp);
+ exit(0);
+}
+]])],
+[ac_cv_rl_version=`cat conftest.rlv`],
+[ac_cv_rl_version='0.0'],
+[ac_cv_rl_version='8.0']
+)])
+
+CFLAGS="$_save_CFLAGS"
+LDFLAGS="$_save_LDFLAGS"
+LIBS="$_save_LIBS"
+
+RL_MAJOR=0
+RL_MINOR=0
+
+# (
+case "$ac_cv_rl_version" in
+2*|3*|4*|5*|6*|7*|8*|9*)
+ RL_MAJOR=`echo $ac_cv_rl_version | sed 's:\..*$::'`
+ RL_MINOR=`echo $ac_cv_rl_version | sed -e 's:^.*\.::' -e 's:[[a-zA-Z]]*$::'`
+ ;;
+esac
+
+# (((
+case $RL_MAJOR in
+[[0-9][0-9]]) _RL_MAJOR=$RL_MAJOR ;;
+[[0-9]]) _RL_MAJOR=0$RL_MAJOR ;;
+*) _RL_MAJOR=00 ;;
+esac
+
+# (((
+case $RL_MINOR in
+[[0-9][0-9]]) _RL_MINOR=$RL_MINOR ;;
+[[0-9]]) _RL_MINOR=0$RL_MINOR ;;
+*) _RL_MINOR=00 ;;
+esac
+
+RL_VERSION="0x${_RL_MAJOR}${_RL_MINOR}"
+
+# Readline versions greater than 4.2 have these defines in readline.h
+
+if test $ac_cv_rl_version = '0.0' ; then
+ AC_MSG_WARN([Could not test version of installed readline library.])
+elif test $RL_MAJOR -gt 4 || { test $RL_MAJOR = 4 && test $RL_MINOR -gt 2 ; } ; then
+ # set these for use by the caller
+ RL_PREFIX=$ac_cv_rl_prefix
+ RL_LIBDIR=$ac_cv_rl_libdir
+ RL_INCLUDEDIR=$ac_cv_rl_includedir
+ AC_MSG_RESULT($ac_cv_rl_version)
+else
+
+AC_DEFINE_UNQUOTED(RL_READLINE_VERSION, $RL_VERSION, [encoded version of the installed readline library])
+AC_DEFINE_UNQUOTED(RL_VERSION_MAJOR, $RL_MAJOR, [major version of installed readline library])
+AC_DEFINE_UNQUOTED(RL_VERSION_MINOR, $RL_MINOR, [minor version of installed readline library])
+
+AC_SUBST(RL_VERSION)
+AC_SUBST(RL_MAJOR)
+AC_SUBST(RL_MINOR)
+
+# set these for use by the caller
+RL_PREFIX=$ac_cv_rl_prefix
+RL_LIBDIR=$ac_cv_rl_libdir
+RL_INCLUDEDIR=$ac_cv_rl_includedir
+
+AC_MSG_RESULT($ac_cv_rl_version)
+
+fi
+])
+
+AC_DEFUN(BASH_CHECK_WCONTINUED,
+[
+AC_MSG_CHECKING(whether WCONTINUED flag to waitpid is unavailable or available but broken)
+AC_CACHE_VAL(bash_cv_wcontinued_broken,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#ifndef errno
+extern int errno;
+#endif
+int
+main()
+{
+ int x;
+
+ x = waitpid(-1, (int *)0, WNOHANG|WCONTINUED);
+ if (x == -1 && errno == EINVAL)
+ exit (1);
+ else
+ exit (0);
+}
+]])], [bash_cv_wcontinued_broken=no], [bash_cv_wcontinued_broken=yes],
+ [AC_MSG_WARN(cannot check WCONTINUED if cross compiling -- defaulting to no)
+ bash_cv_wcontinued_broken=no]
+)])
+AC_MSG_RESULT($bash_cv_wcontinued_broken)
+if test $bash_cv_wcontinued_broken = yes; then
+AC_DEFINE(WCONTINUED_BROKEN)
+fi
+])
+
+dnl
+dnl tests added for bashdb
+dnl
+
+
+AC_DEFUN([AM_PATH_LISPDIR],
+ [AC_ARG_WITH(lispdir, AS_HELP_STRING([--with-lispdir], [override the default lisp directory]),
+ [ lispdir="$withval"
+ AC_MSG_CHECKING([where .elc files should go])
+ AC_MSG_RESULT([$lispdir])],
+ [
+ # If set to t, that means we are running in a shell under Emacs.
+ # If you have an Emacs named "t", then use the full path.
+ test x"$EMACS" = xt && EMACS=
+ AC_CHECK_PROGS(EMACS, emacs xemacs, no)
+ if test $EMACS != "no"; then
+ if test x${lispdir+set} != xset; then
+ AC_CACHE_CHECK([where .elc files should go], [am_cv_lispdir], [dnl
+ am_cv_lispdir=`$EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) "\n")) (setq load-path (cdr load-path)))' | sed -n -e 's,/$,,' -e '/.*\/lib\/\(x\?emacs\/site-lisp\)$/{s,,${libdir}/\1,;p;q;}' -e '/.*\/share\/\(x\?emacs\/site-lisp\)$/{s,,${datadir}/\1,;p;q;}'`
+ if test -z "$am_cv_lispdir"; then
+ am_cv_lispdir='${datadir}/emacs/site-lisp'
+ fi
+ ])
+ lispdir="$am_cv_lispdir"
+ fi
+ fi
+ ])
+ AC_SUBST(lispdir)
+])
+
+dnl From gnulib
+AC_DEFUN([BASH_FUNC_FPURGE],
+[
+ AC_CHECK_FUNCS_ONCE([fpurge])
+ AC_CHECK_FUNCS_ONCE([__fpurge])
+ AC_CHECK_DECLS([fpurge], , , [#include <stdio.h>])
+])
+
+AC_DEFUN([BASH_FUNC_SNPRINTF],
+[
+ AC_CHECK_FUNCS_ONCE([snprintf])
+ if test X$ac_cv_func_snprintf = Xyes; then
+ AC_CACHE_CHECK([for standard-conformant snprintf], [bash_cv_func_snprintf],
+ [AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main()
+{
+ int n;
+ n = snprintf (0, 0, "%s", "0123456");
+ exit(n != 7);
+}
+]])], [bash_cv_func_snprintf=yes], [bash_cv_func_snprintf=no],
+ [AC_MSG_WARN([cannot check standard snprintf if cross-compiling])
+ bash_cv_func_snprintf=yes]
+)])
+ if test $bash_cv_func_snprintf = no; then
+ ac_cv_func_snprintf=no
+ fi
+ fi
+ if test $ac_cv_func_snprintf = no; then
+ AC_DEFINE(HAVE_SNPRINTF, 0,
+ [Define if you have a standard-conformant snprintf function.])
+ fi
+])
+
+AC_DEFUN([BASH_FUNC_VSNPRINTF],
+[
+ AC_CHECK_FUNCS_ONCE([vsnprintf])
+ if test X$ac_cv_func_vsnprintf = Xyes; then
+ AC_CACHE_CHECK([for standard-conformant vsnprintf], [bash_cv_func_vsnprintf],
+ [AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#if HAVE_STDARG_H
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+
+static int
+#if HAVE_STDARG_H
+foo(const char *fmt, ...)
+#else
+foo(format, va_alist)
+ const char *format;
+ va_dcl
+#endif
+{
+ va_list args;
+ int n;
+
+#if HAVE_STDARG_H
+ va_start(args, fmt);
+#else
+ va_start(args);
+#endif
+ n = vsnprintf(0, 0, fmt, args);
+ va_end (args);
+ return n;
+}
+
+int
+main()
+{
+ int n;
+ n = foo("%s", "0123456");
+ exit(n != 7);
+}
+]])], [bash_cv_func_vsnprintf=yes], [bash_cv_func_vsnprintf=no],
+ [AC_MSG_WARN([cannot check standard vsnprintf if cross-compiling])
+ bash_cv_func_vsnprintf=yes]
+)])
+ if test $bash_cv_func_vsnprintf = no; then
+ ac_cv_func_vsnprintf=no
+ fi
+ fi
+ if test $ac_cv_func_vsnprintf = no; then
+ AC_DEFINE(HAVE_VSNPRINTF, 0,
+ [Define if you have a standard-conformant vsnprintf function.])
+ fi
+])
+
+AC_DEFUN(BASH_STRUCT_WEXITSTATUS_OFFSET,
+[AC_MSG_CHECKING(for offset of exit status in return status from wait)
+AC_CACHE_VAL(bash_cv_wexitstatus_offset,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <sys/wait.h>
+
+int
+main(c, v)
+ int c;
+ char **v;
+{
+ pid_t pid, p;
+ int s, i, n;
+
+ s = 0;
+ pid = fork();
+ if (pid == 0)
+ exit (42);
+
+ /* wait for the process */
+ p = wait(&s);
+ if (p != pid)
+ exit (255);
+
+ /* crack s */
+ for (i = 0; i < (sizeof(s) * 8); i++)
+ {
+ n = (s >> i) & 0xff;
+ if (n == 42)
+ exit (i);
+ }
+
+ exit (254);
+}
+]])], [bash_cv_wexitstatus_offset=0], [bash_cv_wexitstatus_offset=$?],
+ [AC_MSG_WARN(cannot check WEXITSTATUS offset if cross compiling -- defaulting to 0)
+ bash_cv_wexitstatus_offset=0]
+)])
+if test "$bash_cv_wexitstatus_offset" -gt 32 ; then
+ AC_MSG_WARN(bad exit status from test program -- defaulting to 0)
+ bash_cv_wexitstatus_offset=0
+fi
+AC_MSG_RESULT($bash_cv_wexitstatus_offset)
+AC_DEFINE_UNQUOTED([WEXITSTATUS_OFFSET], [$bash_cv_wexitstatus_offset], [Offset of exit status in wait status word])
+])
+
+AC_DEFUN([BASH_FUNC_SBRK],
+[
+ AC_MSG_CHECKING([for sbrk])
+ AC_CACHE_VAL(ac_cv_func_sbrk,
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>]],
+ [[ void *x = sbrk (4096); ]])],
+ [ac_cv_func_sbrk=yes],[ac_cv_func_sbrk=no])])
+ AC_MSG_RESULT($ac_cv_func_sbrk)
+ if test X$ac_cv_func_sbrk = Xyes; then
+ AC_CACHE_CHECK([for working sbrk], [bash_cv_func_sbrk],
+ [AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdlib.h>
+#include <unistd.h>
+
+int
+main(int c, char **v)
+{
+ void *x;
+
+ x = sbrk (4096);
+ exit ((x == (void *)-1) ? 1 : 0);
+}
+]])],[bash_cv_func_sbrk=yes],[bash_cv_func_sbrk=no],[AC_MSG_WARN([cannot check working sbrk if cross-compiling])
+ bash_cv_func_sbrk=yes
+])])
+ if test $bash_cv_func_sbrk = no; then
+ ac_cv_func_sbrk=no
+ fi
+ fi
+ if test $ac_cv_func_sbrk = yes; then
+ AC_DEFINE(HAVE_SBRK, 1,
+ [Define if you have a working sbrk function.])
+ fi
+])
+
+AC_DEFUN(BASH_FUNC_FNMATCH_EQUIV_FALLBACK,
+[AC_MSG_CHECKING(whether fnmatch can be used to check bracket equivalence classes)
+AC_CACHE_VAL(bash_cv_fnmatch_equiv_fallback,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <fnmatch.h>
+#include <locale.h>
+
+char *pattern = "[[=a=]]";
+
+/* char *string = "ä"; */
+unsigned char string[4] = { '\xc3', '\xa4', '\0' };
+
+int
+main (int c, char **v)
+{
+ setlocale (LC_ALL, "en_US.UTF-8");
+ if (fnmatch (pattern, (const char *)string, 0) != FNM_NOMATCH)
+ exit (0);
+ exit (1);
+}
+]])], [bash_cv_fnmatch_equiv_fallback=yes], [bash_cv_fnmatch_equiv_fallback=no],
+ [AC_MSG_WARN(cannot check fnmatch if cross compiling -- defaulting to no)
+ bash_cv_fnmatch_equiv_fallback=no]
+)])
+AC_MSG_RESULT($bash_cv_fnmatch_equiv_fallback)
+if test "$bash_cv_fnmatch_equiv_fallback" = "yes" ; then
+ bash_cv_fnmatch_equiv_value=1
+else
+ bash_cv_fnmatch_equiv_value=0
+fi
+AC_DEFINE_UNQUOTED([FNMATCH_EQUIV_FALLBACK], [$bash_cv_fnmatch_equiv_value], [Whether fnmatch can be used for bracket equivalence classes])
+])
diff --git a/ansi_stdlib.h b/ansi_stdlib.h
new file mode 100644
index 0000000..7dc2ee0
--- /dev/null
+++ b/ansi_stdlib.h
@@ -0,0 +1,54 @@
+/* ansi_stdlib.h -- An ANSI Standard stdlib.h. */
+/* A minimal stdlib.h containing extern declarations for those functions
+ that bash uses. */
+
+/* Copyright (C) 1993 Free Software Foundation, Inc.
+
+ This file is part of GNU Bash, the Bourne Again SHell.
+
+ Bash 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.
+
+ Bash 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 Bash. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_STDLIB_H_)
+#define _STDLIB_H_ 1
+
+/* String conversion functions. */
+extern int atoi ();
+
+extern double atof ();
+extern double strtod ();
+
+/* Memory allocation functions. */
+/* Generic pointer type. */
+#ifndef PTR_T
+
+#if defined (__STDC__)
+# define PTR_T void *
+#else
+# define PTR_T char *
+#endif
+
+#endif /* PTR_T */
+
+extern PTR_T malloc ();
+extern PTR_T realloc ();
+extern void free ();
+
+/* Other miscellaneous functions. */
+extern void abort ();
+extern void exit ();
+extern char *getenv ();
+extern void qsort ();
+
+#endif /* _STDLIB_H */
diff --git a/bind.c b/bind.c
new file mode 100644
index 0000000..971116a
--- /dev/null
+++ b/bind.c
@@ -0,0 +1,3082 @@
+/* bind.c -- key binding and startup file support for the readline library. */
+
+/* Copyright (C) 1987-2022 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (__TANDEM)
+# include <floss.h>
+#endif
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+# include <sys/file.h>
+#endif /* HAVE_SYS_FILE_H */
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <errno.h>
+
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+#include "posixstat.h"
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strchr (), *strrchr ();
+#endif /* !strchr && !__STDC__ */
+
+/* Variables exported by this file. */
+Keymap rl_binding_keymap;
+
+static int _rl_skip_to_delim (char *, int, int);
+
+#if defined (USE_VARARGS) && defined (PREFER_STDARG)
+static void _rl_init_file_error (const char *, ...) __attribute__((__format__ (printf, 1, 2)));
+#else
+static void _rl_init_file_error ();
+#endif
+
+static rl_command_func_t *_rl_function_of_keyseq_internal (const char *, size_t, Keymap, int *);
+
+static char *_rl_read_file (char *, size_t *);
+static int _rl_read_init_file (const char *, int);
+static int glean_key_from_name (char *);
+
+static int find_boolean_var (const char *);
+static int find_string_var (const char *);
+
+static const char *boolean_varname (int);
+static const char *string_varname (int);
+
+static char *_rl_get_string_variable_value (const char *);
+static int substring_member_of_array (const char *, const char * const *);
+
+static int _rl_get_keymap_by_name (const char *);
+static int _rl_get_keymap_by_map (Keymap);
+
+static int currently_reading_init_file;
+
+/* used only in this file */
+static int _rl_prefer_visible_bell = 1;
+
+#define OP_EQ 1
+#define OP_NE 2
+#define OP_GT 3
+#define OP_GE 4
+#define OP_LT 5
+#define OP_LE 6
+
+#define OPSTART(c) ((c) == '=' || (c) == '!' || (c) == '<' || (c) == '>')
+#define CMPSTART(c) ((c) == '=' || (c) == '!')
+
+/* **************************************************************** */
+/* */
+/* Binding keys */
+/* */
+/* **************************************************************** */
+
+/* rl_add_defun (char *name, rl_command_func_t *function, int key)
+ Add NAME to the list of named functions. Make FUNCTION be the function
+ that gets called. If KEY is not -1, then bind it. */
+int
+rl_add_defun (const char *name, rl_command_func_t *function, int key)
+{
+ if (key != -1)
+ rl_bind_key (key, function);
+ rl_add_funmap_entry (name, function);
+ return 0;
+}
+
+/* Bind KEY to FUNCTION. Returns non-zero if KEY is out of range. */
+int
+rl_bind_key (int key, rl_command_func_t *function)
+{
+ char keyseq[4];
+ int l;
+
+ if (key < 0 || key > largest_char)
+ return (key);
+
+ /* Want to make this a multi-character key sequence with an ESC prefix */
+ if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
+ {
+ if (_rl_keymap[ESC].type == ISKMAP)
+ {
+ Keymap escmap;
+
+ escmap = FUNCTION_TO_KEYMAP (_rl_keymap, ESC);
+ key = UNMETA (key);
+ escmap[key].type = ISFUNC;
+ escmap[key].function = function;
+ return (0);
+ }
+
+ /* Otherwise, let's just let rl_generic_bind handle the key sequence.
+ We start it off with ESC here and let the code below add the rest
+ of the sequence. */
+ keyseq[0] = ESC;
+ l = 1;
+ key = UNMETA(key);
+ goto bind_keyseq;
+ }
+
+ /* If it's bound to a function or macro, just overwrite. Otherwise we have
+ to treat it as a key sequence so rl_generic_bind handles shadow keymaps
+ for us. If we are binding '\' or \C-@ (NUL) make sure to escape it so
+ it makes it through the call to rl_translate_keyseq. */
+ if (_rl_keymap[key].type != ISKMAP)
+ {
+ if (_rl_keymap[key].type == ISMACR)
+ xfree ((char *)_rl_keymap[key].function);
+ _rl_keymap[key].type = ISFUNC;
+ _rl_keymap[key].function = function;
+ }
+ else
+ {
+ l = 0;
+bind_keyseq:
+ if (key == '\\')
+ {
+ keyseq[l++] = '\\';
+ keyseq[l++] = '\\';
+ }
+ else if (key == '\0')
+ {
+ keyseq[l++] = '\\';
+ keyseq[l++] = '0';
+ }
+ else
+ keyseq[l++] = key;
+ keyseq[l] = '\0';
+ rl_bind_keyseq (keyseq, function);
+ }
+ rl_binding_keymap = _rl_keymap;
+ return (0);
+}
+
+/* Bind KEY to FUNCTION in MAP. Returns non-zero in case of invalid
+ KEY. */
+int
+rl_bind_key_in_map (int key, rl_command_func_t *function, Keymap map)
+{
+ int result;
+ Keymap oldmap;
+
+ oldmap = _rl_keymap;
+ _rl_keymap = map;
+ result = rl_bind_key (key, function);
+ _rl_keymap = oldmap;
+ return (result);
+}
+
+/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. Right
+ now, this is always used to attempt to bind the arrow keys. */
+int
+rl_bind_key_if_unbound_in_map (int key, rl_command_func_t *default_func, Keymap kmap)
+{
+ char *keyseq;
+
+ keyseq = rl_untranslate_keyseq ((unsigned char)key);
+ return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, kmap));
+}
+
+int
+rl_bind_key_if_unbound (int key, rl_command_func_t *default_func)
+{
+ char *keyseq;
+
+ keyseq = rl_untranslate_keyseq ((unsigned char)key);
+ return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap));
+}
+
+/* Make KEY do nothing in the currently selected keymap.
+ Returns non-zero in case of error. This is not the same as self-insert;
+ this makes it a dead key. */
+int
+rl_unbind_key (int key)
+{
+ return (rl_bind_key (key, (rl_command_func_t *)NULL));
+}
+
+/* Make KEY do nothing in MAP. Returns non-zero in case of error. */
+int
+rl_unbind_key_in_map (int key, Keymap map)
+{
+ return (rl_bind_key_in_map (key, (rl_command_func_t *)NULL, map));
+}
+
+/* Unbind all keys bound to FUNCTION in MAP. */
+int
+rl_unbind_function_in_map (rl_command_func_t *func, Keymap map)
+{
+ register int i, rval;
+
+ for (i = rval = 0; i < KEYMAP_SIZE; i++)
+ {
+ if (map[i].type == ISFUNC && map[i].function == func)
+ {
+ map[i].function = (rl_command_func_t *)NULL;
+ rval = 1;
+ }
+ else if (map[i].type == ISKMAP) /* TAG:readline-8.1 */
+ {
+ int r;
+ r = rl_unbind_function_in_map (func, FUNCTION_TO_KEYMAP (map, i));
+ if (r == 1)
+ rval = 1;
+ }
+ }
+ return rval;
+}
+
+/* Unbind all keys bound to COMMAND, which is a bindable command name, in MAP */
+int
+rl_unbind_command_in_map (const char *command, Keymap map)
+{
+ rl_command_func_t *func;
+
+ func = rl_named_function (command);
+ if (func == 0)
+ return 0;
+ return (rl_unbind_function_in_map (func, map));
+}
+
+/* Bind the key sequence represented by the string KEYSEQ to
+ FUNCTION, starting in the current keymap. This makes new
+ keymaps as necessary. */
+int
+rl_bind_keyseq (const char *keyseq, rl_command_func_t *function)
+{
+ return (rl_generic_bind (ISFUNC, keyseq, (char *)function, _rl_keymap));
+}
+
+/* Bind the key sequence represented by the string KEYSEQ to
+ FUNCTION. This makes new keymaps as necessary. The initial
+ place to do bindings is in MAP. */
+int
+rl_bind_keyseq_in_map (const char *keyseq, rl_command_func_t *function, Keymap map)
+{
+ return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map));
+}
+
+/* Backwards compatibility; equivalent to rl_bind_keyseq_in_map() */
+int
+rl_set_key (const char *keyseq, rl_command_func_t *function, Keymap map)
+{
+ return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map));
+}
+
+/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. Right
+ now, this is always used to attempt to bind the arrow keys, hence the
+ check for rl_vi_movement_mode. */
+int
+rl_bind_keyseq_if_unbound_in_map (const char *keyseq, rl_command_func_t *default_func, Keymap kmap)
+{
+ rl_command_func_t *func;
+ char *keys;
+ int keys_len;
+
+ if (keyseq)
+ {
+ /* Handle key sequences that require translations and `raw' ones that
+ don't. This might be a problem with backslashes. */
+ keys = (char *)xmalloc (1 + (2 * strlen (keyseq)));
+ if (rl_translate_keyseq (keyseq, keys, &keys_len))
+ {
+ xfree (keys);
+ return -1;
+ }
+ func = rl_function_of_keyseq_len (keys, keys_len, kmap, (int *)NULL);
+ xfree (keys);
+#if defined (VI_MODE)
+ if (!func || func == rl_do_lowercase_version || func == rl_vi_movement_mode)
+#else
+ if (!func || func == rl_do_lowercase_version)
+#endif
+ return (rl_bind_keyseq_in_map (keyseq, default_func, kmap));
+ else
+ return 1;
+ }
+ return 0;
+}
+
+int
+rl_bind_keyseq_if_unbound (const char *keyseq, rl_command_func_t *default_func)
+{
+ return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap));
+}
+
+/* Bind the key sequence represented by the string KEYSEQ to
+ the string of characters MACRO. This makes new keymaps as
+ necessary. The initial place to do bindings is in MAP. */
+int
+rl_macro_bind (const char *keyseq, const char *macro, Keymap map)
+{
+ char *macro_keys;
+ int macro_keys_len;
+
+ macro_keys = (char *)xmalloc ((2 * strlen (macro)) + 1);
+
+ if (rl_translate_keyseq (macro, macro_keys, &macro_keys_len))
+ {
+ xfree (macro_keys);
+ return -1;
+ }
+ rl_generic_bind (ISMACR, keyseq, macro_keys, map);
+ return 0;
+}
+
+/* Bind the key sequence represented by the string KEYSEQ to
+ the arbitrary pointer DATA. TYPE says what kind of data is
+ pointed to by DATA, right now this can be a function (ISFUNC),
+ a macro (ISMACR), or a keymap (ISKMAP). This makes new keymaps
+ as necessary. The initial place to do bindings is in MAP. */
+int
+rl_generic_bind (int type, const char *keyseq, char *data, Keymap map)
+{
+ char *keys;
+ int keys_len, prevkey, ic;
+ register int i;
+ KEYMAP_ENTRY k;
+ Keymap prevmap;
+
+ k.function = 0;
+
+ /* If no keys to bind to, exit right away. */
+ if (keyseq == 0 || *keyseq == 0)
+ {
+ if (type == ISMACR)
+ xfree (data);
+ return -1;
+ }
+
+ keys = (char *)xmalloc (1 + (2 * strlen (keyseq)));
+
+ /* Translate the ASCII representation of KEYSEQ into an array of
+ characters. Stuff the characters into KEYS, and the length of
+ KEYS into KEYS_LEN. */
+ if (rl_translate_keyseq (keyseq, keys, &keys_len))
+ {
+ xfree (keys);
+ return -1;
+ }
+
+ prevmap = map;
+ prevkey = keys[0];
+
+ /* Bind keys, making new keymaps as necessary. */
+ for (i = 0; i < keys_len; i++)
+ {
+ unsigned char uc = keys[i];
+
+ if (i > 0)
+ prevkey = ic;
+
+ ic = uc;
+ if (ic < 0 || ic >= KEYMAP_SIZE)
+ {
+ xfree (keys);
+ return -1;
+ }
+
+ /* We now rely on rl_translate_keyseq to do this conversion, so this
+ check is superfluous. */
+#if 0
+ if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii)
+ {
+ ic = UNMETA (ic);
+ if (map[ESC].type == ISKMAP)
+ {
+ prevmap = map;
+ map = FUNCTION_TO_KEYMAP (map, ESC);
+ }
+ }
+#endif
+
+ if ((i + 1) < keys_len)
+ {
+ if (map[ic].type != ISKMAP)
+ {
+ /* We allow subsequences of keys. If a keymap is being
+ created that will `shadow' an existing function or macro
+ key binding, we save that keybinding into the ANYOTHERKEY
+ index in the new map. The dispatch code will look there
+ to find the function to execute if the subsequence is not
+ matched. ANYOTHERKEY was chosen to be greater than
+ UCHAR_MAX. */
+ k = map[ic];
+
+ map[ic].type = ISKMAP;
+ map[ic].function = KEYMAP_TO_FUNCTION (rl_make_bare_keymap());
+ }
+ prevmap = map;
+ map = FUNCTION_TO_KEYMAP (map, ic);
+ /* The dispatch code will return this function if no matching
+ key sequence is found in the keymap. This (with a little
+ help from the dispatch code in readline.c) allows `a' to be
+ mapped to something, `abc' to be mapped to something else,
+ and the function bound to `a' to be executed when the user
+ types `abx', leaving `bx' in the input queue. */
+ if (k.function && ((k.type == ISFUNC && k.function != rl_do_lowercase_version) || k.type == ISMACR))
+ {
+ map[ANYOTHERKEY] = k;
+ k.function = 0;
+ }
+ }
+ else
+ {
+ if (map[ic].type == ISKMAP)
+ {
+ prevmap = map;
+ map = FUNCTION_TO_KEYMAP (map, ic);
+ ic = ANYOTHERKEY;
+ /* If we're trying to override a keymap with a null function
+ (e.g., trying to unbind it), we can't use a null pointer
+ here because that's indistinguishable from having not been
+ overridden. We use a special bindable function that does
+ nothing. */
+ if (type == ISFUNC && data == 0)
+ data = (char *)_rl_null_function;
+ }
+ if (map[ic].type == ISMACR)
+ xfree ((char *)map[ic].function);
+
+ map[ic].function = KEYMAP_TO_FUNCTION (data);
+ map[ic].type = type;
+ }
+
+ rl_binding_keymap = map;
+
+ }
+
+ /* If we unbound a key (type == ISFUNC, data == 0), and the prev keymap
+ points to the keymap where we unbound the key (sanity check), and the
+ current binding keymap is empty (rl_empty_keymap() returns non-zero),
+ and the binding keymap has ANYOTHERKEY set with type == ISFUNC
+ (overridden function), delete the now-empty keymap, take the previously-
+ overridden function and remove the override. */
+ /* Right now, this only works one level back. */
+ if (type == ISFUNC && data == 0 &&
+ prevmap[prevkey].type == ISKMAP &&
+ (FUNCTION_TO_KEYMAP(prevmap, prevkey) == rl_binding_keymap) &&
+ rl_binding_keymap[ANYOTHERKEY].type == ISFUNC &&
+ rl_empty_keymap (rl_binding_keymap))
+ {
+ prevmap[prevkey].type = rl_binding_keymap[ANYOTHERKEY].type;
+ prevmap[prevkey].function = rl_binding_keymap[ANYOTHERKEY].function;
+ rl_discard_keymap (rl_binding_keymap);
+ rl_binding_keymap = prevmap;
+ }
+
+ xfree (keys);
+ return 0;
+}
+
+/* Translate the ASCII representation of SEQ, stuffing the values into ARRAY,
+ an array of characters. LEN gets the final length of ARRAY. Return
+ non-zero if there was an error parsing SEQ. */
+int
+rl_translate_keyseq (const char *seq, char *array, int *len)
+{
+ register int i, l, temp;
+ int has_control, has_meta;
+ unsigned char c;
+
+ has_control = 0;
+ has_meta = 0;
+
+ /* When there are incomplete prefixes \C- or \M- (has_control || has_meta)
+ without base character at the end of SEQ, they are processed as the
+ prefixes for '\0'.
+ */
+ for (i = l = 0; (c = seq[i]) || has_control || has_meta; i++)
+ {
+ /* Only backslashes followed by a non-null character are handled
+ specially. Trailing backslash (backslash followed by '\0') is
+ processed as a normal character.
+ */
+ if (c == '\\' && seq[i + 1] != '\0')
+ {
+ c = seq[++i];
+
+ /* Handle \C- and \M- prefixes. */
+ if (c == 'C' && seq[i + 1] == '-')
+ {
+ i++;
+ has_control = 1;
+ continue;
+ }
+ else if (c == 'M' && seq[i + 1] == '-')
+ {
+ i++;
+ has_meta = 1;
+ continue;
+ }
+
+ /* Translate other backslash-escaped characters. These are the
+ same escape sequences that bash's `echo' and `printf' builtins
+ handle, with the addition of \d -> RUBOUT. A backslash
+ preceding a character that is not special is stripped. */
+ switch (c)
+ {
+ case 'a':
+ c = '\007';
+ break;
+ case 'b':
+ c = '\b';
+ break;
+ case 'd':
+ c = RUBOUT; /* readline-specific */
+ break;
+ case 'e':
+ c = ESC;
+ break;
+ case 'f':
+ c = '\f';
+ break;
+ case 'n':
+ c = NEWLINE;
+ break;
+ case 'r':
+ c = RETURN;
+ break;
+ case 't':
+ c = TAB;
+ break;
+ case 'v':
+ c = 0x0B;
+ break;
+ case '\\':
+ c = '\\';
+ break;
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ i++;
+ for (temp = 2, c -= '0'; ISOCTAL ((unsigned char)seq[i]) && temp--; i++)
+ c = (c * 8) + OCTVALUE (seq[i]);
+ i--; /* auto-increment in for loop */
+ c &= largest_char;
+ break;
+ case 'x':
+ i++;
+ for (temp = 2, c = 0; ISXDIGIT ((unsigned char)seq[i]) && temp--; i++)
+ c = (c * 16) + HEXVALUE (seq[i]);
+ if (temp == 2)
+ c = 'x';
+ i--; /* auto-increment in for loop */
+ c &= largest_char;
+ break;
+ default: /* backslashes before non-special chars just add the char */
+ c &= largest_char;
+ break; /* the backslash is stripped */
+ }
+ }
+
+ /* Process \C- and \M- flags */
+ if (has_control)
+ {
+ /* Special treatment for C-? */
+ c = (c == '?') ? RUBOUT : CTRL (_rl_to_upper (c));
+ has_control = 0;
+ }
+ if (has_meta)
+ {
+ c = META (c);
+ has_meta = 0;
+ }
+
+ /* If convert-meta is turned on, convert a meta char to a key sequence */
+ if (META_CHAR (c) && _rl_convert_meta_chars_to_ascii)
+ {
+ array[l++] = ESC; /* ESC is meta-prefix */
+ array[l++] = UNMETA (c);
+ }
+ else
+ array[l++] = (c);
+
+ /* Null characters may be processed for incomplete prefixes at the end of
+ sequence */
+ if (seq[i] == '\0')
+ break;
+ }
+
+ *len = l;
+ array[l] = '\0';
+ return (0);
+}
+
+static int
+_rl_isescape (int c)
+{
+ switch (c)
+ {
+ case '\007':
+ case '\b':
+ case '\f':
+ case '\n':
+ case '\r':
+ case TAB:
+ case 0x0b: return (1);
+ default: return (0);
+ }
+}
+
+static int
+_rl_escchar (int c)
+{
+ switch (c)
+ {
+ case '\007': return ('a');
+ case '\b': return ('b');
+ case '\f': return ('f');
+ case '\n': return ('n');
+ case '\r': return ('r');
+ case TAB: return ('t');
+ case 0x0b: return ('v');
+ default: return (c);
+ }
+}
+
+char *
+rl_untranslate_keyseq (int seq)
+{
+ static char kseq[16];
+ int i, c;
+
+ i = 0;
+ c = seq;
+ if (META_CHAR (c))
+ {
+ kseq[i++] = '\\';
+ kseq[i++] = 'M';
+ kseq[i++] = '-';
+ c = UNMETA (c);
+ }
+ else if (c == ESC)
+ {
+ kseq[i++] = '\\';
+ c = 'e';
+ }
+ else if (CTRL_CHAR (c))
+ {
+ kseq[i++] = '\\';
+ kseq[i++] = 'C';
+ kseq[i++] = '-';
+ c = _rl_to_lower (UNCTRL (c));
+ }
+ else if (c == RUBOUT)
+ {
+ kseq[i++] = '\\';
+ kseq[i++] = 'C';
+ kseq[i++] = '-';
+ c = '?';
+ }
+
+ if (c == ESC)
+ {
+ kseq[i++] = '\\';
+ c = 'e';
+ }
+ else if (c == '\\' || c == '"')
+ {
+ kseq[i++] = '\\';
+ }
+
+ kseq[i++] = (unsigned char) c;
+ kseq[i] = '\0';
+ return kseq;
+}
+
+char *
+_rl_untranslate_macro_value (char *seq, int use_escapes)
+{
+ char *ret, *r, *s;
+ int c;
+
+ r = ret = (char *)xmalloc (7 * strlen (seq) + 1);
+ for (s = seq; *s; s++)
+ {
+ c = *s;
+ if (META_CHAR (c))
+ {
+ *r++ = '\\';
+ *r++ = 'M';
+ *r++ = '-';
+ c = UNMETA (c);
+ }
+ else if (c == ESC)
+ {
+ *r++ = '\\';
+ c = 'e';
+ }
+ else if (CTRL_CHAR (c))
+ {
+ *r++ = '\\';
+ if (use_escapes && _rl_isescape (c))
+ c = _rl_escchar (c);
+ else
+ {
+ *r++ = 'C';
+ *r++ = '-';
+ c = _rl_to_lower (UNCTRL (c));
+ }
+ }
+ else if (c == RUBOUT)
+ {
+ *r++ = '\\';
+ *r++ = 'C';
+ *r++ = '-';
+ c = '?';
+ }
+
+ if (c == ESC)
+ {
+ *r++ = '\\';
+ c = 'e';
+ }
+ else if (c == '\\' || c == '"')
+ *r++ = '\\';
+
+ *r++ = (unsigned char)c;
+ }
+ *r = '\0';
+ return ret;
+}
+
+/* Return a pointer to the function that STRING represents.
+ If STRING doesn't have a matching function, then a NULL pointer
+ is returned. The string match is case-insensitive. */
+rl_command_func_t *
+rl_named_function (const char *string)
+{
+ register int i;
+
+ rl_initialize_funmap ();
+
+ for (i = 0; funmap[i]; i++)
+ if (_rl_stricmp (funmap[i]->name, string) == 0)
+ return (funmap[i]->function);
+ return ((rl_command_func_t *)NULL);
+}
+
+/* Return the function (or macro) definition which would be invoked via
+ KEYSEQ if executed in MAP. If MAP is NULL, then the current keymap is
+ used. TYPE, if non-NULL, is a pointer to an int which will receive the
+ type of the object pointed to. One of ISFUNC (function), ISKMAP (keymap),
+ or ISMACR (macro). */
+static rl_command_func_t *
+_rl_function_of_keyseq_internal (const char *keyseq, size_t len, Keymap map, int *type)
+{
+ register int i;
+
+ if (map == 0)
+ map = _rl_keymap;
+
+ for (i = 0; keyseq && i < len; i++)
+ {
+ unsigned char ic = keyseq[i];
+
+ if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii)
+ {
+ if (map[ESC].type == ISKMAP)
+ {
+ map = FUNCTION_TO_KEYMAP (map, ESC);
+ ic = UNMETA (ic);
+ }
+ /* XXX - should we just return NULL here, since this obviously
+ doesn't match? */
+ else
+ {
+ if (type)
+ *type = map[ESC].type;
+
+ return (map[ESC].function);
+ }
+ }
+
+ if (map[ic].type == ISKMAP)
+ {
+ /* If this is the last key in the key sequence, return the
+ map. */
+ if (i + 1 == len)
+ {
+ if (type)
+ *type = ISKMAP;
+
+ return (map[ic].function);
+ }
+ else
+ map = FUNCTION_TO_KEYMAP (map, ic);
+ }
+ /* If we're not at the end of the key sequence, and the current key
+ is bound to something other than a keymap, then the entire key
+ sequence is not bound. */
+ else if (map[ic].type != ISKMAP && i+1 < len)
+ return ((rl_command_func_t *)NULL);
+ else /* map[ic].type != ISKMAP && i+1 == len */
+ {
+ if (type)
+ *type = map[ic].type;
+
+ return (map[ic].function);
+ }
+ }
+ return ((rl_command_func_t *) NULL);
+}
+
+rl_command_func_t *
+rl_function_of_keyseq (const char *keyseq, Keymap map, int *type)
+{
+ return _rl_function_of_keyseq_internal (keyseq, strlen (keyseq), map, type);
+}
+
+rl_command_func_t *
+rl_function_of_keyseq_len (const char *keyseq, size_t len, Keymap map, int *type)
+{
+ return _rl_function_of_keyseq_internal (keyseq, len, map, type);
+}
+
+/* Assuming there is a numeric argument at the beginning of KEYSEQ (the
+ caller is responsible for checking), return the index of the portion of
+ the key sequence following the numeric argument. If there's no numeric
+ argument (?), or if KEYSEQ consists solely of a numeric argument (?),
+ return -1. */
+int
+rl_trim_arg_from_keyseq (const char *keyseq, size_t len, Keymap map)
+{
+ register int i, j, parsing_digits;
+ unsigned char ic;
+ Keymap map0;
+
+ if (map == 0)
+ map = _rl_keymap;
+ map0 = map;
+
+ /* The digits following the initial one (e.g., the binding to digit-argument)
+ or the optional `-' in a binding to digit-argument or universal-argument
+ are not added to rl_executing_keyseq. This is basically everything read by
+ rl_digit_loop. The parsing_digits logic is here in case they ever are. */
+ for (i = j = parsing_digits = 0; keyseq && i < len; i++)
+ {
+ ic = keyseq[i];
+
+ if (parsing_digits)
+ {
+ if (_rl_digit_p (ic))
+ {
+ j = i + 1;
+ continue;
+ }
+ parsing_digits = 0;
+ }
+
+ if (map[ic].type == ISKMAP)
+ {
+ if (i + 1 == len)
+ return -1;
+ map = FUNCTION_TO_KEYMAP (map, ic);
+ continue;
+ }
+ if (map[ic].type == ISFUNC)
+ {
+#if defined (VI_MODE)
+ if (map[ic].function != rl_digit_argument && map[ic].function != rl_universal_argument && map[ic].function != rl_vi_arg_digit)
+#else
+ if (map[ic].function != rl_digit_argument && map[ic].function != rl_universal_argument)
+#endif
+ return (j);
+
+ /* We don't bother with a keyseq that is only a numeric argument */
+ if (i + 1 == len)
+ return -1;
+
+ parsing_digits = 1;
+
+ /* This logic should be identical to rl_digit_loop */
+ /* We accept M-- as equivalent to M--1, C-u- as equivalent to C-u-1
+ but set parsing_digits to 2 to note that we saw `-' */
+ if (map[ic].function == rl_universal_argument && (i + 1 == '-'))
+ {
+ i++;
+ parsing_digits = 2;
+ }
+ if (map[ic].function == rl_digit_argument && ic == '-')
+ {
+ parsing_digits = 2;
+ }
+
+ map = map0;
+ j = i + 1;
+ }
+ }
+
+ /* If we're still parsing digits by the time we get here, we don't allow a
+ key sequence that consists solely of a numeric argument */
+ return -1;
+}
+
+/* The last key bindings file read. */
+static char *last_readline_init_file = (char *)NULL;
+
+/* The file we're currently reading key bindings from. */
+static const char *current_readline_init_file;
+static int current_readline_init_include_level;
+static int current_readline_init_lineno;
+
+/* Read FILENAME into a locally-allocated buffer and return the buffer.
+ The size of the buffer is returned in *SIZEP. Returns NULL if any
+ errors were encountered. */
+static char *
+_rl_read_file (char *filename, size_t *sizep)
+{
+ struct stat finfo;
+ size_t file_size;
+ char *buffer;
+ int i, file;
+
+ file = -1;
+ if (((file = open (filename, O_RDONLY, 0666)) < 0) || (fstat (file, &finfo) < 0))
+ {
+ if (file >= 0)
+ close (file);
+ return ((char *)NULL);
+ }
+
+ file_size = (size_t)finfo.st_size;
+
+ /* check for overflow on very large files */
+ if (file_size != finfo.st_size || file_size + 1 < file_size)
+ {
+ if (file >= 0)
+ close (file);
+#if defined (EFBIG)
+ errno = EFBIG;
+#endif
+ return ((char *)NULL);
+ }
+
+ /* Read the file into BUFFER. */
+ buffer = (char *)xmalloc (file_size + 1);
+ i = read (file, buffer, file_size);
+ close (file);
+
+ if (i < 0)
+ {
+ xfree (buffer);
+ return ((char *)NULL);
+ }
+
+ RL_CHECK_SIGNALS ();
+
+ buffer[i] = '\0';
+ if (sizep)
+ *sizep = i;
+
+ return (buffer);
+}
+
+/* Re-read the current keybindings file. */
+int
+rl_re_read_init_file (int count, int ignore)
+{
+ int r;
+ r = rl_read_init_file ((const char *)NULL);
+ rl_set_keymap_from_edit_mode ();
+ return r;
+}
+
+/* Do key bindings from a file. If FILENAME is NULL it defaults
+ to the first non-null filename from this list:
+ 1. the filename used for the previous call
+ 2. the value of the shell variable `INPUTRC'
+ 3. ~/.inputrc
+ 4. /etc/inputrc
+ If the file existed and could be opened and read, 0 is returned,
+ otherwise errno is returned. */
+int
+rl_read_init_file (const char *filename)
+{
+ /* Default the filename. */
+ if (filename == 0)
+ filename = last_readline_init_file;
+ if (filename == 0)
+ filename = sh_get_env_value ("INPUTRC");
+ if (filename == 0 || *filename == 0)
+ {
+ filename = DEFAULT_INPUTRC;
+ /* Try to read DEFAULT_INPUTRC; fall back to SYS_INPUTRC on failure */
+ if (_rl_read_init_file (filename, 0) == 0)
+ return 0;
+ filename = SYS_INPUTRC;
+ }
+
+#if defined (__MSDOS__)
+ if (_rl_read_init_file (filename, 0) == 0)
+ return 0;
+ filename = "~/_inputrc";
+#endif
+ return (_rl_read_init_file (filename, 0));
+}
+
+static int
+_rl_read_init_file (const char *filename, int include_level)
+{
+ register int i;
+ char *buffer, *openname, *line, *end;
+ size_t file_size;
+
+ current_readline_init_file = filename;
+ current_readline_init_include_level = include_level;
+
+ openname = tilde_expand (filename);
+ buffer = _rl_read_file (openname, &file_size);
+ xfree (openname);
+
+ RL_CHECK_SIGNALS ();
+ if (buffer == 0)
+ return (errno);
+
+ if (include_level == 0 && filename != last_readline_init_file)
+ {
+ FREE (last_readline_init_file);
+ last_readline_init_file = savestring (filename);
+ }
+
+ currently_reading_init_file = 1;
+
+ /* Loop over the lines in the file. Lines that start with `#' are
+ comments; all other lines are commands for readline initialization. */
+ current_readline_init_lineno = 1;
+ line = buffer;
+ end = buffer + file_size;
+ while (line < end)
+ {
+ /* Find the end of this line. */
+ for (i = 0; line + i != end && line[i] != '\n'; i++);
+
+#if defined (__CYGWIN__)
+ /* ``Be liberal in what you accept.'' */
+ if (line[i] == '\n' && line[i-1] == '\r')
+ line[i - 1] = '\0';
+#endif
+
+ /* Mark end of line. */
+ line[i] = '\0';
+
+ /* Skip leading whitespace. */
+ while (*line && whitespace (*line))
+ {
+ line++;
+ i--;
+ }
+
+ /* If the line is not a comment, then parse it. */
+ if (*line && *line != '#')
+ rl_parse_and_bind (line);
+
+ /* Move to the next line. */
+ line += i + 1;
+ current_readline_init_lineno++;
+ }
+
+ xfree (buffer);
+ currently_reading_init_file = 0;
+ return (0);
+}
+
+static void
+#if defined (PREFER_STDARG)
+_rl_init_file_error (const char *format, ...)
+#else
+_rl_init_file_error (va_alist)
+ va_dcl
+#endif
+{
+ va_list args;
+#if defined (PREFER_VARARGS)
+ char *format;
+#endif
+
+#if defined (PREFER_STDARG)
+ va_start (args, format);
+#else
+ va_start (args);
+ format = va_arg (args, char *);
+#endif
+
+ fprintf (stderr, "readline: ");
+ if (currently_reading_init_file)
+ fprintf (stderr, "%s: line %d: ", current_readline_init_file,
+ current_readline_init_lineno);
+
+ vfprintf (stderr, format, args);
+ fprintf (stderr, "\n");
+ fflush (stderr);
+
+ va_end (args);
+}
+
+/* **************************************************************** */
+/* */
+/* Parser Helper Functions */
+/* */
+/* **************************************************************** */
+
+static int
+parse_comparison_op (s, indp)
+ const char *s;
+ int *indp;
+{
+ int i, peekc, op;
+
+ if (OPSTART (s[*indp]) == 0)
+ return -1;
+ i = *indp;
+ peekc = s[i] ? s[i+1] : 0;
+ op = -1;
+
+ if (s[i] == '=')
+ {
+ op = OP_EQ;
+ if (peekc == '=')
+ i++;
+ i++;
+ }
+ else if (s[i] == '!' && peekc == '=')
+ {
+ op = OP_NE;
+ i += 2;
+ }
+ else if (s[i] == '<' && peekc == '=')
+ {
+ op = OP_LE;
+ i += 2;
+ }
+ else if (s[i] == '>' && peekc == '=')
+ {
+ op = OP_GE;
+ i += 2;
+ }
+ else if (s[i] == '<')
+ {
+ op = OP_LT;
+ i += 1;
+ }
+ else if (s[i] == '>')
+ {
+ op = OP_GT;
+ i += 1;
+ }
+
+ *indp = i;
+ return op;
+}
+
+/* **************************************************************** */
+/* */
+/* Parser Directives */
+/* */
+/* **************************************************************** */
+
+typedef int _rl_parser_func_t (char *);
+
+/* Things that mean `Control'. */
+const char * const _rl_possible_control_prefixes[] = {
+ "Control-", "C-", "CTRL-", (const char *)NULL
+};
+
+const char * const _rl_possible_meta_prefixes[] = {
+ "Meta", "M-", (const char *)NULL
+};
+
+/* Forward declarations */
+static int parser_if (char *);
+static int parser_else (char *);
+static int parser_endif (char *);
+static int parser_include (char *);
+
+/* Conditionals. */
+
+/* Calling programs set this to have their argv[0]. */
+const char *rl_readline_name = "other";
+
+/* Stack of previous values of parsing_conditionalized_out. */
+static unsigned char *if_stack = (unsigned char *)NULL;
+static int if_stack_depth;
+static int if_stack_size;
+
+/* Push _rl_parsing_conditionalized_out, and set parser state based
+ on ARGS. */
+static int
+parser_if (char *args)
+{
+ int i, llen, boolvar, strvar;
+
+ boolvar = strvar = -1;
+
+ /* Push parser state. */
+ if (if_stack_depth + 1 >= if_stack_size)
+ {
+ if (!if_stack)
+ if_stack = (unsigned char *)xmalloc (if_stack_size = 20);
+ else
+ if_stack = (unsigned char *)xrealloc (if_stack, if_stack_size += 20);
+ }
+ if_stack[if_stack_depth++] = _rl_parsing_conditionalized_out;
+
+ /* If parsing is turned off, then nothing can turn it back on except
+ for finding the matching endif. In that case, return right now. */
+ if (_rl_parsing_conditionalized_out)
+ return 0;
+
+ llen = strlen (args);
+
+ /* Isolate first argument. */
+ for (i = 0; args[i] && !whitespace (args[i]); i++);
+
+ if (args[i])
+ args[i++] = '\0';
+
+ /* Handle "$if term=foo" and "$if mode=emacs" constructs. If this
+ isn't term=foo, or mode=emacs, then check to see if the first
+ word in ARGS is the same as the value stored in rl_readline_name. */
+ if (rl_terminal_name && _rl_strnicmp (args, "term=", 5) == 0)
+ {
+ char *tem, *tname;
+
+ /* Terminals like "aaa-60" are equivalent to "aaa". */
+ tname = savestring (rl_terminal_name);
+ tem = strchr (tname, '-');
+ if (tem)
+ *tem = '\0';
+
+ /* Test the `long' and `short' forms of the terminal name so that
+ if someone has a `sun-cmd' and does not want to have bindings
+ that will be executed if the terminal is a `sun', they can put
+ `$if term=sun-cmd' into their .inputrc. */
+ _rl_parsing_conditionalized_out = _rl_stricmp (args + 5, tname) &&
+ _rl_stricmp (args + 5, rl_terminal_name);
+ xfree (tname);
+ }
+#if defined (VI_MODE)
+ else if (_rl_strnicmp (args, "mode=", 5) == 0)
+ {
+ int mode;
+
+ if (_rl_stricmp (args + 5, "emacs") == 0)
+ mode = emacs_mode;
+ else if (_rl_stricmp (args + 5, "vi") == 0)
+ mode = vi_mode;
+ else
+ mode = no_mode;
+
+ _rl_parsing_conditionalized_out = mode != rl_editing_mode;
+ }
+#endif /* VI_MODE */
+ else if (_rl_strnicmp (args, "version", 7) == 0)
+ {
+ int rlversion, versionarg, op, previ, major, minor, opresult;
+
+ _rl_parsing_conditionalized_out = 1;
+ rlversion = RL_VERSION_MAJOR*10 + RL_VERSION_MINOR;
+ /* if "version" is separated from the operator by whitespace, or the
+ operand is separated from the operator by whitespace, restore it.
+ We're more liberal with allowed whitespace for this variable. */
+ if (i > 0 && i <= llen && args[i-1] == '\0')
+ args[i-1] = ' ';
+ args[llen] = '\0'; /* just in case */
+ for (i = 7; whitespace (args[i]); i++)
+ ;
+ if (OPSTART(args[i]) == 0)
+ {
+ _rl_init_file_error ("comparison operator expected, found `%s'", args[i] ? args + i : "end-of-line");
+ return 0;
+ }
+ previ = i;
+ op = parse_comparison_op (args, &i);
+ if (op <= 0)
+ {
+ _rl_init_file_error ("comparison operator expected, found `%s'", args+previ);
+ return 0;
+ }
+ for ( ; args[i] && whitespace (args[i]); i++)
+ ;
+ if (args[i] == 0 || _rl_digit_p (args[i]) == 0)
+ {
+ _rl_init_file_error ("numeric argument expected, found `%s'", args+i);
+ return 0;
+ }
+ major = minor = 0;
+ previ = i;
+ for ( ; args[i] && _rl_digit_p (args[i]); i++)
+ major = major*10 + _rl_digit_value (args[i]);
+ if (args[i] == '.')
+ {
+ if (args[i + 1] && _rl_digit_p (args [i + 1]) == 0)
+ {
+ _rl_init_file_error ("numeric argument expected, found `%s'", args+previ);
+ return 0;
+ }
+ for (++i; args[i] && _rl_digit_p (args[i]); i++)
+ minor = minor*10 + _rl_digit_value (args[i]);
+ }
+ /* optional - check for trailing garbage on the line, allow whitespace
+ and a trailing comment */
+ previ = i;
+ for ( ; args[i] && whitespace (args[i]); i++)
+ ;
+ if (args[i] && args[i] != '#')
+ {
+ _rl_init_file_error ("trailing garbage on line: `%s'", args+previ);
+ return 0;
+ }
+ versionarg = major*10 + minor;
+
+ switch (op)
+ {
+ case OP_EQ:
+ opresult = rlversion == versionarg;
+ break;
+ case OP_NE:
+ opresult = rlversion != versionarg;
+ break;
+ case OP_GT:
+ opresult = rlversion > versionarg;
+ break;
+ case OP_GE:
+ opresult = rlversion >= versionarg;
+ break;
+ case OP_LT:
+ opresult = rlversion < versionarg;
+ break;
+ case OP_LE:
+ opresult = rlversion <= versionarg;
+ break;
+ }
+ _rl_parsing_conditionalized_out = 1 - opresult;
+ }
+ /* Check to see if the first word in ARGS is the same as the
+ value stored in rl_readline_name. */
+ else if (_rl_stricmp (args, rl_readline_name) == 0)
+ _rl_parsing_conditionalized_out = 0;
+ else if ((boolvar = find_boolean_var (args)) >= 0 || (strvar = find_string_var (args)) >= 0)
+ {
+ int op, previ;
+ size_t vlen;
+ const char *vname;
+ char *valuearg, *vval, prevc;
+
+ _rl_parsing_conditionalized_out = 1;
+ vname = (boolvar >= 0) ? boolean_varname (boolvar) : string_varname (strvar);
+ vlen = strlen (vname);
+ if (i > 0 && i <= llen && args[i-1] == '\0')
+ args[i-1] = ' ';
+ args[llen] = '\0'; /* just in case */
+ for (i = vlen; whitespace (args[i]); i++)
+ ;
+ if (CMPSTART(args[i]) == 0)
+ {
+ _rl_init_file_error ("equality comparison operator expected, found `%s'", args[i] ? args + i : "end-of-line");
+ return 0;
+ }
+ previ = i;
+ op = parse_comparison_op (args, &i);
+ if (op != OP_EQ && op != OP_NE)
+ {
+ _rl_init_file_error ("equality comparison operator expected, found `%s'", args+previ);
+ return 0;
+ }
+ for ( ; args[i] && whitespace (args[i]); i++)
+ ;
+ if (args[i] == 0)
+ {
+ _rl_init_file_error ("argument expected, found `%s'", args+i);
+ return 0;
+ }
+ previ = i;
+ valuearg = args + i;
+ for ( ; args[i] && whitespace (args[i]) == 0; i++)
+ ;
+ prevc = args[i];
+ args[i] = '\0'; /* null-terminate valuearg */
+ vval = rl_variable_value (vname);
+ if (op == OP_EQ)
+ _rl_parsing_conditionalized_out = _rl_stricmp (vval, valuearg) != 0;
+ else if (op == OP_NE)
+ _rl_parsing_conditionalized_out = _rl_stricmp (vval, valuearg) == 0;
+ args[i] = prevc;
+ }
+ else
+ _rl_parsing_conditionalized_out = 1;
+ return 0;
+}
+
+/* Invert the current parser state if there is anything on the stack. */
+static int
+parser_else (char *args)
+{
+ register int i;
+
+ if (if_stack_depth == 0)
+ {
+ _rl_init_file_error ("$else found without matching $if");
+ return 0;
+ }
+
+#if 0
+ /* Check the previous (n - 1) levels of the stack to make sure that
+ we haven't previously turned off parsing. */
+ for (i = 0; i < if_stack_depth - 1; i++)
+#else
+ /* Check the previous (n) levels of the stack to make sure that
+ we haven't previously turned off parsing. */
+ for (i = 0; i < if_stack_depth; i++)
+#endif
+ if (if_stack[i] == 1)
+ return 0;
+
+ /* Invert the state of parsing if at top level. */
+ _rl_parsing_conditionalized_out = !_rl_parsing_conditionalized_out;
+ return 0;
+}
+
+/* Terminate a conditional, popping the value of
+ _rl_parsing_conditionalized_out from the stack. */
+static int
+parser_endif (char *args)
+{
+ if (if_stack_depth)
+ _rl_parsing_conditionalized_out = if_stack[--if_stack_depth];
+ else
+ _rl_init_file_error ("$endif without matching $if");
+ return 0;
+}
+
+static int
+parser_include (char *args)
+{
+ const char *old_init_file;
+ char *e;
+ int old_line_number, old_include_level, r;
+
+ if (_rl_parsing_conditionalized_out)
+ return (0);
+
+ old_init_file = current_readline_init_file;
+ old_line_number = current_readline_init_lineno;
+ old_include_level = current_readline_init_include_level;
+
+ e = strchr (args, '\n');
+ if (e)
+ *e = '\0';
+ r = _rl_read_init_file ((const char *)args, old_include_level + 1);
+
+ current_readline_init_file = old_init_file;
+ current_readline_init_lineno = old_line_number;
+ current_readline_init_include_level = old_include_level;
+
+ return r;
+}
+
+/* Associate textual names with actual functions. */
+static const struct {
+ const char * const name;
+ _rl_parser_func_t *function;
+} parser_directives [] = {
+ { "if", parser_if },
+ { "endif", parser_endif },
+ { "else", parser_else },
+ { "include", parser_include },
+ { (char *)0x0, (_rl_parser_func_t *)0x0 }
+};
+
+/* Handle a parser directive. STATEMENT is the line of the directive
+ without any leading `$'. */
+static int
+handle_parser_directive (char *statement)
+{
+ register int i;
+ char *directive, *args;
+
+ /* Isolate the actual directive. */
+
+ /* Skip whitespace. */
+ for (i = 0; whitespace (statement[i]); i++);
+
+ directive = &statement[i];
+
+ for (; statement[i] && !whitespace (statement[i]); i++);
+
+ if (statement[i])
+ statement[i++] = '\0';
+
+ for (; statement[i] && whitespace (statement[i]); i++);
+
+ args = &statement[i];
+
+ /* Lookup the command, and act on it. */
+ for (i = 0; parser_directives[i].name; i++)
+ if (_rl_stricmp (directive, parser_directives[i].name) == 0)
+ {
+ (*parser_directives[i].function) (args);
+ return (0);
+ }
+
+ /* display an error message about the unknown parser directive */
+ _rl_init_file_error ("%s: unknown parser directive", directive);
+ return (1);
+}
+
+/* Start at STRING[START] and look for DELIM. Return I where STRING[I] ==
+ DELIM or STRING[I] == 0. DELIM is usually a double quote. */
+static int
+_rl_skip_to_delim (char *string, int start, int delim)
+{
+ int i, c, passc;
+
+ for (i = start,passc = 0; c = string[i]; i++)
+ {
+ if (passc)
+ {
+ passc = 0;
+ if (c == 0)
+ break;
+ continue;
+ }
+
+ if (c == '\\')
+ {
+ passc = 1;
+ continue;
+ }
+
+ if (c == delim)
+ break;
+ }
+
+ return i;
+}
+
+/* Read the binding command from STRING and perform it.
+ A key binding command looks like: Keyname: function-name\0,
+ a variable binding command looks like: set variable value.
+ A new-style keybinding looks like "\C-x\C-x": exchange-point-and-mark. */
+int
+rl_parse_and_bind (char *string)
+{
+ char *funname, *kname;
+ register int c, i;
+ int key, equivalency, foundmod, foundsep;
+
+ while (string && whitespace (*string))
+ string++;
+
+ if (string == 0 || *string == 0 || *string == '#')
+ return 0;
+
+ /* If this is a parser directive, act on it. */
+ if (*string == '$')
+ {
+ handle_parser_directive (&string[1]);
+ return 0;
+ }
+
+ /* If we aren't supposed to be parsing right now, then we're done. */
+ if (_rl_parsing_conditionalized_out)
+ return 0;
+
+ i = 0;
+ /* If this keyname is a complex key expression surrounded by quotes,
+ advance to after the matching close quote. This code allows the
+ backslash to quote characters in the key expression. */
+ if (*string == '"')
+ {
+ i = _rl_skip_to_delim (string, 1, '"');
+
+ /* If we didn't find a closing quote, abort the line. */
+ if (string[i] == '\0')
+ {
+ _rl_init_file_error ("%s: no closing `\"' in key binding", string);
+ return 1;
+ }
+ else
+ i++; /* skip past closing double quote */
+ }
+
+ /* Advance to the colon (:) or whitespace which separates the two objects. */
+ for (; (c = string[i]) && c != ':' && c != ' ' && c != '\t'; i++ );
+
+ if (i == 0)
+ {
+ _rl_init_file_error ("`%s': invalid key binding: missing key sequence", string);
+ return 1;
+ }
+
+ equivalency = (c == ':' && string[i + 1] == '=');
+
+ foundsep = c != 0;
+
+ /* Mark the end of the command (or keyname). */
+ if (string[i])
+ string[i++] = '\0';
+
+ /* If doing assignment, skip the '=' sign as well. */
+ if (equivalency)
+ string[i++] = '\0';
+
+ /* If this is a command to set a variable, then do that. */
+ if (_rl_stricmp (string, "set") == 0)
+ {
+ char *var, *value, *e;
+ int s;
+
+ var = string + i;
+ /* Make VAR point to start of variable name. */
+ while (*var && whitespace (*var)) var++;
+
+ /* Make VALUE point to start of value string. */
+ value = var;
+ while (*value && whitespace (*value) == 0) value++;
+ if (*value)
+ *value++ = '\0';
+ while (*value && whitespace (*value)) value++;
+
+ /* Strip trailing whitespace from values of boolean variables. */
+ if (find_boolean_var (var) >= 0)
+ {
+ /* just read a whitespace-delimited word or empty string */
+ for (e = value; *e && whitespace (*e) == 0; e++)
+ ;
+ if (e > value)
+ *e = '\0'; /* cut off everything trailing */
+ }
+ else if ((i = find_string_var (var)) >= 0)
+ {
+ /* Allow quoted strings in variable values */
+ if (*value == '"')
+ {
+ i = _rl_skip_to_delim (value, 1, *value);
+ value[i] = '\0';
+ value++; /* skip past the quote */
+ }
+ else
+ {
+ /* remove trailing whitespace */
+ e = value + strlen (value) - 1;
+ while (e >= value && whitespace (*e))
+ e--;
+ e++; /* skip back to whitespace or EOS */
+
+ if (*e && e >= value)
+ *e = '\0';
+ }
+ }
+ else
+ {
+ /* avoid calling rl_variable_bind just to find this out */
+ _rl_init_file_error ("%s: unknown variable name", var);
+ return 1;
+ }
+
+ rl_variable_bind (var, value);
+ return 0;
+ }
+
+ /* Skip any whitespace between keyname and funname. */
+ for (; string[i] && whitespace (string[i]); i++);
+ funname = &string[i];
+
+ /* Now isolate funname.
+ For straight function names just look for whitespace, since
+ that will signify the end of the string. But this could be a
+ macro definition. In that case, the string is quoted, so skip
+ to the matching delimiter. We allow the backslash to quote the
+ delimiter characters in the macro body. */
+ /* This code exists to allow whitespace in macro expansions, which
+ would otherwise be gobbled up by the next `for' loop.*/
+ /* XXX - it may be desirable to allow backslash quoting only if " is
+ the quoted string delimiter, like the shell. */
+ if (*funname == '\'' || *funname == '"')
+ {
+ i = _rl_skip_to_delim (string, i+1, *funname);
+ if (string[i])
+ i++;
+ else
+ {
+ _rl_init_file_error ("`%s': missing closing quote for macro", funname);
+ return 1;
+ }
+ }
+
+ /* Advance to the end of the string. */
+ for (; string[i] && whitespace (string[i]) == 0; i++);
+
+ /* No extra whitespace at the end of the string. */
+ string[i] = '\0';
+
+ /* Handle equivalency bindings here. Make the left-hand side be exactly
+ whatever the right-hand evaluates to, including keymaps. */
+ if (equivalency)
+ {
+ return 0;
+ }
+
+ if (foundsep == 0)
+ {
+ _rl_init_file_error ("%s: no key sequence terminator", string);
+ return 1;
+ }
+
+ /* If this is a new-style key-binding, then do the binding with
+ rl_bind_keyseq (). Otherwise, let the older code deal with it. */
+ if (*string == '"')
+ {
+ char *seq;
+ register int j, k, passc;
+
+ seq = (char *)xmalloc (1 + strlen (string));
+ for (j = 1, k = passc = 0; string[j]; j++)
+ {
+ /* Allow backslash to quote characters, but leave them in place.
+ This allows a string to end with a backslash quoting another
+ backslash, or with a backslash quoting a double quote. The
+ backslashes are left in place for rl_translate_keyseq (). */
+ if (passc || (string[j] == '\\'))
+ {
+ seq[k++] = string[j];
+ passc = !passc;
+ continue;
+ }
+
+ if (string[j] == '"')
+ break;
+
+ seq[k++] = string[j];
+ }
+ seq[k] = '\0';
+
+ /* Binding macro? */
+ if (*funname == '\'' || *funname == '"')
+ {
+ j = strlen (funname);
+
+ /* Remove the delimiting quotes from each end of FUNNAME. */
+ if (j && funname[j - 1] == *funname)
+ funname[j - 1] = '\0';
+
+ rl_macro_bind (seq, &funname[1], _rl_keymap);
+ }
+ else
+ rl_bind_keyseq (seq, rl_named_function (funname));
+
+ xfree (seq);
+ return 0;
+ }
+
+ /* Get the actual character we want to deal with. */
+ kname = strrchr (string, '-');
+ if (kname == 0)
+ kname = string;
+ else
+ kname++;
+
+ key = glean_key_from_name (kname);
+
+ /* Add in control and meta bits. */
+ foundmod = 0;
+ if (substring_member_of_array (string, _rl_possible_control_prefixes))
+ {
+ key = CTRL (_rl_to_upper (key));
+ foundmod = 1;
+ }
+
+ if (substring_member_of_array (string, _rl_possible_meta_prefixes))
+ {
+ key = META (key);
+ foundmod = 1;
+ }
+
+ if (foundmod == 0 && kname != string)
+ {
+ _rl_init_file_error ("%s: unknown key modifier", string);
+ return 1;
+ }
+
+ /* Temporary. Handle old-style keyname with macro-binding. */
+ if (*funname == '\'' || *funname == '"')
+ {
+ char useq[2];
+ int fl = strlen (funname);
+
+ useq[0] = key; useq[1] = '\0';
+ if (fl && funname[fl - 1] == *funname)
+ funname[fl - 1] = '\0';
+
+ rl_macro_bind (useq, &funname[1], _rl_keymap);
+ }
+#if defined (PREFIX_META_HACK)
+ /* Ugly, but working hack to keep prefix-meta around. */
+ else if (_rl_stricmp (funname, "prefix-meta") == 0)
+ {
+ char seq[2];
+
+ seq[0] = key;
+ seq[1] = '\0';
+ rl_generic_bind (ISKMAP, seq, (char *)emacs_meta_keymap, _rl_keymap);
+ }
+#endif /* PREFIX_META_HACK */
+ else
+ rl_bind_key (key, rl_named_function (funname));
+
+ return 0;
+}
+
+/* Simple structure for boolean readline variables (i.e., those that can
+ have one of two values; either "On" or 1 for truth, or "Off" or 0 for
+ false. */
+
+#define V_SPECIAL 0x1
+
+static const struct {
+ const char * const name;
+ int *value;
+ int flags;
+} boolean_varlist [] = {
+ { "bind-tty-special-chars", &_rl_bind_stty_chars, 0 },
+ { "blink-matching-paren", &rl_blink_matching_paren, V_SPECIAL },
+ { "byte-oriented", &rl_byte_oriented, 0 },
+#if defined (COLOR_SUPPORT)
+ { "colored-completion-prefix",&_rl_colored_completion_prefix, 0 },
+ { "colored-stats", &_rl_colored_stats, 0 },
+#endif
+ { "completion-ignore-case", &_rl_completion_case_fold, 0 },
+ { "completion-map-case", &_rl_completion_case_map, 0 },
+ { "convert-meta", &_rl_convert_meta_chars_to_ascii, 0 },
+ { "disable-completion", &rl_inhibit_completion, 0 },
+ { "echo-control-characters", &_rl_echo_control_chars, 0 },
+ { "enable-active-region", &_rl_enable_active_region, 0 },
+ { "enable-bracketed-paste", &_rl_enable_bracketed_paste, V_SPECIAL },
+ { "enable-keypad", &_rl_enable_keypad, 0 },
+ { "enable-meta-key", &_rl_enable_meta, 0 },
+ { "expand-tilde", &rl_complete_with_tilde_expansion, 0 },
+ { "history-preserve-point", &_rl_history_preserve_point, 0 },
+ { "horizontal-scroll-mode", &_rl_horizontal_scroll_mode, 0 },
+ { "input-meta", &_rl_meta_flag, 0 },
+ { "mark-directories", &_rl_complete_mark_directories, 0 },
+ { "mark-modified-lines", &_rl_mark_modified_lines, 0 },
+ { "mark-symlinked-directories", &_rl_complete_mark_symlink_dirs, 0 },
+ { "match-hidden-files", &_rl_match_hidden_files, 0 },
+ { "menu-complete-display-prefix", &_rl_menu_complete_prefix_first, 0 },
+ { "meta-flag", &_rl_meta_flag, 0 },
+ { "output-meta", &_rl_output_meta_chars, 0 },
+ { "page-completions", &_rl_page_completions, 0 },
+ { "prefer-visible-bell", &_rl_prefer_visible_bell, V_SPECIAL },
+ { "print-completions-horizontally", &_rl_print_completions_horizontally, 0 },
+ { "revert-all-at-newline", &_rl_revert_all_at_newline, 0 },
+ { "show-all-if-ambiguous", &_rl_complete_show_all, 0 },
+ { "show-all-if-unmodified", &_rl_complete_show_unmodified, 0 },
+ { "show-mode-in-prompt", &_rl_show_mode_in_prompt, 0 },
+ { "skip-completed-text", &_rl_skip_completed_text, 0 },
+#if defined (VISIBLE_STATS)
+ { "visible-stats", &rl_visible_stats, 0 },
+#endif /* VISIBLE_STATS */
+ { (char *)NULL, (int *)NULL, 0 }
+};
+
+static int
+find_boolean_var (const char *name)
+{
+ register int i;
+
+ for (i = 0; boolean_varlist[i].name; i++)
+ if (_rl_stricmp (name, boolean_varlist[i].name) == 0)
+ return i;
+ return -1;
+}
+
+static const char *
+boolean_varname (int i)
+{
+ return ((i >= 0) ? boolean_varlist[i].name : (char *)NULL);
+}
+
+/* Hooks for handling special boolean variables, where a
+ function needs to be called or another variable needs
+ to be changed when they're changed. */
+static void
+hack_special_boolean_var (int i)
+{
+ const char *name;
+
+ name = boolean_varlist[i].name;
+
+ if (_rl_stricmp (name, "blink-matching-paren") == 0)
+ _rl_enable_paren_matching (rl_blink_matching_paren);
+ else if (_rl_stricmp (name, "prefer-visible-bell") == 0)
+ {
+ if (_rl_prefer_visible_bell)
+ _rl_bell_preference = VISIBLE_BELL;
+ else
+ _rl_bell_preference = AUDIBLE_BELL;
+ }
+ else if (_rl_stricmp (name, "show-mode-in-prompt") == 0)
+ _rl_reset_prompt ();
+ else if (_rl_stricmp (name, "enable-bracketed-paste") == 0)
+ _rl_enable_active_region = _rl_enable_bracketed_paste;
+}
+
+typedef int _rl_sv_func_t (const char *);
+
+/* These *must* correspond to the array indices for the appropriate
+ string variable. (Though they're not used right now.) */
+#define V_BELLSTYLE 0
+#define V_COMBEGIN 1
+#define V_EDITMODE 2
+#define V_ISRCHTERM 3
+#define V_KEYMAP 4
+
+#define V_STRING 1
+#define V_INT 2
+
+/* Forward declarations */
+static int sv_region_start_color (const char *);
+static int sv_region_end_color (const char *);
+static int sv_bell_style (const char *);
+static int sv_combegin (const char *);
+static int sv_dispprefix (const char *);
+static int sv_compquery (const char *);
+static int sv_compwidth (const char *);
+static int sv_editmode (const char *);
+static int sv_emacs_modestr (const char *);
+static int sv_histsize (const char *);
+static int sv_isrchterm (const char *);
+static int sv_keymap (const char *);
+static int sv_seqtimeout (const char *);
+static int sv_viins_modestr (const char *);
+static int sv_vicmd_modestr (const char *);
+
+static const struct {
+ const char * const name;
+ int flags;
+ _rl_sv_func_t *set_func;
+} string_varlist[] = {
+ { "active-region-end-color", V_STRING, sv_region_end_color },
+ { "active-region-start-color", V_STRING, sv_region_start_color },
+ { "bell-style", V_STRING, sv_bell_style },
+ { "comment-begin", V_STRING, sv_combegin },
+ { "completion-display-width", V_INT, sv_compwidth },
+ { "completion-prefix-display-length", V_INT, sv_dispprefix },
+ { "completion-query-items", V_INT, sv_compquery },
+ { "editing-mode", V_STRING, sv_editmode },
+ { "emacs-mode-string", V_STRING, sv_emacs_modestr },
+ { "history-size", V_INT, sv_histsize },
+ { "isearch-terminators", V_STRING, sv_isrchterm },
+ { "keymap", V_STRING, sv_keymap },
+ { "keyseq-timeout", V_INT, sv_seqtimeout },
+ { "vi-cmd-mode-string", V_STRING, sv_vicmd_modestr },
+ { "vi-ins-mode-string", V_STRING, sv_viins_modestr },
+ { (char *)NULL, 0, (_rl_sv_func_t *)0 }
+};
+
+static int
+find_string_var (const char *name)
+{
+ register int i;
+
+ for (i = 0; string_varlist[i].name; i++)
+ if (_rl_stricmp (name, string_varlist[i].name) == 0)
+ return i;
+ return -1;
+}
+
+static const char *
+string_varname (int i)
+{
+ return ((i >= 0) ? string_varlist[i].name : (char *)NULL);
+}
+
+/* A boolean value that can appear in a `set variable' command is true if
+ the value is null or empty, `on' (case-insensitive), or "1". All other
+ values result in 0 (false). */
+static int
+bool_to_int (const char *value)
+{
+ return (value == 0 || *value == '\0' ||
+ (_rl_stricmp (value, "on") == 0) ||
+ (value[0] == '1' && value[1] == '\0'));
+}
+
+char *
+rl_variable_value (const char *name)
+{
+ register int i;
+
+ /* Check for simple variables first. */
+ i = find_boolean_var (name);
+ if (i >= 0)
+ return (*boolean_varlist[i].value ? "on" : "off");
+
+ i = find_string_var (name);
+ if (i >= 0)
+ return (_rl_get_string_variable_value (string_varlist[i].name));
+
+ /* Unknown variable names return NULL. */
+ return (char *)NULL;
+}
+
+int
+rl_variable_bind (const char *name, const char *value)
+{
+ register int i;
+ int v;
+
+ /* Check for simple variables first. */
+ i = find_boolean_var (name);
+ if (i >= 0)
+ {
+ *boolean_varlist[i].value = bool_to_int (value);
+ if (boolean_varlist[i].flags & V_SPECIAL)
+ hack_special_boolean_var (i);
+ return 0;
+ }
+
+ i = find_string_var (name);
+
+ /* For the time being, string names without a handler function are simply
+ ignored. */
+ if (i < 0 || string_varlist[i].set_func == 0)
+ {
+ if (i < 0)
+ _rl_init_file_error ("%s: unknown variable name", name);
+ return 0;
+ }
+
+ v = (*string_varlist[i].set_func) (value);
+ if (v != 0)
+ _rl_init_file_error ("%s: could not set value to `%s'", name, value);
+ return v;
+}
+
+static int
+sv_editmode (const char *value)
+{
+ if (_rl_strnicmp (value, "vi", 2) == 0)
+ {
+#if defined (VI_MODE)
+ _rl_keymap = vi_insertion_keymap;
+ rl_editing_mode = vi_mode;
+#endif /* VI_MODE */
+ return 0;
+ }
+ else if (_rl_strnicmp (value, "emacs", 5) == 0)
+ {
+ _rl_keymap = emacs_standard_keymap;
+ rl_editing_mode = emacs_mode;
+ return 0;
+ }
+ return 1;
+}
+
+static int
+sv_combegin (const char *value)
+{
+ if (value && *value)
+ {
+ FREE (_rl_comment_begin);
+ _rl_comment_begin = savestring (value);
+ return 0;
+ }
+ return 1;
+}
+
+static int
+sv_dispprefix (const char *value)
+{
+ int nval = 0;
+
+ if (value && *value)
+ {
+ nval = atoi (value);
+ if (nval < 0)
+ nval = 0;
+ }
+ _rl_completion_prefix_display_length = nval;
+ return 0;
+}
+
+static int
+sv_compquery (const char *value)
+{
+ int nval = 100;
+
+ if (value && *value)
+ {
+ nval = atoi (value);
+ if (nval < 0)
+ nval = 0;
+ }
+ rl_completion_query_items = nval;
+ return 0;
+}
+
+static int
+sv_compwidth (const char *value)
+{
+ int nval = -1;
+
+ if (value && *value)
+ nval = atoi (value);
+
+ _rl_completion_columns = nval;
+ return 0;
+}
+
+static int
+sv_histsize (const char *value)
+{
+ int nval;
+
+ nval = 500;
+ if (value && *value)
+ {
+ nval = atoi (value);
+ if (nval < 0)
+ {
+ unstifle_history ();
+ return 0;
+ }
+ }
+ stifle_history (nval);
+ return 0;
+}
+
+static int
+sv_keymap (const char *value)
+{
+ Keymap kmap;
+
+ kmap = rl_get_keymap_by_name (value);
+ if (kmap)
+ {
+ rl_set_keymap (kmap);
+ return 0;
+ }
+ return 1;
+}
+
+static int
+sv_seqtimeout (const char *value)
+{
+ int nval;
+
+ nval = 0;
+ if (value && *value)
+ {
+ nval = atoi (value);
+ if (nval < 0)
+ nval = 0;
+ }
+ _rl_keyseq_timeout = nval;
+ return 0;
+}
+
+static int
+sv_region_start_color (const char *value)
+{
+ return (_rl_reset_region_color (0, value));
+}
+
+static int
+sv_region_end_color (const char *value)
+{
+ return (_rl_reset_region_color (1, value));
+}
+
+static int
+sv_bell_style (const char *value)
+{
+ if (value == 0 || *value == '\0')
+ _rl_bell_preference = AUDIBLE_BELL;
+ else if (_rl_stricmp (value, "none") == 0 || _rl_stricmp (value, "off") == 0)
+ _rl_bell_preference = NO_BELL;
+ else if (_rl_stricmp (value, "audible") == 0 || _rl_stricmp (value, "on") == 0)
+ _rl_bell_preference = AUDIBLE_BELL;
+ else if (_rl_stricmp (value, "visible") == 0)
+ _rl_bell_preference = VISIBLE_BELL;
+ else
+ return 1;
+ return 0;
+}
+
+static int
+sv_isrchterm (const char *value)
+{
+ int beg, end, delim;
+ char *v;
+
+ if (value == 0)
+ return 1;
+
+ /* Isolate the value and translate it into a character string. */
+ v = savestring (value);
+ FREE (_rl_isearch_terminators);
+ if (v[0] == '"' || v[0] == '\'')
+ {
+ delim = v[0];
+ for (beg = end = 1; v[end] && v[end] != delim; end++)
+ ;
+ }
+ else
+ {
+ for (beg = end = 0; v[end] && whitespace (v[end]) == 0; end++)
+ ;
+ }
+
+ v[end] = '\0';
+
+ /* The value starts at v + beg. Translate it into a character string. */
+ _rl_isearch_terminators = (char *)xmalloc (2 * strlen (v) + 1);
+ rl_translate_keyseq (v + beg, _rl_isearch_terminators, &end);
+ _rl_isearch_terminators[end] = '\0';
+
+ xfree (v);
+ return 0;
+}
+
+extern char *_rl_emacs_mode_str;
+
+static int
+sv_emacs_modestr (const char *value)
+{
+ if (value && *value)
+ {
+ FREE (_rl_emacs_mode_str);
+ _rl_emacs_mode_str = (char *)xmalloc (2 * strlen (value) + 1);
+ rl_translate_keyseq (value, _rl_emacs_mode_str, &_rl_emacs_modestr_len);
+ _rl_emacs_mode_str[_rl_emacs_modestr_len] = '\0';
+ return 0;
+ }
+ else if (value)
+ {
+ FREE (_rl_emacs_mode_str);
+ _rl_emacs_mode_str = (char *)xmalloc (1);
+ _rl_emacs_mode_str[_rl_emacs_modestr_len = 0] = '\0';
+ return 0;
+ }
+ else if (value == 0)
+ {
+ FREE (_rl_emacs_mode_str);
+ _rl_emacs_mode_str = 0; /* prompt_modestr does the right thing */
+ _rl_emacs_modestr_len = 0;
+ return 0;
+ }
+ return 1;
+}
+
+static int
+sv_viins_modestr (const char *value)
+{
+ if (value && *value)
+ {
+ FREE (_rl_vi_ins_mode_str);
+ _rl_vi_ins_mode_str = (char *)xmalloc (2 * strlen (value) + 1);
+ rl_translate_keyseq (value, _rl_vi_ins_mode_str, &_rl_vi_ins_modestr_len);
+ _rl_vi_ins_mode_str[_rl_vi_ins_modestr_len] = '\0';
+ return 0;
+ }
+ else if (value)
+ {
+ FREE (_rl_vi_ins_mode_str);
+ _rl_vi_ins_mode_str = (char *)xmalloc (1);
+ _rl_vi_ins_mode_str[_rl_vi_ins_modestr_len = 0] = '\0';
+ return 0;
+ }
+ else if (value == 0)
+ {
+ FREE (_rl_vi_ins_mode_str);
+ _rl_vi_ins_mode_str = 0; /* prompt_modestr does the right thing */
+ _rl_vi_ins_modestr_len = 0;
+ return 0;
+ }
+ return 1;
+}
+
+static int
+sv_vicmd_modestr (const char *value)
+{
+ if (value && *value)
+ {
+ FREE (_rl_vi_cmd_mode_str);
+ _rl_vi_cmd_mode_str = (char *)xmalloc (2 * strlen (value) + 1);
+ rl_translate_keyseq (value, _rl_vi_cmd_mode_str, &_rl_vi_cmd_modestr_len);
+ _rl_vi_cmd_mode_str[_rl_vi_cmd_modestr_len] = '\0';
+ return 0;
+ }
+ else if (value)
+ {
+ FREE (_rl_vi_cmd_mode_str);
+ _rl_vi_cmd_mode_str = (char *)xmalloc (1);
+ _rl_vi_cmd_mode_str[_rl_vi_cmd_modestr_len = 0] = '\0';
+ return 0;
+ }
+ else if (value == 0)
+ {
+ FREE (_rl_vi_cmd_mode_str);
+ _rl_vi_cmd_mode_str = 0; /* prompt_modestr does the right thing */
+ _rl_vi_cmd_modestr_len = 0;
+ return 0;
+ }
+ return 1;
+}
+
+/* Return the character which matches NAME.
+ For example, `Space' returns ' '. */
+
+typedef struct {
+ const char * const name;
+ int value;
+} assoc_list;
+
+static const assoc_list name_key_alist[] = {
+ { "DEL", 0x7f },
+ { "ESC", '\033' },
+ { "Escape", '\033' },
+ { "LFD", '\n' },
+ { "Newline", '\n' },
+ { "RET", '\r' },
+ { "Return", '\r' },
+ { "Rubout", 0x7f },
+ { "SPC", ' ' },
+ { "Space", ' ' },
+ { "Tab", 0x09 },
+ { (char *)0x0, 0 }
+};
+
+static int
+glean_key_from_name (char *name)
+{
+ register int i;
+
+ for (i = 0; name_key_alist[i].name; i++)
+ if (_rl_stricmp (name, name_key_alist[i].name) == 0)
+ return (name_key_alist[i].value);
+
+ return (*(unsigned char *)name); /* XXX was return (*name) */
+}
+
+/* Auxiliary functions to manage keymaps. */
+struct name_and_keymap {
+ char *name;
+ Keymap map;
+};
+
+static struct name_and_keymap builtin_keymap_names[] = {
+ { "emacs", emacs_standard_keymap },
+ { "emacs-standard", emacs_standard_keymap },
+ { "emacs-meta", emacs_meta_keymap },
+ { "emacs-ctlx", emacs_ctlx_keymap },
+#if defined (VI_MODE)
+ { "vi", vi_movement_keymap },
+ { "vi-move", vi_movement_keymap },
+ { "vi-command", vi_movement_keymap },
+ { "vi-insert", vi_insertion_keymap },
+#endif /* VI_MODE */
+ { (char *)0x0, (Keymap)0x0 }
+};
+
+/* -1 for NULL entry */
+#define NUM_BUILTIN_KEYMAPS (sizeof (builtin_keymap_names) / sizeof (builtin_keymap_names[0]) - 1)
+
+static struct name_and_keymap *keymap_names = builtin_keymap_names;
+
+static int
+_rl_get_keymap_by_name (const char *name)
+{
+ register int i;
+
+ for (i = 0; keymap_names[i].name; i++)
+ if (_rl_stricmp (name, keymap_names[i].name) == 0)
+ return (i);
+ return -1;
+}
+
+Keymap
+rl_get_keymap_by_name (const char *name)
+{
+ int i;
+
+ i = _rl_get_keymap_by_name (name);
+ return ((i >= 0) ? keymap_names[i].map : (Keymap) NULL);
+}
+
+static int
+_rl_get_keymap_by_map (Keymap map)
+{
+ register int i;
+
+ for (i = 0; keymap_names[i].name; i++)
+ if (map == keymap_names[i].map)
+ return (i);
+ return -1;
+}
+
+char *
+rl_get_keymap_name (Keymap map)
+{
+ int i;
+
+ i = _rl_get_keymap_by_map (map);
+ return ((i >= 0) ? keymap_names[i].name : (char *)NULL);
+}
+
+int
+rl_set_keymap_name (const char *name, Keymap map)
+{
+ int i, ni, mi;
+
+ /* First check whether or not we're trying to rename a builtin keymap */
+ mi = _rl_get_keymap_by_map (map);
+ if (mi >= 0 && mi < NUM_BUILTIN_KEYMAPS)
+ return -1;
+
+ /* Then reject attempts to set one of the builtin names to a new map */
+ ni = _rl_get_keymap_by_name (name);
+ if (ni >= 0 && ni < NUM_BUILTIN_KEYMAPS)
+ return -1;
+
+ /* Renaming a keymap we already added */
+ if (mi >= 0) /* XXX - could be >= NUM_BUILTIN_KEYMAPS */
+ {
+ xfree (keymap_names[mi].name);
+ keymap_names[mi].name = savestring (name);
+ return mi;
+ }
+
+ /* Associating new keymap with existing name */
+ if (ni >= 0)
+ {
+ keymap_names[ni].map = map;
+ return ni;
+ }
+
+ for (i = 0; keymap_names[i].name; i++)
+ ;
+
+ if (keymap_names == builtin_keymap_names)
+ {
+ keymap_names = xmalloc ((i + 2) * sizeof (struct name_and_keymap));
+ memcpy (keymap_names, builtin_keymap_names, i * sizeof (struct name_and_keymap));
+ }
+ else
+ keymap_names = xrealloc (keymap_names, (i + 2) * sizeof (struct name_and_keymap));
+
+ keymap_names[i].name = savestring (name);
+ keymap_names[i].map = map;
+
+ keymap_names[i+1].name = NULL;
+ keymap_names[i+1].map = NULL;
+
+ return i;
+}
+
+void
+rl_set_keymap (Keymap map)
+{
+ if (map)
+ _rl_keymap = map;
+}
+
+Keymap
+rl_get_keymap (void)
+{
+ return (_rl_keymap);
+}
+
+void
+rl_set_keymap_from_edit_mode (void)
+{
+ if (rl_editing_mode == emacs_mode)
+ _rl_keymap = emacs_standard_keymap;
+#if defined (VI_MODE)
+ else if (rl_editing_mode == vi_mode)
+ _rl_keymap = vi_insertion_keymap;
+#endif /* VI_MODE */
+}
+
+char *
+rl_get_keymap_name_from_edit_mode (void)
+{
+ if (rl_editing_mode == emacs_mode)
+ return "emacs";
+#if defined (VI_MODE)
+ else if (rl_editing_mode == vi_mode)
+ return "vi";
+#endif /* VI_MODE */
+ else
+ return "none";
+}
+
+/* **************************************************************** */
+/* */
+/* Key Binding and Function Information */
+/* */
+/* **************************************************************** */
+
+/* Each of the following functions produces information about the
+ state of keybindings and functions known to Readline. The info
+ is always printed to rl_outstream, and in such a way that it can
+ be read back in (i.e., passed to rl_parse_and_bind ()). */
+
+/* Print the names of functions known to Readline. */
+void
+rl_list_funmap_names (void)
+{
+ register int i;
+ const char **funmap_names;
+
+ funmap_names = rl_funmap_names ();
+
+ if (!funmap_names)
+ return;
+
+ for (i = 0; funmap_names[i]; i++)
+ fprintf (rl_outstream, "%s\n", funmap_names[i]);
+
+ xfree (funmap_names);
+}
+
+static char *
+_rl_get_keyname (int key)
+{
+ char *keyname;
+ int i, c;
+
+ keyname = (char *)xmalloc (8);
+
+ c = key;
+ /* Since this is going to be used to write out keysequence-function
+ pairs for possible inclusion in an inputrc file, we don't want to
+ do any special meta processing on KEY. */
+
+#if 1
+ /* XXX - Experimental */
+ /* We might want to do this, but the old version of the code did not. */
+
+ /* If this is an escape character, we don't want to do any more processing.
+ Just add the special ESC key sequence and return. */
+ if (c == ESC)
+ {
+ keyname[0] = '\\';
+ keyname[1] = 'e';
+ keyname[2] = '\0';
+ return keyname;
+ }
+#endif
+
+ /* RUBOUT is translated directly into \C-? */
+ if (key == RUBOUT)
+ {
+ keyname[0] = '\\';
+ keyname[1] = 'C';
+ keyname[2] = '-';
+ keyname[3] = '?';
+ keyname[4] = '\0';
+ return keyname;
+ }
+
+ i = 0;
+ /* Now add special prefixes needed for control characters. This can
+ potentially change C. */
+ if (CTRL_CHAR (c))
+ {
+ keyname[i++] = '\\';
+ keyname[i++] = 'C';
+ keyname[i++] = '-';
+ c = _rl_to_lower (UNCTRL (c));
+ }
+
+ /* XXX experimental code. Turn the characters that are not ASCII or
+ ISO Latin 1 (128 - 159) into octal escape sequences (\200 - \237).
+ This changes C. */
+ if (c >= 128 && c <= 159)
+ {
+ keyname[i++] = '\\';
+ keyname[i++] = '2';
+ c -= 128;
+ keyname[i++] = (c / 8) + '0';
+ c = (c % 8) + '0';
+ }
+ /* These characters are valid UTF-8; convert them into octal escape
+ sequences as well. This changes C. */
+ else if (c >= 160)
+ {
+ keyname[i++] = '\\';
+ keyname[i++] = '0' + ((((unsigned char)c) >> 6) & 0x07);
+ keyname[i++] = '0' + ((((unsigned char)c) >> 3) & 0x07);
+ c = (c % 8) + '0';
+ }
+
+ /* Now, if the character needs to be quoted with a backslash, do that. */
+ if (c == '\\' || c == '"')
+ keyname[i++] = '\\';
+
+ /* Now add the key, terminate the string, and return it. */
+ keyname[i++] = (char) c;
+ keyname[i] = '\0';
+
+ return keyname;
+}
+
+/* Return a NULL terminated array of strings which represent the key
+ sequences that are used to invoke FUNCTION in MAP. */
+char **
+rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map)
+{
+ register int key;
+ char **result;
+ int result_index, result_size;
+
+ result = (char **)NULL;
+ result_index = result_size = 0;
+
+ for (key = 0; key < KEYMAP_SIZE; key++)
+ {
+ switch (map[key].type)
+ {
+ case ISMACR:
+ /* Macros match, if, and only if, the pointers are identical.
+ Thus, they are treated exactly like functions in here. */
+ case ISFUNC:
+ /* If the function in the keymap is the one we are looking for,
+ then add the current KEY to the list of invoking keys. */
+ if (map[key].function == function)
+ {
+ char *keyname;
+
+ keyname = _rl_get_keyname (key);
+
+ if (result_index + 2 > result_size)
+ {
+ result_size += 10;
+ result = (char **)xrealloc (result, result_size * sizeof (char *));
+ }
+
+ result[result_index++] = keyname;
+ result[result_index] = (char *)NULL;
+ }
+ break;
+
+ case ISKMAP:
+ {
+ char **seqs;
+ register int i;
+
+ /* Find the list of keyseqs in this map which have FUNCTION as
+ their target. Add the key sequences found to RESULT. */
+ if (map[key].function)
+ seqs =
+ rl_invoking_keyseqs_in_map (function, FUNCTION_TO_KEYMAP (map, key));
+ else
+ break;
+
+ if (seqs == 0)
+ break;
+
+ for (i = 0; seqs[i]; i++)
+ {
+ char *keyname = (char *)xmalloc (6 + strlen (seqs[i]));
+
+ if (key == ESC)
+ {
+ /* If ESC is the meta prefix and we're converting chars
+ with the eighth bit set to ESC-prefixed sequences, then
+ we can use \M-. Otherwise we need to use the sequence
+ for ESC. */
+ if (_rl_convert_meta_chars_to_ascii && map[ESC].type == ISKMAP)
+ sprintf (keyname, "\\M-");
+ else
+ sprintf (keyname, "\\e");
+ }
+ else
+ {
+ int c = key, l = 0;
+ if (CTRL_CHAR (c) || c == RUBOUT)
+ {
+ keyname[l++] = '\\';
+ keyname[l++] = 'C';
+ keyname[l++] = '-';
+ c = (c == RUBOUT) ? '?' : _rl_to_lower (UNCTRL (c));
+ }
+
+ if (c == '\\' || c == '"')
+ keyname[l++] = '\\';
+
+ keyname[l++] = (char) c;
+ keyname[l++] = '\0';
+ }
+
+ strcat (keyname, seqs[i]);
+ xfree (seqs[i]);
+
+ if (result_index + 2 > result_size)
+ {
+ result_size += 10;
+ result = (char **)xrealloc (result, result_size * sizeof (char *));
+ }
+
+ result[result_index++] = keyname;
+ result[result_index] = (char *)NULL;
+ }
+
+ xfree (seqs);
+ }
+ break;
+ }
+ }
+ return (result);
+}
+
+/* Return a NULL terminated array of strings which represent the key
+ sequences that can be used to invoke FUNCTION using the current keymap. */
+char **
+rl_invoking_keyseqs (rl_command_func_t *function)
+{
+ return (rl_invoking_keyseqs_in_map (function, _rl_keymap));
+}
+
+/* Print all of the functions and their bindings to rl_outstream. If
+ PRINT_READABLY is non-zero, then print the output in such a way
+ that it can be read back in. */
+void
+rl_function_dumper (int print_readably)
+{
+ register int i;
+ const char **names;
+ const char *name;
+
+ names = rl_funmap_names ();
+
+ fprintf (rl_outstream, "\n");
+
+ for (i = 0; name = names[i]; i++)
+ {
+ rl_command_func_t *function;
+ char **invokers;
+
+ function = rl_named_function (name);
+ invokers = rl_invoking_keyseqs_in_map (function, _rl_keymap);
+
+ if (print_readably)
+ {
+ if (!invokers)
+ fprintf (rl_outstream, "# %s (not bound)\n", name);
+ else
+ {
+ register int j;
+
+ for (j = 0; invokers[j]; j++)
+ {
+ fprintf (rl_outstream, "\"%s\": %s\n",
+ invokers[j], name);
+ xfree (invokers[j]);
+ }
+
+ xfree (invokers);
+ }
+ }
+ else
+ {
+ if (!invokers)
+ fprintf (rl_outstream, "%s is not bound to any keys\n",
+ name);
+ else
+ {
+ register int j;
+
+ fprintf (rl_outstream, "%s can be found on ", name);
+
+ for (j = 0; invokers[j] && j < 5; j++)
+ {
+ fprintf (rl_outstream, "\"%s\"%s", invokers[j],
+ invokers[j + 1] ? ", " : ".\n");
+ }
+
+ if (j == 5 && invokers[j])
+ fprintf (rl_outstream, "...\n");
+
+ for (j = 0; invokers[j]; j++)
+ xfree (invokers[j]);
+
+ xfree (invokers);
+ }
+ }
+ }
+
+ xfree (names);
+}
+
+/* Print all of the current functions and their bindings to
+ rl_outstream. If an explicit argument is given, then print
+ the output in such a way that it can be read back in. */
+int
+rl_dump_functions (int count, int key)
+{
+ if (rl_dispatching)
+ fprintf (rl_outstream, "\r\n");
+ rl_function_dumper (rl_explicit_arg);
+ rl_on_new_line ();
+ return (0);
+}
+
+static void
+_rl_macro_dumper_internal (int print_readably, Keymap map, char *prefix)
+{
+ register int key;
+ char *keyname, *out;
+ int prefix_len;
+
+ for (key = 0; key < KEYMAP_SIZE; key++)
+ {
+ switch (map[key].type)
+ {
+ case ISMACR:
+ keyname = _rl_get_keyname (key);
+ out = _rl_untranslate_macro_value ((char *)map[key].function, 0);
+
+ if (print_readably)
+ fprintf (rl_outstream, "\"%s%s\": \"%s\"\n", prefix ? prefix : "",
+ keyname,
+ out ? out : "");
+ else
+ fprintf (rl_outstream, "%s%s outputs %s\n", prefix ? prefix : "",
+ keyname,
+ out ? out : "");
+ xfree (keyname);
+ xfree (out);
+ break;
+ case ISFUNC:
+ break;
+ case ISKMAP:
+ prefix_len = prefix ? strlen (prefix) : 0;
+ if (key == ESC)
+ {
+ keyname = (char *)xmalloc (3 + prefix_len);
+ if (prefix)
+ strcpy (keyname, prefix);
+ keyname[prefix_len] = '\\';
+ keyname[prefix_len + 1] = 'e';
+ keyname[prefix_len + 2] = '\0';
+ }
+ else
+ {
+ keyname = _rl_get_keyname (key);
+ if (prefix)
+ {
+ out = (char *)xmalloc (strlen (keyname) + prefix_len + 1);
+ strcpy (out, prefix);
+ strcpy (out + prefix_len, keyname);
+ xfree (keyname);
+ keyname = out;
+ }
+ }
+
+ _rl_macro_dumper_internal (print_readably, FUNCTION_TO_KEYMAP (map, key), keyname);
+ xfree (keyname);
+ break;
+ }
+ }
+}
+
+void
+rl_macro_dumper (int print_readably)
+{
+ _rl_macro_dumper_internal (print_readably, _rl_keymap, (char *)NULL);
+}
+
+int
+rl_dump_macros (int count, int key)
+{
+ if (rl_dispatching)
+ fprintf (rl_outstream, "\r\n");
+ rl_macro_dumper (rl_explicit_arg);
+ rl_on_new_line ();
+ return (0);
+}
+
+static char *
+_rl_get_string_variable_value (const char *name)
+{
+ static char numbuf[32];
+ char *ret;
+
+ if (_rl_stricmp (name, "bell-style") == 0)
+ {
+ switch (_rl_bell_preference)
+ {
+ case NO_BELL:
+ return "none";
+ case VISIBLE_BELL:
+ return "visible";
+ case AUDIBLE_BELL:
+ default:
+ return "audible";
+ }
+ }
+ else if (_rl_stricmp (name, "comment-begin") == 0)
+ return (_rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT);
+ else if (_rl_stricmp (name, "completion-display-width") == 0)
+ {
+ sprintf (numbuf, "%d", _rl_completion_columns);
+ return (numbuf);
+ }
+ else if (_rl_stricmp (name, "completion-prefix-display-length") == 0)
+ {
+ sprintf (numbuf, "%d", _rl_completion_prefix_display_length);
+ return (numbuf);
+ }
+ else if (_rl_stricmp (name, "completion-query-items") == 0)
+ {
+ sprintf (numbuf, "%d", rl_completion_query_items);
+ return (numbuf);
+ }
+ else if (_rl_stricmp (name, "editing-mode") == 0)
+ return (rl_get_keymap_name_from_edit_mode ());
+ else if (_rl_stricmp (name, "history-size") == 0)
+ {
+ sprintf (numbuf, "%d", history_is_stifled() ? history_max_entries : 0);
+ return (numbuf);
+ }
+ else if (_rl_stricmp (name, "isearch-terminators") == 0)
+ {
+ if (_rl_isearch_terminators == 0)
+ return 0;
+ ret = _rl_untranslate_macro_value (_rl_isearch_terminators, 0);
+ if (ret)
+ {
+ strncpy (numbuf, ret, sizeof (numbuf) - 1);
+ xfree (ret);
+ numbuf[sizeof(numbuf) - 1] = '\0';
+ }
+ else
+ numbuf[0] = '\0';
+ return numbuf;
+ }
+ else if (_rl_stricmp (name, "keymap") == 0)
+ {
+ ret = rl_get_keymap_name (_rl_keymap);
+ if (ret == 0)
+ ret = rl_get_keymap_name_from_edit_mode ();
+ return (ret ? ret : "none");
+ }
+ else if (_rl_stricmp (name, "keyseq-timeout") == 0)
+ {
+ sprintf (numbuf, "%d", _rl_keyseq_timeout);
+ return (numbuf);
+ }
+ else if (_rl_stricmp (name, "emacs-mode-string") == 0)
+ return (_rl_emacs_mode_str ? _rl_emacs_mode_str : RL_EMACS_MODESTR_DEFAULT);
+ else if (_rl_stricmp (name, "vi-cmd-mode-string") == 0)
+ return (_rl_vi_cmd_mode_str ? _rl_vi_cmd_mode_str : RL_VI_CMD_MODESTR_DEFAULT);
+ else if (_rl_stricmp (name, "vi-ins-mode-string") == 0)
+ return (_rl_vi_ins_mode_str ? _rl_vi_ins_mode_str : RL_VI_INS_MODESTR_DEFAULT);
+ else
+ return (0);
+}
+
+void
+rl_variable_dumper (int print_readably)
+{
+ int i;
+ char *v;
+
+ for (i = 0; boolean_varlist[i].name; i++)
+ {
+ if (print_readably)
+ fprintf (rl_outstream, "set %s %s\n", boolean_varlist[i].name,
+ *boolean_varlist[i].value ? "on" : "off");
+ else
+ fprintf (rl_outstream, "%s is set to `%s'\n", boolean_varlist[i].name,
+ *boolean_varlist[i].value ? "on" : "off");
+ }
+
+ for (i = 0; string_varlist[i].name; i++)
+ {
+ v = _rl_get_string_variable_value (string_varlist[i].name);
+ if (v == 0) /* _rl_isearch_terminators can be NULL */
+ continue;
+ if (print_readably)
+ fprintf (rl_outstream, "set %s %s\n", string_varlist[i].name, v);
+ else
+ fprintf (rl_outstream, "%s is set to `%s'\n", string_varlist[i].name, v);
+ }
+}
+
+/* Print all of the current variables and their values to
+ rl_outstream. If an explicit argument is given, then print
+ the output in such a way that it can be read back in. */
+int
+rl_dump_variables (int count, int key)
+{
+ if (rl_dispatching)
+ fprintf (rl_outstream, "\r\n");
+ rl_variable_dumper (rl_explicit_arg);
+ rl_on_new_line ();
+ return (0);
+}
+
+/* Return non-zero if any members of ARRAY are a substring in STRING. */
+static int
+substring_member_of_array (const char *string, const char * const *array)
+{
+ while (*array)
+ {
+ if (_rl_strindex (string, *array))
+ return (1);
+ array++;
+ }
+ return (0);
+}
diff --git a/callback.c b/callback.c
new file mode 100644
index 0000000..69df77d
--- /dev/null
+++ b/callback.c
@@ -0,0 +1,378 @@
+/* callback.c -- functions to use readline as an X `callback' mechanism. */
+
+/* Copyright (C) 1987-2022 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include "rlconf.h"
+
+#if defined (READLINE_CALLBACKS)
+
+#include <sys/types.h>
+
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "readline.h"
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+/* Private data for callback registration functions. See comments in
+ rl_callback_read_char for more details. */
+_rl_callback_func_t *_rl_callback_func = 0;
+_rl_callback_generic_arg *_rl_callback_data = 0;
+
+/* Applications can set this to non-zero to have readline's signal handlers
+ installed during the entire duration of reading a complete line, as in
+ readline-6.2. This should be used with care, because it can result in
+ readline receiving signals and not handling them until it's called again
+ via rl_callback_read_char, thereby stealing them from the application.
+ By default, signal handlers are only active while readline is active. */
+int rl_persistent_signal_handlers = 0;
+
+/* **************************************************************** */
+/* */
+/* Callback Readline Functions */
+/* */
+/* **************************************************************** */
+
+/* Allow using readline in situations where a program may have multiple
+ things to handle at once, and dispatches them via select(). Call
+ rl_callback_handler_install() with the prompt and a function to call
+ whenever a complete line of input is ready. The user must then
+ call rl_callback_read_char() every time some input is available, and
+ rl_callback_read_char() will call the user's function with the complete
+ text read in at each end of line. The terminal is kept prepped
+ all the time, except during calls to the user's function. Signal
+ handlers are only installed when the application calls back into
+ readline, so readline doesn't `steal' signals from the application. */
+
+rl_vcpfunc_t *rl_linefunc; /* user callback function */
+static int in_handler; /* terminal_prepped and signals set? */
+
+/* Make sure the terminal is set up, initialize readline, and prompt. */
+static void
+_rl_callback_newline (void)
+{
+ rl_initialize ();
+
+ if (in_handler == 0)
+ {
+ in_handler = 1;
+
+ if (rl_prep_term_function)
+ (*rl_prep_term_function) (_rl_meta_flag);
+
+#if defined (HANDLE_SIGNALS)
+ if (rl_persistent_signal_handlers)
+ rl_set_signals ();
+#endif
+ }
+
+ readline_internal_setup ();
+ RL_CHECK_SIGNALS ();
+}
+
+/* Install a readline handler, set up the terminal, and issue the prompt. */
+void
+rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *linefunc)
+{
+ rl_set_prompt (prompt);
+ RL_SETSTATE (RL_STATE_CALLBACK);
+ rl_linefunc = linefunc;
+ _rl_callback_newline ();
+}
+
+#if defined (HANDLE_SIGNALS)
+#define CALLBACK_READ_RETURN() \
+ do { \
+ if (rl_persistent_signal_handlers == 0) \
+ rl_clear_signals (); \
+ return; \
+ } while (0)
+#else
+#define CALLBACK_READ_RETURN() return
+#endif
+
+/* Read one character, and dispatch to the handler if it ends the line. */
+void
+rl_callback_read_char (void)
+{
+ char *line;
+ int eof, jcode;
+ static procenv_t olevel;
+
+ if (rl_linefunc == NULL)
+ {
+ _rl_errmsg ("readline_callback_read_char() called with no handler!");
+ abort ();
+ }
+
+ eof = 0;
+
+ memcpy ((void *)olevel, (void *)_rl_top_level, sizeof (procenv_t));
+#if defined (HAVE_POSIX_SIGSETJMP)
+ jcode = sigsetjmp (_rl_top_level, 0);
+#else
+ jcode = setjmp (_rl_top_level);
+#endif
+ if (jcode)
+ {
+ (*rl_redisplay_function) ();
+ _rl_want_redisplay = 0;
+ memcpy ((void *)_rl_top_level, (void *)olevel, sizeof (procenv_t));
+
+ /* If we longjmped because of a timeout, handle it here. */
+ if (RL_ISSTATE (RL_STATE_TIMEOUT))
+ {
+ RL_SETSTATE (RL_STATE_DONE);
+ rl_done = 1;
+ }
+
+ CALLBACK_READ_RETURN ();
+ }
+
+#if defined (HANDLE_SIGNALS)
+ /* Install signal handlers only when readline has control. */
+ if (rl_persistent_signal_handlers == 0)
+ rl_set_signals ();
+#endif
+
+ do
+ {
+ RL_CHECK_SIGNALS ();
+ if (RL_ISSTATE (RL_STATE_ISEARCH))
+ {
+ eof = _rl_isearch_callback (_rl_iscxt);
+ if (eof == 0 && (RL_ISSTATE (RL_STATE_ISEARCH) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING))
+ rl_callback_read_char ();
+
+ CALLBACK_READ_RETURN ();
+ }
+ else if (RL_ISSTATE (RL_STATE_NSEARCH))
+ {
+ eof = _rl_nsearch_callback (_rl_nscxt);
+
+ CALLBACK_READ_RETURN ();
+ }
+#if defined (VI_MODE)
+ /* States that can occur while in state VIMOTION have to be checked
+ before RL_STATE_VIMOTION */
+ else if (RL_ISSTATE (RL_STATE_CHARSEARCH))
+ {
+ int k;
+
+ k = _rl_callback_data->i2;
+
+ eof = (*_rl_callback_func) (_rl_callback_data);
+ /* If the function `deregisters' itself, make sure the data is
+ cleaned up. */
+ if (_rl_callback_func == 0) /* XXX - just sanity check */
+ {
+ if (_rl_callback_data)
+ {
+ _rl_callback_data_dispose (_rl_callback_data);
+ _rl_callback_data = 0;
+ }
+ }
+
+ /* Messy case where vi motion command can be char search */
+ if (RL_ISSTATE (RL_STATE_VIMOTION))
+ {
+ _rl_vi_domove_motion_cleanup (k, _rl_vimvcxt);
+ _rl_internal_char_cleanup ();
+ CALLBACK_READ_RETURN ();
+ }
+
+ _rl_internal_char_cleanup ();
+ }
+ else if (RL_ISSTATE (RL_STATE_VIMOTION))
+ {
+ eof = _rl_vi_domove_callback (_rl_vimvcxt);
+ /* Should handle everything, including cleanup, numeric arguments,
+ and turning off RL_STATE_VIMOTION */
+ if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)
+ _rl_internal_char_cleanup ();
+
+ CALLBACK_READ_RETURN ();
+ }
+#endif
+ else if (RL_ISSTATE (RL_STATE_NUMERICARG))
+ {
+ eof = _rl_arg_callback (_rl_argcxt);
+ if (eof == 0 && (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING))
+ rl_callback_read_char ();
+ /* XXX - this should handle _rl_last_command_was_kill better */
+ else if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)
+ _rl_internal_char_cleanup ();
+
+ CALLBACK_READ_RETURN ();
+ }
+ else if (RL_ISSTATE (RL_STATE_MULTIKEY))
+ {
+ eof = _rl_dispatch_callback (_rl_kscxt); /* For now */
+ while ((eof == -1 || eof == -2) && RL_ISSTATE (RL_STATE_MULTIKEY) && _rl_kscxt && (_rl_kscxt->flags & KSEQ_DISPATCHED))
+ eof = _rl_dispatch_callback (_rl_kscxt);
+ if (RL_ISSTATE (RL_STATE_MULTIKEY) == 0)
+ {
+ _rl_internal_char_cleanup ();
+ _rl_want_redisplay = 1;
+ }
+ }
+ else if (_rl_callback_func)
+ {
+ /* This allows functions that simply need to read an additional
+ character (like quoted-insert) to register a function to be
+ called when input is available. _rl_callback_data is a
+ pointer to a struct that has the argument count originally
+ passed to the registering function and space for any additional
+ parameters. */
+ eof = (*_rl_callback_func) (_rl_callback_data);
+ /* If the function `deregisters' itself, make sure the data is
+ cleaned up. */
+ if (_rl_callback_func == 0)
+ {
+ if (_rl_callback_data)
+ {
+ _rl_callback_data_dispose (_rl_callback_data);
+ _rl_callback_data = 0;
+ }
+ _rl_internal_char_cleanup ();
+ }
+ }
+ else
+ eof = readline_internal_char ();
+
+ RL_CHECK_SIGNALS ();
+ if (rl_done == 0 && _rl_want_redisplay)
+ {
+ (*rl_redisplay_function) ();
+ _rl_want_redisplay = 0;
+ }
+
+ /* Make sure application hooks can see whether we saw EOF. */
+ if (eof > 0)
+ {
+ rl_eof_found = eof;
+ RL_SETSTATE(RL_STATE_EOF);
+ }
+
+ if (rl_done)
+ {
+ line = readline_internal_teardown (eof);
+
+ if (rl_deprep_term_function)
+ (*rl_deprep_term_function) ();
+#if defined (HANDLE_SIGNALS)
+ rl_clear_signals ();
+#endif
+ in_handler = 0;
+ if (rl_linefunc) /* just in case */
+ (*rl_linefunc) (line);
+
+ /* If the user did not clear out the line, do it for him. */
+ if (rl_line_buffer[0])
+ _rl_init_line_state ();
+
+ /* Redisplay the prompt if readline_handler_{install,remove}
+ not called. */
+ if (in_handler == 0 && rl_linefunc)
+ _rl_callback_newline ();
+ }
+ }
+ while (rl_pending_input || _rl_pushed_input_available () || RL_ISSTATE (RL_STATE_MACROINPUT));
+
+ CALLBACK_READ_RETURN ();
+}
+
+/* Remove the handler, and make sure the terminal is in its normal state. */
+void
+rl_callback_handler_remove (void)
+{
+ rl_linefunc = NULL;
+ RL_UNSETSTATE (RL_STATE_CALLBACK);
+ RL_CHECK_SIGNALS ();
+ if (in_handler)
+ {
+ in_handler = 0;
+ if (rl_deprep_term_function)
+ (*rl_deprep_term_function) ();
+#if defined (HANDLE_SIGNALS)
+ rl_clear_signals ();
+#endif
+ }
+}
+
+_rl_callback_generic_arg *
+_rl_callback_data_alloc (int count)
+{
+ _rl_callback_generic_arg *arg;
+
+ arg = (_rl_callback_generic_arg *)xmalloc (sizeof (_rl_callback_generic_arg));
+ arg->count = count;
+
+ arg->i1 = arg->i2 = 0;
+
+ return arg;
+}
+
+void
+_rl_callback_data_dispose (_rl_callback_generic_arg *arg)
+{
+ xfree (arg);
+}
+
+/* Make sure that this agrees with cases in rl_callback_read_char */
+void
+rl_callback_sigcleanup (void)
+{
+ if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
+ return;
+
+ if (RL_ISSTATE (RL_STATE_ISEARCH))
+ _rl_isearch_cleanup (_rl_iscxt, 0);
+ else if (RL_ISSTATE (RL_STATE_NSEARCH))
+ _rl_nsearch_cleanup (_rl_nscxt, 0);
+ else if (RL_ISSTATE (RL_STATE_VIMOTION))
+ RL_UNSETSTATE (RL_STATE_VIMOTION);
+ else if (RL_ISSTATE (RL_STATE_NUMERICARG))
+ {
+ _rl_argcxt = 0;
+ RL_UNSETSTATE (RL_STATE_NUMERICARG);
+ }
+ else if (RL_ISSTATE (RL_STATE_MULTIKEY))
+ RL_UNSETSTATE (RL_STATE_MULTIKEY);
+ if (RL_ISSTATE (RL_STATE_CHARSEARCH))
+ RL_UNSETSTATE (RL_STATE_CHARSEARCH);
+
+ _rl_callback_func = 0;
+}
+#endif
diff --git a/chardefs.h b/chardefs.h
new file mode 100644
index 0000000..24a25f1
--- /dev/null
+++ b/chardefs.h
@@ -0,0 +1,165 @@
+/* chardefs.h -- Character definitions for readline. */
+
+/* Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _CHARDEFS_H_
+#define _CHARDEFS_H_
+
+#include <ctype.h>
+
+#if defined (HAVE_CONFIG_H)
+# if defined (HAVE_STRING_H)
+# include <string.h>
+# endif /* HAVE_STRING_H */
+# if defined (HAVE_STRINGS_H)
+# include <strings.h>
+# endif /* HAVE_STRINGS_H */
+#else
+# include <string.h>
+#endif /* !HAVE_CONFIG_H */
+
+#ifndef whitespace
+#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
+#endif
+
+#ifdef CTRL
+# undef CTRL
+#endif
+#ifdef UNCTRL
+# undef UNCTRL
+#endif
+
+/* Some character stuff. */
+#define control_character_threshold 0x020 /* Smaller than this is control. */
+#define control_character_mask 0x1f /* 0x20 - 1 */
+#define meta_character_threshold 0x07f /* Larger than this is Meta. */
+#define control_character_bit 0x40 /* 0x000000, must be off. */
+#define meta_character_bit 0x080 /* x0000000, must be on. */
+#define largest_char 255 /* Largest character value. */
+
+#define CTRL_CHAR(c) ((c) < control_character_threshold && (((c) & 0x80) == 0))
+#define META_CHAR(c) ((c) > meta_character_threshold && (c) <= largest_char)
+
+#define CTRL(c) ((c) & control_character_mask)
+#define META(c) ((c) | meta_character_bit)
+
+#define UNMETA(c) ((c) & (~meta_character_bit))
+#define UNCTRL(c) _rl_to_upper(((c)|control_character_bit))
+
+#ifndef UCHAR_MAX
+# define UCHAR_MAX 255
+#endif
+#ifndef CHAR_MAX
+# define CHAR_MAX 127
+#endif
+
+/* use this as a proxy for C89 */
+#if defined (HAVE_STDLIB_H) && defined (HAVE_STRING_H)
+# define IN_CTYPE_DOMAIN(c) 1
+# define NON_NEGATIVE(c) 1
+#else
+# define IN_CTYPE_DOMAIN(c) ((c) >= 0 && (c) <= CHAR_MAX)
+# define NON_NEGATIVE(c) ((unsigned char)(c) == (c))
+#endif
+
+#if !defined (isxdigit) && !defined (HAVE_ISXDIGIT) && !defined (__cplusplus)
+# define isxdigit(c) (isdigit((unsigned char)(c)) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+#endif
+
+/* Some systems define these; we want our definitions. */
+#undef ISPRINT
+
+/* Beware: these only work with single-byte ASCII characters. */
+
+#define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum ((unsigned char)c))
+#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha ((unsigned char)c))
+#define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit ((unsigned char)c))
+#define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower ((unsigned char)c))
+#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint ((unsigned char)c))
+#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper ((unsigned char)c))
+#define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit ((unsigned char)c))
+
+#define _rl_lowercase_p(c) (NON_NEGATIVE(c) && ISLOWER(c))
+#define _rl_uppercase_p(c) (NON_NEGATIVE(c) && ISUPPER(c))
+#define _rl_digit_p(c) ((c) >= '0' && (c) <= '9')
+
+#define _rl_alphabetic_p(c) (NON_NEGATIVE(c) && ISALNUM(c))
+#define _rl_pure_alphabetic(c) (NON_NEGATIVE(c) && ISALPHA(c))
+
+#ifndef _rl_to_upper
+# define _rl_to_upper(c) (_rl_lowercase_p(c) ? toupper((unsigned char)(c)) : (c))
+# define _rl_to_lower(c) (_rl_uppercase_p(c) ? tolower((unsigned char)(c)) : (c))
+#endif
+
+#ifndef _rl_digit_value
+# define _rl_digit_value(x) ((x) - '0')
+#endif
+
+#ifndef _rl_isident
+# define _rl_isident(c) (ISALNUM(c) || (c) == '_')
+#endif
+
+#ifndef ISOCTAL
+# define ISOCTAL(c) ((c) >= '0' && (c) <= '7')
+#endif
+#define OCTVALUE(c) ((c) - '0')
+
+#define HEXVALUE(c) \
+ (((c) >= 'a' && (c) <= 'f') \
+ ? (c)-'a'+10 \
+ : (c) >= 'A' && (c) <= 'F' ? (c)-'A'+10 : (c)-'0')
+
+#ifndef NEWLINE
+#define NEWLINE '\n'
+#endif
+
+#ifndef RETURN
+#define RETURN CTRL('M')
+#endif
+
+#ifndef RUBOUT
+#define RUBOUT 0x7f
+#endif
+
+#ifndef TAB
+#define TAB '\t'
+#endif
+
+#ifdef ABORT_CHAR
+#undef ABORT_CHAR
+#endif
+#define ABORT_CHAR CTRL('G')
+
+#ifdef PAGE
+#undef PAGE
+#endif
+#define PAGE CTRL('L')
+
+#ifdef SPACE
+#undef SPACE
+#endif
+#define SPACE ' ' /* XXX - was 0x20 */
+
+#ifdef ESC
+#undef ESC
+#endif
+#define ESC CTRL('[')
+
+#endif /* _CHARDEFS_H_ */
diff --git a/colors.c b/colors.c
new file mode 100644
index 0000000..dba81a2
--- /dev/null
+++ b/colors.c
@@ -0,0 +1,320 @@
+/* `dir', `vdir' and `ls' directory listing programs for GNU.
+
+ Modified by Chet Ramey for Readline.
+
+ Copyright (C) 1985, 1988, 1990-1991, 1995-2021
+ Free Software Foundation, Inc.
+
+ 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/>. */
+
+/* Written by Richard Stallman and David MacKenzie. */
+
+/* Color support by Peter Anvin <Peter.Anvin@linux.org> and Dennis
+ Flaherty <dennisf@denix.elk.miles.com> based on original patches by
+ Greg Lee <lee@uhunix.uhcc.hawaii.edu>. */
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include "rlconf.h"
+
+#if defined __TANDEM
+# define _XOPEN_SOURCE_EXTENDED 1
+# define _TANDEM_SOURCE 1
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif
+
+#include <stdio.h>
+
+#include "posixstat.h" // stat related macros (S_ISREG, ...)
+#include <fcntl.h> // S_ISUID
+
+#ifndef S_ISDIR
+# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+#endif
+
+// strlen()
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else /* !HAVE_STRING_H */
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+// abort()
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include "readline.h"
+#include "rldefs.h"
+
+#ifdef COLOR_SUPPORT
+
+#include "xmalloc.h"
+#include "colors.h"
+
+static bool is_colored (enum indicator_no type);
+static void restore_default_color (void);
+
+#define RL_COLOR_PREFIX_EXTENSION "readline-colored-completion-prefix"
+
+COLOR_EXT_TYPE *_rl_color_ext_list = 0;
+
+/* Output a color indicator (which may contain nulls). */
+void
+_rl_put_indicator (const struct bin_str *ind)
+{
+ fwrite (ind->string, ind->len, 1, rl_outstream);
+}
+
+static bool
+is_colored (enum indicator_no colored_filetype)
+{
+ size_t len = _rl_color_indicator[colored_filetype].len;
+ char const *s = _rl_color_indicator[colored_filetype].string;
+ return ! (len == 0
+ || (len == 1 && strncmp (s, "0", 1) == 0)
+ || (len == 2 && strncmp (s, "00", 2) == 0));
+}
+
+static void
+restore_default_color (void)
+{
+ _rl_put_indicator (&_rl_color_indicator[C_LEFT]);
+ _rl_put_indicator (&_rl_color_indicator[C_RIGHT]);
+}
+
+void
+_rl_set_normal_color (void)
+{
+ if (is_colored (C_NORM))
+ {
+ _rl_put_indicator (&_rl_color_indicator[C_LEFT]);
+ _rl_put_indicator (&_rl_color_indicator[C_NORM]);
+ _rl_put_indicator (&_rl_color_indicator[C_RIGHT]);
+ }
+}
+
+static struct bin_str *
+_rl_custom_readline_prefix (void)
+{
+ size_t len;
+ COLOR_EXT_TYPE *ext;
+
+ len = strlen (RL_COLOR_PREFIX_EXTENSION);
+ for (ext = _rl_color_ext_list; ext; ext = ext->next)
+ if (ext->ext.len == len && STREQN (ext->ext.string, RL_COLOR_PREFIX_EXTENSION, len))
+ return (&ext->seq);
+ return (NULL);
+}
+
+bool
+_rl_print_prefix_color (void)
+{
+ struct bin_str *s;
+
+ /* What do we want to use for the prefix? Let's try cyan first, see colors.h */
+ s = _rl_custom_readline_prefix ();
+ if (s == 0)
+ s = &_rl_color_indicator[C_PREFIX];
+ if (s->string != NULL)
+ {
+ if (is_colored (C_NORM))
+ restore_default_color ();
+ _rl_put_indicator (&_rl_color_indicator[C_LEFT]);
+ _rl_put_indicator (s);
+ _rl_put_indicator (&_rl_color_indicator[C_RIGHT]);
+ return 0;
+ }
+ else
+ return 1;
+}
+
+/* Returns whether any color sequence was printed. */
+bool
+_rl_print_color_indicator (const char *f)
+{
+ enum indicator_no colored_filetype;
+ COLOR_EXT_TYPE *ext; /* Color extension */
+ size_t len; /* Length of name */
+
+ const char* name;
+ char *filename;
+ struct stat astat, linkstat;
+ mode_t mode;
+ int linkok; /* 1 == ok, 0 == dangling symlink, -1 == missing */
+ int stat_ok;
+
+ name = f;
+
+ /* This should already have undergone tilde expansion */
+ filename = 0;
+ if (rl_filename_stat_hook)
+ {
+ filename = savestring (f);
+ (*rl_filename_stat_hook) (&filename);
+ name = filename;
+ }
+
+#if defined (HAVE_LSTAT)
+ stat_ok = lstat(name, &astat);
+#else
+ stat_ok = stat(name, &astat);
+#endif
+ if (stat_ok == 0)
+ {
+ mode = astat.st_mode;
+#if defined (HAVE_LSTAT)
+ if (S_ISLNK (mode))
+ {
+ linkok = stat (name, &linkstat) == 0;
+ if (linkok && strncmp (_rl_color_indicator[C_LINK].string, "target", 6) == 0)
+ mode = linkstat.st_mode;
+ }
+ else
+#endif
+ linkok = 1;
+ }
+ else
+ linkok = -1;
+
+ /* Is this a nonexistent file? If so, linkok == -1. */
+
+ if (linkok == -1 && _rl_color_indicator[C_MISSING].string != NULL)
+ colored_filetype = C_MISSING;
+ else if (linkok == 0 && _rl_color_indicator[C_ORPHAN].string != NULL)
+ colored_filetype = C_ORPHAN; /* dangling symlink */
+ else if(stat_ok != 0)
+ {
+ static enum indicator_no filetype_indicator[] = FILETYPE_INDICATORS;
+ colored_filetype = filetype_indicator[normal]; //f->filetype];
+ }
+ else
+ {
+ if (S_ISREG (mode))
+ {
+ colored_filetype = C_FILE;
+
+#if defined (S_ISUID)
+ if ((mode & S_ISUID) != 0 && is_colored (C_SETUID))
+ colored_filetype = C_SETUID;
+ else
+#endif
+#if defined (S_ISGID)
+ if ((mode & S_ISGID) != 0 && is_colored (C_SETGID))
+ colored_filetype = C_SETGID;
+ else
+#endif
+ if (is_colored (C_CAP) && 0) //f->has_capability)
+ colored_filetype = C_CAP;
+ else if ((mode & S_IXUGO) != 0 && is_colored (C_EXEC))
+ colored_filetype = C_EXEC;
+ else if ((1 < astat.st_nlink) && is_colored (C_MULTIHARDLINK))
+ colored_filetype = C_MULTIHARDLINK;
+ }
+ else if (S_ISDIR (mode))
+ {
+ colored_filetype = C_DIR;
+
+#if defined (S_ISVTX)
+ if ((mode & S_ISVTX) && (mode & S_IWOTH)
+ && is_colored (C_STICKY_OTHER_WRITABLE))
+ colored_filetype = C_STICKY_OTHER_WRITABLE;
+ else
+#endif
+ if ((mode & S_IWOTH) != 0 && is_colored (C_OTHER_WRITABLE))
+ colored_filetype = C_OTHER_WRITABLE;
+#if defined (S_ISVTX)
+ else if ((mode & S_ISVTX) != 0 && is_colored (C_STICKY))
+ colored_filetype = C_STICKY;
+#endif
+ }
+#if defined (S_ISLNK)
+ else if (S_ISLNK (mode))
+ colored_filetype = C_LINK;
+#endif
+ else if (S_ISFIFO (mode))
+ colored_filetype = C_FIFO;
+#if defined (S_ISSOCK)
+ else if (S_ISSOCK (mode))
+ colored_filetype = C_SOCK;
+#endif
+#if defined (S_ISBLK)
+ else if (S_ISBLK (mode))
+ colored_filetype = C_BLK;
+#endif
+ else if (S_ISCHR (mode))
+ colored_filetype = C_CHR;
+ else
+ {
+ /* Classify a file of some other type as C_ORPHAN. */
+ colored_filetype = C_ORPHAN;
+ }
+ }
+
+ /* Check the file's suffix only if still classified as C_FILE. */
+ ext = NULL;
+ if (colored_filetype == C_FILE)
+ {
+ /* Test if NAME has a recognized suffix. */
+ len = strlen (name);
+ name += len; /* Pointer to final \0. */
+ for (ext = _rl_color_ext_list; ext != NULL; ext = ext->next)
+ {
+ if (ext->ext.len <= len
+ && strncmp (name - ext->ext.len, ext->ext.string,
+ ext->ext.len) == 0)
+ break;
+ }
+ }
+
+ free (filename); /* NULL or savestring return value */
+
+ {
+ const struct bin_str *const s
+ = ext ? &(ext->seq) : &_rl_color_indicator[colored_filetype];
+ if (s->string != NULL)
+ {
+ /* Need to reset so not dealing with attribute combinations */
+ if (is_colored (C_NORM))
+ restore_default_color ();
+ _rl_put_indicator (&_rl_color_indicator[C_LEFT]);
+ _rl_put_indicator (s);
+ _rl_put_indicator (&_rl_color_indicator[C_RIGHT]);
+ return 0;
+ }
+ else
+ return 1;
+ }
+}
+
+void
+_rl_prep_non_filename_text (void)
+{
+ if (_rl_color_indicator[C_END].string != NULL)
+ _rl_put_indicator (&_rl_color_indicator[C_END]);
+ else
+ {
+ _rl_put_indicator (&_rl_color_indicator[C_LEFT]);
+ _rl_put_indicator (&_rl_color_indicator[C_RESET]);
+ _rl_put_indicator (&_rl_color_indicator[C_RIGHT]);
+ }
+}
+#endif /* COLOR_SUPPORT */
diff --git a/colors.h b/colors.h
new file mode 100644
index 0000000..6561ad9
--- /dev/null
+++ b/colors.h
@@ -0,0 +1,126 @@
+/* `dir', `vdir' and `ls' directory listing programs for GNU.
+
+ Modified by Chet Ramey for Readline.
+
+ Copyright (C) 1985, 1988, 1990-1991, 1995-2010, 2012, 2015
+ Free Software Foundation, Inc.
+
+ 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/>. */
+
+/* Written by Richard Stallman and David MacKenzie. */
+
+/* Color support by Peter Anvin <Peter.Anvin@linux.org> and Dennis
+ Flaherty <dennisf@denix.elk.miles.com> based on original patches by
+ Greg Lee <lee@uhunix.uhcc.hawaii.edu>. */
+
+#ifndef _COLORS_H_
+#define _COLORS_H_
+
+#include <stdio.h> // size_t
+
+#if defined(__TANDEM) && defined(HAVE_STDBOOL_H) && (__STDC_VERSION__ < 199901L)
+typedef int _Bool;
+#endif
+
+#if defined (HAVE_STDBOOL_H)
+# include <stdbool.h> // bool
+#else
+typedef int _rl_bool_t;
+
+#ifdef bool
+# undef bool
+#endif
+#define bool _rl_bool_t
+
+#ifndef true
+# define true 1
+# define false 0
+#endif
+
+#endif /* !HAVE_STDBOOL_H */
+
+/* Null is a valid character in a color indicator (think about Epson
+ printers, for example) so we have to use a length/buffer string
+ type. */
+struct bin_str
+ {
+ size_t len;
+ const char *string;
+ };
+
+/* file type indicators (dir, sock, fifo, ...)
+ Default value is initialized in parse-colors.c.
+ It is then modified from the values of $LS_COLORS. */
+extern struct bin_str _rl_color_indicator[];
+
+/* The LS_COLORS variable is in a termcap-like format. */
+typedef struct _color_ext_type
+ {
+ struct bin_str ext; /* The extension we're looking for */
+ struct bin_str seq; /* The sequence to output when we do */
+ struct _color_ext_type *next; /* Next in list */
+ } COLOR_EXT_TYPE;
+
+/* file extensions indicators (.txt, .log, .jpg, ...)
+ Values are taken from $LS_COLORS in rl_parse_colors(). */
+extern COLOR_EXT_TYPE *_rl_color_ext_list;
+
+#define FILETYPE_INDICATORS \
+ { \
+ C_ORPHAN, C_FIFO, C_CHR, C_DIR, C_BLK, C_FILE, \
+ C_LINK, C_SOCK, C_FILE, C_DIR \
+ }
+
+/* Whether we used any colors in the output so far. If so, we will
+ need to restore the default color later. If not, we will need to
+ call prep_non_filename_text before using color for the first time. */
+
+enum indicator_no
+ {
+ C_LEFT, C_RIGHT, C_END, C_RESET, C_NORM, C_FILE, C_DIR, C_LINK,
+ C_FIFO, C_SOCK,
+ C_BLK, C_CHR, C_MISSING, C_ORPHAN, C_EXEC, C_DOOR, C_SETUID, C_SETGID,
+ C_STICKY, C_OTHER_WRITABLE, C_STICKY_OTHER_WRITABLE, C_CAP, C_MULTIHARDLINK,
+ C_CLR_TO_EOL
+ };
+
+
+#if !S_IXUGO
+# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
+#endif
+
+enum filetype
+ {
+ unknown,
+ fifo,
+ chardev,
+ directory,
+ blockdev,
+ normal,
+ symbolic_link,
+ sock,
+ whiteout,
+ arg_directory
+ };
+
+/* Prefix color, currently same as socket */
+#define C_PREFIX C_SOCK
+
+extern void _rl_put_indicator (const struct bin_str *ind);
+extern void _rl_set_normal_color (void);
+extern bool _rl_print_prefix_color (void);
+extern bool _rl_print_color_indicator (const char *f);
+extern void _rl_prep_non_filename_text (void);
+
+#endif /* !_COLORS_H_ */
diff --git a/compat.c b/compat.c
new file mode 100644
index 0000000..fc2a48f
--- /dev/null
+++ b/compat.c
@@ -0,0 +1,106 @@
+/* compat.c -- backwards compatibility functions. */
+
+/* Copyright (C) 2000-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#include "rlstdc.h"
+#include "rltypedefs.h"
+
+extern void rl_free_undo_list (void);
+extern int rl_maybe_save_line (void);
+extern int rl_maybe_unsave_line (void);
+extern int rl_maybe_replace_line (void);
+
+extern int rl_crlf (void);
+extern int rl_ding (void);
+extern int rl_alphabetic (int);
+
+extern char **rl_completion_matches (const char *, rl_compentry_func_t *);
+extern char *rl_username_completion_function (const char *, int);
+extern char *rl_filename_completion_function (const char *, int);
+
+/* Provide backwards-compatible entry points for old function names. */
+
+void
+free_undo_list (void)
+{
+ rl_free_undo_list ();
+}
+
+int
+maybe_replace_line (void)
+{
+ return rl_maybe_replace_line ();
+}
+
+int
+maybe_save_line (void)
+{
+ return rl_maybe_save_line ();
+}
+
+int
+maybe_unsave_line (void)
+{
+ return rl_maybe_unsave_line ();
+}
+
+int
+ding (void)
+{
+ return rl_ding ();
+}
+
+int
+crlf (void)
+{
+ return rl_crlf ();
+}
+
+int
+alphabetic (int c)
+{
+ return rl_alphabetic (c);
+}
+
+char **
+completion_matches (const char *s, rl_compentry_func_t *f)
+{
+ return rl_completion_matches (s, f);
+}
+
+char *
+username_completion_function (const char *s, int i)
+{
+ return rl_username_completion_function (s, i);
+}
+
+char *
+filename_completion_function (const char *s, int i)
+{
+ return rl_filename_completion_function (s, i);
+}
diff --git a/complete.c b/complete.c
new file mode 100644
index 0000000..e5d224e
--- /dev/null
+++ b/complete.c
@@ -0,0 +1,2992 @@
+/* complete.c -- filename completion for readline. */
+
+/* Copyright (C) 1987-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (__TANDEM)
+# define _XOPEN_SOURCE_EXTENDED 1
+#endif
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#if defined (__TANDEM)
+# include <sys/stat.h>
+#endif
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+# include <sys/file.h>
+#endif
+
+#include <signal.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+#include <errno.h>
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+#if defined (HAVE_PWD_H)
+#include <pwd.h>
+#endif
+
+#include "posixdir.h"
+#include "posixstat.h"
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "xmalloc.h"
+#include "rlprivate.h"
+
+#if defined (COLOR_SUPPORT)
+# include "colors.h"
+#endif
+
+#ifdef __STDC__
+typedef int QSFUNC (const void *, const void *);
+#else
+typedef int QSFUNC ();
+#endif
+
+#ifdef HAVE_LSTAT
+# define LSTAT lstat
+#else
+# define LSTAT stat
+#endif
+
+/* Unix version of a hidden file. Could be different on other systems. */
+#define HIDDEN_FILE(fname) ((fname)[0] == '.')
+
+/* Most systems don't declare getpwent in <pwd.h> if _POSIX_SOURCE is
+ defined. */
+#if defined (HAVE_GETPWENT) && (!defined (HAVE_GETPW_DECLS) || defined (_POSIX_SOURCE))
+extern struct passwd *getpwent (void);
+#endif /* HAVE_GETPWENT && (!HAVE_GETPW_DECLS || _POSIX_SOURCE) */
+
+/* If non-zero, then this is the address of a function to call when
+ completing a word would normally display the list of possible matches.
+ This function is called instead of actually doing the display.
+ It takes three arguments: (char **matches, int num_matches, int max_length)
+ where MATCHES is the array of strings that matched, NUM_MATCHES is the
+ number of strings in that array, and MAX_LENGTH is the length of the
+ longest string in that array. */
+rl_compdisp_func_t *rl_completion_display_matches_hook = (rl_compdisp_func_t *)NULL;
+
+#if defined (VISIBLE_STATS) || defined (COLOR_SUPPORT)
+# if !defined (X_OK)
+# define X_OK 1
+# endif
+#endif
+
+#if defined (VISIBLE_STATS)
+static int stat_char (char *);
+#endif
+
+#if defined (COLOR_SUPPORT)
+static int colored_stat_start (const char *);
+static void colored_stat_end (void);
+static int colored_prefix_start (void);
+static void colored_prefix_end (void);
+#endif
+
+static int path_isdir (const char *);
+
+static char *rl_quote_filename (char *, int, char *);
+
+static void _rl_complete_sigcleanup (int, void *);
+
+static void set_completion_defaults (int);
+static int get_y_or_n (int);
+static int _rl_internal_pager (int);
+static char *printable_part (char *);
+static int fnwidth (const char *);
+static int fnprint (const char *, int, const char *);
+static int print_filename (char *, char *, int);
+
+static char **gen_completion_matches (char *, int, int, rl_compentry_func_t *, int, int);
+
+static char **remove_duplicate_matches (char **);
+static void insert_match (char *, int, int, char *);
+static int append_to_match (char *, int, int, int);
+static void insert_all_matches (char **, int, char *);
+static int complete_fncmp (const char *, int, const char *, int);
+static void display_matches (char **);
+static int compute_lcd_of_matches (char **, int, const char *);
+static int postprocess_matches (char ***, int);
+static int compare_match (char *, const char *);
+static int complete_get_screenwidth (void);
+
+static char *make_quoted_replacement (char *, int, char *);
+
+/* **************************************************************** */
+/* */
+/* Completion matching, from readline's point of view. */
+/* */
+/* **************************************************************** */
+
+/* Variables known only to the readline library. */
+
+/* If non-zero, non-unique completions always show the list of matches. */
+int _rl_complete_show_all = 0;
+
+/* If non-zero, non-unique completions show the list of matches, unless it
+ is not possible to do partial completion and modify the line. */
+int _rl_complete_show_unmodified = 0;
+
+/* If non-zero, completed directory names have a slash appended. */
+int _rl_complete_mark_directories = 1;
+
+/* If non-zero, the symlinked directory completion behavior introduced in
+ readline-4.2a is disabled, and symlinks that point to directories have
+ a slash appended (subject to the value of _rl_complete_mark_directories).
+ This is user-settable via the mark-symlinked-directories variable. */
+int _rl_complete_mark_symlink_dirs = 0;
+
+/* If non-zero, completions are printed horizontally in alphabetical order,
+ like `ls -x'. */
+int _rl_print_completions_horizontally;
+
+/* Non-zero means that case is not significant in filename completion. */
+#if (defined (__MSDOS__) && !defined (__DJGPP__)) || (defined (_WIN32) && !defined (__CYGWIN__))
+int _rl_completion_case_fold = 1;
+#else
+int _rl_completion_case_fold = 0;
+#endif
+
+/* Non-zero means that `-' and `_' are equivalent when comparing filenames
+ for completion. */
+int _rl_completion_case_map = 0;
+
+/* If zero, don't match hidden files (filenames beginning with a `.' on
+ Unix) when doing filename completion. */
+int _rl_match_hidden_files = 1;
+
+/* Length in characters of a common prefix replaced with an ellipsis (`...')
+ when displaying completion matches. Matches whose printable portion has
+ more than this number of displaying characters in common will have the common
+ display prefix replaced with an ellipsis. */
+int _rl_completion_prefix_display_length = 0;
+
+/* The readline-private number of screen columns to use when displaying
+ matches. If < 0 or > _rl_screenwidth, it is ignored. */
+int _rl_completion_columns = -1;
+
+#if defined (COLOR_SUPPORT)
+/* Non-zero means to use colors to indicate file type when listing possible
+ completions. The colors used are taken from $LS_COLORS, if set. */
+int _rl_colored_stats = 0;
+
+/* Non-zero means to use a color (currently magenta) to indicate the common
+ prefix of a set of possible word completions. */
+int _rl_colored_completion_prefix = 0;
+#endif
+
+/* If non-zero, when completing in the middle of a word, don't insert
+ characters from the match that match characters following point in
+ the word. This means, for instance, completing when the cursor is
+ after the `e' in `Makefile' won't result in `Makefilefile'. */
+int _rl_skip_completed_text = 0;
+
+/* If non-zero, menu completion displays the common prefix first in the
+ cycle of possible completions instead of the last. */
+int _rl_menu_complete_prefix_first = 0;
+
+/* Global variables available to applications using readline. */
+
+#if defined (VISIBLE_STATS)
+/* Non-zero means add an additional character to each filename displayed
+ during listing completion iff rl_filename_completion_desired which helps
+ to indicate the type of file being listed. */
+int rl_visible_stats = 0;
+#endif /* VISIBLE_STATS */
+
+/* If non-zero, then this is the address of a function to call when
+ completing on a directory name. The function is called with
+ the address of a string (the current directory name) as an arg. */
+rl_icppfunc_t *rl_directory_completion_hook = (rl_icppfunc_t *)NULL;
+
+rl_icppfunc_t *rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;
+
+rl_icppfunc_t *rl_filename_stat_hook = (rl_icppfunc_t *)NULL;
+
+/* If non-zero, this is the address of a function to call when reading
+ directory entries from the filesystem for completion and comparing
+ them to the partial word to be completed. The function should
+ either return its first argument (if no conversion takes place) or
+ newly-allocated memory. This can, for instance, convert filenames
+ between character sets for comparison against what's typed at the
+ keyboard. The returned value is what is added to the list of
+ matches. The second argument is the length of the filename to be
+ converted. */
+rl_dequote_func_t *rl_filename_rewrite_hook = (rl_dequote_func_t *)NULL;
+
+/* Non-zero means readline completion functions perform tilde expansion. */
+int rl_complete_with_tilde_expansion = 0;
+
+/* Pointer to the generator function for completion_matches ().
+ NULL means to use rl_filename_completion_function (), the default filename
+ completer. */
+rl_compentry_func_t *rl_completion_entry_function = (rl_compentry_func_t *)NULL;
+
+/* Pointer to generator function for rl_menu_complete (). NULL means to use
+ *rl_completion_entry_function (see above). */
+rl_compentry_func_t *rl_menu_completion_entry_function = (rl_compentry_func_t *)NULL;
+
+/* Pointer to alternative function to create matches.
+ Function is called with TEXT, START, and END.
+ START and END are indices in RL_LINE_BUFFER saying what the boundaries
+ of TEXT are.
+ If this function exists and returns NULL then call the value of
+ rl_completion_entry_function to try to match, otherwise use the
+ array of strings returned. */
+rl_completion_func_t *rl_attempted_completion_function = (rl_completion_func_t *)NULL;
+
+/* Non-zero means to suppress normal filename completion after the
+ user-specified completion function has been called. */
+int rl_attempted_completion_over = 0;
+
+/* Set to a character indicating the type of completion being performed
+ by rl_complete_internal, available for use by application completion
+ functions. */
+int rl_completion_type = 0;
+
+/* Up to this many items will be displayed in response to a
+ possible-completions call. After that, we ask the user if
+ she is sure she wants to see them all. A negative value means
+ don't ask. */
+int rl_completion_query_items = 100;
+
+int _rl_page_completions = 1;
+
+/* The basic list of characters that signal a break between words for the
+ completer routine. The contents of this variable is what breaks words
+ in the shell, i.e. " \t\n\"\\'`@$><=" */
+const char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{("; /* }) */
+
+/* List of basic quoting characters. */
+const char *rl_basic_quote_characters = "\"'";
+
+/* The list of characters that signal a break between words for
+ rl_complete_internal. The default list is the contents of
+ rl_basic_word_break_characters. */
+const char *rl_completer_word_break_characters = 0;
+
+/* Hook function to allow an application to set the completion word
+ break characters before readline breaks up the line. Allows
+ position-dependent word break characters. */
+rl_cpvfunc_t *rl_completion_word_break_hook = (rl_cpvfunc_t *)NULL;
+
+/* List of characters which can be used to quote a substring of the line.
+ Completion occurs on the entire substring, and within the substring
+ rl_completer_word_break_characters are treated as any other character,
+ unless they also appear within this list. */
+const char *rl_completer_quote_characters = (const char *)NULL;
+
+/* List of characters that should be quoted in filenames by the completer. */
+const char *rl_filename_quote_characters = (const char *)NULL;
+
+/* List of characters that are word break characters, but should be left
+ in TEXT when it is passed to the completion function. The shell uses
+ this to help determine what kind of completing to do. */
+const char *rl_special_prefixes = (const char *)NULL;
+
+/* If non-zero, then disallow duplicates in the matches. */
+int rl_ignore_completion_duplicates = 1;
+
+/* Non-zero means that the results of the matches are to be treated
+ as filenames. This is ALWAYS zero on entry, and can only be changed
+ within a completion entry finder function. */
+int rl_filename_completion_desired = 0;
+
+/* Non-zero means that the results of the matches are to be quoted using
+ double quotes (or an application-specific quoting mechanism) if the
+ filename contains any characters in rl_filename_quote_chars. This is
+ ALWAYS non-zero on entry, and can only be changed within a completion
+ entry finder function. */
+int rl_filename_quoting_desired = 1;
+
+/* This function, if defined, is called by the completer when real
+ filename completion is done, after all the matching names have been
+ generated. It is passed a (char**) known as matches in the code below.
+ It consists of a NULL-terminated array of pointers to potential
+ matching strings. The 1st element (matches[0]) is the maximal
+ substring that is common to all matches. This function can re-arrange
+ the list of matches as required, but all elements of the array must be
+ free()'d if they are deleted. The main intent of this function is
+ to implement FIGNORE a la SunOS csh. */
+rl_compignore_func_t *rl_ignore_some_completions_function = (rl_compignore_func_t *)NULL;
+
+/* Set to a function to quote a filename in an application-specific fashion.
+ Called with the text to quote, the type of match found (single or multiple)
+ and a pointer to the quoting character to be used, which the function can
+ reset if desired. */
+rl_quote_func_t *rl_filename_quoting_function = rl_quote_filename;
+
+/* Function to call to remove quoting characters from a filename. Called
+ before completion is attempted, so the embedded quotes do not interfere
+ with matching names in the file system. Readline doesn't do anything
+ with this; it's set only by applications. */
+rl_dequote_func_t *rl_filename_dequoting_function = (rl_dequote_func_t *)NULL;
+
+/* Function to call to decide whether or not a word break character is
+ quoted. If a character is quoted, it does not break words for the
+ completer. */
+rl_linebuf_func_t *rl_char_is_quoted_p = (rl_linebuf_func_t *)NULL;
+
+/* If non-zero, the completion functions don't append anything except a
+ possible closing quote. This is set to 0 by rl_complete_internal and
+ may be changed by an application-specific completion function. */
+int rl_completion_suppress_append = 0;
+
+/* Character appended to completed words when at the end of the line. The
+ default is a space. */
+int rl_completion_append_character = ' ';
+
+/* If non-zero, the completion functions don't append any closing quote.
+ This is set to 0 by rl_complete_internal and may be changed by an
+ application-specific completion function. */
+int rl_completion_suppress_quote = 0;
+
+/* Set to any quote character readline thinks it finds before any application
+ completion function is called. */
+int rl_completion_quote_character;
+
+/* Set to a non-zero value if readline found quoting anywhere in the word to
+ be completed; set before any application completion function is called. */
+int rl_completion_found_quote;
+
+/* If non-zero, a slash will be appended to completed filenames that are
+ symbolic links to directory names, subject to the value of the
+ mark-directories variable (which is user-settable). This exists so
+ that application completion functions can override the user's preference
+ (set via the mark-symlinked-directories variable) if appropriate.
+ It's set to the value of _rl_complete_mark_symlink_dirs in
+ rl_complete_internal before any application-specific completion
+ function is called, so without that function doing anything, the user's
+ preferences are honored. */
+int rl_completion_mark_symlink_dirs;
+
+/* If non-zero, inhibit completion (temporarily). */
+int rl_inhibit_completion;
+
+/* Set to the last key used to invoke one of the completion functions */
+int rl_completion_invoking_key;
+
+/* If non-zero, sort the completion matches. On by default. */
+int rl_sort_completion_matches = 1;
+
+/* Variables local to this file. */
+
+/* Local variable states what happened during the last completion attempt. */
+static int completion_changed_buffer;
+static int last_completion_failed = 0;
+
+/* The result of the query to the user about displaying completion matches */
+static int completion_y_or_n;
+
+static int _rl_complete_display_matches_interrupt = 0;
+
+/*************************************/
+/* */
+/* Bindable completion functions */
+/* */
+/*************************************/
+
+/* Complete the word at or before point. You have supplied the function
+ that does the initial simple matching selection algorithm (see
+ rl_completion_matches ()). The default is to do filename completion. */
+int
+rl_complete (int ignore, int invoking_key)
+{
+ rl_completion_invoking_key = invoking_key;
+
+ if (rl_inhibit_completion)
+ return (_rl_insert_char (ignore, invoking_key));
+#if 0
+ else if (rl_last_func == rl_complete && completion_changed_buffer == 0 && last_completion_failed == 0)
+#else
+ else if (rl_last_func == rl_complete && completion_changed_buffer == 0)
+#endif
+ return (rl_complete_internal ('?'));
+ else if (_rl_complete_show_all)
+ return (rl_complete_internal ('!'));
+ else if (_rl_complete_show_unmodified)
+ return (rl_complete_internal ('@'));
+ else
+ return (rl_complete_internal (TAB));
+}
+
+/* List the possible completions. See description of rl_complete (). */
+int
+rl_possible_completions (int ignore, int invoking_key)
+{
+ rl_completion_invoking_key = invoking_key;
+ return (rl_complete_internal ('?'));
+}
+
+int
+rl_insert_completions (int ignore, int invoking_key)
+{
+ rl_completion_invoking_key = invoking_key;
+ return (rl_complete_internal ('*'));
+}
+
+/* Return the correct value to pass to rl_complete_internal performing
+ the same tests as rl_complete. This allows consecutive calls to an
+ application's completion function to list possible completions and for
+ an application-specific completion function to honor the
+ show-all-if-ambiguous readline variable. */
+int
+rl_completion_mode (rl_command_func_t *cfunc)
+{
+ if (rl_last_func == cfunc && !completion_changed_buffer)
+ return '?';
+ else if (_rl_complete_show_all)
+ return '!';
+ else if (_rl_complete_show_unmodified)
+ return '@';
+ else
+ return TAB;
+}
+
+/************************************/
+/* */
+/* Completion utility functions */
+/* */
+/************************************/
+
+/* Reset public readline state on a signal or other event. */
+void
+_rl_reset_completion_state (void)
+{
+ rl_completion_found_quote = 0;
+ rl_completion_quote_character = 0;
+}
+
+static void
+_rl_complete_sigcleanup (int sig, void *ptr)
+{
+ if (sig == SIGINT) /* XXX - for now */
+ {
+ _rl_free_match_list ((char **)ptr);
+ _rl_complete_display_matches_interrupt = 1;
+ }
+}
+
+/* Set default values for readline word completion. These are the variables
+ that application completion functions can change or inspect. */
+static void
+set_completion_defaults (int what_to_do)
+{
+ /* Only the completion entry function can change these. */
+ rl_filename_completion_desired = 0;
+ rl_filename_quoting_desired = 1;
+ rl_completion_type = what_to_do;
+ rl_completion_suppress_append = rl_completion_suppress_quote = 0;
+ rl_completion_append_character = ' ';
+
+ /* The completion entry function may optionally change this. */
+ rl_completion_mark_symlink_dirs = _rl_complete_mark_symlink_dirs;
+
+ /* Reset private state. */
+ _rl_complete_display_matches_interrupt = 0;
+}
+
+/* The user must press "y" or "n". Non-zero return means "y" pressed. */
+static int
+get_y_or_n (int for_pager)
+{
+ int c;
+
+ /* For now, disable pager in callback mode, until we later convert to state
+ driven functions. Have to wait until next major version to add new
+ state definition, since it will change value of RL_STATE_DONE. */
+#if defined (READLINE_CALLBACKS)
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ return 1;
+#endif
+
+ for (;;)
+ {
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+ if (c == 'y' || c == 'Y' || c == ' ')
+ return (1);
+ if (c == 'n' || c == 'N' || c == RUBOUT)
+ return (0);
+ if (c == ABORT_CHAR || c < 0)
+ _rl_abort_internal ();
+ if (for_pager && (c == NEWLINE || c == RETURN))
+ return (2);
+ if (for_pager && (c == 'q' || c == 'Q'))
+ return (0);
+ rl_ding ();
+ }
+}
+
+static int
+_rl_internal_pager (int lines)
+{
+ int i;
+
+ fprintf (rl_outstream, "--More--");
+ fflush (rl_outstream);
+ i = get_y_or_n (1);
+ _rl_erase_entire_line ();
+ if (i == 0)
+ return -1;
+ else if (i == 2)
+ return (lines - 1);
+ else
+ return 0;
+}
+
+static int
+path_isdir (const char *filename)
+{
+ struct stat finfo;
+
+ return (stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode));
+}
+
+#if defined (VISIBLE_STATS)
+/* Return the character which best describes FILENAME.
+ `@' for symbolic links
+ `/' for directories
+ `*' for executables
+ `=' for sockets
+ `|' for FIFOs
+ `%' for character special devices
+ `#' for block special devices */
+static int
+stat_char (char *filename)
+{
+ struct stat finfo;
+ int character, r;
+ char *f;
+ const char *fn;
+
+ /* Short-circuit a //server on cygwin, since that will always behave as
+ a directory. */
+#if __CYGWIN__
+ if (filename[0] == '/' && filename[1] == '/' && strchr (filename+2, '/') == 0)
+ return '/';
+#endif
+
+ f = 0;
+ if (rl_filename_stat_hook)
+ {
+ f = savestring (filename);
+ (*rl_filename_stat_hook) (&f);
+ fn = f;
+ }
+ else
+ fn = filename;
+
+#if defined (HAVE_LSTAT) && defined (S_ISLNK)
+ r = lstat (fn, &finfo);
+#else
+ r = stat (fn, &finfo);
+#endif
+
+ if (r == -1)
+ {
+ xfree (f);
+ return (0);
+ }
+
+ character = 0;
+ if (S_ISDIR (finfo.st_mode))
+ character = '/';
+#if defined (S_ISCHR)
+ else if (S_ISCHR (finfo.st_mode))
+ character = '%';
+#endif /* S_ISCHR */
+#if defined (S_ISBLK)
+ else if (S_ISBLK (finfo.st_mode))
+ character = '#';
+#endif /* S_ISBLK */
+#if defined (S_ISLNK)
+ else if (S_ISLNK (finfo.st_mode))
+ character = '@';
+#endif /* S_ISLNK */
+#if defined (S_ISSOCK)
+ else if (S_ISSOCK (finfo.st_mode))
+ character = '=';
+#endif /* S_ISSOCK */
+#if defined (S_ISFIFO)
+ else if (S_ISFIFO (finfo.st_mode))
+ character = '|';
+#endif
+ else if (S_ISREG (finfo.st_mode))
+ {
+#if defined (_WIN32) && !defined (__CYGWIN__)
+ char *ext;
+
+ /* Windows doesn't do access and X_OK; check file extension instead */
+ ext = strrchr (fn, '.');
+ if (ext && (_rl_stricmp (ext, ".exe") == 0 ||
+ _rl_stricmp (ext, ".cmd") == 0 ||
+ _rl_stricmp (ext, ".bat") == 0 ||
+ _rl_stricmp (ext, ".com") == 0))
+ character = '*';
+#else
+ if (access (filename, X_OK) == 0)
+ character = '*';
+#endif
+ }
+
+ xfree (f);
+ return (character);
+}
+#endif /* VISIBLE_STATS */
+
+#if defined (COLOR_SUPPORT)
+static int
+colored_stat_start (const char *filename)
+{
+ _rl_set_normal_color ();
+ return (_rl_print_color_indicator (filename));
+}
+
+static void
+colored_stat_end (void)
+{
+ _rl_prep_non_filename_text ();
+ _rl_put_indicator (&_rl_color_indicator[C_CLR_TO_EOL]);
+}
+
+static int
+colored_prefix_start (void)
+{
+ _rl_set_normal_color ();
+ return (_rl_print_prefix_color ());
+}
+
+static void
+colored_prefix_end (void)
+{
+ colored_stat_end (); /* for now */
+}
+#endif
+
+/* Return the portion of PATHNAME that should be output when listing
+ possible completions. If we are hacking filename completion, we
+ are only interested in the basename, the portion following the
+ final slash. Otherwise, we return what we were passed. Since
+ printing empty strings is not very informative, if we're doing
+ filename completion, and the basename is the empty string, we look
+ for the previous slash and return the portion following that. If
+ there's no previous slash, we just return what we were passed. */
+static char *
+printable_part (char *pathname)
+{
+ char *temp, *x;
+
+ if (rl_filename_completion_desired == 0) /* don't need to do anything */
+ return (pathname);
+
+ temp = strrchr (pathname, '/');
+#if defined (__MSDOS__) || defined (_WIN32)
+ if (temp == 0 && ISALPHA ((unsigned char)pathname[0]) && pathname[1] == ':')
+ temp = pathname + 1;
+#endif
+
+ if (temp == 0 || *temp == '\0')
+ return (pathname);
+ else if (temp[1] == 0 && temp == pathname)
+ return (pathname);
+ /* If the basename is NULL, we might have a pathname like '/usr/src/'.
+ Look for a previous slash and, if one is found, return the portion
+ following that slash. If there's no previous slash, just return the
+ pathname we were passed. */
+ else if (temp[1] == '\0')
+ {
+ for (x = temp - 1; x > pathname; x--)
+ if (*x == '/')
+ break;
+ return ((*x == '/') ? x + 1 : pathname);
+ }
+ else
+ return ++temp;
+}
+
+/* Compute width of STRING when displayed on screen by print_filename */
+static int
+fnwidth (const char *string)
+{
+ int width, pos;
+#if defined (HANDLE_MULTIBYTE)
+ mbstate_t ps;
+ int left, w;
+ size_t clen;
+ WCHAR_T wc;
+
+ left = strlen (string) + 1;
+ memset (&ps, 0, sizeof (mbstate_t));
+#endif
+
+ width = pos = 0;
+ while (string[pos])
+ {
+ if (CTRL_CHAR (string[pos]) || string[pos] == RUBOUT)
+ {
+ width += 2;
+ pos++;
+ }
+ else
+ {
+#if defined (HANDLE_MULTIBYTE)
+ clen = MBRTOWC (&wc, string + pos, left - pos, &ps);
+ if (MB_INVALIDCH (clen))
+ {
+ width++;
+ pos++;
+ memset (&ps, 0, sizeof (mbstate_t));
+ }
+ else if (MB_NULLWCH (clen))
+ break;
+ else
+ {
+ pos += clen;
+ w = WCWIDTH (wc);
+ width += (w >= 0) ? w : 1;
+ }
+#else
+ width++;
+ pos++;
+#endif
+ }
+ }
+
+ return width;
+}
+
+#define ELLIPSIS_LEN 3
+
+static int
+fnprint (const char *to_print, int prefix_bytes, const char *real_pathname)
+{
+ int printed_len, w;
+ const char *s;
+ int common_prefix_len, print_len;
+#if defined (HANDLE_MULTIBYTE)
+ mbstate_t ps;
+ const char *end;
+ size_t tlen;
+ int width;
+ WCHAR_T wc;
+
+ print_len = strlen (to_print);
+ end = to_print + print_len + 1;
+ memset (&ps, 0, sizeof (mbstate_t));
+#else
+ print_len = strlen (to_print);
+#endif
+
+ printed_len = common_prefix_len = 0;
+
+ /* Don't print only the ellipsis if the common prefix is one of the
+ possible completions. Only cut off prefix_bytes if we're going to be
+ printing the ellipsis, which takes precedence over coloring the
+ completion prefix (see print_filename() below). */
+ if (_rl_completion_prefix_display_length > 0 && prefix_bytes >= print_len)
+ prefix_bytes = 0;
+
+#if defined (COLOR_SUPPORT)
+ if (_rl_colored_stats && (prefix_bytes == 0 || _rl_colored_completion_prefix <= 0))
+ colored_stat_start (real_pathname);
+#endif
+
+ if (prefix_bytes && _rl_completion_prefix_display_length > 0 &&
+ prefix_bytes > _rl_completion_prefix_display_length)
+ {
+ char ellipsis;
+
+ ellipsis = (to_print[prefix_bytes] == '.') ? '_' : '.';
+ for (w = 0; w < ELLIPSIS_LEN; w++)
+ putc (ellipsis, rl_outstream);
+ printed_len = ELLIPSIS_LEN;
+ }
+#if defined (COLOR_SUPPORT)
+ else if (prefix_bytes && _rl_colored_completion_prefix > 0)
+ {
+ common_prefix_len = prefix_bytes;
+ prefix_bytes = 0;
+ /* XXX - print color indicator start here */
+ colored_prefix_start ();
+ }
+#endif
+
+ s = to_print + prefix_bytes;
+ while (*s)
+ {
+ if (CTRL_CHAR (*s))
+ {
+ putc ('^', rl_outstream);
+ putc (UNCTRL (*s), rl_outstream);
+ printed_len += 2;
+ s++;
+#if defined (HANDLE_MULTIBYTE)
+ memset (&ps, 0, sizeof (mbstate_t));
+#endif
+ }
+ else if (*s == RUBOUT)
+ {
+ putc ('^', rl_outstream);
+ putc ('?', rl_outstream);
+ printed_len += 2;
+ s++;
+#if defined (HANDLE_MULTIBYTE)
+ memset (&ps, 0, sizeof (mbstate_t));
+#endif
+ }
+ else
+ {
+#if defined (HANDLE_MULTIBYTE)
+ tlen = MBRTOWC (&wc, s, end - s, &ps);
+ if (MB_INVALIDCH (tlen))
+ {
+ tlen = 1;
+ width = 1;
+ memset (&ps, 0, sizeof (mbstate_t));
+ }
+ else if (MB_NULLWCH (tlen))
+ break;
+ else
+ {
+ w = WCWIDTH (wc);
+ width = (w >= 0) ? w : 1;
+ }
+ fwrite (s, 1, tlen, rl_outstream);
+ s += tlen;
+ printed_len += width;
+#else
+ putc (*s, rl_outstream);
+ s++;
+ printed_len++;
+#endif
+ }
+ if (common_prefix_len > 0 && (s - to_print) >= common_prefix_len)
+ {
+#if defined (COLOR_SUPPORT)
+ /* printed bytes = s - to_print */
+ /* printed bytes should never be > but check for paranoia's sake */
+ colored_prefix_end ();
+ if (_rl_colored_stats)
+ colored_stat_start (real_pathname); /* XXX - experiment */
+#endif
+ common_prefix_len = 0;
+ }
+ }
+
+#if defined (COLOR_SUPPORT)
+ /* XXX - unconditional for now */
+ if (_rl_colored_stats)
+ colored_stat_end ();
+#endif
+
+ return printed_len;
+}
+
+/* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and we
+ are using it, check for and output a single character for `special'
+ filenames. Return the number of characters we output. */
+
+static int
+print_filename (char *to_print, char *full_pathname, int prefix_bytes)
+{
+ int printed_len, extension_char, slen, tlen;
+ char *s, c, *new_full_pathname, *dn;
+
+ extension_char = 0;
+#if defined (COLOR_SUPPORT)
+ /* Defer printing if we want to prefix with a color indicator */
+ if (_rl_colored_stats == 0 || rl_filename_completion_desired == 0)
+#endif
+ printed_len = fnprint (to_print, prefix_bytes, to_print);
+
+ if (rl_filename_completion_desired && (
+#if defined (VISIBLE_STATS)
+ rl_visible_stats ||
+#endif
+#if defined (COLOR_SUPPORT)
+ _rl_colored_stats ||
+#endif
+ _rl_complete_mark_directories))
+ {
+ /* If to_print != full_pathname, to_print is the basename of the
+ path passed. In this case, we try to expand the directory
+ name before checking for the stat character. */
+ if (to_print != full_pathname)
+ {
+ /* Terminate the directory name. */
+ c = to_print[-1];
+ to_print[-1] = '\0';
+
+ /* If setting the last slash in full_pathname to a NUL results in
+ full_pathname being the empty string, we are trying to complete
+ files in the root directory. If we pass a null string to the
+ bash directory completion hook, for example, it will expand it
+ to the current directory. We just want the `/'. */
+ if (full_pathname == 0 || *full_pathname == 0)
+ dn = "/";
+ else if (full_pathname[0] != '/')
+ dn = full_pathname;
+ else if (full_pathname[1] == 0)
+ dn = "//"; /* restore trailing slash to `//' */
+ else if (full_pathname[1] == '/' && full_pathname[2] == 0)
+ dn = "/"; /* don't turn /// into // */
+ else
+ dn = full_pathname;
+ s = tilde_expand (dn);
+ if (rl_directory_completion_hook)
+ (*rl_directory_completion_hook) (&s);
+
+ slen = strlen (s);
+ tlen = strlen (to_print);
+ new_full_pathname = (char *)xmalloc (slen + tlen + 2);
+ strcpy (new_full_pathname, s);
+ if (s[slen - 1] == '/')
+ slen--;
+ else
+ new_full_pathname[slen] = '/';
+ strcpy (new_full_pathname + slen + 1, to_print);
+
+#if defined (VISIBLE_STATS)
+ if (rl_visible_stats)
+ extension_char = stat_char (new_full_pathname);
+ else
+#endif
+ if (_rl_complete_mark_directories)
+ {
+ dn = 0;
+ if (rl_directory_completion_hook == 0 && rl_filename_stat_hook)
+ {
+ dn = savestring (new_full_pathname);
+ (*rl_filename_stat_hook) (&dn);
+ xfree (new_full_pathname);
+ new_full_pathname = dn;
+ }
+ if (path_isdir (new_full_pathname))
+ extension_char = '/';
+ }
+
+ /* Move colored-stats code inside fnprint() */
+#if defined (COLOR_SUPPORT)
+ if (_rl_colored_stats)
+ printed_len = fnprint (to_print, prefix_bytes, new_full_pathname);
+#endif
+
+ xfree (new_full_pathname);
+ to_print[-1] = c;
+ }
+ else
+ {
+ s = tilde_expand (full_pathname);
+#if defined (VISIBLE_STATS)
+ if (rl_visible_stats)
+ extension_char = stat_char (s);
+ else
+#endif
+ if (_rl_complete_mark_directories && path_isdir (s))
+ extension_char = '/';
+
+ /* Move colored-stats code inside fnprint() */
+#if defined (COLOR_SUPPORT)
+ if (_rl_colored_stats)
+ printed_len = fnprint (to_print, prefix_bytes, s);
+#endif
+ }
+
+ xfree (s);
+ if (extension_char)
+ {
+ putc (extension_char, rl_outstream);
+ printed_len++;
+ }
+ }
+
+ return printed_len;
+}
+
+static char *
+rl_quote_filename (char *s, int rtype, char *qcp)
+{
+ char *r;
+
+ r = (char *)xmalloc (strlen (s) + 2);
+ *r = *rl_completer_quote_characters;
+ strcpy (r + 1, s);
+ if (qcp)
+ *qcp = *rl_completer_quote_characters;
+ return r;
+}
+
+/* Find the bounds of the current word for completion purposes, and leave
+ rl_point set to the end of the word. This function skips quoted
+ substrings (characters between matched pairs of characters in
+ rl_completer_quote_characters). First we try to find an unclosed
+ quoted substring on which to do matching. If one is not found, we use
+ the word break characters to find the boundaries of the current word.
+ We call an application-specific function to decide whether or not a
+ particular word break character is quoted; if that function returns a
+ non-zero result, the character does not break a word. This function
+ returns the opening quote character if we found an unclosed quoted
+ substring, '\0' otherwise. FP, if non-null, is set to a value saying
+ which (shell-like) quote characters we found (single quote, double
+ quote, or backslash) anywhere in the string. DP, if non-null, is set to
+ the value of the delimiter character that caused a word break. */
+
+char
+_rl_find_completion_word (int *fp, int *dp)
+{
+ int scan, end, found_quote, delimiter, pass_next, isbrk;
+ char quote_char;
+ const char *brkchars;
+
+ end = rl_point;
+ found_quote = delimiter = 0;
+ quote_char = '\0';
+
+ brkchars = 0;
+ if (rl_completion_word_break_hook)
+ brkchars = (*rl_completion_word_break_hook) ();
+ if (brkchars == 0)
+ brkchars = rl_completer_word_break_characters;
+
+ if (rl_completer_quote_characters)
+ {
+ /* We have a list of characters which can be used in pairs to
+ quote substrings for the completer. Try to find the start
+ of an unclosed quoted substring. */
+ /* FOUND_QUOTE is set so we know what kind of quotes we found. */
+ for (scan = pass_next = 0; scan < end; scan = MB_NEXTCHAR (rl_line_buffer, scan, 1, MB_FIND_ANY))
+ {
+ if (pass_next)
+ {
+ pass_next = 0;
+ continue;
+ }
+
+ /* Shell-like semantics for single quotes -- don't allow backslash
+ to quote anything in single quotes, especially not the closing
+ quote. If you don't like this, take out the check on the value
+ of quote_char. */
+ if (quote_char != '\'' && rl_line_buffer[scan] == '\\')
+ {
+ pass_next = 1;
+ found_quote |= RL_QF_BACKSLASH;
+ continue;
+ }
+
+ if (quote_char != '\0')
+ {
+ /* Ignore everything until the matching close quote char. */
+ if (rl_line_buffer[scan] == quote_char)
+ {
+ /* Found matching close. Abandon this substring. */
+ quote_char = '\0';
+ rl_point = end;
+ }
+ }
+ else if (strchr (rl_completer_quote_characters, rl_line_buffer[scan]))
+ {
+ /* Found start of a quoted substring. */
+ quote_char = rl_line_buffer[scan];
+ rl_point = scan + 1;
+ /* Shell-like quoting conventions. */
+ if (quote_char == '\'')
+ found_quote |= RL_QF_SINGLE_QUOTE;
+ else if (quote_char == '"')
+ found_quote |= RL_QF_DOUBLE_QUOTE;
+ else
+ found_quote |= RL_QF_OTHER_QUOTE;
+ }
+ }
+ }
+
+ if (rl_point == end && quote_char == '\0')
+ {
+ /* We didn't find an unclosed quoted substring upon which to do
+ completion, so use the word break characters to find the
+ substring on which to complete. */
+ while (rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_ANY))
+ {
+ scan = rl_line_buffer[rl_point];
+
+ if (strchr (brkchars, scan) == 0)
+ continue;
+
+ /* Call the application-specific function to tell us whether
+ this word break character is quoted and should be skipped. */
+ if (rl_char_is_quoted_p && found_quote &&
+ (*rl_char_is_quoted_p) (rl_line_buffer, rl_point))
+ continue;
+
+ /* Convoluted code, but it avoids an n^2 algorithm with calls
+ to char_is_quoted. */
+ break;
+ }
+ }
+
+ /* If we are at an unquoted word break, then advance past it. */
+ scan = rl_line_buffer[rl_point];
+
+ /* If there is an application-specific function to say whether or not
+ a character is quoted and we found a quote character, let that
+ function decide whether or not a character is a word break, even
+ if it is found in rl_completer_word_break_characters. Don't bother
+ if we're at the end of the line, though. */
+ if (scan)
+ {
+ if (rl_char_is_quoted_p)
+ isbrk = (found_quote == 0 ||
+ (*rl_char_is_quoted_p) (rl_line_buffer, rl_point) == 0) &&
+ strchr (brkchars, scan) != 0;
+ else
+ isbrk = strchr (brkchars, scan) != 0;
+
+ if (isbrk)
+ {
+ /* If the character that caused the word break was a quoting
+ character, then remember it as the delimiter. */
+ if (rl_basic_quote_characters &&
+ strchr (rl_basic_quote_characters, scan) &&
+ (end - rl_point) > 1)
+ delimiter = scan;
+
+ /* If the character isn't needed to determine something special
+ about what kind of completion to perform, then advance past it. */
+ if (rl_special_prefixes == 0 || strchr (rl_special_prefixes, scan) == 0)
+ rl_point++;
+ }
+ }
+
+ if (fp)
+ *fp = found_quote;
+ if (dp)
+ *dp = delimiter;
+
+ return (quote_char);
+}
+
+static char **
+gen_completion_matches (char *text, int start, int end, rl_compentry_func_t *our_func, int found_quote, int quote_char)
+{
+ char **matches;
+
+ rl_completion_found_quote = found_quote;
+ rl_completion_quote_character = quote_char;
+
+ /* If the user wants to TRY to complete, but then wants to give
+ up and use the default completion function, they set the
+ variable rl_attempted_completion_function. */
+ if (rl_attempted_completion_function)
+ {
+ matches = (*rl_attempted_completion_function) (text, start, end);
+ if (RL_SIG_RECEIVED())
+ {
+ _rl_free_match_list (matches);
+ matches = 0;
+ RL_CHECK_SIGNALS ();
+ }
+
+ if (matches || rl_attempted_completion_over)
+ {
+ rl_attempted_completion_over = 0;
+ return (matches);
+ }
+ }
+
+ /* XXX -- filename dequoting moved into rl_filename_completion_function */
+
+ /* rl_completion_matches will check for signals as well to avoid a long
+ delay while reading a directory. */
+ matches = rl_completion_matches (text, our_func);
+ if (RL_SIG_RECEIVED())
+ {
+ _rl_free_match_list (matches);
+ matches = 0;
+ RL_CHECK_SIGNALS ();
+ }
+ return matches;
+}
+
+/* Filter out duplicates in MATCHES. This frees up the strings in
+ MATCHES. */
+static char **
+remove_duplicate_matches (char **matches)
+{
+ char *lowest_common;
+ int i, j, newlen;
+ char dead_slot;
+ char **temp_array;
+
+ /* Sort the items. */
+ for (i = 0; matches[i]; i++)
+ ;
+
+ /* Sort the array without matches[0], since we need it to
+ stay in place no matter what. */
+ if (i && rl_sort_completion_matches)
+ qsort (matches+1, i-1, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
+
+ /* Remember the lowest common denominator for it may be unique. */
+ lowest_common = savestring (matches[0]);
+
+ for (i = newlen = 0; matches[i + 1]; i++)
+ {
+ if (strcmp (matches[i], matches[i + 1]) == 0)
+ {
+ xfree (matches[i]);
+ matches[i] = (char *)&dead_slot;
+ }
+ else
+ newlen++;
+ }
+
+ /* We have marked all the dead slots with (char *)&dead_slot.
+ Copy all the non-dead entries into a new array. */
+ temp_array = (char **)xmalloc ((3 + newlen) * sizeof (char *));
+ for (i = j = 1; matches[i]; i++)
+ {
+ if (matches[i] != (char *)&dead_slot)
+ temp_array[j++] = matches[i];
+ }
+ temp_array[j] = (char *)NULL;
+
+ if (matches[0] != (char *)&dead_slot)
+ xfree (matches[0]);
+
+ /* Place the lowest common denominator back in [0]. */
+ temp_array[0] = lowest_common;
+
+ /* If there is one string left, and it is identical to the
+ lowest common denominator, then the LCD is the string to
+ insert. */
+ if (j == 2 && strcmp (temp_array[0], temp_array[1]) == 0)
+ {
+ xfree (temp_array[1]);
+ temp_array[1] = (char *)NULL;
+ }
+ return (temp_array);
+}
+
+/* Find the common prefix of the list of matches, and put it into
+ matches[0]. */
+static int
+compute_lcd_of_matches (char **match_list, int matches, const char *text)
+{
+ register int i, c1, c2, si;
+ int low; /* Count of max-matched characters. */
+ int lx;
+ char *dtext; /* dequoted TEXT, if needed */
+#if defined (HANDLE_MULTIBYTE)
+ int v;
+ size_t v1, v2;
+ mbstate_t ps1, ps2;
+ WCHAR_T wc1, wc2;
+#endif
+
+ /* If only one match, just use that. Otherwise, compare each
+ member of the list with the next, finding out where they
+ stop matching. */
+ if (matches == 1)
+ {
+ match_list[0] = match_list[1];
+ match_list[1] = (char *)NULL;
+ return 1;
+ }
+
+ for (i = 1, low = 100000; i < matches; i++)
+ {
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ memset (&ps1, 0, sizeof (mbstate_t));
+ memset (&ps2, 0, sizeof (mbstate_t));
+ }
+#endif
+ for (si = 0; (c1 = match_list[i][si]) && (c2 = match_list[i + 1][si]); si++)
+ {
+ if (_rl_completion_case_fold)
+ {
+ c1 = _rl_to_lower (c1);
+ c2 = _rl_to_lower (c2);
+ }
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ v1 = MBRTOWC (&wc1, match_list[i]+si, strlen (match_list[i]+si), &ps1);
+ v2 = MBRTOWC (&wc2, match_list[i+1]+si, strlen (match_list[i+1]+si), &ps2);
+ if (MB_INVALIDCH (v1) || MB_INVALIDCH (v2))
+ {
+ if (c1 != c2) /* do byte comparison */
+ break;
+ continue;
+ }
+ if (_rl_completion_case_fold)
+ {
+ wc1 = towlower (wc1);
+ wc2 = towlower (wc2);
+ }
+ if (wc1 != wc2)
+ break;
+ else if (v1 > 1)
+ si += v1 - 1;
+ }
+ else
+#endif
+ if (c1 != c2)
+ break;
+ }
+
+ if (low > si)
+ low = si;
+ }
+
+ /* If there were multiple matches, but none matched up to even the
+ first character, and the user typed something, use that as the
+ value of matches[0]. */
+ if (low == 0 && text && *text)
+ {
+ match_list[0] = (char *)xmalloc (strlen (text) + 1);
+ strcpy (match_list[0], text);
+ }
+ else
+ {
+ match_list[0] = (char *)xmalloc (low + 1);
+
+ /* XXX - this might need changes in the presence of multibyte chars */
+
+ /* If we are ignoring case, try to preserve the case of the string
+ the user typed in the face of multiple matches differing in case. */
+ if (_rl_completion_case_fold)
+ {
+ /* We're making an assumption here:
+ IF we're completing filenames AND
+ the application has defined a filename dequoting function AND
+ we found a quote character AND
+ the application has requested filename quoting
+ THEN
+ we assume that TEXT was dequoted before checking against
+ the file system and needs to be dequoted here before we
+ check against the list of matches
+ FI */
+ dtext = (char *)NULL;
+ if (rl_filename_completion_desired &&
+ rl_filename_dequoting_function &&
+ rl_completion_found_quote &&
+ rl_filename_quoting_desired)
+ {
+ dtext = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
+ text = dtext;
+ }
+
+ /* sort the list to get consistent answers. */
+ if (rl_sort_completion_matches)
+ qsort (match_list+1, matches, sizeof(char *), (QSFUNC *)_rl_qsort_string_compare);
+
+ si = strlen (text);
+ lx = (si <= low) ? si : low; /* check shorter of text and matches */
+ /* Try to preserve the case of what the user typed in the presence of
+ multiple matches: check each match for something that matches
+ what the user typed taking case into account; use it up to common
+ length of matches if one is found. If not, just use first match. */
+ for (i = 1; i <= matches; i++)
+ if (strncmp (match_list[i], text, lx) == 0)
+ {
+ strncpy (match_list[0], match_list[i], low);
+ break;
+ }
+ /* no casematch, use first entry */
+ if (i > matches)
+ strncpy (match_list[0], match_list[1], low);
+
+ FREE (dtext);
+ }
+ else
+ strncpy (match_list[0], match_list[1], low);
+
+ match_list[0][low] = '\0';
+ }
+
+ return matches;
+}
+
+static int
+postprocess_matches (char ***matchesp, int matching_filenames)
+{
+ char *t, **matches, **temp_matches;
+ int nmatch, i;
+
+ matches = *matchesp;
+
+ if (matches == 0)
+ return 0;
+
+ /* It seems to me that in all the cases we handle we would like
+ to ignore duplicate possibilities. Scan for the text to
+ insert being identical to the other completions. */
+ if (rl_ignore_completion_duplicates)
+ {
+ temp_matches = remove_duplicate_matches (matches);
+ xfree (matches);
+ matches = temp_matches;
+ }
+
+ /* If we are matching filenames, then here is our chance to
+ do clever processing by re-examining the list. Call the
+ ignore function with the array as a parameter. It can
+ munge the array, deleting matches as it desires. */
+ if (rl_ignore_some_completions_function && matching_filenames)
+ {
+ for (nmatch = 1; matches[nmatch]; nmatch++)
+ ;
+ (void)(*rl_ignore_some_completions_function) (matches);
+ if (matches == 0 || matches[0] == 0)
+ {
+ FREE (matches);
+ *matchesp = (char **)0;
+ return 0;
+ }
+ else
+ {
+ /* If we removed some matches, recompute the common prefix. */
+ for (i = 1; matches[i]; i++)
+ ;
+ if (i > 1 && i < nmatch)
+ {
+ t = matches[0];
+ compute_lcd_of_matches (matches, i - 1, t);
+ FREE (t);
+ }
+ }
+ }
+
+ *matchesp = matches;
+ return (1);
+}
+
+static int
+complete_get_screenwidth (void)
+{
+ int cols;
+ char *envcols;
+
+ cols = _rl_completion_columns;
+ if (cols >= 0 && cols <= _rl_screenwidth)
+ return cols;
+ envcols = getenv ("COLUMNS");
+ if (envcols && *envcols)
+ cols = atoi (envcols);
+ if (cols >= 0 && cols <= _rl_screenwidth)
+ return cols;
+ return _rl_screenwidth;
+}
+
+/* A convenience function for displaying a list of strings in
+ columnar format on readline's output stream. MATCHES is the list
+ of strings, in argv format, LEN is the number of strings in MATCHES,
+ and MAX is the length of the longest string in MATCHES. */
+void
+rl_display_match_list (char **matches, int len, int max)
+{
+ int count, limit, printed_len, lines, cols;
+ int i, j, k, l, common_length, sind;
+ char *temp, *t;
+
+ /* Find the length of the prefix common to all items: length as displayed
+ characters (common_length) and as a byte index into the matches (sind) */
+ common_length = sind = 0;
+ if (_rl_completion_prefix_display_length > 0)
+ {
+ t = printable_part (matches[0]);
+ /* check again in case of /usr/src/ */
+ temp = rl_filename_completion_desired ? strrchr (t, '/') : 0;
+ common_length = temp ? fnwidth (temp) : fnwidth (t);
+ sind = temp ? strlen (temp) : strlen (t);
+ if (common_length > max || sind > max)
+ common_length = sind = 0;
+
+ if (common_length > _rl_completion_prefix_display_length && common_length > ELLIPSIS_LEN)
+ max -= common_length - ELLIPSIS_LEN;
+ else if (_rl_colored_completion_prefix <= 0)
+ common_length = sind = 0;
+ }
+#if defined (COLOR_SUPPORT)
+ else if (_rl_colored_completion_prefix > 0)
+ {
+ t = printable_part (matches[0]);
+ temp = rl_filename_completion_desired ? strrchr (t, '/') : 0;
+ common_length = temp ? fnwidth (temp) : fnwidth (t);
+ sind = temp ? RL_STRLEN (temp+1) : RL_STRLEN (t); /* want portion after final slash */
+ if (common_length > max || sind > max)
+ common_length = sind = 0;
+ }
+#endif
+
+ /* How many items of MAX length can we fit in the screen window? */
+ cols = complete_get_screenwidth ();
+ max += 2;
+ limit = cols / max;
+ if (limit != 1 && (limit * max == cols))
+ limit--;
+
+ /* If cols == 0, limit will end up -1 */
+ if (cols < _rl_screenwidth && limit < 0)
+ limit = 1;
+
+ /* Avoid a possible floating exception. If max > cols,
+ limit will be 0 and a divide-by-zero fault will result. */
+ if (limit == 0)
+ limit = 1;
+
+ /* How many iterations of the printing loop? */
+ count = (len + (limit - 1)) / limit;
+
+ /* Watch out for special case. If LEN is less than LIMIT, then
+ just do the inner printing loop.
+ 0 < len <= limit implies count = 1. */
+
+ /* Sort the items if they are not already sorted. */
+ if (rl_ignore_completion_duplicates == 0 && rl_sort_completion_matches)
+ qsort (matches + 1, len, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
+
+ rl_crlf ();
+
+ lines = 0;
+ if (_rl_print_completions_horizontally == 0)
+ {
+ /* Print the sorted items, up-and-down alphabetically, like ls. */
+ for (i = 1; i <= count; i++)
+ {
+ for (j = 0, l = i; j < limit; j++)
+ {
+ if (l > len || matches[l] == 0)
+ break;
+ else
+ {
+ temp = printable_part (matches[l]);
+ printed_len = print_filename (temp, matches[l], sind);
+
+ if (j + 1 < limit)
+ {
+ if (max <= printed_len)
+ putc (' ', rl_outstream);
+ else
+ for (k = 0; k < max - printed_len; k++)
+ putc (' ', rl_outstream);
+ }
+ }
+ l += count;
+ }
+ rl_crlf ();
+#if defined (SIGWINCH)
+ if (RL_SIG_RECEIVED () && RL_SIGWINCH_RECEIVED() == 0)
+#else
+ if (RL_SIG_RECEIVED ())
+#endif
+ return;
+ lines++;
+ if (_rl_page_completions && lines >= (_rl_screenheight - 1) && i < count)
+ {
+ lines = _rl_internal_pager (lines);
+ if (lines < 0)
+ return;
+ }
+ }
+ }
+ else
+ {
+ /* Print the sorted items, across alphabetically, like ls -x. */
+ for (i = 1; matches[i]; i++)
+ {
+ temp = printable_part (matches[i]);
+ printed_len = print_filename (temp, matches[i], sind);
+ /* Have we reached the end of this line? */
+#if defined (SIGWINCH)
+ if (RL_SIG_RECEIVED () && RL_SIGWINCH_RECEIVED() == 0)
+#else
+ if (RL_SIG_RECEIVED ())
+#endif
+ return;
+ if (matches[i+1])
+ {
+ if (limit == 1 || (i && (limit > 1) && (i % limit) == 0))
+ {
+ rl_crlf ();
+ lines++;
+ if (_rl_page_completions && lines >= _rl_screenheight - 1)
+ {
+ lines = _rl_internal_pager (lines);
+ if (lines < 0)
+ return;
+ }
+ }
+ else if (max <= printed_len)
+ putc (' ', rl_outstream);
+ else
+ for (k = 0; k < max - printed_len; k++)
+ putc (' ', rl_outstream);
+ }
+ }
+ rl_crlf ();
+ }
+}
+
+/* Display MATCHES, a list of matching filenames in argv format. This
+ handles the simple case -- a single match -- first. If there is more
+ than one match, we compute the number of strings in the list and the
+ length of the longest string, which will be needed by the display
+ function. If the application wants to handle displaying the list of
+ matches itself, it sets RL_COMPLETION_DISPLAY_MATCHES_HOOK to the
+ address of a function, and we just call it. If we're handling the
+ display ourselves, we just call rl_display_match_list. We also check
+ that the list of matches doesn't exceed the user-settable threshold,
+ and ask the user if he wants to see the list if there are more matches
+ than RL_COMPLETION_QUERY_ITEMS. */
+static void
+display_matches (char **matches)
+{
+ int len, max, i;
+ char *temp;
+
+ /* Move to the last visible line of a possibly-multiple-line command. */
+ _rl_move_vert (_rl_vis_botlin);
+
+ /* Handle simple case first. What if there is only one answer? */
+ if (matches[1] == 0)
+ {
+ temp = printable_part (matches[0]);
+ rl_crlf ();
+ print_filename (temp, matches[0], 0);
+ rl_crlf ();
+
+ rl_forced_update_display ();
+ rl_display_fixed = 1;
+
+ return;
+ }
+
+ /* There is more than one answer. Find out how many there are,
+ and find the maximum printed length of a single entry. */
+ for (max = 0, i = 1; matches[i]; i++)
+ {
+ temp = printable_part (matches[i]);
+ len = fnwidth (temp);
+
+ if (len > max)
+ max = len;
+ }
+
+ len = i - 1;
+
+ /* If the caller has defined a display hook, then call that now. */
+ if (rl_completion_display_matches_hook)
+ {
+ (*rl_completion_display_matches_hook) (matches, len, max);
+ return;
+ }
+
+ /* If there are many items, then ask the user if she really wants to
+ see them all. */
+ if (rl_completion_query_items > 0 && len >= rl_completion_query_items)
+ {
+ rl_crlf ();
+ fprintf (rl_outstream, "Display all %d possibilities? (y or n)", len);
+ fflush (rl_outstream);
+ if ((completion_y_or_n = get_y_or_n (0)) == 0)
+ {
+ rl_crlf ();
+
+ rl_forced_update_display ();
+ rl_display_fixed = 1;
+
+ return;
+ }
+ }
+
+ rl_display_match_list (matches, len, max);
+
+ rl_forced_update_display ();
+ rl_display_fixed = 1;
+}
+
+/* qc == pointer to quoting character, if any */
+static char *
+make_quoted_replacement (char *match, int mtype, char *qc)
+{
+ int should_quote, do_replace;
+ char *replacement;
+
+ /* If we are doing completion on quoted substrings, and any matches
+ contain any of the completer_word_break_characters, then auto-
+ matically prepend the substring with a quote character (just pick
+ the first one from the list of such) if it does not already begin
+ with a quote string. FIXME: Need to remove any such automatically
+ inserted quote character when it no longer is necessary, such as
+ if we change the string we are completing on and the new set of
+ matches don't require a quoted substring. */
+ replacement = match;
+
+ should_quote = match && rl_completer_quote_characters &&
+ rl_filename_completion_desired &&
+ rl_filename_quoting_desired;
+
+ if (should_quote)
+ should_quote = should_quote && (!qc || !*qc ||
+ (rl_completer_quote_characters && strchr (rl_completer_quote_characters, *qc)));
+
+ if (should_quote)
+ {
+ /* If there is a single match, see if we need to quote it.
+ This also checks whether the common prefix of several
+ matches needs to be quoted. */
+ should_quote = rl_filename_quote_characters
+ ? (_rl_strpbrk (match, rl_filename_quote_characters) != 0)
+ : 0;
+
+ do_replace = should_quote ? mtype : NO_MATCH;
+ /* Quote the replacement, since we found an embedded
+ word break character in a potential match. */
+ if (do_replace != NO_MATCH && rl_filename_quoting_function)
+ replacement = (*rl_filename_quoting_function) (match, do_replace, qc);
+ }
+ return (replacement);
+}
+
+static void
+insert_match (char *match, int start, int mtype, char *qc)
+{
+ char *replacement, *r;
+ char oqc;
+ int end, rlen;
+
+ oqc = qc ? *qc : '\0';
+ replacement = make_quoted_replacement (match, mtype, qc);
+
+ /* Now insert the match. */
+ if (replacement)
+ {
+ rlen = strlen (replacement);
+ /* Don't double an opening quote character. */
+ if (qc && *qc && start && rl_line_buffer[start - 1] == *qc &&
+ replacement[0] == *qc)
+ start--;
+ /* If make_quoted_replacement changed the quoting character, remove
+ the opening quote and insert the (fully-quoted) replacement. */
+ else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc &&
+ replacement[0] != oqc)
+ start--;
+ end = rl_point - 1;
+ /* Don't double a closing quote character */
+ if (qc && *qc && end && rl_line_buffer[rl_point] == *qc && replacement[rlen - 1] == *qc)
+ end++;
+ if (_rl_skip_completed_text)
+ {
+ r = replacement;
+ while (start < rl_end && *r && rl_line_buffer[start] == *r)
+ {
+ start++;
+ r++;
+ }
+ if (start <= end || *r)
+ _rl_replace_text (r, start, end);
+ rl_point = start + strlen (r);
+ }
+ else
+ _rl_replace_text (replacement, start, end);
+ if (replacement != match)
+ xfree (replacement);
+ }
+}
+
+/* Append any necessary closing quote and a separator character to the
+ just-inserted match. If the user has specified that directories
+ should be marked by a trailing `/', append one of those instead. The
+ default trailing character is a space. Returns the number of characters
+ appended. If NONTRIVIAL_MATCH is set, we test for a symlink (if the OS
+ has them) and don't add a suffix for a symlink to a directory. A
+ nontrivial match is one that actually adds to the word being completed.
+ The variable rl_completion_mark_symlink_dirs controls this behavior
+ (it's initially set to the what the user has chosen, indicated by the
+ value of _rl_complete_mark_symlink_dirs, but may be modified by an
+ application's completion function). */
+static int
+append_to_match (char *text, int delimiter, int quote_char, int nontrivial_match)
+{
+ char temp_string[4], *filename, *fn;
+ int temp_string_index, s;
+ struct stat finfo;
+
+ temp_string_index = 0;
+ if (quote_char && rl_point && rl_completion_suppress_quote == 0 &&
+ rl_line_buffer[rl_point - 1] != quote_char)
+ temp_string[temp_string_index++] = quote_char;
+
+ if (delimiter)
+ temp_string[temp_string_index++] = delimiter;
+ else if (rl_completion_suppress_append == 0 && rl_completion_append_character)
+ temp_string[temp_string_index++] = rl_completion_append_character;
+
+ temp_string[temp_string_index++] = '\0';
+
+ if (rl_filename_completion_desired)
+ {
+ filename = tilde_expand (text);
+ if (rl_filename_stat_hook)
+ {
+ fn = savestring (filename);
+ (*rl_filename_stat_hook) (&fn);
+ xfree (filename);
+ filename = fn;
+ }
+ s = (nontrivial_match && rl_completion_mark_symlink_dirs == 0)
+ ? LSTAT (filename, &finfo)
+ : stat (filename, &finfo);
+ if (s == 0 && S_ISDIR (finfo.st_mode))
+ {
+ if (_rl_complete_mark_directories /* && rl_completion_suppress_append == 0 */)
+ {
+ /* This is clumsy. Avoid putting in a double slash if point
+ is at the end of the line and the previous character is a
+ slash. */
+ if (rl_point && rl_line_buffer[rl_point] == '\0' && rl_line_buffer[rl_point - 1] == '/')
+ ;
+ else if (rl_line_buffer[rl_point] != '/')
+ rl_insert_text ("/");
+ }
+ }
+#ifdef S_ISLNK
+ /* Don't add anything if the filename is a symlink and resolves to a
+ directory. */
+ else if (s == 0 && S_ISLNK (finfo.st_mode) && path_isdir (filename))
+ ;
+#endif
+ else
+ {
+ if (rl_point == rl_end && temp_string_index)
+ rl_insert_text (temp_string);
+ }
+ xfree (filename);
+ }
+ else
+ {
+ if (rl_point == rl_end && temp_string_index)
+ rl_insert_text (temp_string);
+ }
+
+ return (temp_string_index);
+}
+
+static void
+insert_all_matches (char **matches, int point, char *qc)
+{
+ int i;
+ char *rp;
+
+ rl_begin_undo_group ();
+ /* remove any opening quote character; make_quoted_replacement will add
+ it back. */
+ if (qc && *qc && point && rl_line_buffer[point - 1] == *qc)
+ point--;
+ rl_delete_text (point, rl_point);
+ rl_point = point;
+
+ if (matches[1])
+ {
+ for (i = 1; matches[i]; i++)
+ {
+ rp = make_quoted_replacement (matches[i], SINGLE_MATCH, qc);
+ rl_insert_text (rp);
+ rl_insert_text (" ");
+ if (rp != matches[i])
+ xfree (rp);
+ }
+ }
+ else
+ {
+ rp = make_quoted_replacement (matches[0], SINGLE_MATCH, qc);
+ rl_insert_text (rp);
+ rl_insert_text (" ");
+ if (rp != matches[0])
+ xfree (rp);
+ }
+ rl_end_undo_group ();
+}
+
+void
+_rl_free_match_list (char **matches)
+{
+ register int i;
+
+ if (matches == 0)
+ return;
+
+ for (i = 0; matches[i]; i++)
+ xfree (matches[i]);
+ xfree (matches);
+}
+
+/* Compare a possibly-quoted filename TEXT from the line buffer and a possible
+ MATCH that is the product of filename completion, which acts on the dequoted
+ text. */
+static int
+compare_match (char *text, const char *match)
+{
+ char *temp;
+ int r;
+
+ if (rl_filename_completion_desired && rl_filename_quoting_desired &&
+ rl_completion_found_quote && rl_filename_dequoting_function)
+ {
+ temp = (*rl_filename_dequoting_function) (text, rl_completion_quote_character);
+ r = strcmp (temp, match);
+ xfree (temp);
+ return r;
+ }
+ return (strcmp (text, match));
+}
+
+/* Complete the word at or before point.
+ WHAT_TO_DO says what to do with the completion.
+ `?' means list the possible completions.
+ TAB means do standard completion.
+ `*' means insert all of the possible completions.
+ `!' means to do standard completion, and list all possible completions if
+ there is more than one.
+ `@' means to do standard completion, and list all possible completions if
+ there is more than one and partial completion is not possible. */
+int
+rl_complete_internal (int what_to_do)
+{
+ char **matches;
+ rl_compentry_func_t *our_func;
+ int start, end, delimiter, found_quote, i, nontrivial_lcd;
+ char *text, *saved_line_buffer;
+ char quote_char;
+ int tlen, mlen, saved_last_completion_failed;
+
+ RL_SETSTATE(RL_STATE_COMPLETING);
+
+ saved_last_completion_failed = last_completion_failed;
+
+ set_completion_defaults (what_to_do);
+
+ saved_line_buffer = rl_line_buffer ? savestring (rl_line_buffer) : (char *)NULL;
+ our_func = rl_completion_entry_function
+ ? rl_completion_entry_function
+ : rl_filename_completion_function;
+ /* We now look backwards for the start of a filename/variable word. */
+ end = rl_point;
+ found_quote = delimiter = 0;
+ quote_char = '\0';
+
+ if (rl_point)
+ /* This (possibly) changes rl_point. If it returns a non-zero char,
+ we know we have an open quote. */
+ quote_char = _rl_find_completion_word (&found_quote, &delimiter);
+
+ start = rl_point;
+ rl_point = end;
+
+ text = rl_copy_text (start, end);
+ matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char);
+ /* nontrivial_lcd is set if the common prefix adds something to the word
+ being completed. */
+ nontrivial_lcd = matches && compare_match (text, matches[0]) != 0;
+ if (what_to_do == '!' || what_to_do == '@')
+ tlen = strlen (text);
+ xfree (text);
+
+ if (matches == 0)
+ {
+ rl_ding ();
+ FREE (saved_line_buffer);
+ completion_changed_buffer = 0;
+ last_completion_failed = 1;
+ RL_UNSETSTATE(RL_STATE_COMPLETING);
+ _rl_reset_completion_state ();
+ return (0);
+ }
+
+ /* If we are matching filenames, the attempted completion function will
+ have set rl_filename_completion_desired to a non-zero value. The basic
+ rl_filename_completion_function does this. */
+ i = rl_filename_completion_desired;
+
+ if (postprocess_matches (&matches, i) == 0)
+ {
+ rl_ding ();
+ FREE (saved_line_buffer);
+ completion_changed_buffer = 0;
+ last_completion_failed = 1;
+ RL_UNSETSTATE(RL_STATE_COMPLETING);
+ _rl_reset_completion_state ();
+ return (0);
+ }
+
+ if (matches && matches[0] && *matches[0])
+ last_completion_failed = 0;
+
+ switch (what_to_do)
+ {
+ case TAB:
+ case '!':
+ case '@':
+ /* Insert the first match with proper quoting. */
+ if (what_to_do == TAB)
+ {
+ if (*matches[0])
+ insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, &quote_char);
+ }
+ else if (*matches[0] && matches[1] == 0)
+ /* should we perform the check only if there are multiple matches? */
+ insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, &quote_char);
+ else if (*matches[0]) /* what_to_do != TAB && multiple matches */
+ {
+ mlen = *matches[0] ? strlen (matches[0]) : 0;
+ if (mlen >= tlen)
+ insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, &quote_char);
+ }
+
+ /* If there are more matches, ring the bell to indicate.
+ If we are in vi mode, Posix.2 says to not ring the bell.
+ If the `show-all-if-ambiguous' variable is set, display
+ all the matches immediately. Otherwise, if this was the
+ only match, and we are hacking files, check the file to
+ see if it was a directory. If so, and the `mark-directories'
+ variable is set, add a '/' to the name. If not, and we
+ are at the end of the line, then add a space. */
+ if (matches[1])
+ {
+ if (what_to_do == '!')
+ {
+ display_matches (matches);
+ break;
+ }
+ else if (what_to_do == '@')
+ {
+ if (nontrivial_lcd == 0)
+ display_matches (matches);
+ break;
+ }
+ else if (rl_editing_mode != vi_mode)
+ rl_ding (); /* There are other matches remaining. */
+ }
+ else
+ append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd);
+
+ break;
+
+ case '*':
+ insert_all_matches (matches, start, &quote_char);
+ break;
+
+ case '?':
+ /* Let's try to insert a single match here if the last completion failed
+ but this attempt returned a single match. */
+ if (saved_last_completion_failed && matches[0] && *matches[0] && matches[1] == 0)
+ {
+ insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, &quote_char);
+ append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd);
+ break;
+ }
+
+ if (rl_completion_display_matches_hook == 0)
+ {
+ _rl_sigcleanup = _rl_complete_sigcleanup;
+ _rl_sigcleanarg = matches;
+ _rl_complete_display_matches_interrupt = 0;
+ }
+ display_matches (matches);
+ if (_rl_complete_display_matches_interrupt)
+ {
+ matches = 0; /* already freed by rl_complete_sigcleanup */
+ _rl_complete_display_matches_interrupt = 0;
+ if (rl_signal_event_hook)
+ (*rl_signal_event_hook) (); /* XXX */
+ }
+ _rl_sigcleanup = 0;
+ _rl_sigcleanarg = 0;
+ break;
+
+ default:
+ _rl_ttymsg ("bad value %d for what_to_do in rl_complete", what_to_do);
+ rl_ding ();
+ FREE (saved_line_buffer);
+ RL_UNSETSTATE(RL_STATE_COMPLETING);
+ _rl_free_match_list (matches);
+ _rl_reset_completion_state ();
+ return 1;
+ }
+
+ _rl_free_match_list (matches);
+
+ /* Check to see if the line has changed through all of this manipulation. */
+ if (saved_line_buffer)
+ {
+ completion_changed_buffer = strcmp (rl_line_buffer, saved_line_buffer) != 0;
+ xfree (saved_line_buffer);
+ }
+
+ RL_UNSETSTATE(RL_STATE_COMPLETING);
+ _rl_reset_completion_state ();
+
+ RL_CHECK_SIGNALS ();
+ return 0;
+}
+
+/***************************************************************/
+/* */
+/* Application-callable completion match generator functions */
+/* */
+/***************************************************************/
+
+/* Return an array of (char *) which is a list of completions for TEXT.
+ If there are no completions, return a NULL pointer.
+ The first entry in the returned array is the substitution for TEXT.
+ The remaining entries are the possible completions.
+ The array is terminated with a NULL pointer.
+
+ ENTRY_FUNCTION is a function of two args, and returns a (char *).
+ The first argument is TEXT.
+ The second is a state argument; it should be zero on the first call, and
+ non-zero on subsequent calls. It returns a NULL pointer to the caller
+ when there are no more matches.
+ */
+char **
+rl_completion_matches (const char *text, rl_compentry_func_t *entry_function)
+{
+ register int i;
+
+ /* Number of slots in match_list. */
+ int match_list_size;
+
+ /* The list of matches. */
+ char **match_list;
+
+ /* Number of matches actually found. */
+ int matches;
+
+ /* Temporary string binder. */
+ char *string;
+
+ matches = 0;
+ match_list_size = 10;
+ match_list = (char **)xmalloc ((match_list_size + 1) * sizeof (char *));
+ match_list[1] = (char *)NULL;
+
+ while (string = (*entry_function) (text, matches))
+ {
+ if (RL_SIG_RECEIVED ())
+ {
+ /* Start at 1 because we don't set matches[0] in this function.
+ Only free the list members if we're building match list from
+ rl_filename_completion_function, since we know that doesn't
+ free the strings it returns. */
+ if (entry_function == rl_filename_completion_function)
+ {
+ for (i = 1; match_list[i]; i++)
+ xfree (match_list[i]);
+ }
+ xfree (match_list);
+ match_list = 0;
+ match_list_size = 0;
+ matches = 0;
+ RL_CHECK_SIGNALS ();
+ }
+
+ if (matches + 1 >= match_list_size)
+ match_list = (char **)xrealloc
+ (match_list, ((match_list_size += 10) + 1) * sizeof (char *));
+
+ if (match_list == 0)
+ return (match_list);
+
+ match_list[++matches] = string;
+ match_list[matches + 1] = (char *)NULL;
+ }
+
+ /* If there were any matches, then look through them finding out the
+ lowest common denominator. That then becomes match_list[0]. */
+ if (matches)
+ compute_lcd_of_matches (match_list, matches, text);
+ else /* There were no matches. */
+ {
+ xfree (match_list);
+ match_list = (char **)NULL;
+ }
+ return (match_list);
+}
+
+/* A completion function for usernames.
+ TEXT contains a partial username preceded by a random
+ character (usually `~'). */
+char *
+rl_username_completion_function (const char *text, int state)
+{
+#if defined (__WIN32__) || defined (__OPENNT)
+ return (char *)NULL;
+#else /* !__WIN32__ && !__OPENNT) */
+ static char *username = (char *)NULL;
+ static struct passwd *entry;
+ static int namelen, first_char, first_char_loc;
+ char *value;
+
+ if (state == 0)
+ {
+ FREE (username);
+
+ first_char = *text;
+ first_char_loc = first_char == '~';
+
+ username = savestring (&text[first_char_loc]);
+ namelen = strlen (username);
+#if defined (HAVE_GETPWENT)
+ setpwent ();
+#endif
+ }
+
+#if defined (HAVE_GETPWENT)
+ while (entry = getpwent ())
+ {
+ /* Null usernames should result in all users as possible completions. */
+ if (namelen == 0 || (STREQN (username, entry->pw_name, namelen)))
+ break;
+ }
+#endif
+
+ if (entry == 0)
+ {
+#if defined (HAVE_GETPWENT)
+ endpwent ();
+#endif
+ return ((char *)NULL);
+ }
+ else
+ {
+ value = (char *)xmalloc (2 + strlen (entry->pw_name));
+
+ *value = *text;
+
+ strcpy (value + first_char_loc, entry->pw_name);
+
+ if (first_char == '~')
+ rl_filename_completion_desired = 1;
+
+ return (value);
+ }
+#endif /* !__WIN32__ && !__OPENNT */
+}
+
+/* Return non-zero if CONVFN matches FILENAME up to the length of FILENAME
+ (FILENAME_LEN). If _rl_completion_case_fold is set, compare without
+ regard to the alphabetic case of characters. If
+ _rl_completion_case_map is set, make `-' and `_' equivalent. CONVFN is
+ the possibly-converted directory entry; FILENAME is what the user typed. */
+static int
+complete_fncmp (const char *convfn, int convlen, const char *filename, int filename_len)
+{
+ register char *s1, *s2;
+ int d, len;
+#if defined (HANDLE_MULTIBYTE)
+ size_t v1, v2;
+ mbstate_t ps1, ps2;
+ WCHAR_T wc1, wc2;
+#endif
+
+#if defined (HANDLE_MULTIBYTE)
+ memset (&ps1, 0, sizeof (mbstate_t));
+ memset (&ps2, 0, sizeof (mbstate_t));
+#endif
+
+ if (filename_len == 0)
+ return 1;
+ if (convlen < filename_len)
+ return 0;
+
+ len = filename_len;
+ s1 = (char *)convfn;
+ s2 = (char *)filename;
+
+ /* Otherwise, if these match up to the length of filename, then
+ it is a match. */
+ if (_rl_completion_case_fold && _rl_completion_case_map)
+ {
+ /* Case-insensitive comparison treating _ and - as equivalent */
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ do
+ {
+ v1 = MBRTOWC (&wc1, s1, convlen, &ps1);
+ v2 = MBRTOWC (&wc2, s2, filename_len, &ps2);
+ if (v1 == 0 && v2 == 0)
+ return 1;
+ else if (MB_INVALIDCH (v1) || MB_INVALIDCH (v2))
+ {
+ if (*s1 != *s2) /* do byte comparison */
+ return 0;
+ else if ((*s1 == '-' || *s1 == '_') && (*s2 == '-' || *s2 == '_'))
+ return 0;
+ s1++; s2++; len--;
+ continue;
+ }
+ wc1 = towlower (wc1);
+ wc2 = towlower (wc2);
+ s1 += v1;
+ s2 += v1;
+ len -= v1;
+ if ((wc1 == L'-' || wc1 == L'_') && (wc2 == L'-' || wc2 == L'_'))
+ continue;
+ if (wc1 != wc2)
+ return 0;
+ }
+ while (len != 0);
+ }
+ else
+#endif
+ {
+ do
+ {
+ d = _rl_to_lower (*s1) - _rl_to_lower (*s2);
+ /* *s1 == [-_] && *s2 == [-_] */
+ if ((*s1 == '-' || *s1 == '_') && (*s2 == '-' || *s2 == '_'))
+ d = 0;
+ if (d != 0)
+ return 0;
+ s1++; s2++; /* already checked convlen >= filename_len */
+ }
+ while (--len != 0);
+ }
+
+ return 1;
+ }
+ else if (_rl_completion_case_fold)
+ {
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ do
+ {
+ v1 = MBRTOWC (&wc1, s1, convlen, &ps1);
+ v2 = MBRTOWC (&wc2, s2, filename_len, &ps2);
+ if (v1 == 0 && v2 == 0)
+ return 1;
+ else if (MB_INVALIDCH (v1) || MB_INVALIDCH (v2))
+ {
+ if (*s1 != *s2) /* do byte comparison */
+ return 0;
+ s1++; s2++; len--;
+ continue;
+ }
+ wc1 = towlower (wc1);
+ wc2 = towlower (wc2);
+ if (wc1 != wc2)
+ return 0;
+ s1 += v1;
+ s2 += v1;
+ len -= v1;
+ }
+ while (len != 0);
+ return 1;
+ }
+ else
+#endif
+ if ((_rl_to_lower (convfn[0]) == _rl_to_lower (filename[0])) &&
+ (convlen >= filename_len) &&
+ (_rl_strnicmp (filename, convfn, filename_len) == 0))
+ return 1;
+ }
+ else
+ {
+ if ((convfn[0] == filename[0]) &&
+ (convlen >= filename_len) &&
+ (strncmp (filename, convfn, filename_len) == 0))
+ return 1;
+ }
+ return 0;
+}
+
+/* Okay, now we write the entry_function for filename completion. In the
+ general case. Note that completion in the shell is a little different
+ because of all the pathnames that must be followed when looking up the
+ completion for a command. */
+char *
+rl_filename_completion_function (const char *text, int state)
+{
+ static DIR *directory = (DIR *)NULL;
+ static char *filename = (char *)NULL;
+ static char *dirname = (char *)NULL;
+ static char *users_dirname = (char *)NULL;
+ static int filename_len;
+ char *temp, *dentry, *convfn;
+ int dirlen, dentlen, convlen;
+ int tilde_dirname;
+ struct dirent *entry;
+
+ /* If we don't have any state, then do some initialization. */
+ if (state == 0)
+ {
+ /* If we were interrupted before closing the directory or reading
+ all of its contents, close it. */
+ if (directory)
+ {
+ closedir (directory);
+ directory = (DIR *)NULL;
+ }
+ FREE (dirname);
+ FREE (filename);
+ FREE (users_dirname);
+
+ filename = savestring (text);
+ if (*text == 0)
+ text = ".";
+ dirname = savestring (text);
+
+ temp = strrchr (dirname, '/');
+
+#if defined (__MSDOS__) || defined (_WIN32)
+ /* special hack for //X/... */
+ if (dirname[0] == '/' && dirname[1] == '/' && ISALPHA ((unsigned char)dirname[2]) && dirname[3] == '/')
+ temp = strrchr (dirname + 3, '/');
+#endif
+
+ if (temp)
+ {
+ strcpy (filename, ++temp);
+ *temp = '\0';
+ }
+#if defined (__MSDOS__) || (defined (_WIN32) && !defined (__CYGWIN__))
+ /* searches from current directory on the drive */
+ else if (ISALPHA ((unsigned char)dirname[0]) && dirname[1] == ':')
+ {
+ strcpy (filename, dirname + 2);
+ dirname[2] = '\0';
+ }
+#endif
+ else
+ {
+ dirname[0] = '.';
+ dirname[1] = '\0';
+ }
+
+ /* We aren't done yet. We also support the "~user" syntax. */
+
+ /* Save the version of the directory that the user typed, dequoting
+ it if necessary. */
+ if (rl_completion_found_quote && rl_filename_dequoting_function)
+ users_dirname = (*rl_filename_dequoting_function) (dirname, rl_completion_quote_character);
+ else
+ users_dirname = savestring (dirname);
+
+ tilde_dirname = 0;
+ if (*dirname == '~')
+ {
+ temp = tilde_expand (dirname);
+ xfree (dirname);
+ dirname = temp;
+ tilde_dirname = 1;
+ }
+
+ /* We have saved the possibly-dequoted version of the directory name
+ the user typed. Now transform the directory name we're going to
+ pass to opendir(2). The directory rewrite hook modifies only the
+ directory name; the directory completion hook modifies both the
+ directory name passed to opendir(2) and the version the user
+ typed. Both the directory completion and rewrite hooks should perform
+ any necessary dequoting. The hook functions return 1 if they modify
+ the directory name argument. If either hook returns 0, it should
+ not modify the directory name pointer passed as an argument. */
+ if (rl_directory_rewrite_hook)
+ (*rl_directory_rewrite_hook) (&dirname);
+ else if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&dirname))
+ {
+ xfree (users_dirname);
+ users_dirname = savestring (dirname);
+ }
+ else if (tilde_dirname == 0 && rl_completion_found_quote && rl_filename_dequoting_function)
+ {
+ /* delete single and double quotes */
+ xfree (dirname);
+ dirname = savestring (users_dirname);
+ }
+ directory = opendir (dirname);
+
+ /* Now dequote a non-null filename. FILENAME will not be NULL, but may
+ be empty. */
+ if (*filename && rl_completion_found_quote && rl_filename_dequoting_function)
+ {
+ /* delete single and double quotes */
+ temp = (*rl_filename_dequoting_function) (filename, rl_completion_quote_character);
+ xfree (filename);
+ filename = temp;
+ }
+ filename_len = strlen (filename);
+
+ rl_filename_completion_desired = 1;
+ }
+
+ /* At this point we should entertain the possibility of hacking wildcarded
+ filenames, like /usr/man/man<WILD>/te<TAB>. If the directory name
+ contains globbing characters, then build an array of directories, and
+ then map over that list while completing. */
+ /* *** UNIMPLEMENTED *** */
+
+ /* Now that we have some state, we can read the directory. */
+
+ entry = (struct dirent *)NULL;
+ while (directory && (entry = readdir (directory)))
+ {
+ convfn = dentry = entry->d_name;
+ convlen = dentlen = D_NAMLEN (entry);
+
+ if (rl_filename_rewrite_hook)
+ {
+ convfn = (*rl_filename_rewrite_hook) (dentry, dentlen);
+ convlen = (convfn == dentry) ? dentlen : strlen (convfn);
+ }
+
+ /* Special case for no filename. If the user has disabled the
+ `match-hidden-files' variable, skip filenames beginning with `.'.
+ All other entries except "." and ".." match. */
+ if (filename_len == 0)
+ {
+ if (_rl_match_hidden_files == 0 && HIDDEN_FILE (convfn))
+ continue;
+
+ if (convfn[0] != '.' ||
+ (convfn[1] && (convfn[1] != '.' || convfn[2])))
+ break;
+ }
+ else
+ {
+ if (complete_fncmp (convfn, convlen, filename, filename_len))
+ break;
+ }
+ }
+
+ if (entry == 0)
+ {
+ if (directory)
+ {
+ closedir (directory);
+ directory = (DIR *)NULL;
+ }
+ if (dirname)
+ {
+ xfree (dirname);
+ dirname = (char *)NULL;
+ }
+ if (filename)
+ {
+ xfree (filename);
+ filename = (char *)NULL;
+ }
+ if (users_dirname)
+ {
+ xfree (users_dirname);
+ users_dirname = (char *)NULL;
+ }
+
+ return (char *)NULL;
+ }
+ else
+ {
+ /* dirname && (strcmp (dirname, ".") != 0) */
+ if (dirname && (dirname[0] != '.' || dirname[1]))
+ {
+ if (rl_complete_with_tilde_expansion && *users_dirname == '~')
+ {
+ dirlen = strlen (dirname);
+ temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry));
+ strcpy (temp, dirname);
+ /* Canonicalization cuts off any final slash present. We
+ may need to add it back. */
+ if (dirname[dirlen - 1] != '/')
+ {
+ temp[dirlen++] = '/';
+ temp[dirlen] = '\0';
+ }
+ }
+ else
+ {
+ dirlen = strlen (users_dirname);
+ temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry));
+ strcpy (temp, users_dirname);
+ /* Make sure that temp has a trailing slash here. */
+ if (users_dirname[dirlen - 1] != '/')
+ temp[dirlen++] = '/';
+ }
+
+ strcpy (temp + dirlen, convfn);
+ }
+ else
+ temp = savestring (convfn);
+
+ if (convfn != dentry)
+ xfree (convfn);
+
+ return (temp);
+ }
+}
+
+/* An initial implementation of a menu completion function a la tcsh. The
+ first time (if the last readline command was not rl_old_menu_complete), we
+ generate the list of matches. This code is very similar to the code in
+ rl_complete_internal -- there should be a way to combine the two. Then,
+ for each item in the list of matches, we insert the match in an undoable
+ fashion, with the appropriate character appended (this happens on the
+ second and subsequent consecutive calls to rl_old_menu_complete). When we
+ hit the end of the match list, we restore the original unmatched text,
+ ring the bell, and reset the counter to zero. */
+int
+rl_old_menu_complete (int count, int invoking_key)
+{
+ rl_compentry_func_t *our_func;
+ int matching_filenames, found_quote;
+
+ static char *orig_text;
+ static char **matches = (char **)0;
+ static int match_list_index = 0;
+ static int match_list_size = 0;
+ static int orig_start, orig_end;
+ static char quote_char;
+ static int delimiter;
+
+ /* The first time through, we generate the list of matches and set things
+ up to insert them. */
+ if (rl_last_func != rl_old_menu_complete)
+ {
+ /* Clean up from previous call, if any. */
+ FREE (orig_text);
+ if (matches)
+ _rl_free_match_list (matches);
+
+ match_list_index = match_list_size = 0;
+ matches = (char **)NULL;
+
+ rl_completion_invoking_key = invoking_key;
+
+ RL_SETSTATE(RL_STATE_COMPLETING);
+
+ /* Only the completion entry function can change these. */
+ set_completion_defaults ('%');
+
+ our_func = rl_menu_completion_entry_function;
+ if (our_func == 0)
+ our_func = rl_completion_entry_function
+ ? rl_completion_entry_function
+ : rl_filename_completion_function;
+
+ /* We now look backwards for the start of a filename/variable word. */
+ orig_end = rl_point;
+ found_quote = delimiter = 0;
+ quote_char = '\0';
+
+ if (rl_point)
+ /* This (possibly) changes rl_point. If it returns a non-zero char,
+ we know we have an open quote. */
+ quote_char = _rl_find_completion_word (&found_quote, &delimiter);
+
+ orig_start = rl_point;
+ rl_point = orig_end;
+
+ orig_text = rl_copy_text (orig_start, orig_end);
+ matches = gen_completion_matches (orig_text, orig_start, orig_end,
+ our_func, found_quote, quote_char);
+
+ /* If we are matching filenames, the attempted completion function will
+ have set rl_filename_completion_desired to a non-zero value. The basic
+ rl_filename_completion_function does this. */
+ matching_filenames = rl_filename_completion_desired;
+
+ if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0)
+ {
+ rl_ding ();
+ FREE (matches);
+ matches = (char **)0;
+ FREE (orig_text);
+ orig_text = (char *)0;
+ completion_changed_buffer = 0;
+ RL_UNSETSTATE(RL_STATE_COMPLETING);
+ return (0);
+ }
+
+ RL_UNSETSTATE(RL_STATE_COMPLETING);
+
+ for (match_list_size = 0; matches[match_list_size]; match_list_size++)
+ ;
+ /* matches[0] is lcd if match_list_size > 1, but the circular buffer
+ code below should take care of it. */
+
+ if (match_list_size > 1 && _rl_complete_show_all)
+ display_matches (matches);
+ }
+
+ /* Now we have the list of matches. Replace the text between
+ rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with
+ matches[match_list_index], and add any necessary closing char. */
+
+ if (matches == 0 || match_list_size == 0)
+ {
+ rl_ding ();
+ FREE (matches);
+ matches = (char **)0;
+ completion_changed_buffer = 0;
+ return (0);
+ }
+
+ match_list_index += count;
+ if (match_list_index < 0)
+ {
+ while (match_list_index < 0)
+ match_list_index += match_list_size;
+ }
+ else
+ match_list_index %= match_list_size;
+
+ if (match_list_index == 0 && match_list_size > 1)
+ {
+ rl_ding ();
+ insert_match (orig_text, orig_start, MULT_MATCH, &quote_char);
+ }
+ else
+ {
+ insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, &quote_char);
+ append_to_match (matches[match_list_index], delimiter, quote_char,
+ compare_match (orig_text, matches[match_list_index]));
+ }
+
+ completion_changed_buffer = 1;
+ return (0);
+}
+
+/* The current version of menu completion.
+ The differences between this function and the original are:
+
+1. It honors the maximum number of completions variable (completion-query-items)
+2. It appends to the word as usual if there is only one match
+3. It displays the common prefix if there is one, and makes it the first menu
+ choice if the menu-complete-display-prefix option is enabled
+*/
+
+int
+rl_menu_complete (int count, int ignore)
+{
+ rl_compentry_func_t *our_func;
+ int matching_filenames, found_quote;
+
+ static char *orig_text;
+ static char **matches = (char **)0;
+ static int match_list_index = 0;
+ static int match_list_size = 0;
+ static int nontrivial_lcd = 0;
+ static int full_completion = 0; /* set to 1 if menu completion should reinitialize on next call */
+ static int orig_start, orig_end;
+ static char quote_char;
+ static int delimiter, cstate;
+
+ /* The first time through, we generate the list of matches and set things
+ up to insert them. */
+ if ((rl_last_func != rl_menu_complete && rl_last_func != rl_backward_menu_complete) || full_completion)
+ {
+ /* Clean up from previous call, if any. */
+ FREE (orig_text);
+ if (matches)
+ _rl_free_match_list (matches);
+
+ match_list_index = match_list_size = 0;
+ matches = (char **)NULL;
+
+ full_completion = 0;
+
+ RL_SETSTATE(RL_STATE_COMPLETING);
+
+ /* Only the completion entry function can change these. */
+ set_completion_defaults ('%');
+
+ our_func = rl_menu_completion_entry_function;
+ if (our_func == 0)
+ our_func = rl_completion_entry_function
+ ? rl_completion_entry_function
+ : rl_filename_completion_function;
+
+ /* We now look backwards for the start of a filename/variable word. */
+ orig_end = rl_point;
+ found_quote = delimiter = 0;
+ quote_char = '\0';
+
+ if (rl_point)
+ /* This (possibly) changes rl_point. If it returns a non-zero char,
+ we know we have an open quote. */
+ quote_char = _rl_find_completion_word (&found_quote, &delimiter);
+
+ orig_start = rl_point;
+ rl_point = orig_end;
+
+ orig_text = rl_copy_text (orig_start, orig_end);
+ matches = gen_completion_matches (orig_text, orig_start, orig_end,
+ our_func, found_quote, quote_char);
+
+ nontrivial_lcd = matches && compare_match (orig_text, matches[0]) != 0;
+
+ /* If we are matching filenames, the attempted completion function will
+ have set rl_filename_completion_desired to a non-zero value. The basic
+ rl_filename_completion_function does this. */
+ matching_filenames = rl_filename_completion_desired;
+
+ if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0)
+ {
+ rl_ding ();
+ FREE (matches);
+ matches = (char **)0;
+ FREE (orig_text);
+ orig_text = (char *)0;
+ completion_changed_buffer = 0;
+ RL_UNSETSTATE(RL_STATE_COMPLETING);
+ return (0);
+ }
+
+ RL_UNSETSTATE(RL_STATE_COMPLETING);
+
+ for (match_list_size = 0; matches[match_list_size]; match_list_size++)
+ ;
+
+ if (match_list_size == 0)
+ {
+ rl_ding ();
+ FREE (matches);
+ matches = (char **)0;
+ match_list_index = 0;
+ completion_changed_buffer = 0;
+ return (0);
+ }
+
+ /* matches[0] is lcd if match_list_size > 1, but the circular buffer
+ code below should take care of it. */
+ if (*matches[0])
+ {
+ insert_match (matches[0], orig_start, matches[1] ? MULT_MATCH : SINGLE_MATCH, &quote_char);
+ orig_end = orig_start + strlen (matches[0]);
+ completion_changed_buffer = STREQ (orig_text, matches[0]) == 0;
+ }
+
+ if (match_list_size > 1 && _rl_complete_show_all)
+ {
+ display_matches (matches);
+ /* If there are so many matches that the user has to be asked
+ whether or not he wants to see the matches, menu completion
+ is unwieldy. */
+ if (rl_completion_query_items > 0 && match_list_size >= rl_completion_query_items)
+ {
+ rl_ding ();
+ FREE (matches);
+ matches = (char **)0;
+ full_completion = 1;
+ return (0);
+ }
+ else if (_rl_menu_complete_prefix_first)
+ {
+ rl_ding ();
+ return (0);
+ }
+ }
+ else if (match_list_size <= 1)
+ {
+ append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd);
+ full_completion = 1;
+ return (0);
+ }
+ else if (_rl_menu_complete_prefix_first && match_list_size > 1)
+ {
+ rl_ding ();
+ return (0);
+ }
+ }
+
+ /* Now we have the list of matches. Replace the text between
+ rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with
+ matches[match_list_index], and add any necessary closing char. */
+
+ if (matches == 0 || match_list_size == 0)
+ {
+ rl_ding ();
+ FREE (matches);
+ matches = (char **)0;
+ completion_changed_buffer = 0;
+ return (0);
+ }
+
+ match_list_index += count;
+ if (match_list_index < 0)
+ {
+ while (match_list_index < 0)
+ match_list_index += match_list_size;
+ }
+ else
+ match_list_index %= match_list_size;
+
+ if (match_list_index == 0 && match_list_size > 1)
+ {
+ rl_ding ();
+ insert_match (matches[0], orig_start, MULT_MATCH, &quote_char);
+ }
+ else
+ {
+ insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, &quote_char);
+ append_to_match (matches[match_list_index], delimiter, quote_char,
+ compare_match (orig_text, matches[match_list_index]));
+ }
+
+ completion_changed_buffer = 1;
+ return (0);
+}
+
+int
+rl_backward_menu_complete (int count, int key)
+{
+ /* Positive arguments to backward-menu-complete translate into negative
+ arguments for menu-complete, and vice versa. */
+ return (rl_menu_complete (-count, key));
+}
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..521e778
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,311 @@
+/* config.h.in. Maintained by hand. */
+
+/* Template definitions for autoconf */
+
+/* These are set by AC_USE_SYSTEM_EXTENSIONS */
+#undef __EXTENSIONS__
+#undef _ALL_SOURCE
+#undef _GNU_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_1_SOURCE
+#undef _POSIX_PTHREAD_SEMANTICS
+#undef _TANDEM_SOURCE
+#undef _MINIX
+
+/* Define NO_MULTIBYTE_SUPPORT to not compile in support for multibyte
+ characters, even if the OS supports them. */
+#undef NO_MULTIBYTE_SUPPORT
+
+#undef _FILE_OFFSET_BITS
+
+/* Characteristics of the compiler. */
+#undef inline
+
+#undef sig_atomic_t
+
+#undef size_t
+
+#undef ssize_t
+
+#undef const
+
+#undef volatile
+
+#undef PROTOTYPES
+#undef __PROTOTYPES
+
+#undef __CHAR_UNSIGNED__
+
+/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly. */
+#undef STAT_MACROS_BROKEN
+
+/* Define if you have the chown function. */
+#undef HAVE_CHOWN
+
+/* Define if you have the fcntl function. */
+#undef HAVE_FCNTL
+
+/* Define if you have the fnmatch function. */
+#undef HAVE_FNMATCH
+
+/* Define if you have the getpwent function. */
+#undef HAVE_GETPWENT
+
+/* Define if you have the getpwnam function. */
+#undef HAVE_GETPWNAM
+
+/* Define if you have the getpwuid function. */
+#undef HAVE_GETPWUID
+
+/* Define if you have the gettimeofday function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define if you have the isascii function. */
+#undef HAVE_ISASCII
+
+/* Define if you have the iswctype function. */
+#undef HAVE_ISWCTYPE
+
+/* Define if you have the iswlower function. */
+#undef HAVE_ISWLOWER
+
+/* Define if you have the iswupper function. */
+#undef HAVE_ISWUPPER
+
+/* Define if you have the isxdigit function. */
+#undef HAVE_ISXDIGIT
+
+/* Define if you have the kill function. */
+#undef HAVE_KILL
+
+/* Define if you have the lstat function. */
+#undef HAVE_LSTAT
+
+/* Define if you have the mbrlen function. */
+#undef HAVE_MBRLEN
+
+/* Define if you have the mbrtowc function. */
+#undef HAVE_MBRTOWC
+
+/* Define if you have the mbsrtowcs function. */
+#undef HAVE_MBSRTOWCS
+
+/* Define if you have the memmove function. */
+#undef HAVE_MEMMOVE
+
+/* Define if you have the pselect function. */
+#undef HAVE_PSELECT
+
+/* Define if you have the putenv function. */
+#undef HAVE_PUTENV
+
+/* Define if you have the readlink function. */
+#undef HAVE_READLINK
+
+/* Define if you have the select function. */
+#undef HAVE_SELECT
+
+/* Define if you have the setenv function. */
+#undef HAVE_SETENV
+
+/* Define if you have the setitimer function. */
+#undef HAVE_SETITIMER
+
+/* Define if you have the setlocale function. */
+#undef HAVE_SETLOCALE
+
+/* Define if you have the strcasecmp function. */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strcoll function. */
+#undef HAVE_STRCOLL
+
+#undef STRCOLL_BROKEN
+
+/* Define if you have the strpbrk function. */
+#undef HAVE_STRPBRK
+
+/* Define if you have the sysconf function. */
+#undef HAVE_SYSCONF
+
+/* Define if you have the tcgetattr function. */
+#undef HAVE_TCGETATTR
+
+/* Define if you have the towlower function. */
+#undef HAVE_TOWLOWER
+
+/* Define if you have the towupper function. */
+#undef HAVE_TOWUPPER
+
+/* Define if you have the vsnprintf function. */
+#undef HAVE_VSNPRINTF
+
+/* Define if you have the wcrtomb function. */
+#undef HAVE_WCRTOMB
+
+/* Define if you have the wcscoll function. */
+#undef HAVE_WCSCOLL
+
+/* Define if you have the wctype function. */
+#undef HAVE_WCTYPE
+
+/* Define if you have the wcwidth function. */
+#undef HAVE_WCWIDTH
+
+/* and whether it works */
+#undef WCWIDTH_BROKEN
+
+/* Define if you have the <dirent.h> header file. */
+#undef HAVE_DIRENT_H
+
+/* Define if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <langinfo.h> header file. */
+#undef HAVE_LANGINFO_H
+
+/* Define if you have the <libaudit.h> header file. */
+#undef HAVE_LIBAUDIT_H
+
+/* Define if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define if you have the <ndir.h> header file. */
+#undef HAVE_NDIR_H
+
+/* Define if you have the <ncurses/termcap.h> header file. */
+#undef HAVE_NCURSES_TERMCAP_H
+
+/* Define if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define if you have the <stdarg.h> header file. */
+#undef HAVE_STDARG_H
+
+/* Define if you have the <stdbool.h> header file. */
+#undef HAVE_STDBOOL_H
+
+/* Define if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define if you have the <sys/dir.h> header file. */
+#undef HAVE_SYS_DIR_H
+
+/* Define if you have the <sys/file.h> header file. */
+#undef HAVE_SYS_FILE_H
+
+/* Define if you have the <sys/ioctl.h> header file. */
+#undef HAVE_SYS_IOCTL_H
+
+/* Define if you have the <sys/ndir.h> header file. */
+#undef HAVE_SYS_NDIR_H
+
+/* Define if you have the <sys/pte.h> header file. */
+#undef HAVE_SYS_PTE_H
+
+/* Define if you have the <sys/ptem.h> header file. */
+#undef HAVE_SYS_PTEM_H
+
+/* Define if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define if you have the <sys/stream.h> header file. */
+#undef HAVE_SYS_STREAM_H
+
+/* Define if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define if you have the <termcap.h> header file. */
+#undef HAVE_TERMCAP_H
+
+/* Define if you have the <termio.h> header file. */
+#undef HAVE_TERMIO_H
+
+/* Define if you have the <termios.h> header file. */
+#undef HAVE_TERMIOS_H
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <varargs.h> header file. */
+#undef HAVE_VARARGS_H
+
+/* Define if you have the <wchar.h> header file. */
+#undef HAVE_WCHAR_H
+
+/* Define if you have the <wctype.h> header file. */
+#undef HAVE_WCTYPE_H
+
+#undef HAVE_MBSTATE_T
+
+/* Define if you have wchar_t in <wctype.h>. */
+#undef HAVE_WCHAR_T
+
+/* Define if you have wctype_t in <wctype.h>. */
+#undef HAVE_WCTYPE_T
+
+/* Define if you have wint_t in <wctype.h>. */
+#undef HAVE_WINT_T
+
+/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+#undef HAVE_LANGINFO_CODESET
+
+/* Define if you have <linux/audit.h> and it defines AUDIT_USER_TTY */
+#undef HAVE_DECL_AUDIT_USER_TTY
+
+/* Definitions pulled in from aclocal.m4. */
+#undef GWINSZ_IN_SYS_IOCTL
+
+#undef STRUCT_WINSIZE_IN_SYS_IOCTL
+
+#undef STRUCT_WINSIZE_IN_TERMIOS
+
+#undef TIOCSTAT_IN_SYS_IOCTL
+
+#undef FIONREAD_IN_SYS_IOCTL
+
+#undef SPEED_T_IN_SYS_TYPES
+
+#undef HAVE_GETPW_DECLS
+
+#undef HAVE_STRUCT_DIRENT_D_INO
+
+#undef HAVE_STRUCT_DIRENT_D_FILENO
+
+#undef HAVE_STRUCT_DIRENT_D_NAMLEN
+
+#undef HAVE_TIMEVAL
+
+#undef HAVE_BSD_SIGNALS
+
+#undef HAVE_POSIX_SIGNALS
+
+#undef HAVE_USG_SIGHOLD
+
+#undef MUST_REINSTALL_SIGHANDLERS
+
+#undef HAVE_POSIX_SIGSETJMP
+
+#undef CTYPE_NON_ASCII
+
+/* modify settings or make new ones based on what autoconf tells us. */
+
+/* Ultrix botches type-ahead when switching from canonical to
+ non-canonical mode, at least through version 4.3 */
+#if !defined (HAVE_TERMIOS_H) || !defined (HAVE_TCGETATTR) || defined (ultrix)
+# define TERMIOS_MISSING
+#endif
+
+/* VARARGS defines moved to rlstdc.h */
diff --git a/configure b/configure
new file mode 100755
index 0000000..cb4e07a
--- /dev/null
+++ b/configure
@@ -0,0 +1,9219 @@
+#! /bin/sh
+# From configure.ac for Readline 8.2, version 2.97.
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.71 for readline 8.2.
+#
+# Report bugs to <bug-readline@gnu.org>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else \$as_nop
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
+
+else \$as_nop
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null
+then :
+ as_have_required=yes
+else $as_nop
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
+
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
+
+
+ if test "x$CONFIG_SHELL" != x
+then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and
+$0: bug-readline@gnu.org about your system, including any
+$0: error possibly output before this message. Then install
+$0: a modern shell, or manually run the script under such a
+$0: shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='readline'
+PACKAGE_TARNAME='readline'
+PACKAGE_VERSION='8.2'
+PACKAGE_STRING='readline 8.2'
+PACKAGE_BUGREPORT='bug-readline@gnu.org'
+PACKAGE_URL=''
+
+ac_unique_file="readline.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_header_c_list=
+ac_subst_vars='LTLIBOBJS
+TERMCAP_PKG_CONFIG_LIB
+TERMCAP_LIB
+LIBVERSION
+ARFLAGS
+LOCAL_DEFS
+LOCAL_LDFLAGS
+LOCAL_CFLAGS
+BUILD_DIR
+EXAMPLES_INSTALL_TARGET
+SHARED_INSTALL_TARGET
+STATIC_INSTALL_TARGET
+SHARED_TARGET
+STATIC_TARGET
+SHLIB_MINOR
+SHLIB_MAJOR
+SHLIB_LIBS
+SHLIB_DLLVERSION
+SHLIB_LIBVERSION
+SHLIB_LIBSUFF
+SHLIB_LIBPREF
+SHLIB_DOT
+SHLIB_XLDFLAGS
+SHLIB_STATUS
+SHOBJ_STATUS
+SHOBJ_LIBS
+SHOBJ_XLDFLAGS
+SHOBJ_LDFLAGS
+SHOBJ_LD
+SHOBJ_CFLAGS
+SHOBJ_CC
+LIBOBJS
+MAKE_SHELL
+RANLIB
+AR
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+EGREP
+GREP
+CPP
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+SET_MAKE
+CROSS_COMPILE
+BRACKETED_PASTE
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+runstatedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+with_curses
+with_shared_termcap_library
+enable_multibyte
+enable_shared
+enable_static
+enable_install_examples
+enable_bracketed_paste_default
+enable_largefile
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir runstatedir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures readline 8.2 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/readline]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of readline 8.2:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-multibyte enable multibyte characters if OS supports them
+ --enable-shared build shared libraries [[default=YES]]
+ --enable-static build static libraries [[default=YES]]
+ --disable-install-examples
+ don't install examples [[default=install]]
+ --disable-bracketed-paste-default
+ disable bracketed paste by default
+ [[default=enable]]
+ --disable-largefile omit support for large files
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-curses use the curses library instead of the termcap
+ library
+ --with-shared-termcap-library
+ link the readline shared library against the
+ termcap/curses shared library [[default=NO]]
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <bug-readline@gnu.org>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+readline configure 8.2
+generated by GNU Autoconf 2.71
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below. */
+
+#include <limits.h>
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main (void)
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ----------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_c_check_member ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+printf %s "checking for $2.$3... " >&6; }
+if eval test \${$4+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main (void)
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$4=yes"
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main (void)
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$4=yes"
+else $as_nop
+ eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$4
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_member
+
+# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR
+# ------------------------------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR.
+ac_fn_check_decl ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+printf %s "checking whether $as_decl_name is declared... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ eval ac_save_FLAGS=\$$6
+ as_fn_append $6 " $5"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ eval $6=\$ac_save_FLAGS
+
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_check_decl
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_hi=$ac_mid; break
+else $as_nop
+ as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_lo=$ac_mid; break
+else $as_nop
+ as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+else $as_nop
+ ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_hi=$ac_mid
+else $as_nop
+ as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+static long int longval (void) { return $2; }
+static unsigned long int ulongval (void) { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main (void)
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if (($2) < 0)
+ {
+ long int i = longval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%ld", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%lu", i);
+ }
+ /* Do not output a trailing newline, as this causes \r\n confusion
+ on some platforms. */
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else $as_nop
+ ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+ fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by readline $as_me 8.2, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ $ $0$ac_configure_args_raw
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ printf "%s\n" "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ printf "%s\n" "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ printf "%s\n" "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ printf "%s\n" "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+printf "%s\n" "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ ac_site_files="$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
+else
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+fi
+
+for ac_site_file in $ac_site_files
+do
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H"
+as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="install-sh config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}/./support"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+LIBVERSION=8.2
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+
+opt_curses=no
+opt_shared_termcap_lib=no
+
+
+# Check whether --with-curses was given.
+if test ${with_curses+y}
+then :
+ withval=$with_curses; opt_curses=$withval
+fi
+
+
+# Check whether --with-shared-termcap-library was given.
+if test ${with_shared_termcap_library+y}
+then :
+ withval=$with_shared_termcap_library; opt_shared_termcap_lib=$withval
+fi
+
+
+if test "$opt_curses" = "yes"; then
+ prefer_curses=yes
+fi
+
+opt_multibyte=yes
+opt_static_libs=yes
+opt_shared_libs=yes
+opt_install_examples=yes
+opt_bracketed_paste_default=yes
+
+# Check whether --enable-multibyte was given.
+if test ${enable_multibyte+y}
+then :
+ enableval=$enable_multibyte; opt_multibyte=$enableval
+fi
+
+# Check whether --enable-shared was given.
+if test ${enable_shared+y}
+then :
+ enableval=$enable_shared; opt_shared_libs=$enableval
+fi
+
+# Check whether --enable-static was given.
+if test ${enable_static+y}
+then :
+ enableval=$enable_static; opt_static_libs=$enableval
+fi
+
+# Check whether --enable-install-examples was given.
+if test ${enable_install_examples+y}
+then :
+ enableval=$enable_install_examples; opt_install_examples=$enableval
+fi
+
+
+# Check whether --enable-bracketed-paste-default was given.
+if test ${enable_bracketed_paste_default+y}
+then :
+ enableval=$enable_bracketed_paste_default; opt_bracketed_paste_default=$enableval
+fi
+
+
+if test $opt_multibyte = no; then
+printf "%s\n" "#define NO_MULTIBYTE_SUPPORT 1" >>confdefs.h
+
+fi
+
+if test $opt_bracketed_paste_default = yes; then
+ BRACKETED_PASTE='-DBRACKETED_PASTE_DEFAULT=1'
+else
+ BRACKETED_PASTE='-DBRACKETED_PASTE_DEFAULT=0'
+fi
+
+
+
+
+CROSS_COMPILE=
+if test "x$cross_compiling" = "xyes"; then
+ case "${host}" in
+ *-cygwin*)
+ cross_cache=${srcdir}/cross-build/cygwin.cache
+ ;;
+ *-mingw*)
+ cross_cache=${srcdir}/cross-build/mingw.cache
+ ;;
+ i[3456]86-*-beos*)
+ cross_cache=${srcdir}/cross-build/x86-beos.cache
+ ;;
+ *) echo "configure: cross-compiling for $host is not supported" >&2
+ ;;
+ esac
+ if test -n "${cross_cache}" && test -r "${cross_cache}"; then
+ echo "loading cross-build cache file ${cross_cache}"
+ . ${cross_cache}
+ fi
+ unset cross_cache
+ CROSS_COMPILE='-DCROSS_COMPILING'
+
+fi
+
+echo ""
+echo "Beginning configuration for readline-$LIBVERSION for ${host_cpu}-${host_vendor}-${host_os}"
+echo ""
+
+# We want these before the checks, so the checks can modify their values.
+test -z "$CFLAGS" && want_auto_cflags=1
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ SET_MAKE=
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion -version; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else $as_nop
+ ac_file=''
+fi
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main (void)
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+else $as_nop
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
+do
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
+ fi
+done
+
+
+
+
+
+
+
+
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
+
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
+printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; }
+if test ${ac_cv_safe_to_define___extensions__+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define __EXTENSIONS__ 1
+ $ac_includes_default
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_safe_to_define___extensions__=yes
+else $as_nop
+ ac_cv_safe_to_define___extensions__=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
+printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5
+printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; }
+if test ${ac_cv_should_define__xopen_source+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_should_define__xopen_source=no
+ if test $ac_cv_header_wchar_h = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <wchar.h>
+ mbstate_t x;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #define _XOPEN_SOURCE 500
+ #include <wchar.h>
+ mbstate_t x;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_should_define__xopen_source=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5
+printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; }
+
+ printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h
+
+ printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h
+
+ printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h
+
+ if test $ac_cv_header_minix_config_h = yes
+then :
+ MINIX=yes
+ printf "%s\n" "#define _MINIX 1" >>confdefs.h
+
+ printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h
+
+else $as_nop
+ MINIX=
+fi
+ if test $ac_cv_safe_to_define___extensions__ = yes
+then :
+ printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h
+
+fi
+ if test $ac_cv_should_define__xopen_source = yes
+then :
+ printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h
+
+fi
+
+
+# If we're using gcc and the user hasn't specified CFLAGS, add -O2 to CFLAGS
+if test -n "$want_auto_cflags" ; then
+ AUTO_CFLAGS="-g ${GCC:+-O2}"
+ STYLE_CFLAGS="${GCC:+-Wno-parentheses} ${GCC:+-Wno-format-security} ${GCC:+-Wno-tautological-constant-out-of-range-compare}"
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+printf %s "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test ${ac_cv_prog_CPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CC needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+printf "%s\n" "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+if test $ac_cv_c_compiler_gnu = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5
+printf %s "checking whether $CC needs -traditional... " >&6; }
+if test ${ac_cv_prog_gcc_traditional+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_pattern="Autoconf.*'x'"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sgtty.h>
+Autoconf TIOCGETP
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "$ac_pattern" >/dev/null 2>&1
+then :
+ ac_cv_prog_gcc_traditional=yes
+else $as_nop
+ ac_cv_prog_gcc_traditional=no
+fi
+rm -rf conftest*
+
+
+ if test $ac_cv_prog_gcc_traditional = no; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <termio.h>
+Autoconf TCGETA
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "$ac_pattern" >/dev/null 2>&1
+then :
+ ac_cv_prog_gcc_traditional=yes
+fi
+rm -rf conftest*
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5
+printf "%s\n" "$ac_cv_prog_gcc_traditional" >&6; }
+ if test $ac_cv_prog_gcc_traditional = yes; then
+ CC="$CC -traditional"
+ fi
+fi
+
+
+ # Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in #((
+ ./ | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test ${ac_cv_path_install+y}; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+ ac_ct_AR=$AR
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="ar"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_AR" = x; then
+ AR=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+else
+ AR="$ac_cv_prog_AR"
+fi
+
+test -n "$ARFLAGS" || ARFLAGS="cr"
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+MAKE_SHELL=/bin/sh
+
+
+
+# codeset.m4 serial 5 (gettext-0.18.2)
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+printf %s "checking for an ANSI C-conforming const... " >&6; }
+if test ${ac_cv_c_const+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this sort of thing. */
+ typedef int charset[2];
+ const charset cs = { 0, 0 };
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *pcpcc;
+ char **ppc;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* IBM XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ pcpcc = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++pcpcc;
+ ppc = (char**) pcpcc;
+ pcpcc = (char const *const *) ppc;
+ { /* SCO 3.2v4 cc rejects this sort of thing. */
+ char tx;
+ char *t = &tx;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ if (s) return 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; } bx;
+ struct s *b = &bx; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ if (!foo) return 0;
+ }
+ return !cs[0] && !zero.x;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_const=yes
+else $as_nop
+ ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+printf "%s\n" "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+printf "%s\n" "#define const /**/" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+printf %s "checking for inline... " >&6; }
+if test ${ac_cv_c_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo (void) {return 0; }
+$ac_kw foo_t foo (void) {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+printf "%s\n" "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+if test "$ac_prog_cc_stdc" != no; then
+
+printf "%s\n" "#define PROTOTYPES 1" >>confdefs.h
+
+
+printf "%s\n" "#define __PROTOTYPES 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5
+printf %s "checking whether char is unsigned... " >&6; }
+if test ${ac_cv_c_char_unsigned+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main (void)
+{
+static int test_array [1 - 2 * !(((char) -1) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_char_unsigned=no
+else $as_nop
+ ac_cv_c_char_unsigned=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5
+printf "%s\n" "$ac_cv_c_char_unsigned" >&6; }
+if test $ac_cv_c_char_unsigned = yes; then
+ printf "%s\n" "#define __CHAR_UNSIGNED__ 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5
+printf %s "checking for working volatile... " >&6; }
+if test ${ac_cv_c_volatile+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+volatile int x;
+int * volatile y = (int *) 0;
+return !x && !y;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_volatile=yes
+else $as_nop
+ ac_cv_c_volatile=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5
+printf "%s\n" "$ac_cv_c_volatile" >&6; }
+if test $ac_cv_c_volatile = no; then
+
+printf "%s\n" "#define volatile /**/" >>confdefs.h
+
+fi
+
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define size_t unsigned int" >>confdefs.h
+
+fi
+
+ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
+if test "x$ac_cv_type_ssize_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define ssize_t int" >>confdefs.h
+
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5
+printf %s "checking whether stat file-mode macros are broken... " >&6; }
+if test ${ac_cv_header_stat_broken+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined S_ISBLK && defined S_IFDIR
+extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1];
+#endif
+
+#if defined S_ISBLK && defined S_IFCHR
+extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1];
+#endif
+
+#if defined S_ISLNK && defined S_IFREG
+extern char c3[S_ISLNK (S_IFREG) ? -1 : 1];
+#endif
+
+#if defined S_ISSOCK && defined S_IFREG
+extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1];
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_header_stat_broken=no
+else $as_nop
+ ac_cv_header_stat_broken=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5
+printf "%s\n" "$ac_cv_header_stat_broken" >&6; }
+if test $ac_cv_header_stat_broken = yes; then
+
+printf "%s\n" "#define STAT_MACROS_BROKEN 1" >>confdefs.h
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+ as_ac_Header=`printf "%s\n" "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
+printf %s "checking for $ac_hdr that defines DIR... " >&6; }
+if eval test \${$as_ac_Header+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main (void)
+{
+if ((DIR *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$as_ac_Header=yes"
+else $as_nop
+ eval "$as_ac_Header=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$as_ac_Header
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Header"\" = x"yes"
+then :
+ cat >>confdefs.h <<_ACEOF
+#define `printf "%s\n" "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+printf %s "checking for library containing opendir... " >&6; }
+if test ${ac_cv_search_opendir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char opendir ();
+int
+main (void)
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' dir
+do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_opendir+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_opendir+y}
+then :
+
+else $as_nop
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+printf "%s\n" "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+printf %s "checking for library containing opendir... " >&6; }
+if test ${ac_cv_search_opendir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char opendir ();
+int
+main (void)
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' x
+do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_opendir+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_opendir+y}
+then :
+
+else $as_nop
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+printf "%s\n" "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+
+ac_fn_c_check_func "$LINENO" "fcntl" "ac_cv_func_fcntl"
+if test "x$ac_cv_func_fcntl" = xyes
+then :
+ printf "%s\n" "#define HAVE_FCNTL 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday"
+if test "x$ac_cv_func_gettimeofday" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "kill" "ac_cv_func_kill"
+if test "x$ac_cv_func_kill" = xyes
+then :
+ printf "%s\n" "#define HAVE_KILL 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "lstat" "ac_cv_func_lstat"
+if test "x$ac_cv_func_lstat" = xyes
+then :
+ printf "%s\n" "#define HAVE_LSTAT 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "pselect" "ac_cv_func_pselect"
+if test "x$ac_cv_func_pselect" = xyes
+then :
+ printf "%s\n" "#define HAVE_PSELECT 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "readlink" "ac_cv_func_readlink"
+if test "x$ac_cv_func_readlink" = xyes
+then :
+ printf "%s\n" "#define HAVE_READLINK 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select"
+if test "x$ac_cv_func_select" = xyes
+then :
+ printf "%s\n" "#define HAVE_SELECT 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "setitimer" "ac_cv_func_setitimer"
+if test "x$ac_cv_func_setitimer" = xyes
+then :
+ printf "%s\n" "#define HAVE_SETITIMER 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "fnmatch" "ac_cv_func_fnmatch"
+if test "x$ac_cv_func_fnmatch" = xyes
+then :
+ printf "%s\n" "#define HAVE_FNMATCH 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove"
+if test "x$ac_cv_func_memmove" = xyes
+then :
+ printf "%s\n" "#define HAVE_MEMMOVE 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv"
+if test "x$ac_cv_func_putenv" = xyes
+then :
+ printf "%s\n" "#define HAVE_PUTENV 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv"
+if test "x$ac_cv_func_setenv" = xyes
+then :
+ printf "%s\n" "#define HAVE_SETENV 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale"
+if test "x$ac_cv_func_setlocale" = xyes
+then :
+ printf "%s\n" "#define HAVE_SETLOCALE 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp"
+if test "x$ac_cv_func_strcasecmp" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "strpbrk" "ac_cv_func_strpbrk"
+if test "x$ac_cv_func_strpbrk" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRPBRK 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "sysconf" "ac_cv_func_sysconf"
+if test "x$ac_cv_func_sysconf" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYSCONF 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "tcgetattr" "ac_cv_func_tcgetattr"
+if test "x$ac_cv_func_tcgetattr" = xyes
+then :
+ printf "%s\n" "#define HAVE_TCGETATTR 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
+if test "x$ac_cv_func_vsnprintf" = xyes
+then :
+ printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "isascii" "ac_cv_func_isascii"
+if test "x$ac_cv_func_isascii" = xyes
+then :
+ printf "%s\n" "#define HAVE_ISASCII 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "isxdigit" "ac_cv_func_isxdigit"
+if test "x$ac_cv_func_isxdigit" = xyes
+then :
+ printf "%s\n" "#define HAVE_ISXDIGIT 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "getpwent" "ac_cv_func_getpwent"
+if test "x$ac_cv_func_getpwent" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETPWENT 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "getpwnam" "ac_cv_func_getpwnam"
+if test "x$ac_cv_func_getpwnam" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETPWNAM 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "getpwuid" "ac_cv_func_getpwuid"
+if test "x$ac_cv_func_getpwuid" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETPWUID 1" >>confdefs.h
+
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
+printf %s "checking for uid_t in sys/types.h... " >&6; }
+if test ${ac_cv_type_uid_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "uid_t" >/dev/null 2>&1
+then :
+ ac_cv_type_uid_t=yes
+else $as_nop
+ ac_cv_type_uid_t=no
+fi
+rm -rf conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5
+printf "%s\n" "$ac_cv_type_uid_t" >&6; }
+if test $ac_cv_type_uid_t = no; then
+
+printf "%s\n" "#define uid_t int" >>confdefs.h
+
+
+printf "%s\n" "#define gid_t int" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working chown" >&5
+printf %s "checking for working chown... " >&6; }
+if test ${ac_cv_func_chown_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in # ((
+ # Guess yes on glibc systems.
+ *-gnu*) ac_cv_func_chown_works=yes ;;
+ # If we don't know, assume the worst.
+ *) ac_cv_func_chown_works=no ;;
+ esac
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+#include <fcntl.h>
+
+int
+main (void)
+{
+ char *f = "conftest.chown";
+ struct stat before, after;
+
+ if (creat (f, 0600) < 0)
+ return 1;
+ if (stat (f, &before) < 0)
+ return 1;
+ if (chown (f, (uid_t) -1, (gid_t) -1) == -1)
+ return 1;
+ if (stat (f, &after) < 0)
+ return 1;
+ return ! (before.st_uid == after.st_uid && before.st_gid == after.st_gid);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_func_chown_works=yes
+else $as_nop
+ ac_cv_func_chown_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+rm -f conftest.chown
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_chown_works" >&5
+printf "%s\n" "$ac_cv_func_chown_works" >&6; }
+if test $ac_cv_func_chown_works = yes; then
+
+printf "%s\n" "#define HAVE_CHOWN 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strcoll" >&5
+printf %s "checking for working strcoll... " >&6; }
+if test ${ac_cv_func_strcoll_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in # ((
+ # Guess yes on glibc systems.
+ *-gnu*) ac_cv_func_strcoll_works=yes ;;
+ # If we don't know, assume the worst.
+ *) ac_cv_func_strcoll_works=no ;;
+ esac
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main (void)
+{
+return (strcoll ("abc", "def") >= 0 ||
+ strcoll ("ABC", "DEF") >= 0 ||
+ strcoll ("123", "456") >= 0)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_func_strcoll_works=yes
+else $as_nop
+ ac_cv_func_strcoll_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strcoll_works" >&5
+printf "%s\n" "$ac_cv_func_strcoll_works" >&6; }
+if test $ac_cv_func_strcoll_works = yes; then
+
+printf "%s\n" "#define HAVE_STRCOLL 1" >>confdefs.h
+
+fi
+
+
+ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default"
+if test "x$ac_cv_header_fcntl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
+if test "x$ac_cv_header_unistd_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdlib_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "varargs.h" "ac_cv_header_varargs_h" "$ac_includes_default"
+if test "x$ac_cv_header_varargs_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_VARARGS_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "stdarg.h" "ac_cv_header_stdarg_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdarg_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDARG_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "stdbool.h" "ac_cv_header_stdbool_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdbool_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDBOOL_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default"
+if test "x$ac_cv_header_string_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default"
+if test "x$ac_cv_header_strings_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default"
+if test "x$ac_cv_header_limits_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default"
+if test "x$ac_cv_header_locale_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_LOCALE_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "pwd.h" "ac_cv_header_pwd_h" "$ac_includes_default"
+if test "x$ac_cv_header_pwd_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_PWD_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "memory.h" "ac_cv_header_memory_h" "$ac_includes_default"
+if test "x$ac_cv_header_memory_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_MEMORY_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "termcap.h" "ac_cv_header_termcap_h" "$ac_includes_default"
+if test "x$ac_cv_header_termcap_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_TERMCAP_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default"
+if test "x$ac_cv_header_termios_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_TERMIOS_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "termio.h" "ac_cv_header_termio_h" "$ac_includes_default"
+if test "x$ac_cv_header_termio_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_TERMIO_H 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_ioctl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/pte.h" "ac_cv_header_sys_pte_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_pte_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_PTE_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/stream.h" "ac_cv_header_sys_stream_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_stream_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_STREAM_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_select_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_time_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/file.h" "ac_cv_header_sys_file_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_file_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_FILE_H 1" >>confdefs.h
+
+fi
+
+
+ac_fn_c_check_header_compile "$LINENO" "sys/ptem.h" "ac_cv_header_sys_ptem_h" "
+#if HAVE_SYS_STREAM_H
+# include <sys/stream.h>
+#endif
+
+"
+if test "x$ac_cv_header_sys_ptem_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_PTEM_H 1" >>confdefs.h
+
+fi
+
+
+# Check whether --enable-largefile was given.
+if test ${enable_largefile+y}
+then :
+ enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+printf %s "checking for special C compiler options needed for large files... " >&6; }
+if test ${ac_cv_sys_largefile_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_sys_largefile_CC=no
+ if test "$GCC" != yes; then
+ ac_save_CC=$CC
+ while :; do
+ # IRIX 6.2 and later do not support large files by default,
+ # so use the C compiler's -n32 option if that helps.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ CC="$CC -n32"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ break
+ done
+ CC=$ac_save_CC
+ rm -f conftest.$ac_ext
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; }
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if test ${ac_cv_sys_file_offset_bits+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_cv_sys_file_offset_bits=unknown
+ break
+done
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+ no | unknown) ;;
+ *)
+printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h
+;;
+esac
+rm -rf conftest*
+ if test $ac_cv_sys_file_offset_bits = unknown; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+printf %s "checking for _LARGE_FILES value needed for large files... " >&6; }
+if test ${ac_cv_sys_large_files+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_cv_sys_large_files=unknown
+ break
+done
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+printf "%s\n" "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+ no | unknown) ;;
+ *)
+printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h
+;;
+esac
+rm -rf conftest*
+ fi
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for type of signal functions" >&5
+printf %s "checking for type of signal functions... " >&6; }
+if test ${bash_cv_signal_vintage+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+if test ${bash_cv_posix_signals+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <signal.h>
+
+int
+main (void)
+{
+
+ sigset_t ss;
+ struct sigaction sa;
+ sigemptyset(&ss); sigsuspend(&ss);
+ sigaction(SIGINT, &sa, (struct sigaction *) 0);
+ sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ bash_cv_posix_signals=yes
+else $as_nop
+ bash_cv_posix_signals=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+if test $bash_cv_posix_signals = yes; then
+ bash_cv_signal_vintage=posix
+else
+ if test ${bash_cv_bsd_signals+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <signal.h>
+
+int
+main (void)
+{
+
+int mask = sigmask(SIGINT);
+sigsetmask(mask); sigblock(mask); sigpause(mask);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ bash_cv_bsd_signals=yes
+else $as_nop
+ bash_cv_bsd_signals=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+ if test $bash_cv_bsd_signals = yes; then
+ bash_cv_signal_vintage=4.2bsd
+ else
+ if test ${bash_cv_sysv_signals+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <signal.h>
+void foo() { }
+
+int
+main (void)
+{
+
+int mask = sigmask(SIGINT);
+sigset(SIGINT, foo); sigrelse(SIGINT);
+sighold(SIGINT); sigpause(SIGINT);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ bash_cv_sysv_signals=yes
+else $as_nop
+ bash_cv_sysv_signals=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+ if test $bash_cv_sysv_signals = yes; then
+ bash_cv_signal_vintage=svr3
+ else
+ bash_cv_signal_vintage=v7
+ fi
+ fi
+fi
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_signal_vintage" >&5
+printf "%s\n" "$bash_cv_signal_vintage" >&6; }
+if test "$bash_cv_signal_vintage" = posix; then
+printf "%s\n" "#define HAVE_POSIX_SIGNALS 1" >>confdefs.h
+
+elif test "$bash_cv_signal_vintage" = "4.2bsd"; then
+printf "%s\n" "#define HAVE_BSD_SIGNALS 1" >>confdefs.h
+
+elif test "$bash_cv_signal_vintage" = svr3; then
+printf "%s\n" "#define HAVE_USG_SIGHOLD 1" >>confdefs.h
+
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if signal handlers must be reinstalled when invoked" >&5
+printf %s "checking if signal handlers must be reinstalled when invoked... " >&6; }
+if test ${bash_cv_must_reinstall_sighandlers+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&5
+printf "%s\n" "$as_me: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&2;}
+ bash_cv_must_reinstall_sighandlers=no
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+
+typedef void sigfunc();
+
+volatile int nsigint;
+
+#ifdef HAVE_POSIX_SIGNALS
+sigfunc *
+set_signal_handler(sig, handler)
+ int sig;
+ sigfunc *handler;
+{
+ struct sigaction act, oact;
+ act.sa_handler = handler;
+ act.sa_flags = 0;
+ sigemptyset (&act.sa_mask);
+ sigemptyset (&oact.sa_mask);
+ sigaction (sig, &act, &oact);
+ return (oact.sa_handler);
+}
+#else
+#define set_signal_handler(s, h) signal(s, h)
+#endif
+
+void
+sigint(s)
+int s;
+{
+ nsigint++;
+}
+
+int
+main()
+{
+ nsigint = 0;
+ set_signal_handler(SIGINT, sigint);
+ kill((int)getpid(), SIGINT);
+ kill((int)getpid(), SIGINT);
+ exit(nsigint != 2);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ bash_cv_must_reinstall_sighandlers=no
+else $as_nop
+ bash_cv_must_reinstall_sighandlers=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_must_reinstall_sighandlers" >&5
+printf "%s\n" "$bash_cv_must_reinstall_sighandlers" >&6; }
+if test $bash_cv_must_reinstall_sighandlers = yes; then
+printf "%s\n" "#define MUST_REINSTALL_SIGHANDLERS 1" >>confdefs.h
+
+fi
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for presence of POSIX-style sigsetjmp/siglongjmp" >&5
+printf %s "checking for presence of POSIX-style sigsetjmp/siglongjmp... " >&6; }
+if test ${bash_cv_func_sigsetjmp+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to $bash_cv_posix_signals" >&5
+printf "%s\n" "$as_me: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to $bash_cv_posix_signals" >&2;}
+ if test "$bash_cv_posix_signals" = "yes" ; then
+ bash_cv_func_sigsetjmp=present
+ else
+ bash_cv_func_sigsetjmp=missing
+ fi
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/types.h>
+#include <signal.h>
+#include <setjmp.h>
+#include <stdlib.h>
+
+int
+main()
+{
+#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS)
+exit (1);
+#else
+
+int code;
+sigset_t set, oset, nset;
+sigjmp_buf xx;
+
+/* get the mask */
+sigemptyset(&set);
+sigemptyset(&oset);
+
+sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset);
+/* paranoia -- make sure SIGINT is not blocked */
+sigdelset (&oset, SIGINT);
+sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
+
+/* save it */
+code = sigsetjmp(xx, 1);
+if (code)
+{
+ sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &nset);
+ /* could compare nset to oset here, but we just look for SIGINT */
+ if (sigismember (&nset, SIGINT))
+ exit(1);
+ exit(0);
+}
+
+/* change it so that SIGINT is blocked */
+sigaddset(&set, SIGINT);
+sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL);
+
+/* and siglongjmp */
+siglongjmp(xx, 10);
+exit(1);
+#endif
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ bash_cv_func_sigsetjmp=present
+else $as_nop
+ bash_cv_func_sigsetjmp=missing
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_sigsetjmp" >&5
+printf "%s\n" "$bash_cv_func_sigsetjmp" >&6; }
+if test $bash_cv_func_sigsetjmp = present; then
+printf "%s\n" "#define HAVE_POSIX_SIGSETJMP 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lstat" >&5
+printf %s "checking for lstat... " >&6; }
+if test ${bash_cv_func_lstat+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <sys/types.h>
+ #include <sys/stat.h>
+
+int
+main (void)
+{
+ lstat(".",(struct stat *)0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ bash_cv_func_lstat=yes
+else $as_nop
+ bash_cv_func_lstat=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_lstat" >&5
+printf "%s\n" "$bash_cv_func_lstat" >&6; }
+if test $bash_cv_func_lstat = yes; then
+ printf "%s\n" "#define HAVE_LSTAT 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether or not strcoll and strcmp differ" >&5
+printf %s "checking whether or not strcoll and strcmp differ... " >&6; }
+if test ${bash_cv_func_strcoll_broken+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&5
+printf "%s\n" "$as_me: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&2;}
+ bash_cv_func_strcoll_broken=no
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#if defined (HAVE_LOCALE_H)
+#include <locale.h>
+#endif
+#include <string.h>
+#include <stdlib.h>
+
+int
+main(c, v)
+int c;
+char *v[];
+{
+ int r1, r2;
+ char *deflocale, *defcoll;
+
+#ifdef HAVE_SETLOCALE
+ deflocale = setlocale(LC_ALL, "");
+ defcoll = setlocale(LC_COLLATE, "");
+#endif
+
+#ifdef HAVE_STRCOLL
+ /* These two values are taken from tests/glob-test. */
+ r1 = strcoll("abd", "aXd");
+#else
+ r1 = 0;
+#endif
+ r2 = strcmp("abd", "aXd");
+
+ /* These two should both be greater than 0. It is permissible for
+ a system to return different values, as long as the sign is the
+ same. */
+
+ /* Exit with 1 (failure) if these two values are both > 0, since
+ this tests whether strcoll(3) is broken with respect to strcmp(3)
+ in the default locale. */
+ exit (r1 > 0 && r2 > 0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ bash_cv_func_strcoll_broken=yes
+else $as_nop
+ bash_cv_func_strcoll_broken=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_strcoll_broken" >&5
+printf "%s\n" "$bash_cv_func_strcoll_broken" >&6; }
+if test $bash_cv_func_strcoll_broken = yes; then
+printf "%s\n" "#define STRCOLL_BROKEN 1" >>confdefs.h
+
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getpw functions are declared in pwd.h" >&5
+printf %s "checking whether getpw functions are declared in pwd.h... " >&6; }
+if test ${bash_cv_getpw_declared+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <pwd.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "getpwuid" >/dev/null 2>&1
+then :
+ bash_cv_getpw_declared=yes
+else $as_nop
+ bash_cv_getpw_declared=no
+fi
+rm -rf conftest*
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_getpw_declared" >&5
+printf "%s\n" "$bash_cv_getpw_declared" >&6; }
+if test $bash_cv_getpw_declared = yes; then
+printf "%s\n" "#define HAVE_GETPW_DECLS 1" >>confdefs.h
+
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether termios.h defines TIOCGWINSZ" >&5
+printf %s "checking whether termios.h defines TIOCGWINSZ... " >&6; }
+if test ${ac_cv_sys_tiocgwinsz_in_termios_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <termios.h>
+#ifdef TIOCGWINSZ
+ yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ ac_cv_sys_tiocgwinsz_in_termios_h=yes
+else $as_nop
+ ac_cv_sys_tiocgwinsz_in_termios_h=no
+fi
+rm -rf conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5
+printf "%s\n" "$ac_cv_sys_tiocgwinsz_in_termios_h" >&6; }
+
+if test $ac_cv_sys_tiocgwinsz_in_termios_h != yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5
+printf %s "checking whether sys/ioctl.h defines TIOCGWINSZ... " >&6; }
+if test ${ac_cv_sys_tiocgwinsz_in_sys_ioctl_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#ifdef TIOCGWINSZ
+ yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=yes
+else $as_nop
+ ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no
+fi
+rm -rf conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5
+printf "%s\n" "$ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&6; }
+
+ if test $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h = yes; then
+
+printf "%s\n" "#define GWINSZ_IN_SYS_IOCTL 1" >>confdefs.h
+
+ fi
+fi
+
+
+
+ ac_fn_c_check_header_compile "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default"
+if test "x$ac_cv_header_inttypes_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_INTTYPES_H 1" >>confdefs.h
+
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sig_atomic_t in signal.h" >&5
+printf %s "checking for sig_atomic_t in signal.h... " >&6; }
+if test ${ac_cv_have_sig_atomic_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+ #include <signal.h>
+int
+main (void)
+{
+ sig_atomic_t x;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_have_sig_atomic_t=yes
+else $as_nop
+ ac_cv_have_sig_atomic_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sig_atomic_t" >&5
+printf "%s\n" "$ac_cv_have_sig_atomic_t" >&6; }
+if test "$ac_cv_have_sig_atomic_t" = "no"
+then
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sig_atomic_t" >&5
+printf %s "checking for sig_atomic_t... " >&6; }
+if test ${bash_cv_type_sig_atomic_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#if HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#include <signal.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "sig_atomic_t" >/dev/null 2>&1
+then :
+ bash_cv_type_sig_atomic_t=yes
+else $as_nop
+ bash_cv_type_sig_atomic_t=no
+fi
+rm -rf conftest*
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_sig_atomic_t" >&5
+printf "%s\n" "$bash_cv_type_sig_atomic_t" >&6; }
+
+if test $bash_cv_type_sig_atomic_t = no; then
+ printf "%s\n" "#define sig_atomic_t int" >>confdefs.h
+
+fi
+
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for TIOCSTAT in sys/ioctl.h" >&5
+printf %s "checking for TIOCSTAT in sys/ioctl.h... " >&6; }
+if test ${bash_cv_tiocstat_in_ioctl+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+int
+main (void)
+{
+int x = TIOCSTAT;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ bash_cv_tiocstat_in_ioctl=yes
+else $as_nop
+ bash_cv_tiocstat_in_ioctl=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_tiocstat_in_ioctl" >&5
+printf "%s\n" "$bash_cv_tiocstat_in_ioctl" >&6; }
+if test $bash_cv_tiocstat_in_ioctl = yes; then
+printf "%s\n" "#define TIOCSTAT_IN_SYS_IOCTL 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for FIONREAD in sys/ioctl.h" >&5
+printf %s "checking for FIONREAD in sys/ioctl.h... " >&6; }
+if test ${bash_cv_fionread_in_ioctl+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+int
+main (void)
+{
+int x = FIONREAD;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ bash_cv_fionread_in_ioctl=yes
+else $as_nop
+ bash_cv_fionread_in_ioctl=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_fionread_in_ioctl" >&5
+printf "%s\n" "$bash_cv_fionread_in_ioctl" >&6; }
+if test $bash_cv_fionread_in_ioctl = yes; then
+printf "%s\n" "#define FIONREAD_IN_SYS_IOCTL 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for speed_t in sys/types.h" >&5
+printf %s "checking for speed_t in sys/types.h... " >&6; }
+if test ${bash_cv_speed_t_in_sys_types+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+int
+main (void)
+{
+speed_t x;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ bash_cv_speed_t_in_sys_types=yes
+else $as_nop
+ bash_cv_speed_t_in_sys_types=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_speed_t_in_sys_types" >&5
+printf "%s\n" "$bash_cv_speed_t_in_sys_types" >&6; }
+if test $bash_cv_speed_t_in_sys_types = yes; then
+printf "%s\n" "#define SPEED_T_IN_SYS_TYPES 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct winsize in sys/ioctl.h and termios.h" >&5
+printf %s "checking for struct winsize in sys/ioctl.h and termios.h... " >&6; }
+if test ${bash_cv_struct_winsize_header+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+if test ${bash_cv_struct_winsize_ioctl+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+int
+main (void)
+{
+
+struct winsize x;
+if (sizeof (x) > 0) return (0);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ bash_cv_struct_winsize_ioctl=yes
+else $as_nop
+ bash_cv_struct_winsize_ioctl=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+
+
+if test ${bash_cv_struct_winsize_termios+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/termios.h>
+
+int
+main (void)
+{
+
+struct winsize x;
+if (sizeof (x) > 0) return (0);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ bash_cv_struct_winsize_termios=yes
+else $as_nop
+ bash_cv_struct_winsize_termios=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+
+
+
+if test $bash_cv_struct_winsize_ioctl = yes; then
+ bash_cv_struct_winsize_header=ioctl_h
+elif test $bash_cv_struct_winsize_termios = yes; then
+ bash_cv_struct_winsize_header=termios_h
+else
+ bash_cv_struct_winsize_header=other
+fi
+
+fi
+
+if test $bash_cv_struct_winsize_header = ioctl_h; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: sys/ioctl.h" >&5
+printf "%s\n" "sys/ioctl.h" >&6; }
+ printf "%s\n" "#define STRUCT_WINSIZE_IN_SYS_IOCTL 1" >>confdefs.h
+
+elif test $bash_cv_struct_winsize_header = termios_h; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: termios.h" >&5
+printf "%s\n" "termios.h" >&6; }
+ printf "%s\n" "#define STRUCT_WINSIZE_IN_TERMIOS 1" >>confdefs.h
+
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+printf "%s\n" "not found" >&6; }
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct dirent.d_ino" >&5
+printf %s "checking for struct dirent.d_ino... " >&6; }
+if test ${bash_cv_dirent_has_d_ino+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+ac_fn_c_check_member "$LINENO" "struct dirent" "d_ino" "ac_cv_member_struct_dirent_d_ino" "
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+
+"
+if test "x$ac_cv_member_struct_dirent_d_ino" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_INO 1" >>confdefs.h
+
+bash_cv_dirent_has_d_ino=yes
+else $as_nop
+ bash_cv_dirent_has_d_ino=no
+fi
+
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_dirent_has_d_ino" >&5
+printf "%s\n" "$bash_cv_dirent_has_d_ino" >&6; }
+if test $bash_cv_dirent_has_d_ino = yes; then
+printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_INO 1" >>confdefs.h
+
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct dirent.d_fileno" >&5
+printf %s "checking for struct dirent.d_fileno... " >&6; }
+if test ${bash_cv_dirent_has_d_fileno+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+ac_fn_c_check_member "$LINENO" "struct dirent" "d_fileno" "ac_cv_member_struct_dirent_d_fileno" "
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+
+"
+if test "x$ac_cv_member_struct_dirent_d_fileno" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_FILENO 1" >>confdefs.h
+
+bash_cv_dirent_has_d_fileno=yes
+else $as_nop
+ bash_cv_dirent_has_d_fileno=no
+fi
+
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_dirent_has_d_fileno" >&5
+printf "%s\n" "$bash_cv_dirent_has_d_fileno" >&6; }
+if test $bash_cv_dirent_has_d_fileno = yes; then
+printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_FILENO 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timeval in sys/time.h and time.h" >&5
+printf %s "checking for struct timeval in sys/time.h and time.h... " >&6; }
+if test ${bash_cv_struct_timeval+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+
+int
+main (void)
+{
+static struct timeval x; x.tv_sec = x.tv_usec;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ bash_cv_struct_timeval=yes
+else $as_nop
+ bash_cv_struct_timeval=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_struct_timeval" >&5
+printf "%s\n" "$bash_cv_struct_timeval" >&6; }
+if test $bash_cv_struct_timeval = yes; then
+ printf "%s\n" "#define HAVE_TIMEVAL 1" >>confdefs.h
+
+fi
+
+
+ac_fn_c_check_header_compile "$LINENO" "libaudit.h" "ac_cv_header_libaudit_h" "$ac_includes_default"
+if test "x$ac_cv_header_libaudit_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBAUDIT_H 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5
+printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; }
+if test ${ac_cv_c_undeclared_builtin_options+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_CFLAGS=$CFLAGS
+ ac_cv_c_undeclared_builtin_options='cannot detect'
+ for ac_arg in '' -fno-builtin; do
+ CFLAGS="$ac_save_CFLAGS $ac_arg"
+ # This test program should *not* compile successfully.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+(void) strchr;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ # This test program should compile successfully.
+ # No library function is consistently available on
+ # freestanding implementations, so test against a dummy
+ # declaration. Include always-available headers on the
+ # off chance that they somehow elicit warnings.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <float.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stddef.h>
+extern void ac_decl (int, char *);
+
+int
+main (void)
+{
+(void) ac_decl (0, (char *) 0);
+ (void) ac_decl;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if test x"$ac_arg" = x
+then :
+ ac_cv_c_undeclared_builtin_options='none needed'
+else $as_nop
+ ac_cv_c_undeclared_builtin_options=$ac_arg
+fi
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+ CFLAGS=$ac_save_CFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5
+printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; }
+ case $ac_cv_c_undeclared_builtin_options in #(
+ 'cannot detect') :
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot make $CC report undeclared builtins
+See \`config.log' for more details" "$LINENO" 5; } ;; #(
+ 'none needed') :
+ ac_c_undeclared_builtin_options='' ;; #(
+ *) :
+ ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;;
+esac
+
+ac_fn_check_decl "$LINENO" "AUDIT_USER_TTY" "ac_cv_have_decl_AUDIT_USER_TTY" "#include <linux/audit.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_AUDIT_USER_TTY" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_AUDIT_USER_TTY $ac_have_decl" >>confdefs.h
+
+
+case "$host_os" in
+aix*) prefer_curses=yes ;;
+esac
+
+if test "X$bash_cv_termcap_lib" = "X"; then
+_bash_needmsg=yes
+else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which library has the termcap functions" >&5
+printf %s "checking which library has the termcap functions... " >&6; }
+_bash_needmsg=
+fi
+if test ${bash_cv_termcap_lib+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_fn_c_check_func "$LINENO" "tgetent" "ac_cv_func_tgetent"
+if test "x$ac_cv_func_tgetent" = xyes
+then :
+ bash_cv_termcap_lib=libc
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltermcap" >&5
+printf %s "checking for tgetent in -ltermcap... " >&6; }
+if test ${ac_cv_lib_termcap_tgetent+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltermcap $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char tgetent ();
+int
+main (void)
+{
+return tgetent ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_termcap_tgetent=yes
+else $as_nop
+ ac_cv_lib_termcap_tgetent=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termcap_tgetent" >&5
+printf "%s\n" "$ac_cv_lib_termcap_tgetent" >&6; }
+if test "x$ac_cv_lib_termcap_tgetent" = xyes
+then :
+ bash_cv_termcap_lib=libtermcap
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltinfo" >&5
+printf %s "checking for tgetent in -ltinfo... " >&6; }
+if test ${ac_cv_lib_tinfo_tgetent+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltinfo $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char tgetent ();
+int
+main (void)
+{
+return tgetent ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_tinfo_tgetent=yes
+else $as_nop
+ ac_cv_lib_tinfo_tgetent=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tinfo_tgetent" >&5
+printf "%s\n" "$ac_cv_lib_tinfo_tgetent" >&6; }
+if test "x$ac_cv_lib_tinfo_tgetent" = xyes
+then :
+ bash_cv_termcap_lib=libtinfo
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lcurses" >&5
+printf %s "checking for tgetent in -lcurses... " >&6; }
+if test ${ac_cv_lib_curses_tgetent+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcurses $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char tgetent ();
+int
+main (void)
+{
+return tgetent ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_curses_tgetent=yes
+else $as_nop
+ ac_cv_lib_curses_tgetent=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_tgetent" >&5
+printf "%s\n" "$ac_cv_lib_curses_tgetent" >&6; }
+if test "x$ac_cv_lib_curses_tgetent" = xyes
+then :
+ bash_cv_termcap_lib=libcurses
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lncurses" >&5
+printf %s "checking for tgetent in -lncurses... " >&6; }
+if test ${ac_cv_lib_ncurses_tgetent+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lncurses $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char tgetent ();
+int
+main (void)
+{
+return tgetent ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_ncurses_tgetent=yes
+else $as_nop
+ ac_cv_lib_ncurses_tgetent=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_tgetent" >&5
+printf "%s\n" "$ac_cv_lib_ncurses_tgetent" >&6; }
+if test "x$ac_cv_lib_ncurses_tgetent" = xyes
+then :
+ bash_cv_termcap_lib=libncurses
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lncursesw" >&5
+printf %s "checking for tgetent in -lncursesw... " >&6; }
+if test ${ac_cv_lib_ncursesw_tgetent+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lncursesw $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char tgetent ();
+int
+main (void)
+{
+return tgetent ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_ncursesw_tgetent=yes
+else $as_nop
+ ac_cv_lib_ncursesw_tgetent=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncursesw_tgetent" >&5
+printf "%s\n" "$ac_cv_lib_ncursesw_tgetent" >&6; }
+if test "x$ac_cv_lib_ncursesw_tgetent" = xyes
+then :
+ bash_cv_termcap_lib=libncursesw
+else $as_nop
+ bash_cv_termcap_lib=gnutermcap
+fi
+
+fi
+
+fi
+
+fi
+
+fi
+
+fi
+
+fi
+
+if test "X$_bash_needmsg" = "Xyes"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which library has the termcap functions" >&5
+printf %s "checking which library has the termcap functions... " >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: using $bash_cv_termcap_lib" >&5
+printf "%s\n" "using $bash_cv_termcap_lib" >&6; }
+if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then
+LDFLAGS="$LDFLAGS -L./lib/termcap"
+TERMCAP_LIB="./lib/termcap/libtermcap.a"
+TERMCAP_DEP="./lib/termcap/libtermcap.a"
+elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then
+TERMCAP_LIB=-ltermcap
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libtinfo; then
+TERMCAP_LIB=-ltinfo
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libncurses; then
+TERMCAP_LIB=-lncurses
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libc; then
+TERMCAP_LIB=
+TERMCAP_DEP=
+else
+# we assume ncurses is installed somewhere the linker can find it
+TERMCAP_LIB=-lncurses
+TERMCAP_DEP=
+fi
+
+if test "$TERMCAP_LIB" = "./lib/termcap/libtermcap.a"; then
+ if test "$prefer_curses" = yes; then
+ TERMCAP_LIB=-lcurses
+ else
+ TERMCAP_LIB=-ltermcap #default
+ fi
+fi
+# Windows ncurses installation
+if test "$TERMCAP_LIB" = "-lncurses"; then
+ ac_fn_c_check_header_compile "$LINENO" "ncurses/termcap.h" "ac_cv_header_ncurses_termcap_h" "$ac_includes_default"
+if test "x$ac_cv_header_ncurses_termcap_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NCURSES_TERMCAP_H 1" >>confdefs.h
+
+fi
+
+fi
+case "$opt_shared_termcap_lib" in
+[Yy][Ee][Ss]) SHARED_TERMCAP="$TERMCAP_LIB" ;;
+-l*) SHARED_TERMCAP="$opt_shared_termcap_lib" ;;
+esac
+
+case "$TERMCAP_LIB" in
+-ltinfo) TERMCAP_PKG_CONFIG_LIB=tinfo ;;
+-lcurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;;
+-lncurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;;
+-ltermcap) TERMCAP_PKG_CONFIG_LIB=termcap ;;
+*) TERMCAP_PKG_CONFIG_LIB=termcap ;;
+esac
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5
+printf %s "checking for nl_langinfo and CODESET... " >&6; }
+if test ${am_cv_langinfo_codeset+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+int
+main (void)
+{
+char* cs = nl_langinfo(CODESET); return !cs;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ am_cv_langinfo_codeset=yes
+else $as_nop
+ am_cv_langinfo_codeset=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5
+printf "%s\n" "$am_cv_langinfo_codeset" >&6; }
+ if test $am_cv_langinfo_codeset = yes; then
+
+printf "%s\n" "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h
+
+ fi
+
+
+ac_fn_c_check_header_compile "$LINENO" "wctype.h" "ac_cv_header_wctype_h" "$ac_includes_default"
+if test "x$ac_cv_header_wctype_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCTYPE_H 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_header_compile "$LINENO" "wchar.h" "ac_cv_header_wchar_h" "$ac_includes_default"
+if test "x$ac_cv_header_wchar_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCHAR_H 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_header_compile "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default"
+if test "x$ac_cv_header_langinfo_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_LANGINFO_H 1" >>confdefs.h
+
+fi
+
+
+ac_fn_c_check_header_compile "$LINENO" "mbstr.h" "ac_cv_header_mbstr_h" "$ac_includes_default"
+if test "x$ac_cv_header_mbstr_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_MBSTR_H 1" >>confdefs.h
+
+fi
+
+
+ac_fn_c_check_func "$LINENO" "mbrlen" "ac_cv_func_mbrlen"
+if test "x$ac_cv_func_mbrlen" = xyes
+then :
+ printf "%s\n" "#define HAVE_MBRLEN 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "mbscasecmp" "ac_cv_func_mbscasecmp"
+if test "x$ac_cv_func_mbscasecmp" = xyes
+then :
+ printf "%s\n" "#define HAVE_MBSCMP 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "mbscmp" "ac_cv_func_mbscmp"
+if test "x$ac_cv_func_mbscmp" = xyes
+then :
+ printf "%s\n" "#define HAVE_MBSCMP 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "mbsnrtowcs" "ac_cv_func_mbsnrtowcs"
+if test "x$ac_cv_func_mbsnrtowcs" = xyes
+then :
+ printf "%s\n" "#define HAVE_MBSNRTOWCS 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "mbsrtowcs" "ac_cv_func_mbsrtowcs"
+if test "x$ac_cv_func_mbsrtowcs" = xyes
+then :
+ printf "%s\n" "#define HAVE_MBSRTOWCS 1" >>confdefs.h
+
+fi
+
+
+ac_fn_c_check_func "$LINENO" "mbschr" "ac_cv_func_mbschr"
+if test "x$ac_cv_func_mbschr" = xyes
+then :
+ printf "%s\n" "#define HAVE_MBSCHR 1" >>confdefs.h
+
+else $as_nop
+ case " $LIBOBJS " in
+ *" mbschr.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS mbschr.$ac_objext"
+ ;;
+esac
+
+fi
+
+
+ac_fn_c_check_func "$LINENO" "wcrtomb" "ac_cv_func_wcrtomb"
+if test "x$ac_cv_func_wcrtomb" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCRTOMB 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "wcscoll" "ac_cv_func_wcscoll"
+if test "x$ac_cv_func_wcscoll" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCSCOLL 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "wcsdup" "ac_cv_func_wcsdup"
+if test "x$ac_cv_func_wcsdup" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCSDUP 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "wcwidth" "ac_cv_func_wcwidth"
+if test "x$ac_cv_func_wcwidth" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCWIDTH 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "wctype" "ac_cv_func_wctype"
+if test "x$ac_cv_func_wctype" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCTYPE 1" >>confdefs.h
+
+fi
+
+
+ac_fn_c_check_func "$LINENO" "wcswidth" "ac_cv_func_wcswidth"
+if test "x$ac_cv_func_wcswidth" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCSWIDTH 1" >>confdefs.h
+
+else $as_nop
+ case " $LIBOBJS " in
+ *" wcswidth.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS wcswidth.$ac_objext"
+ ;;
+esac
+
+fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc and mbstate_t are properly declared" >&5
+printf %s "checking whether mbrtowc and mbstate_t are properly declared... " >&6; }
+if test ${ac_cv_func_mbrtowc+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+int
+main (void)
+{
+wchar_t wc;
+ char const s[] = "";
+ size_t n = 1;
+ mbstate_t state;
+ return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_func_mbrtowc=yes
+else $as_nop
+ ac_cv_func_mbrtowc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mbrtowc" >&5
+printf "%s\n" "$ac_cv_func_mbrtowc" >&6; }
+ if test $ac_cv_func_mbrtowc = yes; then
+
+printf "%s\n" "#define HAVE_MBRTOWC 1" >>confdefs.h
+
+ fi
+
+if test $ac_cv_func_mbrtowc = yes; then
+ printf "%s\n" "#define HAVE_MBSTATE_T 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "iswlower" "ac_cv_func_iswlower"
+if test "x$ac_cv_func_iswlower" = xyes
+then :
+ printf "%s\n" "#define HAVE_ISWLOWER 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "iswupper" "ac_cv_func_iswupper"
+if test "x$ac_cv_func_iswupper" = xyes
+then :
+ printf "%s\n" "#define HAVE_ISWUPPER 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower"
+if test "x$ac_cv_func_towlower" = xyes
+then :
+ printf "%s\n" "#define HAVE_TOWLOWER 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "towupper" "ac_cv_func_towupper"
+if test "x$ac_cv_func_towupper" = xyes
+then :
+ printf "%s\n" "#define HAVE_TOWUPPER 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "iswctype" "ac_cv_func_iswctype"
+if test "x$ac_cv_func_iswctype" = xyes
+then :
+ printf "%s\n" "#define HAVE_ISWCTYPE 1" >>confdefs.h
+
+fi
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wchar_t in wchar.h" >&5
+printf %s "checking for wchar_t in wchar.h... " >&6; }
+if test ${bash_cv_type_wchar_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <wchar.h>
+int
+main (void)
+{
+
+ wchar_t foo;
+ foo = 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ bash_cv_type_wchar_t=yes
+else $as_nop
+ bash_cv_type_wchar_t=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_wchar_t" >&5
+printf "%s\n" "$bash_cv_type_wchar_t" >&6; }
+if test $bash_cv_type_wchar_t = yes; then
+
+printf "%s\n" "#define HAVE_WCHAR_T 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctype_t in wctype.h" >&5
+printf %s "checking for wctype_t in wctype.h... " >&6; }
+if test ${bash_cv_type_wctype_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <wctype.h>
+int
+main (void)
+{
+
+ wctype_t foo;
+ foo = 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ bash_cv_type_wctype_t=yes
+else $as_nop
+ bash_cv_type_wctype_t=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_wctype_t" >&5
+printf "%s\n" "$bash_cv_type_wctype_t" >&6; }
+if test $bash_cv_type_wctype_t = yes; then
+
+printf "%s\n" "#define HAVE_WCTYPE_T 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wint_t in wctype.h" >&5
+printf %s "checking for wint_t in wctype.h... " >&6; }
+if test ${bash_cv_type_wint_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <wctype.h>
+int
+main (void)
+{
+
+ wint_t foo;
+ foo = 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ bash_cv_type_wint_t=yes
+else $as_nop
+ bash_cv_type_wint_t=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_wint_t" >&5
+printf "%s\n" "$bash_cv_type_wint_t" >&6; }
+if test $bash_cv_type_wint_t = yes; then
+
+printf "%s\n" "#define HAVE_WINT_T 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wcwidth broken with unicode combining characters" >&5
+printf %s "checking for wcwidth broken with unicode combining characters... " >&6; }
+if test ${bash_cv_wcwidth_broken+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ bash_cv_wcwidth_broken=no
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <locale.h>
+#include <wchar.h>
+
+int
+main(c, v)
+int c;
+char **v;
+{
+ int w;
+
+ setlocale(LC_ALL, "en_US.UTF-8");
+ w = wcwidth (0x0301);
+ exit (w == 0); /* exit 0 if wcwidth broken */
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ bash_cv_wcwidth_broken=yes
+else $as_nop
+ bash_cv_wcwidth_broken=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_wcwidth_broken" >&5
+printf "%s\n" "$bash_cv_wcwidth_broken" >&6; }
+if test "$bash_cv_wcwidth_broken" = yes; then
+
+printf "%s\n" "#define WCWIDTH_BROKEN 1" >>confdefs.h
+
+fi
+
+if test "$am_cv_func_iconv" = yes; then
+ OLDLIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL $LIBICONV"
+ ac_fn_c_check_func "$LINENO" "locale_charset" "ac_cv_func_locale_charset"
+if test "x$ac_cv_func_locale_charset" = xyes
+then :
+ printf "%s\n" "#define HAVE_LOCALE_CHARSET 1" >>confdefs.h
+
+fi
+
+ LIBS="$OLDLIBS"
+fi
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of wchar_t" >&5
+printf %s "checking size of wchar_t... " >&6; }
+if test ${ac_cv_sizeof_wchar_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (wchar_t))" "ac_cv_sizeof_wchar_t" "$ac_includes_default"
+then :
+
+else $as_nop
+ if test "$ac_cv_type_wchar_t" = yes; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (wchar_t)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_wchar_t=0
+ fi
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_wchar_t" >&5
+printf "%s\n" "$ac_cv_sizeof_wchar_t" >&6; }
+
+
+
+printf "%s\n" "#define SIZEOF_WCHAR_T $ac_cv_sizeof_wchar_t" >>confdefs.h
+
+
+
+
+
+case "$host_cpu" in
+*cray*) LOCAL_CFLAGS=-DCRAY ;;
+*s390*) LOCAL_CFLAGS=-fsigned-char ;;
+esac
+
+case "$host_os" in
+isc*) LOCAL_CFLAGS=-Disc386 ;;
+hpux*) LOCAL_CFLAGS="-DTGETENT_BROKEN -DTGETFLAG_BROKEN" ;;
+esac
+
+# shared library configuration section
+#
+# Shared object configuration section. These values are generated by
+# ${srcdir}/support/shobj-conf
+#
+if test -f ${srcdir}/support/shobj-conf; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking configuration for building shared libraries" >&5
+printf %s "checking configuration for building shared libraries... " >&6; }
+ eval `TERMCAP_LIB=$TERMCAP_LIB ${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}`
+
+ # SHARED_TERMCAP is set only if opt_shared_termcap_library is set
+ case "$SHLIB_LIBS" in
+ *curses*|*tinfo*) ;;
+ *termcap*|*termlib*) ;; # common aliases
+ *) SHLIB_LIBS="$SHLIB_LIBS $SHARED_TERMCAP" ;;
+ esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SHLIB_STATUS" >&5
+printf "%s\n" "$SHLIB_STATUS" >&6; }
+
+ # SHLIB_STATUS is either `supported' or `unsupported'. If it's
+ # `unsupported', turn off any default shared library building
+ if test "$SHLIB_STATUS" = 'unsupported'; then
+ opt_shared_libs=no
+ fi
+
+ # shared library versioning
+ # quoted for m4 so I can use character classes
+ SHLIB_MAJOR=`expr "$LIBVERSION" : '\([0-9]\)\..*'`
+ SHLIB_MINOR=`expr "$LIBVERSION" : '[0-9]\.\([0-9]\).*'`
+
+
+fi
+
+if test "$opt_static_libs" = "yes"; then
+ STATIC_TARGET=static
+ STATIC_INSTALL_TARGET=install-static
+fi
+if test "$opt_shared_libs" = "yes"; then
+ SHARED_TARGET=shared
+ SHARED_INSTALL_TARGET=install-shared
+fi
+
+
+
+
+
+
+if test "$opt_install_examples" = "yes"; then
+ EXAMPLES_INSTALL_TARGET=install-examples
+fi
+
+
+case "$build_os" in
+msdosdjgpp*) BUILD_DIR=`pwd.exe` ;; # to prevent //d/path/file
+*) BUILD_DIR=`pwd` ;;
+esac
+
+case "$BUILD_DIR" in
+*\ *) BUILD_DIR=`echo "$BUILD_DIR" | sed 's: :\\\\ :g'` ;;
+*) ;;
+esac
+
+
+
+# CFLAGS=${CFLAGS-"$AUTO_CFLAGS"}
+if test -n "$want_auto_cflags"; then
+ CFLAGS="$AUTO_CFLAGS"
+fi
+CFLAGS="$CFLAGS $STYLE_CFLAGS"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile doc/Makefile examples/Makefile shlib/Makefile readline.pc history.pc"
+
+
+ac_config_commands="$ac_config_commands stamp-h"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by readline $as_me 8.2, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-readline@gnu.org>."
+
+_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config='$ac_cs_config_escaped'
+ac_cs_version="\\
+readline config.status 8.2
+configured by $0, generated by GNU Autoconf 2.71,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ printf "%s\n" "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ printf "%s\n" "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ printf "%s\n" "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ printf "%s\n" "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+ "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
+ "shlib/Makefile") CONFIG_FILES="$CONFIG_FILES shlib/Makefile" ;;
+ "readline.pc") CONFIG_FILES="$CONFIG_FILES readline.pc" ;;
+ "history.pc") CONFIG_FILES="$CONFIG_FILES history.pc" ;;
+ "stamp-h") CONFIG_COMMANDS="$CONFIG_COMMANDS stamp-h" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+ test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+ ;;
+
+ :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "stamp-h":C) echo > stamp-h ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..15501fa
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,345 @@
+dnl
+dnl Configure script for readline library
+dnl
+dnl report bugs to chet@po.cwru.edu
+dnl
+dnl Process this file with autoconf to produce a configure script.
+
+# Copyright (C) 1987-2022 Free Software Foundation, Inc.
+
+# 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/>.
+
+AC_REVISION([for Readline 8.2, version 2.97])
+
+AC_INIT(readline, 8.2, bug-readline@gnu.org)
+
+dnl make sure we are using a recent autoconf version
+AC_PREREQ(2.69)
+
+AC_CONFIG_SRCDIR(readline.h)
+AC_CONFIG_AUX_DIR(./support)
+AC_CONFIG_HEADERS(config.h)
+
+dnl update the value of RL_READLINE_VERSION in readline.h when this changes
+LIBVERSION=8.2
+
+AC_CANONICAL_HOST
+AC_CANONICAL_BUILD
+
+dnl configure defaults
+opt_curses=no
+opt_shared_termcap_lib=no
+
+dnl arguments to configure
+AC_ARG_WITH(curses, AS_HELP_STRING([--with-curses], [use the curses library instead of the termcap library]), opt_curses=$withval)
+AC_ARG_WITH(shared-termcap-library, AS_HELP_STRING([--with-shared-termcap-library], [link the readline shared library against the termcap/curses shared library [[default=NO]]]), opt_shared_termcap_lib=$withval)
+
+if test "$opt_curses" = "yes"; then
+ prefer_curses=yes
+fi
+
+dnl option parsing for optional features
+opt_multibyte=yes
+opt_static_libs=yes
+opt_shared_libs=yes
+opt_install_examples=yes
+opt_bracketed_paste_default=yes
+
+AC_ARG_ENABLE(multibyte, AS_HELP_STRING([--enable-multibyte], [enable multibyte characters if OS supports them]), opt_multibyte=$enableval)
+AC_ARG_ENABLE(shared, AS_HELP_STRING([--enable-shared], [build shared libraries [[default=YES]]]), opt_shared_libs=$enableval)
+AC_ARG_ENABLE(static, AS_HELP_STRING([--enable-static], [build static libraries [[default=YES]]]), opt_static_libs=$enableval)
+AC_ARG_ENABLE(install-examples, AS_HELP_STRING([--disable-install-examples], [don't install examples [[default=install]]]), opt_install_examples=$enableval)
+
+AC_ARG_ENABLE(bracketed-paste-default, AS_HELP_STRING([--disable-bracketed-paste-default], [disable bracketed paste by default [[default=enable]]]), opt_bracketed_paste_default=$enableval)
+
+if test $opt_multibyte = no; then
+AC_DEFINE(NO_MULTIBYTE_SUPPORT)
+fi
+
+if test $opt_bracketed_paste_default = yes; then
+ BRACKETED_PASTE='-DBRACKETED_PASTE_DEFAULT=1'
+else
+ BRACKETED_PASTE='-DBRACKETED_PASTE_DEFAULT=0'
+fi
+AC_SUBST(BRACKETED_PASTE)
+
+dnl load up the cross-building cache file -- add more cases and cache
+dnl files as necessary
+
+dnl Note that host and target machine are the same, and different than the
+dnl build machine.
+
+CROSS_COMPILE=
+if test "x$cross_compiling" = "xyes"; then
+ case "${host}" in
+ *-cygwin*)
+ cross_cache=${srcdir}/cross-build/cygwin.cache
+ ;;
+ *-mingw*)
+ cross_cache=${srcdir}/cross-build/mingw.cache
+ ;;
+ i[[3456]]86-*-beos*)
+ cross_cache=${srcdir}/cross-build/x86-beos.cache
+ ;;
+ *) echo "configure: cross-compiling for $host is not supported" >&2
+ ;;
+ esac
+ if test -n "${cross_cache}" && test -r "${cross_cache}"; then
+ echo "loading cross-build cache file ${cross_cache}"
+ . ${cross_cache}
+ fi
+ unset cross_cache
+ CROSS_COMPILE='-DCROSS_COMPILING'
+ AC_SUBST(CROSS_COMPILE)
+fi
+
+echo ""
+echo "Beginning configuration for readline-$LIBVERSION for ${host_cpu}-${host_vendor}-${host_os}"
+echo ""
+
+# We want these before the checks, so the checks can modify their values.
+test -z "$CFLAGS" && want_auto_cflags=1
+
+AC_PROG_MAKE_SET
+AC_PROG_CC
+AC_USE_SYSTEM_EXTENSIONS
+
+# If we're using gcc and the user hasn't specified CFLAGS, add -O2 to CFLAGS
+if test -n "$want_auto_cflags" ; then
+ AUTO_CFLAGS="-g ${GCC:+-O2}"
+ STYLE_CFLAGS="${GCC:+-Wno-parentheses} ${GCC:+-Wno-format-security} ${GCC:+-Wno-tautological-constant-out-of-range-compare}"
+fi
+
+AC_PROG_GCC_TRADITIONAL
+AC_PROG_INSTALL
+AC_CHECK_TOOL(AR, ar)
+dnl Set default for ARFLAGS, since autoconf does not have a macro for it.
+dnl This allows people to set it when running configure or make
+test -n "$ARFLAGS" || ARFLAGS="cr"
+AC_PROG_RANLIB
+
+MAKE_SHELL=/bin/sh
+AC_SUBST(MAKE_SHELL)
+
+dnl include files for gettext
+
+m4_include([m4/codeset.m4])
+
+AC_C_CONST
+AC_C_INLINE
+AC_C_PROTOTYPES
+AC_C_CHAR_UNSIGNED
+AC_C_VOLATILE
+
+AC_TYPE_SIZE_T
+AC_CHECK_TYPE(ssize_t, int)
+
+AC_HEADER_STAT
+AC_HEADER_DIRENT
+
+AC_CHECK_FUNCS(fcntl gettimeofday kill lstat pselect readlink select setitimer)
+AC_CHECK_FUNCS(fnmatch memmove putenv setenv setlocale \
+ strcasecmp strpbrk sysconf tcgetattr vsnprintf)
+AC_CHECK_FUNCS(isascii isxdigit)
+AC_CHECK_FUNCS(getpwent getpwnam getpwuid)
+
+AC_FUNC_CHOWN
+AC_FUNC_STRCOLL
+
+AC_CHECK_HEADERS(fcntl.h unistd.h stdlib.h varargs.h stdarg.h stdbool.h \
+ string.h strings.h \
+ limits.h locale.h pwd.h memory.h termcap.h termios.h termio.h)
+AC_CHECK_HEADERS(sys/ioctl.h sys/pte.h sys/stream.h sys/select.h \
+ sys/time.h sys/file.h)
+
+AC_CHECK_HEADERS(sys/ptem.h,,,
+[[
+#if HAVE_SYS_STREAM_H
+# include <sys/stream.h>
+#endif
+]])
+
+AC_SYS_LARGEFILE
+
+BASH_SYS_SIGNAL_VINTAGE
+BASH_SYS_REINSTALL_SIGHANDLERS
+
+BASH_FUNC_POSIX_SETJMP
+BASH_FUNC_LSTAT
+BASH_FUNC_STRCOLL
+
+BASH_CHECK_GETPW_FUNCS
+
+AC_HEADER_TIOCGWINSZ
+
+BASH_TYPE_SIG_ATOMIC_T
+
+BASH_HAVE_TIOCSTAT
+BASH_HAVE_FIONREAD
+BASH_CHECK_SPEED_T
+BASH_STRUCT_WINSIZE
+BASH_STRUCT_DIRENT_D_INO
+BASH_STRUCT_DIRENT_D_FILENO
+BASH_STRUCT_TIMEVAL
+
+AC_CHECK_HEADERS(libaudit.h)
+AC_CHECK_DECLS([AUDIT_USER_TTY],,, [[#include <linux/audit.h>]])
+
+dnl yuck
+case "$host_os" in
+aix*) prefer_curses=yes ;;
+esac
+BASH_CHECK_LIB_TERMCAP
+if test "$TERMCAP_LIB" = "./lib/termcap/libtermcap.a"; then
+ if test "$prefer_curses" = yes; then
+ TERMCAP_LIB=-lcurses
+ else
+ TERMCAP_LIB=-ltermcap #default
+ fi
+fi
+# Windows ncurses installation
+if test "$TERMCAP_LIB" = "-lncurses"; then
+ AC_CHECK_HEADERS(ncurses/termcap.h)
+fi
+case "$opt_shared_termcap_lib" in
+[[Yy]][[Ee]][[Ss]]) SHARED_TERMCAP="$TERMCAP_LIB" ;;
+-l*) SHARED_TERMCAP="$opt_shared_termcap_lib" ;;
+esac
+
+case "$TERMCAP_LIB" in
+-ltinfo) TERMCAP_PKG_CONFIG_LIB=tinfo ;;
+-lcurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;;
+-lncurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;;
+-ltermcap) TERMCAP_PKG_CONFIG_LIB=termcap ;;
+*) TERMCAP_PKG_CONFIG_LIB=termcap ;;
+esac
+
+BASH_CHECK_MULTIBYTE
+
+case "$host_cpu" in
+*cray*) LOCAL_CFLAGS=-DCRAY ;;
+*s390*) LOCAL_CFLAGS=-fsigned-char ;;
+esac
+
+case "$host_os" in
+isc*) LOCAL_CFLAGS=-Disc386 ;;
+hpux*) LOCAL_CFLAGS="-DTGETENT_BROKEN -DTGETFLAG_BROKEN" ;;
+esac
+
+# shared library configuration section
+#
+# Shared object configuration section. These values are generated by
+# ${srcdir}/support/shobj-conf
+#
+if test -f ${srcdir}/support/shobj-conf; then
+ AC_MSG_CHECKING(configuration for building shared libraries)
+ eval `TERMCAP_LIB=$TERMCAP_LIB ${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}`
+
+ # SHARED_TERMCAP is set only if opt_shared_termcap_library is set
+ case "$SHLIB_LIBS" in
+ *curses*|*tinfo*) ;;
+ *termcap*|*termlib*) ;; # common aliases
+ *) SHLIB_LIBS="$SHLIB_LIBS $SHARED_TERMCAP" ;;
+ esac
+
+ AC_SUBST(SHOBJ_CC)
+ AC_SUBST(SHOBJ_CFLAGS)
+ AC_SUBST(SHOBJ_LD)
+ AC_SUBST(SHOBJ_LDFLAGS)
+ AC_SUBST(SHOBJ_XLDFLAGS)
+ AC_SUBST(SHOBJ_LIBS)
+ AC_SUBST(SHOBJ_STATUS)
+ AC_SUBST(SHLIB_STATUS)
+ AC_SUBST(SHLIB_XLDFLAGS)
+ AC_SUBST(SHLIB_DOT)
+ AC_SUBST(SHLIB_LIBPREF)
+ AC_SUBST(SHLIB_LIBSUFF)
+ AC_SUBST(SHLIB_LIBVERSION)
+ AC_SUBST(SHLIB_DLLVERSION)
+ AC_SUBST(SHLIB_LIBS)
+ AC_MSG_RESULT($SHLIB_STATUS)
+
+ # SHLIB_STATUS is either `supported' or `unsupported'. If it's
+ # `unsupported', turn off any default shared library building
+ if test "$SHLIB_STATUS" = 'unsupported'; then
+ opt_shared_libs=no
+ fi
+
+ # shared library versioning
+ # quoted for m4 so I can use character classes
+ SHLIB_MAJOR=[`expr "$LIBVERSION" : '\([0-9]\)\..*'`]
+ SHLIB_MINOR=[`expr "$LIBVERSION" : '[0-9]\.\([0-9]\).*'`]
+ AC_SUBST(SHLIB_MAJOR)
+ AC_SUBST(SHLIB_MINOR)
+fi
+
+if test "$opt_static_libs" = "yes"; then
+ STATIC_TARGET=static
+ STATIC_INSTALL_TARGET=install-static
+fi
+if test "$opt_shared_libs" = "yes"; then
+ SHARED_TARGET=shared
+ SHARED_INSTALL_TARGET=install-shared
+fi
+
+AC_SUBST(STATIC_TARGET)
+AC_SUBST(SHARED_TARGET)
+AC_SUBST(STATIC_INSTALL_TARGET)
+AC_SUBST(SHARED_INSTALL_TARGET)
+
+if test "$opt_install_examples" = "yes"; then
+ EXAMPLES_INSTALL_TARGET=install-examples
+fi
+AC_SUBST(EXAMPLES_INSTALL_TARGET)
+
+case "$build_os" in
+msdosdjgpp*) BUILD_DIR=`pwd.exe` ;; # to prevent //d/path/file
+*) BUILD_DIR=`pwd` ;;
+esac
+
+case "$BUILD_DIR" in
+*\ *) BUILD_DIR=`echo "$BUILD_DIR" | sed 's: :\\\\ :g'` ;;
+*) ;;
+esac
+
+AC_SUBST(BUILD_DIR)
+
+# CFLAGS=${CFLAGS-"$AUTO_CFLAGS"}
+if test -n "$want_auto_cflags"; then
+ CFLAGS="$AUTO_CFLAGS"
+fi
+CFLAGS="$CFLAGS $STYLE_CFLAGS"
+
+AC_SUBST(CFLAGS)
+AC_SUBST(LOCAL_CFLAGS)
+AC_SUBST(LOCAL_LDFLAGS)
+AC_SUBST(LOCAL_DEFS)
+
+AC_SUBST(AR)
+AC_SUBST(ARFLAGS)
+
+AC_SUBST(host_cpu)
+AC_SUBST(host_os)
+
+AC_SUBST(LIBVERSION)
+
+AC_SUBST(TERMCAP_LIB)
+AC_SUBST(TERMCAP_PKG_CONFIG_LIB)
+
+AC_CONFIG_FILES([Makefile doc/Makefile examples/Makefile shlib/Makefile readline.pc history.pc])
+
+dnl Makefile uses this timestamp file to record whether config.h is up to date.
+AC_CONFIG_COMMANDS([stamp-h], [echo > stamp-h])
+
+AC_OUTPUT
diff --git a/display.c b/display.c
new file mode 100644
index 0000000..c1135ec
--- /dev/null
+++ b/display.c
@@ -0,0 +1,3583 @@
+/* display.c -- readline redisplay facility. */
+
+/* Copyright (C) 1987-2022 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#include "posixstat.h"
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+#ifdef __MSDOS__
+# include <pc.h>
+#endif
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+/* Termcap library stuff. */
+#include "tcap.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strchr (), *strrchr ();
+#endif /* !strchr && !__STDC__ */
+
+static void putc_face (int, int, char *);
+static void puts_face (const char *, const char *, int);
+static void norm_face (char *, int);
+
+static void update_line (char *, char *, char *, char *, int, int, int, int);
+static void space_to_eol (int);
+static void delete_chars (int);
+static void insert_some_chars (char *, int, int);
+static void open_some_spaces (int);
+static void cr (void);
+static void redraw_prompt (char *);
+static void _rl_move_cursor_relative (int, const char *, const char *);
+
+/* Values for FLAGS */
+#define PMT_MULTILINE 0x01
+
+static char *expand_prompt (char *, int, int *, int *, int *, int *);
+
+#define DEFAULT_LINE_BUFFER_SIZE 1024
+
+/* State of visible and invisible lines. */
+struct line_state
+ {
+ char *line;
+ char *lface;
+ int *lbreaks;
+ int lbsize;
+#if defined (HANDLE_MULTIBYTE)
+ int wbsize;
+ int *wrapped_line;
+#endif
+ };
+
+/* The line display buffers. One is the line currently displayed on
+ the screen. The other is the line about to be displayed. */
+static struct line_state line_state_array[2];
+static struct line_state *line_state_visible = &line_state_array[0];
+static struct line_state *line_state_invisible = &line_state_array[1];
+static int line_structures_initialized = 0;
+
+/* Backwards-compatible names. */
+#define inv_lbreaks (line_state_invisible->lbreaks)
+#define inv_lbsize (line_state_invisible->lbsize)
+#define vis_lbreaks (line_state_visible->lbreaks)
+#define vis_lbsize (line_state_visible->lbsize)
+
+#define visible_line (line_state_visible->line)
+#define vis_face (line_state_visible->lface)
+#define invisible_line (line_state_invisible->line)
+#define inv_face (line_state_invisible->lface)
+
+#if defined (HANDLE_MULTIBYTE)
+static int _rl_col_width (const char *, int, int, int);
+#else
+# define _rl_col_width(l, s, e, f) (((e) <= (s)) ? 0 : (e) - (s))
+#endif
+
+/* Heuristic used to decide whether it is faster to move from CUR to NEW
+ by backing up or outputting a carriage return and moving forward. CUR
+ and NEW are either both buffer positions or absolute screen positions. */
+#define CR_FASTER(new, cur) (((new) + 1) < ((cur) - (new)))
+
+/* _rl_last_c_pos is an absolute cursor position in multibyte locales and a
+ buffer index in others. This macro is used when deciding whether the
+ current cursor position is in the middle of a prompt string containing
+ invisible characters. XXX - might need to take `modmark' into account. */
+/* XXX - only valid when tested against _rl_last_c_pos; buffer indices need
+ to use prompt_last_invisible directly. */
+#define PROMPT_ENDING_INDEX \
+ ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) ? prompt_physical_chars : prompt_last_invisible+1)
+
+#define FACE_NORMAL '0'
+#define FACE_STANDOUT '1'
+#define FACE_INVALID ((char)1)
+
+/* **************************************************************** */
+/* */
+/* Display stuff */
+/* */
+/* **************************************************************** */
+
+/* This is the stuff that is hard for me. I never seem to write good
+ display routines in C. Let's see how I do this time. */
+
+/* (PWP) Well... Good for a simple line updater, but totally ignores
+ the problems of input lines longer than the screen width.
+
+ update_line and the code that calls it makes a multiple line,
+ automatically wrapping line update. Careful attention needs
+ to be paid to the vertical position variables. */
+
+/* Keep two buffers; one which reflects the current contents of the
+ screen, and the other to draw what we think the new contents should
+ be. Then compare the buffers, and make whatever changes to the
+ screen itself that we should. Finally, make the buffer that we
+ just drew into be the one which reflects the current contents of the
+ screen, and place the cursor where it belongs.
+
+ Commands that want to can fix the display themselves, and then let
+ this function know that the display has been fixed by setting the
+ RL_DISPLAY_FIXED variable. This is good for efficiency. */
+
+/* Application-specific redisplay function. */
+rl_voidfunc_t *rl_redisplay_function = rl_redisplay;
+
+/* Global variables declared here. */
+/* What YOU turn on when you have handled all redisplay yourself. */
+int rl_display_fixed = 0;
+
+/* The stuff that gets printed out before the actual text of the line.
+ This is usually pointing to rl_prompt. */
+char *rl_display_prompt = (char *)NULL;
+
+/* Variables used to include the editing mode in the prompt. */
+char *_rl_emacs_mode_str;
+int _rl_emacs_modestr_len;
+
+char *_rl_vi_ins_mode_str;
+int _rl_vi_ins_modestr_len;
+
+char *_rl_vi_cmd_mode_str;
+int _rl_vi_cmd_modestr_len;
+
+/* Pseudo-global variables declared here. */
+
+/* Hints for other parts of readline to give to the display engine. */
+int _rl_suppress_redisplay = 0;
+int _rl_want_redisplay = 0;
+
+/* The visible cursor position. If you print some text, adjust this. */
+/* NOTE: _rl_last_c_pos is used as a buffer index when not in a locale
+ supporting multibyte characters, and an absolute cursor position when
+ in such a locale. This is an artifact of the donated multibyte support.
+ Care must be taken when modifying its value. */
+int _rl_last_c_pos = 0;
+int _rl_last_v_pos = 0;
+
+/* Number of physical lines consumed by the current line buffer currently
+ on screen minus 1. */
+int _rl_vis_botlin = 0;
+
+static int _rl_quick_redisplay = 0;
+
+/* This is a hint update_line gives to rl_redisplay that it has adjusted the
+ value of _rl_last_c_pos *and* taken the presence of any invisible chars in
+ the prompt into account. rl_redisplay notes this and does not do the
+ adjustment itself. */
+static int cpos_adjusted;
+
+/* The index into the line buffer corresponding to the cursor position */
+static int cpos_buffer_position;
+
+/* A flag to note when we're displaying the first line of the prompt */
+static int displaying_prompt_first_line;
+/* The number of multibyte characters in the prompt, if any */
+static int prompt_multibyte_chars;
+
+static int _rl_inv_botlin = 0;
+
+/* Variables used only in this file. */
+/* The last left edge of text that was displayed. This is used when
+ doing horizontal scrolling. It shifts in thirds of a screenwidth. */
+static int last_lmargin;
+
+/* A buffer for `modeline' messages. */
+static char *msg_buf = 0;
+static int msg_bufsiz = 0;
+
+/* Non-zero forces the redisplay even if we thought it was unnecessary. */
+static int forced_display;
+
+/* Default and initial buffer size. Can grow. */
+static int line_size = 0;
+
+/* Set to a non-zero value if horizontal scrolling has been enabled
+ automatically because the terminal was resized to height 1. */
+static int horizontal_scrolling_autoset = 0; /* explicit initialization */
+
+/* Variables to keep track of the expanded prompt string, which may
+ include invisible characters. */
+
+static char *local_prompt, *local_prompt_prefix;
+static int local_prompt_len;
+static int prompt_prefix_length;
+/* Number of chars in the buffer that contribute to visible chars on the screen.
+ This might be different from the number of physical chars in the presence
+ of multibyte characters */
+static int prompt_visible_length;
+
+/* The number of invisible characters in the line currently being
+ displayed on the screen. */
+static int visible_wrap_offset;
+
+/* The number of invisible characters in the prompt string. Static so it
+ can be shared between rl_redisplay and update_line */
+static int wrap_offset;
+
+/* The index of the last invisible character in the prompt string. */
+static int prompt_last_invisible;
+
+/* The length (buffer offset) of the first line of the last (possibly
+ multi-line) buffer displayed on the screen. */
+static int visible_first_line_len;
+
+/* Number of invisible characters on the first physical line of the prompt.
+ Only valid when the number of physical characters in the prompt exceeds
+ (or is equal to) _rl_screenwidth. */
+static int prompt_invis_chars_first_line;
+
+static int prompt_last_screen_line;
+
+static int prompt_physical_chars;
+
+/* An array of indexes into the prompt string where we will break physical
+ screen lines. It's easier to compute in expand_prompt and use later in
+ rl_redisplay instead of having rl_redisplay try to guess about invisible
+ characters in the prompt or use heuristics about where they are. */
+static int *local_prompt_newlines;
+
+/* set to a non-zero value by rl_redisplay if we are marking modified history
+ lines and the current line is so marked. */
+static int modmark;
+
+static int line_totbytes;
+
+/* Variables to save and restore prompt and display information. */
+
+/* These are getting numerous enough that it's time to create a struct. */
+
+static char *saved_local_prompt;
+static char *saved_local_prefix;
+static int *saved_local_prompt_newlines;
+
+static int saved_last_invisible;
+static int saved_visible_length;
+static int saved_prefix_length;
+static int saved_local_length;
+static int saved_invis_chars_first_line;
+static int saved_physical_chars;
+
+/* Return a string indicating the editing mode, for use in the prompt. */
+
+static char *
+prompt_modestr (int *lenp)
+{
+ if (rl_editing_mode == emacs_mode)
+ {
+ if (lenp)
+ *lenp = _rl_emacs_mode_str ? _rl_emacs_modestr_len : RL_EMACS_MODESTR_DEFLEN;
+ return _rl_emacs_mode_str ? _rl_emacs_mode_str : RL_EMACS_MODESTR_DEFAULT;
+ }
+ else if (_rl_keymap == vi_insertion_keymap)
+ {
+ if (lenp)
+ *lenp = _rl_vi_ins_mode_str ? _rl_vi_ins_modestr_len : RL_VI_INS_MODESTR_DEFLEN;
+ return _rl_vi_ins_mode_str ? _rl_vi_ins_mode_str : RL_VI_INS_MODESTR_DEFAULT; /* vi insert mode */
+ }
+ else
+ {
+ if (lenp)
+ *lenp = _rl_vi_cmd_mode_str ? _rl_vi_cmd_modestr_len : RL_VI_CMD_MODESTR_DEFLEN;
+ return _rl_vi_cmd_mode_str ? _rl_vi_cmd_mode_str : RL_VI_CMD_MODESTR_DEFAULT; /* vi command mode */
+ }
+}
+
+/* Expand the prompt string S and return the number of visible
+ characters in *LP, if LP is not null. This is currently more-or-less
+ a placeholder for expansion. LIP, if non-null is a place to store the
+ index of the last invisible character in the returned string. NIFLP,
+ if non-zero, is a place to store the number of invisible characters in
+ the first prompt line. The previous are used as byte counts -- indexes
+ into a character buffer. *VLP gets the number of physical characters in
+ the expanded prompt (visible length) */
+
+/* Current implementation:
+ \001 (^A) start non-visible characters
+ \002 (^B) end non-visible characters
+ all characters except \001 and \002 (following a \001) are copied to
+ the returned string; all characters except those between \001 and
+ \002 are assumed to be `visible'. */
+
+/* Possible values for FLAGS:
+ PMT_MULTILINE caller indicates that this is part of a multiline prompt
+*/
+
+/* This approximates the number of lines the prompt will take when displayed */
+#define APPROX_DIV(n, d) (((n) < (d)) ? 1 : ((n) / (d)) + 1)
+
+static char *
+expand_prompt (char *pmt, int flags, int *lp, int *lip, int *niflp, int *vlp)
+{
+ char *r, *ret, *p, *igstart, *nprompt, *ms;
+ int l, rl, last, ignoring, ninvis, invfl, invflset, ind, pind, physchars;
+ int mlen, newlines, newlines_guess, bound, can_add_invis;
+ int mb_cur_max;
+
+ /* We only expand the mode string for the last line of a multiline prompt
+ (a prompt with embedded newlines). */
+ ms = (((pmt == rl_prompt) ^ (flags & PMT_MULTILINE)) && _rl_show_mode_in_prompt) ? prompt_modestr (&mlen) : 0;
+ if (ms)
+ {
+ l = strlen (pmt);
+ nprompt = (char *)xmalloc (l + mlen + 1);
+ memcpy (nprompt, ms, mlen);
+ strcpy (nprompt + mlen, pmt);
+ }
+ else
+ nprompt = pmt;
+
+ can_add_invis = 0;
+ mb_cur_max = MB_CUR_MAX;
+
+ if (_rl_screenwidth == 0)
+ _rl_get_screen_size (0, 0); /* avoid division by zero */
+
+ /* Short-circuit if we can. We can do this if we are treating the prompt as
+ a sequence of bytes and there are no invisible characters in the prompt
+ to deal with. Since we populate local_prompt_newlines, we have to run
+ through the rest of the function if this prompt looks like it's going to
+ be longer than one screen line. */
+ if ((mb_cur_max <= 1 || rl_byte_oriented) && strchr (nprompt, RL_PROMPT_START_IGNORE) == 0)
+ {
+ l = strlen (nprompt);
+ if (l < (_rl_screenwidth > 0 ? _rl_screenwidth : 80))
+ {
+ r = (nprompt == pmt) ? savestring (pmt) : nprompt;
+ if (lp)
+ *lp = l;
+ if (lip)
+ *lip = 0;
+ if (niflp)
+ *niflp = 0;
+ if (vlp)
+ *vlp = l;
+
+ local_prompt_newlines = (int *) xrealloc (local_prompt_newlines, sizeof (int) * 2);
+ local_prompt_newlines[0] = 0;
+ local_prompt_newlines[1] = -1;
+
+ return r;
+ }
+ }
+
+ l = strlen (nprompt); /* XXX */
+ r = ret = (char *)xmalloc (l + 1);
+
+ /* Guess at how many screen lines the prompt will take to size the array that
+ keeps track of where the line wraps happen */
+ newlines_guess = (_rl_screenwidth > 0) ? APPROX_DIV(l, _rl_screenwidth) : APPROX_DIV(l, 80);
+ local_prompt_newlines = (int *) xrealloc (local_prompt_newlines, sizeof (int) * (newlines_guess + 1));
+ local_prompt_newlines[newlines = 0] = 0;
+ for (rl = 1; rl <= newlines_guess; rl++)
+ local_prompt_newlines[rl] = -1;
+
+ rl = physchars = 0; /* mode string now part of nprompt */
+ invfl = 0; /* invisible chars in first line of prompt */
+ invflset = 0; /* we only want to set invfl once */
+ igstart = 0; /* we're not ignoring any characters yet */
+
+ for (ignoring = last = ninvis = 0, p = nprompt; p && *p; p++)
+ {
+ /* This code strips the invisible character string markers
+ RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE */
+ if (ignoring == 0 && *p == RL_PROMPT_START_IGNORE) /* XXX - check ignoring? */
+ {
+ ignoring = 1;
+ igstart = p;
+ continue;
+ }
+ else if (ignoring && *p == RL_PROMPT_END_IGNORE)
+ {
+ ignoring = 0;
+ /* If we have a run of invisible characters, adjust local_prompt_newlines
+ to add them, since update_line expects them to be counted before
+ wrapping the line. */
+ if (can_add_invis)
+ {
+ local_prompt_newlines[newlines] = r - ret;
+ /* If we're adding to the number of invisible characters on the
+ first line of the prompt, but we've already set the number of
+ invisible characters on that line, we need to adjust the
+ counter. */
+ if (invflset && newlines == 1)
+ invfl = ninvis;
+ }
+ if (p != (igstart + 1))
+ last = r - ret - 1;
+ continue;
+ }
+ else
+ {
+#if defined (HANDLE_MULTIBYTE)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ pind = p - nprompt;
+ ind = _rl_find_next_mbchar (nprompt, pind, 1, MB_FIND_NONZERO);
+ l = ind - pind;
+ while (l--)
+ *r++ = *p++;
+ if (!ignoring)
+ {
+ /* rl ends up being assigned to prompt_visible_length,
+ which is the number of characters in the buffer that
+ contribute to characters on the screen, which might
+ not be the same as the number of physical characters
+ on the screen in the presence of multibyte characters */
+ rl += ind - pind;
+ physchars += _rl_col_width (nprompt, pind, ind, 0);
+ }
+ else
+ ninvis += ind - pind;
+ p--; /* compensate for later increment */
+ }
+ else
+#endif
+ {
+ *r++ = *p;
+ if (!ignoring)
+ {
+ rl++; /* visible length byte counter */
+ physchars++;
+ }
+ else
+ ninvis++; /* invisible chars byte counter */
+ }
+
+ if (invflset == 0 && physchars >= _rl_screenwidth)
+ {
+ invfl = ninvis;
+ invflset = 1;
+ }
+
+ if (physchars >= (bound = (newlines + 1) * _rl_screenwidth) && local_prompt_newlines[newlines+1] == -1)
+ {
+ int new;
+ if (physchars > bound) /* should rarely happen */
+ {
+#if defined (HANDLE_MULTIBYTE)
+ *r = '\0'; /* need null-termination for strlen */
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ new = _rl_find_prev_mbchar (ret, r - ret, MB_FIND_ANY);
+ else
+#endif
+ new = r - ret - (physchars - bound); /* XXX */
+ }
+ else
+ new = r - ret;
+ local_prompt_newlines[++newlines] = new;
+ }
+
+ /* What if a physical character of width >= 2 is split? There is
+ code that wraps before the physical screen width if the character
+ width would exceed it, but it needs to be checked against this
+ code and local_prompt_newlines[]. */
+ if (ignoring == 0)
+ can_add_invis = (physchars == bound);
+ }
+ }
+
+ if (rl <= _rl_screenwidth)
+ invfl = ninvis;
+
+ *r = '\0';
+ if (lp)
+ *lp = rl;
+ if (lip)
+ *lip = last;
+ if (niflp)
+ *niflp = invfl;
+ if (vlp)
+ *vlp = physchars;
+
+ if (nprompt != pmt)
+ xfree (nprompt);
+
+ return ret;
+}
+
+/* Just strip out RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE from
+ PMT and return the rest of PMT. */
+char *
+_rl_strip_prompt (char *pmt)
+{
+ char *ret;
+
+ ret = expand_prompt (pmt, 0, (int *)NULL, (int *)NULL, (int *)NULL, (int *)NULL);
+ return ret;
+}
+
+void
+_rl_reset_prompt (void)
+{
+ rl_visible_prompt_length = rl_expand_prompt (rl_prompt);
+}
+
+/*
+ * Expand the prompt string into the various display components, if
+ * necessary.
+ *
+ * local_prompt = expanded last line of string in rl_display_prompt
+ * (portion after the final newline)
+ * local_prompt_prefix = portion before last newline of rl_display_prompt,
+ * expanded via expand_prompt
+ * prompt_visible_length = number of visible characters in local_prompt
+ * prompt_prefix_length = number of visible characters in local_prompt_prefix
+ *
+ * It also tries to keep track of the number of invisible characters in the
+ * prompt string, and where they are.
+ *
+ * This function is called once per call to readline(). It may also be
+ * called arbitrarily to expand the primary prompt.
+ *
+ * The return value is the number of visible characters on the last line
+ * of the (possibly multi-line) prompt. In this case, multi-line means
+ * there are embedded newlines in the prompt string itself, not that the
+ * number of physical characters exceeds the screen width and the prompt
+ * wraps.
+ */
+int
+rl_expand_prompt (char *prompt)
+{
+ char *p, *t;
+ int c;
+
+ /* Clear out any saved values. */
+ FREE (local_prompt);
+ FREE (local_prompt_prefix);
+
+ local_prompt = local_prompt_prefix = (char *)0;
+ local_prompt_len = 0;
+ prompt_last_invisible = prompt_invis_chars_first_line = 0;
+ prompt_visible_length = prompt_physical_chars = 0;
+
+ if (prompt == 0 || *prompt == 0)
+ return (0);
+
+ p = strrchr (prompt, '\n');
+ if (p == 0)
+ {
+ /* The prompt is only one logical line, though it might wrap. */
+ local_prompt = expand_prompt (prompt, 0, &prompt_visible_length,
+ &prompt_last_invisible,
+ &prompt_invis_chars_first_line,
+ &prompt_physical_chars);
+ local_prompt_prefix = (char *)0;
+ local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
+ return (prompt_visible_length);
+ }
+ else
+ {
+ /* The prompt spans multiple lines. */
+ t = ++p;
+ c = *t; *t = '\0';
+ /* The portion of the prompt string up to and including the
+ final newline is now null-terminated. */
+ local_prompt_prefix = expand_prompt (prompt, PMT_MULTILINE,
+ &prompt_prefix_length,
+ (int *)NULL,
+ (int *)NULL,
+ (int *)NULL);
+ *t = c;
+
+ local_prompt = expand_prompt (p, PMT_MULTILINE,
+ &prompt_visible_length,
+ &prompt_last_invisible,
+ &prompt_invis_chars_first_line,
+ &prompt_physical_chars);
+ local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
+ return (prompt_prefix_length);
+ }
+}
+
+/* Allocate the various line structures, making sure they can hold MINSIZE
+ bytes. If the existing line size can accommodate MINSIZE bytes, don't do
+ anything. */
+static void
+realloc_line (int minsize)
+{
+ int minimum_size;
+ int newsize, delta;
+
+ minimum_size = DEFAULT_LINE_BUFFER_SIZE;
+ if (minsize < minimum_size)
+ minsize = minimum_size;
+ if (minsize <= _rl_screenwidth) /* XXX - for gdb */
+ minsize = _rl_screenwidth + 1;
+ if (line_size >= minsize)
+ return;
+
+ newsize = minimum_size;
+ while (newsize < minsize)
+ newsize *= 2;
+
+ visible_line = (char *)xrealloc (visible_line, newsize);
+ vis_face = (char *)xrealloc (vis_face, newsize);
+
+ invisible_line = (char *)xrealloc (invisible_line, newsize);
+ inv_face = (char *)xrealloc (inv_face, newsize);
+
+ delta = newsize - line_size;
+ memset (visible_line + line_size, 0, delta);
+ memset (vis_face + line_size, FACE_NORMAL, delta);
+ memset (invisible_line + line_size, 1, delta);
+ memset (inv_face + line_size, FACE_INVALID, delta);
+
+ line_size = newsize;
+}
+
+/* Initialize the VISIBLE_LINE and INVISIBLE_LINE arrays, and their associated
+ arrays of line break markers. MINSIZE is the minimum size of VISIBLE_LINE
+ and INVISIBLE_LINE; if it is greater than LINE_SIZE, LINE_SIZE is
+ increased. If the lines have already been allocated, this ensures that
+ they can hold at least MINSIZE characters. */
+static void
+init_line_structures (int minsize)
+{
+ if (invisible_line == 0) /* initialize it */
+ {
+ if (line_size > minsize)
+ minsize = line_size;
+ }
+ realloc_line (minsize);
+
+ if (vis_lbreaks == 0)
+ {
+ /* should be enough. */
+ inv_lbsize = vis_lbsize = 256;
+
+#if defined (HANDLE_MULTIBYTE)
+ line_state_visible->wbsize = vis_lbsize;
+ line_state_visible->wrapped_line = (int *)xmalloc (line_state_visible->wbsize * sizeof (int));
+
+ line_state_invisible->wbsize = inv_lbsize;
+ line_state_invisible->wrapped_line = (int *)xmalloc (line_state_invisible->wbsize * sizeof (int));
+#endif
+
+ inv_lbreaks = (int *)xmalloc (inv_lbsize * sizeof (int));
+ vis_lbreaks = (int *)xmalloc (vis_lbsize * sizeof (int));
+ inv_lbreaks[0] = vis_lbreaks[0] = 0;
+ }
+
+ line_structures_initialized = 1;
+}
+
+/* Convenience functions to add chars to the invisible line that update the
+ face information at the same time. */
+static void /* XXX - change this */
+invis_addc (int *outp, char c, char face)
+{
+ realloc_line (*outp + 1);
+ invisible_line[*outp] = c;
+ inv_face[*outp] = face;
+ *outp += 1;
+}
+
+static void
+invis_adds (int *outp, const char *str, int n, char face)
+{
+ int i;
+
+ for (i = 0; i < n; i++)
+ invis_addc (outp, str[i], face);
+}
+
+static void
+invis_nul (int *outp)
+{
+ invis_addc (outp, '\0', 0);
+ *outp -= 1;
+}
+
+static void
+set_active_region (int *beg, int *end)
+{
+ if (rl_point >= 0 && rl_point <= rl_end && rl_mark >= 0 && rl_mark <= rl_end)
+ {
+ *beg = (rl_mark < rl_point) ? rl_mark : rl_point;
+ *end = (rl_mark < rl_point) ? rl_point : rl_mark;
+ }
+}
+
+/* Do whatever tests are necessary and tell update_line that it can do a
+ quick, dumb redisplay on the assumption that there are so many
+ differences between the old and new lines that it would be a waste to
+ compute all the differences.
+ Right now, it just sets _rl_quick_redisplay if the current visible line
+ is a single line (so we don't have to move vertically or mess with line
+ wrapping). */
+void
+_rl_optimize_redisplay (void)
+{
+ if (_rl_vis_botlin == 0)
+ _rl_quick_redisplay = 1;
+}
+
+/* Basic redisplay algorithm. See comments inline. */
+void
+rl_redisplay (void)
+{
+ int in, out, c, linenum, cursor_linenum;
+ int inv_botlin, lb_botlin, lb_linenum, o_cpos;
+ int newlines, lpos, temp, n0, num, prompt_lines_estimate;
+ char *prompt_this_line;
+ char cur_face;
+ int hl_begin, hl_end;
+ int mb_cur_max = MB_CUR_MAX;
+#if defined (HANDLE_MULTIBYTE)
+ WCHAR_T wc;
+ size_t wc_bytes;
+ int wc_width;
+ mbstate_t ps;
+ int _rl_wrapped_multicolumn = 0;
+#endif
+
+ if (_rl_echoing_p == 0)
+ return;
+
+ /* Block keyboard interrupts because this function manipulates global
+ data structures. */
+ _rl_block_sigint ();
+ RL_SETSTATE (RL_STATE_REDISPLAYING);
+
+ cur_face = FACE_NORMAL;
+ /* Can turn this into an array for multiple highlighted objects in addition
+ to the region */
+ hl_begin = hl_end = -1;
+
+ if (rl_mark_active_p ())
+ set_active_region (&hl_begin, &hl_end);
+
+ if (!rl_display_prompt)
+ rl_display_prompt = "";
+
+ if (line_structures_initialized == 0)
+ {
+ init_line_structures (0);
+ rl_on_new_line ();
+ }
+ else if (line_size <= _rl_screenwidth)
+ init_line_structures (_rl_screenwidth + 1);
+
+ /* Enable horizontal scrolling automatically for terminals of height 1
+ where wrapping lines doesn't work. Disable it as soon as the terminal
+ height is increased again if it was automatically enabled. */
+ if (_rl_screenheight <= 1)
+ {
+ if (_rl_horizontal_scroll_mode == 0)
+ horizontal_scrolling_autoset = 1;
+ _rl_horizontal_scroll_mode = 1;
+ }
+ else if (horizontal_scrolling_autoset)
+ _rl_horizontal_scroll_mode = 0;
+
+ /* Draw the line into the buffer. */
+ cpos_buffer_position = -1;
+
+ prompt_multibyte_chars = prompt_visible_length - prompt_physical_chars;
+
+ out = inv_botlin = 0;
+
+ /* Mark the line as modified or not. We only do this for history
+ lines. */
+ modmark = 0;
+ if (_rl_mark_modified_lines && current_history () && rl_undo_list)
+ {
+ invis_addc (&out, '*', cur_face);
+ invis_nul (&out);
+ modmark = 1;
+ }
+
+ /* If someone thought that the redisplay was handled, but the currently
+ visible line has a different modification state than the one about
+ to become visible, then correct the caller's misconception. */
+ if (visible_line[0] != invisible_line[0])
+ rl_display_fixed = 0;
+
+ /* If the prompt to be displayed is the `primary' readline prompt (the
+ one passed to readline()), use the values we have already expanded.
+ If not, use what's already in rl_display_prompt. WRAP_OFFSET is the
+ number of non-visible characters (bytes) in the prompt string. */
+ /* This is where we output the characters in the prompt before the last
+ newline, if any. If there aren't any embedded newlines, we don't
+ write anything. Copy the last line of the prompt string into the line in
+ any case */
+ if (rl_display_prompt == rl_prompt || local_prompt)
+ {
+ if (local_prompt_prefix && forced_display)
+ _rl_output_some_chars (local_prompt_prefix, strlen (local_prompt_prefix));
+
+ if (local_prompt_len > 0)
+ invis_adds (&out, local_prompt, local_prompt_len, cur_face);
+ invis_nul (&out);
+ wrap_offset = local_prompt_len - prompt_visible_length;
+ }
+ else
+ {
+ int pmtlen;
+ prompt_this_line = strrchr (rl_display_prompt, '\n');
+ if (!prompt_this_line)
+ prompt_this_line = rl_display_prompt;
+ else
+ {
+ prompt_this_line++;
+ pmtlen = prompt_this_line - rl_display_prompt; /* temp var */
+ if (forced_display)
+ {
+ _rl_output_some_chars (rl_display_prompt, pmtlen);
+ /* Make sure we are at column zero even after a newline,
+ regardless of the state of terminal output processing. */
+ if (pmtlen < 2 || prompt_this_line[-2] != '\r')
+ cr ();
+ }
+ }
+
+ prompt_physical_chars = pmtlen = strlen (prompt_this_line); /* XXX */
+ invis_adds (&out, prompt_this_line, pmtlen, cur_face);
+ invis_nul (&out);
+ wrap_offset = prompt_invis_chars_first_line = 0;
+ }
+
+#if defined (HANDLE_MULTIBYTE)
+#define CHECK_INV_LBREAKS() \
+ do { \
+ if (newlines >= (inv_lbsize - 2)) \
+ { \
+ inv_lbsize *= 2; \
+ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
+ } \
+ if (newlines >= (line_state_invisible->wbsize - 2)) \
+ { \
+ line_state_invisible->wbsize *= 2; \
+ line_state_invisible->wrapped_line = (int *)xrealloc (line_state_invisible->wrapped_line, line_state_invisible->wbsize * sizeof(int)); \
+ } \
+ } while (0)
+#else
+#define CHECK_INV_LBREAKS() \
+ do { \
+ if (newlines >= (inv_lbsize - 2)) \
+ { \
+ inv_lbsize *= 2; \
+ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
+ } \
+ } while (0)
+#endif /* !HANDLE_MULTIBYTE */
+
+#if defined (HANDLE_MULTIBYTE)
+#define CHECK_LPOS() \
+ do { \
+ lpos++; \
+ if (lpos >= _rl_screenwidth) \
+ { \
+ if (newlines >= (inv_lbsize - 2)) \
+ { \
+ inv_lbsize *= 2; \
+ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
+ } \
+ inv_lbreaks[++newlines] = out; \
+ if (newlines >= (line_state_invisible->wbsize - 2)) \
+ { \
+ line_state_invisible->wbsize *= 2; \
+ line_state_invisible->wrapped_line = (int *)xrealloc (line_state_invisible->wrapped_line, line_state_invisible->wbsize * sizeof(int)); \
+ } \
+ line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn; \
+ lpos = 0; \
+ } \
+ } while (0)
+#else
+#define CHECK_LPOS() \
+ do { \
+ lpos++; \
+ if (lpos >= _rl_screenwidth) \
+ { \
+ if (newlines >= (inv_lbsize - 2)) \
+ { \
+ inv_lbsize *= 2; \
+ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
+ } \
+ inv_lbreaks[++newlines] = out; \
+ lpos = 0; \
+ } \
+ } while (0)
+#endif
+
+ /* inv_lbreaks[i] is where line i starts in the buffer. */
+ inv_lbreaks[newlines = 0] = 0;
+ /* lpos is a physical cursor position, so it needs to be adjusted by the
+ number of invisible characters in the prompt, per line. We compute
+ the line breaks in the prompt string in expand_prompt, taking invisible
+ characters into account, and if lpos exceeds the screen width, we copy
+ the data in the loop below. */
+ lpos = prompt_physical_chars + modmark;
+
+#if defined (HANDLE_MULTIBYTE)
+ memset (line_state_invisible->wrapped_line, 0, line_state_invisible->wbsize * sizeof (int));
+ num = 0;
+#endif
+
+ /* prompt_invis_chars_first_line is the number of invisible characters (bytes)
+ in the first physical line of the prompt.
+ wrap_offset - prompt_invis_chars_first_line is usually the number of
+ invis chars on the second (or, more generally, last) line. */
+
+ /* This is zero-based, used to set the newlines */
+ prompt_lines_estimate = lpos / _rl_screenwidth;
+
+ /* what if lpos is already >= _rl_screenwidth before we start drawing the
+ contents of the command line? */
+ if (lpos >= _rl_screenwidth)
+ {
+ temp = 0;
+
+ /* first copy the linebreaks array we computed in expand_prompt */
+ while (local_prompt_newlines[newlines+1] != -1)
+ {
+ temp = local_prompt_newlines[newlines+1];
+ inv_lbreaks[++newlines] = temp;
+ }
+
+ /* Now set lpos from the last newline */
+ if (mb_cur_max > 1 && rl_byte_oriented == 0 && prompt_multibyte_chars > 0)
+ lpos = _rl_col_width (local_prompt, temp, local_prompt_len, 1) - (wrap_offset - prompt_invis_chars_first_line);
+ else
+ lpos -= (_rl_screenwidth * newlines);
+ }
+
+ prompt_last_screen_line = newlines;
+
+ /* Draw the rest of the line (after the prompt) into invisible_line, keeping
+ track of where the cursor is (cpos_buffer_position), the number of the
+ line containing the cursor (lb_linenum), the last line number (lb_botlin
+ and inv_botlin).
+ It maintains an array of line breaks for display (inv_lbreaks).
+ This handles expanding tabs for display and displaying meta characters. */
+ lb_linenum = 0;
+#if defined (HANDLE_MULTIBYTE)
+ in = 0;
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ memset (&ps, 0, sizeof (mbstate_t));
+ if (_rl_utf8locale && UTF8_SINGLEBYTE(rl_line_buffer[0]))
+ {
+ wc = (WCHAR_T)rl_line_buffer[0];
+ wc_bytes = 1;
+ }
+ else
+ wc_bytes = MBRTOWC (&wc, rl_line_buffer, rl_end, &ps);
+ }
+ else
+ wc_bytes = 1;
+ while (in < rl_end)
+#else
+ for (in = 0; in < rl_end; in++)
+#endif
+ {
+ if (in == hl_begin)
+ cur_face = FACE_STANDOUT;
+ else if (in == hl_end)
+ cur_face = FACE_NORMAL;
+
+ c = (unsigned char)rl_line_buffer[in];
+
+#if defined (HANDLE_MULTIBYTE)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ if (MB_INVALIDCH (wc_bytes))
+ {
+ /* Byte sequence is invalid or shortened. Assume that the
+ first byte represents a character. */
+ wc_bytes = 1;
+ /* Assume that a character occupies a single column. */
+ wc_width = 1;
+ memset (&ps, 0, sizeof (mbstate_t));
+ }
+ else if (MB_NULLWCH (wc_bytes))
+ break; /* Found '\0' */
+ else
+ {
+ temp = WCWIDTH (wc);
+ wc_width = (temp >= 0) ? temp : 1;
+ }
+ }
+#endif
+
+ if (in == rl_point)
+ {
+ cpos_buffer_position = out;
+ lb_linenum = newlines;
+ }
+
+#if defined (HANDLE_MULTIBYTE)
+ if (META_CHAR (c) && _rl_output_meta_chars == 0) /* XXX - clean up */
+#else
+ if (META_CHAR (c))
+#endif
+ {
+ if (_rl_output_meta_chars == 0)
+ {
+ char obuf[5];
+ int olen;
+
+ olen = sprintf (obuf, "\\%o", c);
+
+ if (lpos + olen >= _rl_screenwidth)
+ {
+ temp = _rl_screenwidth - lpos;
+ CHECK_INV_LBREAKS ();
+ inv_lbreaks[++newlines] = out + temp;
+#if defined (HANDLE_MULTIBYTE)
+ line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn;
+#endif
+ lpos = olen - temp;
+ }
+ else
+ lpos += olen;
+
+ for (temp = 0; temp < olen; temp++)
+ {
+ invis_addc (&out, obuf[temp], cur_face);
+ CHECK_LPOS ();
+ }
+ }
+ else
+ {
+ invis_addc (&out, c, cur_face);
+ CHECK_LPOS();
+ }
+ }
+#if defined (DISPLAY_TABS)
+ else if (c == '\t')
+ {
+ register int newout;
+
+ newout = out + 8 - lpos % 8;
+ temp = newout - out;
+ if (lpos + temp >= _rl_screenwidth)
+ {
+ register int temp2;
+ temp2 = _rl_screenwidth - lpos;
+ CHECK_INV_LBREAKS ();
+ inv_lbreaks[++newlines] = out + temp2;
+#if defined (HANDLE_MULTIBYTE)
+ line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn;
+#endif
+ lpos = temp - temp2;
+ while (out < newout)
+ invis_addc (&out, ' ', cur_face);
+ }
+ else
+ {
+ while (out < newout)
+ invis_addc (&out, ' ', cur_face);
+ lpos += temp;
+ }
+ }
+#endif
+ else if (c == '\n' && _rl_horizontal_scroll_mode == 0 && _rl_term_up && *_rl_term_up)
+ {
+ invis_addc (&out, '\0', cur_face);
+ CHECK_INV_LBREAKS ();
+ inv_lbreaks[++newlines] = out;
+#if defined (HANDLE_MULTIBYTE)
+ line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn;
+#endif
+ lpos = 0;
+ }
+ else if (CTRL_CHAR (c) || c == RUBOUT)
+ {
+ invis_addc (&out, '^', cur_face);
+ CHECK_LPOS();
+ invis_addc (&out, CTRL_CHAR (c) ? UNCTRL (c) : '?', cur_face);
+ CHECK_LPOS();
+ }
+ else
+ {
+#if defined (HANDLE_MULTIBYTE)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ register int i;
+
+ _rl_wrapped_multicolumn = 0;
+
+ if (_rl_screenwidth < lpos + wc_width)
+ for (i = lpos; i < _rl_screenwidth; i++)
+ {
+ /* The space will be removed in update_line() */
+ invis_addc (&out, ' ', cur_face);
+ _rl_wrapped_multicolumn++;
+ CHECK_LPOS();
+ }
+ if (in == rl_point)
+ {
+ cpos_buffer_position = out;
+ lb_linenum = newlines;
+ }
+ for (i = in; i < in+wc_bytes; i++)
+ invis_addc (&out, rl_line_buffer[i], cur_face);
+ for (i = 0; i < wc_width; i++)
+ CHECK_LPOS();
+ }
+ else
+ {
+ invis_addc (&out, c, cur_face);
+ CHECK_LPOS();
+ }
+#else
+ invis_addc (&out, c, cur_face);
+ CHECK_LPOS();
+#endif
+ }
+
+#if defined (HANDLE_MULTIBYTE)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ in += wc_bytes;
+ if (_rl_utf8locale && UTF8_SINGLEBYTE(rl_line_buffer[in]))
+ {
+ wc = (WCHAR_T)rl_line_buffer[in];
+ wc_bytes = 1;
+ memset (&ps, 0, sizeof (mbstate_t)); /* re-init state */
+ }
+ else
+ wc_bytes = MBRTOWC (&wc, rl_line_buffer + in, rl_end - in, &ps);
+ }
+ else
+ in++;
+#endif
+ }
+ invis_nul (&out);
+ line_totbytes = out;
+ if (cpos_buffer_position < 0)
+ {
+ cpos_buffer_position = out;
+ lb_linenum = newlines;
+ }
+
+ /* If we are switching from one line to multiple wrapped lines, we don't
+ want to do a dumb update (or we want to make it smarter). */
+ if (_rl_quick_redisplay && newlines > 0)
+ _rl_quick_redisplay = 0;
+
+ inv_botlin = lb_botlin = _rl_inv_botlin = newlines;
+ CHECK_INV_LBREAKS ();
+ inv_lbreaks[newlines+1] = out;
+#if defined (HANDLE_MULTIBYTE)
+ /* This should be 0 anyway */
+ line_state_invisible->wrapped_line[newlines+1] = _rl_wrapped_multicolumn;
+#endif
+ cursor_linenum = lb_linenum;
+
+ /* CPOS_BUFFER_POSITION == position in buffer where cursor should be placed.
+ CURSOR_LINENUM == line number where the cursor should be placed. */
+
+ /* PWP: now is when things get a bit hairy. The visible and invisible
+ line buffers are really multiple lines, which would wrap every
+ (screenwidth - 1) characters. Go through each in turn, finding
+ the changed region and updating it. The line order is top to bottom. */
+
+ /* If we can move the cursor up and down, then use multiple lines,
+ otherwise, let long lines display in a single terminal line, and
+ horizontally scroll it. */
+ displaying_prompt_first_line = 1;
+ if (_rl_horizontal_scroll_mode == 0 && _rl_term_up && *_rl_term_up)
+ {
+ int nleft, pos, changed_screen_line, tx;
+
+ if (!rl_display_fixed || forced_display)
+ {
+ forced_display = 0;
+
+ /* If we have more than a screenful of material to display, then
+ only display a screenful. We should display the last screen,
+ not the first. */
+ if (out >= _rl_screenchars)
+ {
+#if defined (HANDLE_MULTIBYTE)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ out = _rl_find_prev_mbchar (invisible_line, _rl_screenchars, MB_FIND_ANY);
+ else
+#endif
+ out = _rl_screenchars - 1;
+ }
+
+ /* The first line is at character position 0 in the buffer. The
+ second and subsequent lines start at inv_lbreaks[N], offset by
+ OFFSET (which has already been calculated above). */
+
+#define INVIS_FIRST() (prompt_physical_chars > _rl_screenwidth ? prompt_invis_chars_first_line : wrap_offset)
+#define WRAP_OFFSET(line, offset) ((line == 0) \
+ ? (offset ? INVIS_FIRST() : 0) \
+ : ((line == prompt_last_screen_line) ? wrap_offset-prompt_invis_chars_first_line : 0))
+#define W_OFFSET(line, offset) ((line) == 0 ? offset : 0)
+#define VIS_LLEN(l) ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l]))
+#define INV_LLEN(l) (inv_lbreaks[l+1] - inv_lbreaks[l])
+#define VIS_CHARS(line) (visible_line + vis_lbreaks[line])
+#define VIS_FACE(line) (vis_face + vis_lbreaks[line])
+#define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line)
+#define VIS_LINE_FACE(line) ((line) > _rl_vis_botlin) ? "" : VIS_FACE(line)
+#define INV_LINE(line) (invisible_line + inv_lbreaks[line])
+#define INV_LINE_FACE(line) (inv_face + inv_lbreaks[line])
+
+#define OLD_CPOS_IN_PROMPT() (cpos_adjusted == 0 && \
+ _rl_last_c_pos != o_cpos && \
+ _rl_last_c_pos > wrap_offset && \
+ o_cpos < prompt_last_invisible)
+
+
+ /* We don't want to highlight anything that's going to be off the top
+ of the display; if the current line takes up more than an entire
+ screen, just mark the lines that won't be displayed as having a
+ `normal' face.
+ It's imperfect, but better than display corruption. */
+ if (rl_mark_active_p () && inv_botlin > _rl_screenheight)
+ {
+ int extra;
+
+ extra = inv_botlin - _rl_screenheight;
+ for (linenum = 0; linenum <= extra; linenum++)
+ norm_face (INV_LINE_FACE(linenum), INV_LLEN (linenum));
+ }
+
+ /* For each line in the buffer, do the updating display. */
+ for (linenum = 0; linenum <= inv_botlin; linenum++)
+ {
+ /* This can lead us astray if we execute a program that changes
+ the locale from a non-multibyte to a multibyte one. */
+ o_cpos = _rl_last_c_pos;
+ cpos_adjusted = 0;
+ update_line (VIS_LINE(linenum), VIS_LINE_FACE(linenum),
+ INV_LINE(linenum), INV_LINE_FACE(linenum),
+ linenum,
+ VIS_LLEN(linenum), INV_LLEN(linenum), inv_botlin);
+
+ /* update_line potentially changes _rl_last_c_pos, but doesn't
+ take invisible characters into account, since _rl_last_c_pos
+ is an absolute cursor position in a multibyte locale. We
+ choose to (mostly) compensate for that here, rather than
+ change update_line itself. There are several cases in which
+ update_line adjusts _rl_last_c_pos itself (so it can pass
+ _rl_move_cursor_relative accurate values); it communicates
+ this back by setting cpos_adjusted. If we assume that
+ _rl_last_c_pos is correct (an absolute cursor position) each
+ time update_line is called, then we can assume in our
+ calculations that o_cpos does not need to be adjusted by
+ wrap_offset. */
+ if (linenum == 0 && (mb_cur_max > 1 && rl_byte_oriented == 0) && OLD_CPOS_IN_PROMPT())
+ _rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */
+ else if (cpos_adjusted == 0 &&
+ linenum == prompt_last_screen_line &&
+ prompt_physical_chars > _rl_screenwidth &&
+ (mb_cur_max > 1 && rl_byte_oriented == 0) &&
+ _rl_last_c_pos != o_cpos &&
+ _rl_last_c_pos > (prompt_last_invisible - _rl_screenwidth - prompt_invis_chars_first_line)) /* XXX - rethink this last one */
+ /* This assumes that all the invisible characters are split
+ between the first and last lines of the prompt, if the
+ prompt consumes more than two lines. It's usually right */
+ /* XXX - not sure this is ever executed */
+ _rl_last_c_pos -= (wrap_offset-prompt_invis_chars_first_line);
+
+ /* If this is the line with the prompt, we might need to
+ compensate for invisible characters in the new line. Do
+ this only if there is not more than one new line (which
+ implies that we completely overwrite the old visible line)
+ and the new line is shorter than the old. Make sure we are
+ at the end of the new line before clearing. */
+ if (linenum == 0 &&
+ inv_botlin == 0 && _rl_last_c_pos == out &&
+ (wrap_offset > visible_wrap_offset) &&
+ (_rl_last_c_pos < visible_first_line_len))
+ {
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ nleft = _rl_screenwidth - _rl_last_c_pos;
+ else
+ nleft = _rl_screenwidth + wrap_offset - _rl_last_c_pos;
+ if (nleft)
+ _rl_clear_to_eol (nleft);
+ }
+#if 0
+ /* This segment is intended to handle the case where the old
+ visible prompt has invisible characters and the new line
+ to be displayed needs to clear the rest of the old characters
+ out (e.g., when printing the i-search prompt): in general,
+ the case of the new line being shorter than the old. We need
+ to be at the end of the new line and the old line needs to be
+ longer than the current cursor position. It's not perfect,
+ since it uses the byte length of the first line, but this will
+ at worst result in some extra clear-to-end-of-lines. We can't
+ use the prompt length variables because they may not
+ correspond to the visible line (see printing the i-search
+ prompt above). The tests for differing numbers of invisible
+ characters may not matter and can probably be removed. */
+ else if (linenum == 0 &&
+ linenum == prompt_last_screen_line &&
+ _rl_last_c_pos == out &&
+ _rl_last_c_pos < visible_first_line_len &&
+ visible_wrap_offset &&
+ visible_wrap_offset != wrap_offset)
+ {
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ nleft = _rl_screenwidth - _rl_last_c_pos;
+ else
+ nleft = _rl_screenwidth + wrap_offset - _rl_last_c_pos;
+ if (nleft)
+ _rl_clear_to_eol (nleft);
+ }
+#endif
+
+ /* Since the new first line is now visible, save its length. */
+ if (linenum == 0)
+ visible_first_line_len = (inv_botlin > 0) ? inv_lbreaks[1] : out - wrap_offset;
+ }
+
+ /* We may have deleted some lines. If so, clear the left over
+ blank ones at the bottom out. */
+ if (_rl_vis_botlin > inv_botlin)
+ {
+ char *tt;
+ for (; linenum <= _rl_vis_botlin; linenum++)
+ {
+ tt = VIS_CHARS (linenum);
+ _rl_move_vert (linenum);
+ _rl_move_cursor_relative (0, tt, VIS_FACE(linenum));
+ _rl_clear_to_eol
+ ((linenum == _rl_vis_botlin) ? strlen (tt) : _rl_screenwidth);
+ }
+ }
+ _rl_vis_botlin = inv_botlin;
+
+ /* CHANGED_SCREEN_LINE is set to 1 if we have moved to a
+ different screen line during this redisplay. */
+ changed_screen_line = _rl_last_v_pos != cursor_linenum;
+ if (changed_screen_line)
+ {
+ _rl_move_vert (cursor_linenum);
+ /* If we moved up to the line with the prompt using _rl_term_up,
+ the physical cursor position on the screen stays the same,
+ but the buffer position needs to be adjusted to account
+ for invisible characters. */
+ if ((mb_cur_max == 1 || rl_byte_oriented) && cursor_linenum == 0 && wrap_offset)
+ _rl_last_c_pos += wrap_offset;
+ }
+
+ /* Now we move the cursor to where it needs to be. First, make
+ sure we are on the correct line (cursor_linenum). */
+
+ /* We have to reprint the prompt if it contains invisible
+ characters, since it's not generally OK to just reprint
+ the characters from the current cursor position. But we
+ only need to reprint it if the cursor is before the last
+ invisible character in the prompt string. */
+ /* XXX - why not use local_prompt_len? */
+ nleft = prompt_visible_length + wrap_offset;
+ if (cursor_linenum == 0 && wrap_offset > 0 && _rl_last_c_pos > 0 &&
+ _rl_last_c_pos < PROMPT_ENDING_INDEX && local_prompt)
+ {
+ _rl_cr ();
+ if (modmark)
+ _rl_output_some_chars ("*", 1);
+
+ _rl_output_some_chars (local_prompt, nleft);
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ _rl_last_c_pos = _rl_col_width (local_prompt, 0, nleft, 1) - wrap_offset + modmark;
+ else
+ _rl_last_c_pos = nleft + modmark;
+ }
+
+ /* Where on that line? And where does that line start
+ in the buffer? */
+ pos = inv_lbreaks[cursor_linenum];
+ /* nleft == number of characters (bytes) in the line buffer between
+ the start of the line and the desired cursor position. */
+ nleft = cpos_buffer_position - pos;
+
+ /* NLEFT is now a number of characters in a buffer. When in a
+ multibyte locale, however, _rl_last_c_pos is an absolute cursor
+ position that doesn't take invisible characters in the prompt
+ into account. We use a fudge factor to compensate. */
+
+ /* Since _rl_backspace() doesn't know about invisible characters in
+ the prompt, and there's no good way to tell it, we compensate for
+ those characters here and call _rl_backspace() directly if
+ necessary */
+ if (wrap_offset && cursor_linenum == 0 && nleft < _rl_last_c_pos)
+ {
+ /* TX == new physical cursor position in multibyte locale. */
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ tx = _rl_col_width (&visible_line[pos], 0, nleft, 1) - visible_wrap_offset;
+ else
+ tx = nleft;
+ if (tx >= 0 && _rl_last_c_pos > tx)
+ {
+ _rl_backspace (_rl_last_c_pos - tx); /* XXX */
+ _rl_last_c_pos = tx;
+ }
+ }
+
+ /* We need to note that in a multibyte locale we are dealing with
+ _rl_last_c_pos as an absolute cursor position, but moving to a
+ point specified by a buffer position (NLEFT) that doesn't take
+ invisible characters into account. */
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ _rl_move_cursor_relative (nleft, &invisible_line[pos], &inv_face[pos]);
+ else if (nleft != _rl_last_c_pos)
+ _rl_move_cursor_relative (nleft, &invisible_line[pos], &inv_face[pos]);
+ }
+ }
+ else /* Do horizontal scrolling. Much simpler */
+ {
+#define M_OFFSET(margin, offset) ((margin) == 0 ? offset : 0)
+ int lmargin, ndisp, nleft, phys_c_pos, t;
+
+ /* Always at top line. */
+ _rl_last_v_pos = 0;
+
+ /* Compute where in the buffer the displayed line should start. This
+ will be LMARGIN. */
+
+ /* The number of characters that will be displayed before the cursor. */
+ ndisp = cpos_buffer_position - wrap_offset;
+ nleft = prompt_visible_length + wrap_offset;
+ /* Where the new cursor position will be on the screen. This can be
+ longer than SCREENWIDTH; if it is, lmargin will be adjusted. */
+ phys_c_pos = cpos_buffer_position - (last_lmargin ? last_lmargin : wrap_offset);
+ t = _rl_screenwidth / 3;
+
+ /* If the number of characters had already exceeded the screenwidth,
+ last_lmargin will be > 0. */
+
+ /* If the number of characters to be displayed is more than the screen
+ width, compute the starting offset so that the cursor is about
+ two-thirds of the way across the screen. */
+ if (phys_c_pos > _rl_screenwidth - 2)
+ {
+ lmargin = cpos_buffer_position - (2 * t);
+ if (lmargin < 0)
+ lmargin = 0;
+ /* If the left margin would be in the middle of a prompt with
+ invisible characters, don't display the prompt at all. */
+ if (wrap_offset && lmargin > 0 && lmargin < nleft)
+ lmargin = nleft;
+ }
+ else if (ndisp < _rl_screenwidth - 2) /* XXX - was -1 */
+ lmargin = 0;
+ else if (phys_c_pos < 1)
+ {
+ /* If we are moving back towards the beginning of the line and
+ the last margin is no longer correct, compute a new one. */
+ lmargin = ((cpos_buffer_position - 1) / t) * t; /* XXX */
+ if (wrap_offset && lmargin > 0 && lmargin < nleft)
+ lmargin = nleft;
+ }
+ else
+ lmargin = last_lmargin;
+
+ displaying_prompt_first_line = lmargin < nleft;
+
+ /* If the first character on the screen isn't the first character
+ in the display line, indicate this with a special character. */
+ if (lmargin > 0)
+ invisible_line[lmargin] = '<';
+
+ /* If SCREENWIDTH characters starting at LMARGIN do not encompass
+ the whole line, indicate that with a special character at the
+ right edge of the screen. If LMARGIN is 0, we need to take the
+ wrap offset into account. */
+ t = lmargin + M_OFFSET (lmargin, wrap_offset) + _rl_screenwidth;
+ if (t > 0 && t < out)
+ invisible_line[t - 1] = '>';
+
+ if (rl_display_fixed == 0 || forced_display || lmargin != last_lmargin)
+ {
+ forced_display = 0;
+ o_cpos = _rl_last_c_pos;
+ cpos_adjusted = 0;
+ update_line (&visible_line[last_lmargin], &vis_face[last_lmargin],
+ &invisible_line[lmargin], &inv_face[lmargin],
+ 0,
+ _rl_screenwidth + visible_wrap_offset,
+ _rl_screenwidth + (lmargin ? 0 : wrap_offset),
+ 0);
+
+ if ((mb_cur_max > 1 && rl_byte_oriented == 0) &&
+ displaying_prompt_first_line && OLD_CPOS_IN_PROMPT())
+ _rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */
+
+ /* If the visible new line is shorter than the old, but the number
+ of invisible characters is greater, and we are at the end of
+ the new line, we need to clear to eol. */
+ t = _rl_last_c_pos - M_OFFSET (lmargin, wrap_offset);
+ if ((M_OFFSET (lmargin, wrap_offset) > visible_wrap_offset) &&
+ (_rl_last_c_pos == out) && displaying_prompt_first_line &&
+ t < visible_first_line_len)
+ {
+ nleft = _rl_screenwidth - t;
+ _rl_clear_to_eol (nleft);
+ }
+ visible_first_line_len = out - lmargin - M_OFFSET (lmargin, wrap_offset);
+ if (visible_first_line_len > _rl_screenwidth)
+ visible_first_line_len = _rl_screenwidth;
+
+ _rl_move_cursor_relative (cpos_buffer_position - lmargin, &invisible_line[lmargin], &inv_face[lmargin]);
+ last_lmargin = lmargin;
+ }
+ }
+ fflush (rl_outstream);
+
+ /* Swap visible and non-visible lines. */
+ {
+ struct line_state *vtemp = line_state_visible;
+
+ line_state_visible = line_state_invisible;
+ line_state_invisible = vtemp;
+
+ rl_display_fixed = 0;
+ /* If we are displaying on a single line, and last_lmargin is > 0, we
+ are not displaying any invisible characters, so set visible_wrap_offset
+ to 0. */
+ if (_rl_horizontal_scroll_mode && last_lmargin)
+ visible_wrap_offset = 0;
+ else
+ visible_wrap_offset = wrap_offset;
+
+ _rl_quick_redisplay = 0;
+ }
+
+ RL_UNSETSTATE (RL_STATE_REDISPLAYING);
+ _rl_release_sigint ();
+}
+
+static void
+putc_face (int c, int face, char *cur_face)
+{
+ char cf;
+ cf = *cur_face;
+ if (cf != face)
+ {
+ if (cf != FACE_NORMAL && cf != FACE_STANDOUT)
+ return;
+ if (face != FACE_NORMAL && face != FACE_STANDOUT)
+ return;
+ if (face == FACE_STANDOUT && cf == FACE_NORMAL)
+ _rl_region_color_on ();
+ if (face == FACE_NORMAL && cf == FACE_STANDOUT)
+ _rl_region_color_off ();
+ *cur_face = face;
+ }
+ if (c != EOF)
+ putc (c, rl_outstream);
+}
+
+static void
+puts_face (const char *str, const char *face, int n)
+{
+ int i;
+ char cur_face;
+
+ for (cur_face = FACE_NORMAL, i = 0; i < n; i++)
+ putc_face ((unsigned char) str[i], face[i], &cur_face);
+ putc_face (EOF, FACE_NORMAL, &cur_face);
+}
+
+static void
+norm_face (char *face, int n)
+{
+ memset (face, FACE_NORMAL, n);
+}
+
+#define ADJUST_CPOS(x) do { _rl_last_c_pos -= (x) ; cpos_adjusted = 1; } while (0)
+
+/* PWP: update_line() is based on finding the middle difference of each
+ line on the screen; vis:
+
+ /old first difference
+ /beginning of line | /old last same /old EOL
+ v v v v
+old: eddie> Oh, my little gruntle-buggy is to me, as lurgid as
+new: eddie> Oh, my little buggy says to me, as lurgid as
+ ^ ^ ^ ^
+ \beginning of line | \new last same \new end of line
+ \new first difference
+
+ All are character pointers for the sake of speed. Special cases for
+ no differences, as well as for end of line additions must be handled.
+
+ Could be made even smarter, but this works well enough */
+static void
+update_line (char *old, char *old_face, char *new, char *new_face, int current_line, int omax, int nmax, int inv_botlin)
+{
+ char *ofd, *ols, *oe, *nfd, *nls, *ne;
+ char *ofdf, *nfdf, *olsf, *nlsf;
+ int temp, lendiff, wsatend, od, nd, twidth, o_cpos;
+ int current_invis_chars;
+ int col_lendiff, col_temp;
+ int bytes_to_insert;
+ int mb_cur_max = MB_CUR_MAX;
+#if defined (HANDLE_MULTIBYTE)
+ mbstate_t ps_new, ps_old;
+ int new_offset, old_offset;
+#endif
+
+ /* If we're at the right edge of a terminal that supports xn, we're
+ ready to wrap around, so do so. This fixes problems with knowing
+ the exact cursor position and cut-and-paste with certain terminal
+ emulators. In this calculation, TEMP is the physical screen
+ position of the cursor. */
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ temp = _rl_last_c_pos;
+ else
+ temp = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset);
+ if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
+ && _rl_last_v_pos == current_line - 1)
+ {
+ /* We're going to wrap around by writing the first character of NEW to
+ the screen and dealing with changes to what's visible by modifying
+ OLD to match it. Complicated by the presence of multi-width
+ characters at the end of the line or beginning of the new one. */
+ /* old is always somewhere in visible_line; new is always somewhere in
+ invisible_line. These should always be null-terminated. */
+#if defined (HANDLE_MULTIBYTE)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ WCHAR_T wc;
+ mbstate_t ps;
+ int oldwidth, newwidth;
+ int oldbytes, newbytes;
+ size_t ret;
+
+ /* This fixes only double-column characters, but if the wrapped
+ character consumes more than three columns, spaces will be
+ inserted in the string buffer. */
+ /* XXX remember that we are working on the invisible line right now;
+ we don't swap visible and invisible until just before rl_redisplay
+ returns */
+ /* This will remove the extra placeholder space we added with
+ _rl_wrapped_multicolumn */
+ if (current_line < line_state_invisible->wbsize && line_state_invisible->wrapped_line[current_line] > 0)
+ _rl_clear_to_eol (line_state_invisible->wrapped_line[current_line]);
+
+ /* 1. how many screen positions does first char in old consume? */
+ memset (&ps, 0, sizeof (mbstate_t));
+ ret = MBRTOWC (&wc, old, mb_cur_max, &ps);
+ oldbytes = ret;
+ if (MB_INVALIDCH (ret))
+ {
+ oldwidth = 1;
+ oldbytes = 1;
+ }
+ else if (MB_NULLWCH (ret))
+ oldwidth = 0;
+ else
+ oldwidth = WCWIDTH (wc);
+ if (oldwidth < 0)
+ oldwidth = 1;
+
+ /* 2. how many screen positions does the first char in new consume? */
+ memset (&ps, 0, sizeof (mbstate_t));
+ ret = MBRTOWC (&wc, new, mb_cur_max, &ps);
+ newbytes = ret;
+ if (MB_INVALIDCH (ret))
+ {
+ newwidth = 1;
+ newbytes = 1;
+ }
+ else if (MB_NULLWCH (ret))
+ newwidth = 0;
+ else
+ newwidth = WCWIDTH (wc);
+ if (newwidth < 0)
+ newwidth = 1;
+
+ /* 3. if the new width is less than the old width, we need to keep
+ going in new until we have consumed at least that many screen
+ positions, and figure out how many bytes that will take */
+ while (newbytes < nmax && newwidth < oldwidth)
+ {
+ int t;
+
+ ret = MBRTOWC (&wc, new+newbytes, mb_cur_max, &ps);
+ if (MB_INVALIDCH (ret))
+ {
+ newwidth += 1;
+ newbytes += 1;
+ }
+ else if (MB_NULLWCH (ret))
+ break;
+ else
+ {
+ t = WCWIDTH (wc);
+ newwidth += (t >= 0) ? t : 1;
+ newbytes += ret;
+ }
+ }
+ /* 4. If the new width is more than the old width, keep going in old
+ until we have consumed exactly that many screen positions, and
+ figure out how many bytes that will take. This is an optimization */
+ while (oldbytes < omax && oldwidth < newwidth)
+ {
+ int t;
+
+ ret = MBRTOWC (&wc, old+oldbytes, mb_cur_max, &ps);
+ if (MB_INVALIDCH (ret))
+ {
+ oldwidth += 1;
+ oldbytes += 1;
+ }
+ else if (MB_NULLWCH (ret))
+ break;
+ else
+ {
+ t = WCWIDTH (wc);
+ oldwidth += (t >= 0) ? t : 1;
+ oldbytes += ret;
+ }
+ }
+ /* 5. write the first newbytes of new, which takes newwidth. This is
+ where the screen wrapping takes place, and we are now writing
+ characters onto the new line. We need to fix up old so it
+ accurately reflects what is on the screen after the
+ _rl_output_some_chars below. */
+ if (newwidth > 0)
+ {
+ int count, i, j;
+ char *optr;
+
+ puts_face (new, new_face, newbytes);
+ _rl_last_c_pos = newwidth;
+ _rl_last_v_pos++;
+
+ /* 5a. If the number of screen positions doesn't match, punt
+ and do a dumb update.
+ 5b. If the number of bytes is greater in the new line than
+ the old, do a dumb update, because there is no guarantee we
+ can extend the old line enough to fit the new bytes. */
+ if (newwidth != oldwidth || newbytes > oldbytes)
+ {
+ oe = old + omax;
+ ne = new + nmax;
+ nd = newbytes;
+ nfd = new + nd;
+ ofdf = old_face + oldbytes;
+ nfdf = new_face + newbytes;
+
+ goto dumb_update;
+ }
+ if (oldbytes != 0 && newbytes != 0)
+ {
+ /* We have written as many bytes from new as we need to
+ consume the first character of old. Fix up `old' so it
+ reflects the new screen contents. We use +1 in the
+ memmove call to copy the trailing NUL. */
+ /* (strlen(old+oldbytes) == (omax - oldbytes - 1)) */
+
+ /* Don't bother trying to fit the bytes if the number of bytes
+ doesn't change. */
+ if (oldbytes != newbytes)
+ {
+ memmove (old+newbytes, old+oldbytes, strlen (old+oldbytes) + 1);
+ memmove (old_face+newbytes, old_face+oldbytes, strlen (old+oldbytes) + 1);
+ }
+ memcpy (old, new, newbytes);
+ memcpy (old_face, new_face, newbytes);
+ j = newbytes - oldbytes;
+ omax += j;
+ /* Fix up indices if we copy data from one line to another */
+ for (i = current_line+1; j != 0 && i <= inv_botlin+1 && i <=_rl_vis_botlin+1; i++)
+ vis_lbreaks[i] += j;
+ }
+ }
+ else
+ {
+ putc (' ', rl_outstream);
+ _rl_last_c_pos = 1;
+ _rl_last_v_pos++;
+ if (old[0] && new[0])
+ {
+ old[0] = new[0];
+ old_face[0] = new_face[0];
+ }
+ }
+ }
+ else
+#endif
+ {
+ if (new[0])
+ puts_face (new, new_face, 1);
+ else
+ putc (' ', rl_outstream);
+ _rl_last_c_pos = 1;
+ _rl_last_v_pos++;
+ if (old[0] && new[0])
+ {
+ old[0] = new[0];
+ old_face[0] = new_face[0];
+ }
+ }
+ }
+
+ /* We know that we are dealing with a single screen line here */
+ if (_rl_quick_redisplay)
+ {
+ nfd = new;
+ nfdf = new_face;
+ ofd = old;
+ ofdf = old_face;
+ for (od = 0, oe = ofd; od < omax && *oe; oe++, od++);
+ for (nd = 0, ne = nfd; nd < nmax && *ne; ne++, nd++);
+ od = nd = 0;
+ _rl_move_cursor_relative (0, old, old_face);
+
+ bytes_to_insert = ne - nfd;
+ if (bytes_to_insert < local_prompt_len) /* ??? */
+ goto dumb_update;
+
+ /* output the prompt, output the line contents, clear the rest */
+ _rl_output_some_chars (nfd, local_prompt_len);
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ _rl_last_c_pos = prompt_physical_chars;
+ else
+ _rl_last_c_pos = local_prompt_len;
+
+ bytes_to_insert -= local_prompt_len;
+ if (bytes_to_insert > 0)
+ {
+ puts_face (new+local_prompt_len, nfdf+local_prompt_len, bytes_to_insert);
+ if (mb_cur_max > 1 && rl_byte_oriented)
+ _rl_last_c_pos += _rl_col_width (new, local_prompt_len, ne-new, 1);
+ else
+ _rl_last_c_pos += bytes_to_insert;
+ }
+
+ /* See comments at dumb_update: for an explanation of this heuristic */
+ if (nmax < omax)
+ goto clear_rest_of_line;
+ else if ((nmax - W_OFFSET(current_line, wrap_offset)) < (omax - W_OFFSET (current_line, visible_wrap_offset)))
+ goto clear_rest_of_line;
+ else
+ return;
+ }
+
+ /* Find first difference. */
+#if defined (HANDLE_MULTIBYTE)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ /* See if the old line is a subset of the new line, so that the
+ only change is adding characters. */
+ temp = (omax < nmax) ? omax : nmax;
+ if (memcmp (old, new, temp) == 0 && memcmp (old_face, new_face, temp) == 0)
+ {
+ new_offset = old_offset = temp; /* adding at the end */
+ ofd = old + temp;
+ ofdf = old_face + temp;
+ nfd = new + temp;
+ nfdf = new_face + temp;
+ }
+ else
+ {
+ memset (&ps_new, 0, sizeof(mbstate_t));
+ memset (&ps_old, 0, sizeof(mbstate_t));
+
+ /* Are the old and new lines the same? */
+ if (omax == nmax && memcmp (new, old, omax) == 0 && memcmp (new_face, old_face, omax) == 0)
+ {
+ old_offset = omax;
+ new_offset = nmax;
+ ofd = old + omax;
+ ofdf = old_face + omax;
+ nfd = new + nmax;
+ nfdf = new_face + nmax;
+ }
+ else
+ {
+ /* Go through the line from the beginning and find the first
+ difference. We assume that faces change at (possibly multi-
+ byte) character boundaries. */
+ new_offset = old_offset = 0;
+ for (ofd = old, ofdf = old_face, nfd = new, nfdf = new_face;
+ (ofd - old < omax) && *ofd &&
+ _rl_compare_chars(old, old_offset, &ps_old, new, new_offset, &ps_new) &&
+ *ofdf == *nfdf; )
+ {
+ old_offset = _rl_find_next_mbchar (old, old_offset, 1, MB_FIND_ANY);
+ new_offset = _rl_find_next_mbchar (new, new_offset, 1, MB_FIND_ANY);
+
+ ofd = old + old_offset;
+ ofdf = old_face + old_offset;
+ nfd = new + new_offset;
+ nfdf = new_face + new_offset;
+ }
+ }
+ }
+ }
+ else
+#endif
+ for (ofd = old, ofdf = old_face, nfd = new, nfdf = new_face;
+ (ofd - old < omax) && *ofd && (*ofd == *nfd) && (*ofdf == *nfdf);
+ ofd++, nfd++, ofdf++, nfdf++)
+ ;
+
+ /* Move to the end of the screen line. ND and OD are used to keep track
+ of the distance between ne and new and oe and old, respectively, to
+ move a subtraction out of each loop. */
+ for (od = ofd - old, oe = ofd; od < omax && *oe; oe++, od++);
+ for (nd = nfd - new, ne = nfd; nd < nmax && *ne; ne++, nd++);
+
+ /* If no difference, continue to next line. */
+ if (ofd == oe && nfd == ne)
+ return;
+
+#if defined (HANDLE_MULTIBYTE)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0 && _rl_utf8locale)
+ {
+ WCHAR_T wc;
+ mbstate_t ps = { 0 };
+ int t;
+
+ /* If the first character in the difference is a zero-width character,
+ assume it's a combining character and back one up so the two base
+ characters no longer compare equivalently. */
+ t = MBRTOWC (&wc, ofd, mb_cur_max, &ps);
+ if (t > 0 && UNICODE_COMBINING_CHAR (wc) && WCWIDTH (wc) == 0)
+ {
+ old_offset = _rl_find_prev_mbchar (old, ofd - old, MB_FIND_ANY);
+ new_offset = _rl_find_prev_mbchar (new, nfd - new, MB_FIND_ANY);
+ ofd = old + old_offset; /* equal by definition */
+ ofdf = old_face + old_offset;
+ nfd = new + new_offset;
+ nfdf = new_face + new_offset;
+ }
+ }
+#endif
+
+ wsatend = 1; /* flag for trailing whitespace */
+
+#if defined (HANDLE_MULTIBYTE)
+ /* Find the last character that is the same between the two lines. This
+ bounds the region that needs to change. */
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ ols = old + _rl_find_prev_mbchar (old, oe - old, MB_FIND_ANY);
+ olsf = old_face + (ols - old);
+ nls = new + _rl_find_prev_mbchar (new, ne - new, MB_FIND_ANY);
+ nlsf = new_face + (nls - new);
+
+ while ((ols > ofd) && (nls > nfd))
+ {
+ memset (&ps_old, 0, sizeof (mbstate_t));
+ memset (&ps_new, 0, sizeof (mbstate_t));
+
+ if (_rl_compare_chars (old, ols - old, &ps_old, new, nls - new, &ps_new) == 0 ||
+ *olsf != *nlsf)
+ break;
+
+ if (*ols == ' ')
+ wsatend = 0;
+
+ ols = old + _rl_find_prev_mbchar (old, ols - old, MB_FIND_ANY);
+ olsf = old_face + (ols - old);
+ nls = new + _rl_find_prev_mbchar (new, nls - new, MB_FIND_ANY);
+ nlsf = new_face + (nls - new);
+ }
+ }
+ else
+ {
+#endif /* HANDLE_MULTIBYTE */
+ ols = oe - 1; /* find last same */
+ olsf = old_face + (ols - old);
+ nls = ne - 1;
+ nlsf = new_face + (nls - new);
+ while ((ols > ofd) && (nls > nfd) && (*ols == *nls) && (*olsf == *nlsf))
+ {
+ if (*ols != ' ')
+ wsatend = 0;
+ ols--; olsf--;
+ nls--; nlsf--;
+ }
+#if defined (HANDLE_MULTIBYTE)
+ }
+#endif
+
+ if (wsatend)
+ {
+ ols = oe;
+ olsf = old_face + (ols - old);
+ nls = ne;
+ nlsf = new_face + (nls - new);
+ }
+#if defined (HANDLE_MULTIBYTE)
+ /* This may not work for stateful encoding, but who cares? To handle
+ stateful encoding properly, we have to scan each string from the
+ beginning and compare. */
+ else if (_rl_compare_chars (ols, 0, NULL, nls, 0, NULL) == 0 || *olsf != *nlsf)
+#else
+ else if (*ols != *nls || *olsf != *nlsf)
+#endif
+ {
+ if (*ols) /* don't step past the NUL */
+ {
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ ols = old + _rl_find_next_mbchar (old, ols - old, 1, MB_FIND_ANY);
+ else
+ ols++;
+ }
+ if (*nls)
+ {
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ nls = new + _rl_find_next_mbchar (new, nls - new, 1, MB_FIND_ANY);
+ else
+ nls++;
+ }
+ olsf = old_face + (ols - old);
+ nlsf = new_face + (nls - new);
+ }
+
+ /* count of invisible characters in the current invisible line. */
+ current_invis_chars = W_OFFSET (current_line, wrap_offset);
+ if (_rl_last_v_pos != current_line)
+ {
+ _rl_move_vert (current_line);
+ /* We have moved up to a new screen line. This line may or may not have
+ invisible characters on it, but we do our best to recalculate
+ visible_wrap_offset based on what we know. */
+ if (current_line == 0)
+ visible_wrap_offset = prompt_invis_chars_first_line; /* XXX */
+#if 0 /* XXX - not yet */
+ else if (current_line == prompt_last_screen_line && wrap_offset > prompt_invis_chars_first_line)
+ visible_wrap_offset = wrap_offset - prompt_invis_chars_first_line
+#endif
+ if ((mb_cur_max == 1 || rl_byte_oriented) && current_line == 0 && visible_wrap_offset)
+ _rl_last_c_pos += visible_wrap_offset;
+ }
+
+ /* If this is the first line and there are invisible characters in the
+ prompt string, and the prompt string has not changed, and the current
+ cursor position is before the last invisible character in the prompt,
+ and the index of the character to move to is past the end of the prompt
+ string, then redraw the entire prompt string. We can only do this
+ reliably if the terminal supports a `cr' capability.
+
+ This can also happen if the prompt string has changed, and the first
+ difference in the line is in the middle of the prompt string, after a
+ sequence of invisible characters (worst case) and before the end of
+ the prompt. In this case, we have to redraw the entire prompt string
+ so that the entire sequence of invisible characters is drawn. We need
+ to handle the worst case, when the difference is after (or in the middle
+ of) a sequence of invisible characters that changes the text color and
+ before the sequence that restores the text color to normal. Then we have
+ to make sure that the lines still differ -- if they don't, we can
+ return immediately.
+
+ This is not an efficiency hack -- there is a problem with redrawing
+ portions of the prompt string if they contain terminal escape
+ sequences (like drawing the `unbold' sequence without a corresponding
+ `bold') that manifests itself on certain terminals. */
+
+ lendiff = local_prompt_len;
+ if (lendiff > nmax)
+ lendiff = nmax;
+ od = ofd - old; /* index of first difference in visible line */
+ nd = nfd - new; /* nd, od are buffer indexes */
+ if (current_line == 0 && !_rl_horizontal_scroll_mode &&
+ _rl_term_cr && lendiff > prompt_visible_length && _rl_last_c_pos > 0 &&
+ (((od > 0 || nd > 0) && (od <= prompt_last_invisible || nd <= prompt_last_invisible)) ||
+ ((od >= lendiff) && _rl_last_c_pos < PROMPT_ENDING_INDEX)))
+ {
+ _rl_cr ();
+ if (modmark)
+ _rl_output_some_chars ("*", 1);
+ _rl_output_some_chars (local_prompt, lendiff);
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ /* If we just output the entire prompt string we can take advantage
+ of knowing the number of physical characters in the prompt. If
+ the prompt wraps lines (lendiff clamped at nmax), we can't. */
+ if (lendiff == local_prompt_len)
+ _rl_last_c_pos = prompt_physical_chars + modmark;
+ else
+ /* We take wrap_offset into account here so we can pass correct
+ information to _rl_move_cursor_relative. */
+ _rl_last_c_pos = _rl_col_width (local_prompt, 0, lendiff, 1) - wrap_offset + modmark;
+ cpos_adjusted = 1;
+ }
+ else
+ _rl_last_c_pos = lendiff + modmark;
+
+ /* Now if we have printed the prompt string because the first difference
+ was within the prompt, see if we need to recompute where the lines
+ differ. Check whether where we are now is past the last place where
+ the old and new lines are the same and short-circuit now if we are. */
+ if ((od <= prompt_last_invisible || nd <= prompt_last_invisible) &&
+ omax == nmax &&
+ lendiff > (ols-old) && lendiff > (nls-new))
+ return;
+
+ /* XXX - we need to fix up our calculations if we are now past the
+ old ofd/nfd and the prompt length (or line length) has changed.
+ We punt on the problem and do a dumb update. We'd like to be able
+ to just output the prompt from the beginning of the line up to the
+ first difference, but you don't know the number of invisible
+ characters in that case.
+ This needs a lot of work to be efficient, but it usually doesn't matter. */
+ if ((od <= prompt_last_invisible || nd <= prompt_last_invisible))
+ {
+ nfd = new + lendiff; /* number of characters we output above */
+ nfdf = new_face + lendiff;
+ nd = lendiff;
+
+ /* Do a dumb update and return */
+dumb_update:
+ temp = ne - nfd;
+ if (temp > 0)
+ {
+ puts_face (nfd, nfdf, temp);
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ _rl_last_c_pos += _rl_col_width (new, nd, ne - new, 1);
+ /* Need to adjust here based on wrap_offset. Guess that if
+ this is the line containing the last line of the prompt
+ we need to adjust by
+ wrap_offset-prompt_invis_chars_first_line
+ on the assumption that this is the number of invisible
+ characters in the last line of the prompt. */
+ if (wrap_offset > prompt_invis_chars_first_line &&
+ current_line == prompt_last_screen_line &&
+ prompt_physical_chars > _rl_screenwidth &&
+ _rl_horizontal_scroll_mode == 0)
+ ADJUST_CPOS (wrap_offset - prompt_invis_chars_first_line);
+
+ /* If we just output a new line including the prompt, and
+ the prompt includes invisible characters, we need to
+ account for them in the _rl_last_c_pos calculation, since
+ _rl_col_width does not. This happens when other code does
+ a goto dumb_update; */
+ else if (current_line == 0 &&
+ nfd == new &&
+ prompt_invis_chars_first_line &&
+ local_prompt_len <= temp &&
+ wrap_offset >= prompt_invis_chars_first_line &&
+ _rl_horizontal_scroll_mode == 0)
+ ADJUST_CPOS (prompt_invis_chars_first_line);
+ }
+ else
+ _rl_last_c_pos += temp;
+ }
+ /* This is a useful heuristic, but what we really want is to clear
+ if the new number of visible screen characters is less than the
+ old number of visible screen characters. If the prompt has changed,
+ we don't really have enough information about the visible line to
+ know for sure, so we use another heuristic calclulation below. */
+ if (nmax < omax)
+ goto clear_rest_of_line; /* XXX */
+ else if ((nmax - W_OFFSET(current_line, wrap_offset)) < (omax - W_OFFSET (current_line, visible_wrap_offset)))
+ goto clear_rest_of_line;
+ else
+ return;
+ }
+ }
+
+ o_cpos = _rl_last_c_pos;
+
+ /* When this function returns, _rl_last_c_pos is correct, and an absolute
+ cursor position in multibyte mode, but a buffer index when not in a
+ multibyte locale. */
+ _rl_move_cursor_relative (od, old, old_face);
+
+#if defined (HANDLE_MULTIBYTE)
+ /* We need to indicate that the cursor position is correct in the presence of
+ invisible characters in the prompt string. Let's see if setting this when
+ we make sure we're at the end of the drawn prompt string works. */
+ if (current_line == 0 && mb_cur_max > 1 && rl_byte_oriented == 0 &&
+ (_rl_last_c_pos > 0 || o_cpos > 0) &&
+ _rl_last_c_pos == prompt_physical_chars)
+ cpos_adjusted = 1;
+#endif
+
+ /* if (len (new) > len (old))
+ lendiff == difference in buffer (bytes)
+ col_lendiff == difference on screen (columns)
+ When not using multibyte characters, these are equal */
+ lendiff = (nls - nfd) - (ols - ofd);
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ int newchars, newwidth, newind;
+ int oldchars, oldwidth, oldind;
+
+ newchars = nls - new;
+ oldchars = ols - old;
+
+ /* If we can do it, try to adjust nls and ols so that nls-new will
+ contain the entire new prompt string. That way we can use
+ prompt_physical_chars and not have to recompute column widths.
+ _rl_col_width adds wrap_offset and expects the caller to compensate,
+ which we do below, so we do the same thing if we don't call
+ _rl_col_width.
+ We don't have to compare, since we know the characters are the same.
+ The check of differing numbers of invisible chars may be extraneous.
+ XXX - experimental */
+ if (current_line == 0 && nfd == new && newchars > prompt_last_invisible &&
+ newchars <= local_prompt_len &&
+ local_prompt_len <= nmax &&
+ current_invis_chars != visible_wrap_offset)
+ {
+ while (newchars < nmax && oldchars < omax && newchars < local_prompt_len)
+ {
+#if defined (HANDLE_MULTIBYTE)
+ newind = _rl_find_next_mbchar (new, newchars, 1, MB_FIND_NONZERO);
+ oldind = _rl_find_next_mbchar (old, oldchars, 1, MB_FIND_NONZERO);
+
+ nls += newind - newchars;
+ ols += oldind - oldchars;
+
+ newchars = newind;
+ oldchars = oldind;
+#else
+ nls++; ols++;
+ newchars++; oldchars++;
+#endif
+ }
+ newwidth = (newchars == local_prompt_len) ? prompt_physical_chars + wrap_offset
+ : _rl_col_width (new, 0, nls - new, 1);
+ /* if we changed nls and ols, we need to recompute lendiff */
+ lendiff = (nls - nfd) - (ols - ofd);
+
+ nlsf = new_face + (nls - new);
+ olsf = old_face + (ols - old);
+ }
+ else
+ newwidth = _rl_col_width (new, nfd - new, nls - new, 1);
+
+ oldwidth = _rl_col_width (old, ofd - old, ols - old, 1);
+
+ col_lendiff = newwidth - oldwidth;
+ }
+ else
+ col_lendiff = lendiff;
+
+ /* col_lendiff uses _rl_col_width(), which doesn't know about whether or not
+ the multibyte characters it counts are invisible, so unless we're printing
+ the entire prompt string (in which case we can use prompt_physical_chars)
+ the count is short by the number of bytes in the invisible multibyte
+ characters - the number of multibyte characters.
+
+ We don't have a good way to solve this without moving to something like
+ a bitmap that indicates which characters are visible and which are
+ invisible. We fix it up (imperfectly) in the caller and by trying to use
+ the entire prompt string wherever we can. */
+
+ /* If we are changing the number of invisible characters in a line, and
+ the spot of first difference is before the end of the invisible chars,
+ lendiff needs to be adjusted. */
+ if (current_line == 0 && current_invis_chars != visible_wrap_offset)
+ {
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ lendiff += visible_wrap_offset - current_invis_chars;
+ col_lendiff += visible_wrap_offset - current_invis_chars;
+ }
+ else
+ {
+ lendiff += visible_wrap_offset - current_invis_chars;
+ col_lendiff = lendiff;
+ }
+ }
+
+ /* We use temp as a count of the number of bytes from the first difference
+ to the end of the new line. col_temp is the corresponding number of
+ screen columns. A `dumb' update moves to the spot of first difference
+ and writes TEMP bytes. */
+ /* Insert (diff (len (old), len (new)) ch. */
+ temp = ne - nfd;
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ col_temp = _rl_col_width (new, nfd - new, ne - new, 1);
+ else
+ col_temp = temp;
+
+ /* how many bytes from the new line buffer to write to the display */
+ bytes_to_insert = nls - nfd;
+
+ /* col_lendiff > 0 if we are adding characters to the line */
+ if (col_lendiff > 0) /* XXX - was lendiff */
+ {
+ /* Non-zero if we're increasing the number of lines. */
+ int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin;
+
+ /* If col_lendiff is > 0, implying that the new string takes up more
+ screen real estate than the old, but lendiff is < 0, meaning that it
+ takes fewer bytes, we need to just output the characters starting
+ from the first difference. These will overwrite what is on the
+ display, so there's no reason to do a smart update. This can really
+ only happen in a multibyte environment. */
+ if (lendiff < 0)
+ {
+ puts_face (nfd, nfdf, temp);
+ _rl_last_c_pos += col_temp;
+ /* If nfd begins before any invisible characters in the prompt,
+ adjust _rl_last_c_pos to account for wrap_offset and set
+ cpos_adjusted to let the caller know. */
+ if (current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible))
+ ADJUST_CPOS (wrap_offset); /* XXX - prompt_invis_chars_first_line? */
+ return;
+ }
+ /* Sometimes it is cheaper to print the characters rather than
+ use the terminal's capabilities. If we're growing the number
+ of lines, make sure we actually cause the new line to wrap
+ around on auto-wrapping terminals. */
+ else if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl))
+ {
+ /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and
+ _rl_horizontal_scroll_mode == 1, inserting the characters with
+ _rl_term_IC or _rl_term_ic will screw up the screen because of the
+ invisible characters. We need to just draw them. */
+ /* The same thing happens if we're trying to draw before the last
+ invisible character in the prompt string or we're increasing the
+ number of invisible characters in the line and we're not drawing
+ the entire prompt string. */
+ if (*ols && ((_rl_horizontal_scroll_mode &&
+ _rl_last_c_pos == 0 &&
+ lendiff > prompt_visible_length &&
+ current_invis_chars > 0) == 0) &&
+ (((mb_cur_max > 1 && rl_byte_oriented == 0) &&
+ current_line == 0 && wrap_offset &&
+ ((nfd - new) <= prompt_last_invisible) &&
+ (col_lendiff < prompt_visible_length)) == 0) &&
+ (visible_wrap_offset >= current_invis_chars))
+ {
+ open_some_spaces (col_lendiff);
+ puts_face (nfd, nfdf, bytes_to_insert);
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ _rl_last_c_pos += _rl_col_width (nfd, 0, bytes_to_insert, 1);
+ else
+ _rl_last_c_pos += bytes_to_insert;
+ }
+ else if ((mb_cur_max == 1 || rl_byte_oriented != 0) && *ols == 0 && lendiff > 0)
+ {
+ /* At the end of a line the characters do not have to
+ be "inserted". They can just be placed on the screen. */
+ puts_face (nfd, nfdf, temp);
+ _rl_last_c_pos += col_temp;
+ return;
+ }
+ else /* just write from first difference to end of new line */
+ {
+ puts_face (nfd, nfdf, temp);
+ _rl_last_c_pos += col_temp;
+ /* If nfd begins before the last invisible character in the
+ prompt, adjust _rl_last_c_pos to account for wrap_offset
+ and set cpos_adjusted to let the caller know. */
+ if ((mb_cur_max > 1 && rl_byte_oriented == 0) && current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible))
+ ADJUST_CPOS (wrap_offset); /* XXX - prompt_invis_chars_first_line? */
+ return;
+ }
+
+ if (bytes_to_insert > lendiff)
+ {
+ /* If nfd begins before the last invisible character in the
+ prompt, adjust _rl_last_c_pos to account for wrap_offset
+ and set cpos_adjusted to let the caller know. */
+ if ((mb_cur_max > 1 && rl_byte_oriented == 0) && current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible))
+ ADJUST_CPOS (wrap_offset); /* XXX - prompt_invis_chars_first_line? */
+ }
+ }
+ else
+ {
+ /* cannot insert chars, write to EOL */
+ puts_face (nfd, nfdf, temp);
+ _rl_last_c_pos += col_temp;
+ /* If we're in a multibyte locale and were before the last invisible
+ char in the current line (which implies we just output some invisible
+ characters) we need to adjust _rl_last_c_pos, since it represents
+ a physical character position. */
+ /* The current_line*rl_screenwidth+prompt_invis_chars_first_line is a
+ crude attempt to compute how far into the new line buffer we are.
+ It doesn't work well in the face of multibyte characters and needs
+ to be rethought. XXX */
+ if ((mb_cur_max > 1 && rl_byte_oriented == 0) &&
+ current_line == prompt_last_screen_line && wrap_offset &&
+ displaying_prompt_first_line &&
+ wrap_offset != prompt_invis_chars_first_line &&
+ ((nfd-new) < (prompt_last_invisible-(current_line*_rl_screenwidth+prompt_invis_chars_first_line))))
+ ADJUST_CPOS (wrap_offset - prompt_invis_chars_first_line);
+
+ /* What happens if wrap_offset == prompt_invis_chars_first_line
+ and we are drawing the first line (current_line == 0), or if we
+ are drawing the first line and changing the number of invisible
+ characters in the line? If we're starting to draw before the last
+ invisible character in the prompt, we need to adjust by
+ _rl_last_c_pos -= prompt_invis_chars_first_line. This can happen
+ when we finish reading a digit argument (with the "(arg: N)"
+ prompt) and are switching back to displaying a line with a prompt
+ containing invisible characters, since we have to redraw the
+ entire prompt string. */
+ if ((mb_cur_max > 1 && rl_byte_oriented == 0) &&
+ current_line == 0 && wrap_offset &&
+ displaying_prompt_first_line &&
+ wrap_offset == prompt_invis_chars_first_line &&
+ visible_wrap_offset != current_invis_chars &&
+ visible_wrap_offset != prompt_invis_chars_first_line &&
+ ((nfd-new) < prompt_last_invisible))
+ ADJUST_CPOS (prompt_invis_chars_first_line);
+ }
+ }
+ else /* Delete characters from line. */
+ {
+ /* If possible and inexpensive to use terminal deletion, then do so. */
+ if (_rl_term_dc && (2 * col_temp) >= -col_lendiff)
+ {
+ /* If all we're doing is erasing the invisible characters in the
+ prompt string, don't bother. It screws up the assumptions
+ about what's on the screen. */
+ if (_rl_horizontal_scroll_mode && _rl_last_c_pos == 0 &&
+ displaying_prompt_first_line &&
+ -lendiff == visible_wrap_offset)
+ col_lendiff = 0;
+
+ /* If we have moved lmargin and we're shrinking the line, we've
+ already moved the cursor to the first character of the new line,
+ so deleting -col_lendiff characters will mess up the cursor
+ position calculation */
+ if (_rl_horizontal_scroll_mode && displaying_prompt_first_line == 0 &&
+ col_lendiff && _rl_last_c_pos < -col_lendiff)
+ col_lendiff = 0;
+
+ if (col_lendiff)
+ delete_chars (-col_lendiff); /* delete (diff) characters */
+
+ /* Copy (new) chars to screen from first diff to last match,
+ overwriting what is there. */
+ if (bytes_to_insert > 0)
+ {
+ /* If nfd begins at the prompt, or before the invisible
+ characters in the prompt, we need to adjust _rl_last_c_pos
+ in a multibyte locale to account for the wrap offset and
+ set cpos_adjusted accordingly. */
+ puts_face (nfd, nfdf, bytes_to_insert);
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ /* This still doesn't take into account whether or not the
+ characters that this counts are invisible. */
+ _rl_last_c_pos += _rl_col_width (nfd, 0, bytes_to_insert, 1);
+ if (current_line == 0 && wrap_offset &&
+ displaying_prompt_first_line &&
+ prompt_invis_chars_first_line &&
+ _rl_last_c_pos >= prompt_invis_chars_first_line &&
+ ((nfd - new) <= prompt_last_invisible))
+ ADJUST_CPOS (prompt_invis_chars_first_line);
+
+#if 1
+#ifdef HANDLE_MULTIBYTE
+ /* If we write a non-space into the last screen column,
+ remove the note that we added a space to compensate for
+ a multibyte double-width character that didn't fit, since
+ it's only valid for what was previously there. */
+ /* XXX - watch this */
+ if (_rl_last_c_pos == _rl_screenwidth &&
+ line_state_invisible->wrapped_line[current_line+1] &&
+ nfd[bytes_to_insert-1] != ' ')
+ line_state_invisible->wrapped_line[current_line+1] = 0;
+#endif
+#endif
+ }
+ else
+ _rl_last_c_pos += bytes_to_insert;
+
+ /* XXX - we only want to do this if we are at the end of the line
+ so we move there with _rl_move_cursor_relative */
+ if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new)))
+ {
+ _rl_move_cursor_relative (ne-new, new, new_face);
+ goto clear_rest_of_line;
+ }
+ }
+ }
+ /* Otherwise, print over the existing material. */
+ else
+ {
+ if (temp > 0)
+ {
+ /* If nfd begins at the prompt, or before the invisible
+ characters in the prompt, we need to adjust _rl_last_c_pos
+ in a multibyte locale to account for the wrap offset and
+ set cpos_adjusted accordingly. */
+ puts_face (nfd, nfdf, temp);
+ _rl_last_c_pos += col_temp; /* XXX */
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ if (current_line == 0 && wrap_offset &&
+ displaying_prompt_first_line &&
+ _rl_last_c_pos > wrap_offset &&
+ ((nfd - new) <= prompt_last_invisible))
+ ADJUST_CPOS (wrap_offset); /* XXX - prompt_invis_chars_first_line? */
+ }
+ }
+clear_rest_of_line:
+ lendiff = (oe - old) - (ne - new);
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ col_lendiff = _rl_col_width (old, 0, oe - old, 1) - _rl_col_width (new, 0, ne - new, 1);
+ else
+ col_lendiff = lendiff;
+
+ /* If we've already printed over the entire width of the screen,
+ including the old material, then col_lendiff doesn't matter and
+ space_to_eol will insert too many spaces. XXX - maybe we should
+ adjust col_lendiff based on the difference between _rl_last_c_pos
+ and _rl_screenwidth */
+ if (col_lendiff && ((mb_cur_max == 1 || rl_byte_oriented) || (_rl_last_c_pos < _rl_screenwidth)))
+ {
+ if (_rl_term_autowrap && current_line < inv_botlin)
+ space_to_eol (col_lendiff);
+ else
+ _rl_clear_to_eol (col_lendiff);
+ }
+ }
+ }
+}
+
+/* Tell the update routines that we have moved onto a new (empty) line. */
+int
+rl_on_new_line (void)
+{
+ if (visible_line)
+ visible_line[0] = '\0';
+
+ _rl_last_c_pos = _rl_last_v_pos = 0;
+ _rl_vis_botlin = last_lmargin = 0;
+ if (vis_lbreaks)
+ vis_lbreaks[0] = vis_lbreaks[1] = 0;
+ visible_wrap_offset = 0;
+ return 0;
+}
+
+/* Clear all screen lines occupied by the current readline line buffer
+ (visible line) */
+int
+rl_clear_visible_line (void)
+{
+ int curr_line;
+
+ /* Make sure we move to column 0 so we clear the entire line */
+ _rl_cr ();
+ _rl_last_c_pos = 0;
+
+ /* Move to the last screen line of the current visible line */
+ _rl_move_vert (_rl_vis_botlin);
+
+ /* And erase screen lines going up to line 0 (first visible line) */
+ for (curr_line = _rl_last_v_pos; curr_line >= 0; curr_line--)
+ {
+ _rl_move_vert (curr_line);
+ _rl_clear_to_eol (_rl_screenwidth);
+ _rl_cr (); /* in case we use space_to_eol() */
+ }
+
+ return 0;
+}
+
+/* Tell the update routines that we have moved onto a new line with the
+ prompt already displayed. Code originally from the version of readline
+ distributed with CLISP. rl_expand_prompt must have already been called
+ (explicitly or implicitly). This still doesn't work exactly right; it
+ should use expand_prompt() */
+int
+rl_on_new_line_with_prompt (void)
+{
+ int prompt_size, i, l, real_screenwidth, newlines;
+ char *prompt_last_line, *lprompt;
+
+ /* Initialize visible_line and invisible_line to ensure that they can hold
+ the already-displayed prompt. */
+ prompt_size = strlen (rl_prompt) + 1;
+ init_line_structures (prompt_size);
+
+ /* Make sure the line structures hold the already-displayed prompt for
+ redisplay. */
+ lprompt = local_prompt ? local_prompt : rl_prompt;
+ strcpy (visible_line, lprompt);
+ strcpy (invisible_line, lprompt);
+
+ /* If the prompt contains newlines, take the last tail. */
+ prompt_last_line = strrchr (rl_prompt, '\n');
+ if (!prompt_last_line)
+ prompt_last_line = rl_prompt;
+
+ l = strlen (prompt_last_line);
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ _rl_last_c_pos = _rl_col_width (prompt_last_line, 0, l, 1); /* XXX */
+ else
+ _rl_last_c_pos = l;
+
+ /* Dissect prompt_last_line into screen lines. Note that here we have
+ to use the real screenwidth. Readline's notion of screenwidth might be
+ one less, see terminal.c. */
+ real_screenwidth = _rl_screenwidth + (_rl_term_autowrap ? 0 : 1);
+ _rl_last_v_pos = l / real_screenwidth;
+ /* If the prompt length is a multiple of real_screenwidth, we don't know
+ whether the cursor is at the end of the last line, or already at the
+ beginning of the next line. Output a newline just to be safe. */
+ if (l > 0 && (l % real_screenwidth) == 0)
+ _rl_output_some_chars ("\n", 1);
+ last_lmargin = 0;
+
+ newlines = 0; i = 0;
+ while (i <= l)
+ {
+ _rl_vis_botlin = newlines;
+ vis_lbreaks[newlines++] = i;
+ i += real_screenwidth;
+ }
+ vis_lbreaks[newlines] = l;
+ visible_wrap_offset = 0;
+
+ rl_display_prompt = rl_prompt; /* XXX - make sure it's set */
+
+ return 0;
+}
+
+/* Actually update the display, period. */
+int
+rl_forced_update_display (void)
+{
+ register char *temp;
+
+ if (visible_line)
+ {
+ temp = visible_line;
+ while (*temp)
+ *temp++ = '\0';
+ }
+ rl_on_new_line ();
+ forced_display++;
+ (*rl_redisplay_function) ();
+ return 0;
+}
+
+/* Redraw only the last line of a multi-line prompt. */
+void
+rl_redraw_prompt_last_line (void)
+{
+ char *t;
+
+ t = strrchr (rl_display_prompt, '\n');
+ if (t)
+ redraw_prompt (++t);
+ else
+ rl_forced_update_display ();
+}
+
+/* Move the cursor from _rl_last_c_pos to NEW, which are buffer indices.
+ (Well, when we don't have multibyte characters, _rl_last_c_pos is a
+ buffer index.)
+ DATA is the contents of the screen line of interest; i.e., where
+ the movement is being done.
+ DATA is always the visible line or the invisible line */
+static void
+_rl_move_cursor_relative (int new, const char *data, const char *dataf)
+{
+ register int i;
+ int woff; /* number of invisible chars on current line */
+ int cpos, dpos; /* current and desired cursor positions */
+ int adjust;
+ int in_invisline;
+ int mb_cur_max = MB_CUR_MAX;
+
+ woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset);
+ cpos = _rl_last_c_pos;
+
+ if (cpos == 0 && cpos == new)
+ return;
+
+#if defined (HANDLE_MULTIBYTE)
+ /* If we have multibyte characters, NEW is indexed by the buffer point in
+ a multibyte string, but _rl_last_c_pos is the display position. In
+ this case, NEW's display position is not obvious and must be
+ calculated. We need to account for invisible characters in this line,
+ as long as we are past them and they are counted by _rl_col_width. */
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ adjust = 1;
+ /* Try to short-circuit common cases and eliminate a bunch of multibyte
+ character function calls. */
+ /* 1. prompt string */
+ if (new == local_prompt_len && memcmp (data, local_prompt, new) == 0)
+ {
+ dpos = prompt_physical_chars;
+ cpos_adjusted = 1;
+ adjust = 0;
+ }
+ /* 2. prompt_string + line contents */
+ else if (new > local_prompt_len && local_prompt && memcmp (data, local_prompt, local_prompt_len) == 0)
+ {
+ dpos = prompt_physical_chars + _rl_col_width (data, local_prompt_len, new, 1);
+ cpos_adjusted = 1;
+ adjust = 0;
+ }
+ else
+ dpos = _rl_col_width (data, 0, new, 1);
+
+ if (displaying_prompt_first_line == 0)
+ adjust = 0;
+
+ /* yet another special case: printing the last line of a prompt with
+ multibyte characters and invisible characters whose printable length
+ exceeds the screen width with the last invisible character
+ (prompt_last_invisible) in the last line. IN_INVISLINE is the
+ offset of DATA in invisible_line */
+ in_invisline = 0;
+ if (data > invisible_line && data < invisible_line+inv_lbreaks[_rl_inv_botlin+1])
+ in_invisline = data - invisible_line;
+
+ /* Use NEW when comparing against the last invisible character in the
+ prompt string, since they're both buffer indices and DPOS is a
+ desired display position. */
+ /* NEW is relative to the current displayed line, while
+ PROMPT_LAST_INVISIBLE is relative to the entire (wrapped) line.
+ Need a way to reconcile these two variables by turning NEW into a
+ buffer position relative to the start of the line */
+ if (adjust && ((new > prompt_last_invisible) || /* XXX - don't use woff here */
+ (new+in_invisline > prompt_last_invisible) || /* invisible line */
+ (prompt_physical_chars >= _rl_screenwidth && /* visible line */
+ _rl_last_v_pos == prompt_last_screen_line &&
+ wrap_offset >= woff && dpos >= woff &&
+ new > (prompt_last_invisible-(vis_lbreaks[_rl_last_v_pos])-wrap_offset))))
+ /* XXX last comparison might need to be >= */
+ {
+ dpos -= woff;
+ /* Since this will be assigned to _rl_last_c_pos at the end (more
+ precisely, _rl_last_c_pos == dpos when this function returns),
+ let the caller know. */
+ cpos_adjusted = 1;
+ }
+ }
+ else
+#endif
+ dpos = new;
+
+ /* If we don't have to do anything, then return. */
+ if (cpos == dpos)
+ return;
+
+ /* It may be faster to output a CR, and then move forwards instead
+ of moving backwards. */
+ /* i == current physical cursor position. */
+#if defined (HANDLE_MULTIBYTE)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ i = _rl_last_c_pos;
+ else
+#endif
+ i = _rl_last_c_pos - woff;
+ if (dpos == 0 || CR_FASTER (dpos, _rl_last_c_pos) ||
+ (_rl_term_autowrap && i == _rl_screenwidth))
+ {
+ _rl_cr ();
+ cpos = _rl_last_c_pos = 0;
+ }
+
+ if (cpos < dpos)
+ {
+ /* Move the cursor forward. We do it by printing the command
+ to move the cursor forward if there is one, else print that
+ portion of the output buffer again. Which is cheaper? */
+
+ /* The above comment is left here for posterity. It is faster
+ to print one character (non-control) than to print a control
+ sequence telling the terminal to move forward one character.
+ That kind of control is for people who don't know what the
+ data is underneath the cursor. */
+
+ /* However, we need a handle on where the current display position is
+ in the buffer for the immediately preceding comment to be true.
+ In multibyte locales, we don't currently have that info available.
+ Without it, we don't know where the data we have to display begins
+ in the buffer and we have to go back to the beginning of the screen
+ line. In this case, we can use the terminal sequence to move forward
+ if it's available. */
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
+ {
+ if (_rl_term_forward_char)
+ {
+ for (i = cpos; i < dpos; i++)
+ tputs (_rl_term_forward_char, 1, _rl_output_character_function);
+ }
+ else
+ {
+ _rl_cr ();
+ puts_face (data, dataf, new);
+ }
+ }
+ else
+ puts_face (data + cpos, dataf + cpos, new - cpos);
+ }
+
+#if defined (HANDLE_MULTIBYTE)
+ /* NEW points to the buffer point, but _rl_last_c_pos is the display point.
+ The byte length of the string is probably bigger than the column width
+ of the string, which means that if NEW == _rl_last_c_pos, then NEW's
+ display point is less than _rl_last_c_pos. */
+#endif
+ else if (cpos > dpos)
+ _rl_backspace (cpos - dpos);
+
+ _rl_last_c_pos = dpos;
+}
+
+/* PWP: move the cursor up or down. */
+void
+_rl_move_vert (int to)
+{
+ register int delta, i;
+
+ if (_rl_last_v_pos == to || to > _rl_screenheight)
+ return;
+
+ if ((delta = to - _rl_last_v_pos) > 0)
+ {
+ for (i = 0; i < delta; i++)
+ putc ('\n', rl_outstream);
+ _rl_cr ();
+ _rl_last_c_pos = 0;
+ }
+ else
+ { /* delta < 0 */
+#ifdef __DJGPP__
+ int row, col;
+
+ fflush (rl_outstream);
+ ScreenGetCursor (&row, &col);
+ ScreenSetCursor (row + delta, col);
+ i = -delta;
+#else
+ if (_rl_term_up && *_rl_term_up)
+ for (i = 0; i < -delta; i++)
+ tputs (_rl_term_up, 1, _rl_output_character_function);
+#endif /* !__DJGPP__ */
+ }
+
+ _rl_last_v_pos = to; /* Now TO is here */
+}
+
+/* Physically print C on rl_outstream. This is for functions which know
+ how to optimize the display. Return the number of characters output. */
+int
+rl_show_char (int c)
+{
+ int n = 1;
+ if (META_CHAR (c) && (_rl_output_meta_chars == 0))
+ {
+ fprintf (rl_outstream, "M-");
+ n += 2;
+ c = UNMETA (c);
+ }
+
+#if defined (DISPLAY_TABS)
+ if ((CTRL_CHAR (c) && c != '\t') || c == RUBOUT)
+#else
+ if (CTRL_CHAR (c) || c == RUBOUT)
+#endif /* !DISPLAY_TABS */
+ {
+ fprintf (rl_outstream, "C-");
+ n += 2;
+ c = CTRL_CHAR (c) ? UNCTRL (c) : '?';
+ }
+
+ putc (c, rl_outstream);
+ fflush (rl_outstream);
+ return n;
+}
+
+int
+rl_character_len (int c, int pos)
+{
+ unsigned char uc;
+
+ uc = (unsigned char)c;
+
+ if (META_CHAR (uc))
+ return ((_rl_output_meta_chars == 0) ? 4 : 1);
+
+ if (uc == '\t')
+ {
+#if defined (DISPLAY_TABS)
+ return (((pos | 7) + 1) - pos);
+#else
+ return (2);
+#endif /* !DISPLAY_TABS */
+ }
+
+ if (CTRL_CHAR (c) || c == RUBOUT)
+ return (2);
+
+ return ((ISPRINT (uc)) ? 1 : 2);
+}
+/* How to print things in the "echo-area". The prompt is treated as a
+ mini-modeline. */
+static int msg_saved_prompt = 0;
+
+#if defined (USE_VARARGS)
+int
+#if defined (PREFER_STDARG)
+rl_message (const char *format, ...)
+#else
+rl_message (va_alist)
+ va_dcl
+#endif
+{
+ va_list args;
+#if defined (PREFER_VARARGS)
+ char *format;
+#endif
+#if defined (HAVE_VSNPRINTF)
+ int bneed;
+#endif
+
+#if defined (PREFER_STDARG)
+ va_start (args, format);
+#else
+ va_start (args);
+ format = va_arg (args, char *);
+#endif
+
+ if (msg_buf == 0)
+ msg_buf = xmalloc (msg_bufsiz = 128);
+
+#if defined (HAVE_VSNPRINTF)
+ bneed = vsnprintf (msg_buf, msg_bufsiz, format, args);
+ if (bneed >= msg_bufsiz - 1)
+ {
+ msg_bufsiz = bneed + 1;
+ msg_buf = xrealloc (msg_buf, msg_bufsiz);
+ va_end (args);
+
+#if defined (PREFER_STDARG)
+ va_start (args, format);
+#else
+ va_start (args);
+ format = va_arg (args, char *);
+#endif
+ vsnprintf (msg_buf, msg_bufsiz - 1, format, args);
+ }
+#else
+ vsprintf (msg_buf, format, args);
+ msg_buf[msg_bufsiz - 1] = '\0'; /* overflow? */
+#endif
+ va_end (args);
+
+ if (saved_local_prompt == 0)
+ {
+ rl_save_prompt ();
+ msg_saved_prompt = 1;
+ }
+ else if (local_prompt != saved_local_prompt)
+ {
+ FREE (local_prompt);
+ FREE (local_prompt_prefix);
+ local_prompt = (char *)NULL;
+ }
+ rl_display_prompt = msg_buf;
+ local_prompt = expand_prompt (msg_buf, 0, &prompt_visible_length,
+ &prompt_last_invisible,
+ &prompt_invis_chars_first_line,
+ &prompt_physical_chars);
+ local_prompt_prefix = (char *)NULL;
+ local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
+ (*rl_redisplay_function) ();
+
+ return 0;
+}
+#else /* !USE_VARARGS */
+int
+rl_message (format, arg1, arg2)
+ char *format;
+{
+ if (msg_buf == 0)
+ msg_buf = xmalloc (msg_bufsiz = 128);
+
+ sprintf (msg_buf, format, arg1, arg2);
+ msg_buf[msg_bufsiz - 1] = '\0'; /* overflow? */
+
+ rl_display_prompt = msg_buf;
+ if (saved_local_prompt == 0)
+ {
+ rl_save_prompt ();
+ msg_saved_prompt = 1;
+ }
+ else if (local_prompt != saved_local_prompt)
+ {
+ FREE (local_prompt);
+ FREE (local_prompt_prefix);
+ local_prompt = (char *)NULL;
+ }
+ local_prompt = expand_prompt (msg_buf, 0, &prompt_visible_length,
+ &prompt_last_invisible,
+ &prompt_invis_chars_first_line,
+ &prompt_physical_chars);
+ local_prompt_prefix = (char *)NULL;
+ local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
+ (*rl_redisplay_function) ();
+
+ return 0;
+}
+#endif /* !USE_VARARGS */
+
+/* How to clear things from the "echo-area". */
+int
+rl_clear_message (void)
+{
+ rl_display_prompt = rl_prompt;
+ if (msg_saved_prompt)
+ {
+ rl_restore_prompt ();
+ msg_saved_prompt = 0;
+ }
+ (*rl_redisplay_function) ();
+ return 0;
+}
+
+int
+rl_reset_line_state (void)
+{
+ rl_on_new_line ();
+
+ rl_display_prompt = rl_prompt ? rl_prompt : "";
+ forced_display = 1;
+ return 0;
+}
+
+/* Save all of the variables associated with the prompt and its display. Most
+ of the complexity is dealing with the invisible characters in the prompt
+ string and where they are. There are enough of these that I should consider
+ a struct. */
+void
+rl_save_prompt (void)
+{
+ saved_local_prompt = local_prompt;
+ saved_local_prefix = local_prompt_prefix;
+ saved_prefix_length = prompt_prefix_length;
+ saved_local_length = local_prompt_len;
+ saved_last_invisible = prompt_last_invisible;
+ saved_visible_length = prompt_visible_length;
+ saved_invis_chars_first_line = prompt_invis_chars_first_line;
+ saved_physical_chars = prompt_physical_chars;
+ saved_local_prompt_newlines = local_prompt_newlines;
+
+ local_prompt = local_prompt_prefix = (char *)0;
+ local_prompt_len = 0;
+ local_prompt_newlines = (int *)0;
+
+ prompt_last_invisible = prompt_visible_length = prompt_prefix_length = 0;
+ prompt_invis_chars_first_line = prompt_physical_chars = 0;
+}
+
+void
+rl_restore_prompt (void)
+{
+ FREE (local_prompt);
+ FREE (local_prompt_prefix);
+ FREE (local_prompt_newlines);
+
+ local_prompt = saved_local_prompt;
+ local_prompt_prefix = saved_local_prefix;
+ local_prompt_len = saved_local_length;
+ local_prompt_newlines = saved_local_prompt_newlines;
+
+ prompt_prefix_length = saved_prefix_length;
+ prompt_last_invisible = saved_last_invisible;
+ prompt_visible_length = saved_visible_length;
+ prompt_invis_chars_first_line = saved_invis_chars_first_line;
+ prompt_physical_chars = saved_physical_chars;
+
+ /* can test saved_local_prompt to see if prompt info has been saved. */
+ saved_local_prompt = saved_local_prefix = (char *)0;
+ saved_local_length = 0;
+ saved_last_invisible = saved_visible_length = saved_prefix_length = 0;
+ saved_invis_chars_first_line = saved_physical_chars = 0;
+ saved_local_prompt_newlines = 0;
+}
+
+char *
+_rl_make_prompt_for_search (int pchar)
+{
+ int len;
+ char *pmt, *p;
+
+ rl_save_prompt ();
+
+ /* We've saved the prompt, and can do anything with the various prompt
+ strings we need before they're restored. We want the unexpanded
+ portion of the prompt string after any final newline. */
+ p = rl_prompt ? strrchr (rl_prompt, '\n') : 0;
+ if (p == 0)
+ {
+ len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0;
+ pmt = (char *)xmalloc (len + 2);
+ if (len)
+ strcpy (pmt, rl_prompt);
+ pmt[len] = pchar;
+ pmt[len+1] = '\0';
+ }
+ else
+ {
+ p++;
+ len = strlen (p);
+ pmt = (char *)xmalloc (len + 2);
+ if (len)
+ strcpy (pmt, p);
+ pmt[len] = pchar;
+ pmt[len+1] = '\0';
+ }
+
+ /* will be overwritten by expand_prompt, called from rl_message */
+ prompt_physical_chars = saved_physical_chars + 1;
+ return pmt;
+}
+
+/* Quick redisplay hack when erasing characters at the end of the line. */
+void
+_rl_erase_at_end_of_line (int l)
+{
+ register int i;
+
+ _rl_backspace (l);
+ for (i = 0; i < l; i++)
+ putc (' ', rl_outstream);
+ _rl_backspace (l);
+ for (i = 0; i < l; i++)
+ visible_line[--_rl_last_c_pos] = '\0';
+ rl_display_fixed++;
+}
+
+/* Clear to the end of the line. COUNT is the minimum
+ number of character spaces to clear, but we use a terminal escape
+ sequence if available. */
+void
+_rl_clear_to_eol (int count)
+{
+#ifndef __MSDOS__
+ if (_rl_term_clreol)
+ tputs (_rl_term_clreol, 1, _rl_output_character_function);
+ else
+#endif
+ if (count)
+ space_to_eol (count);
+}
+
+/* Clear to the end of the line using spaces. COUNT is the minimum
+ number of character spaces to clear, */
+static void
+space_to_eol (int count)
+{
+ register int i;
+
+ for (i = 0; i < count; i++)
+ putc (' ', rl_outstream);
+
+ _rl_last_c_pos += count;
+}
+
+void
+_rl_clear_screen (int clrscr)
+{
+#if defined (__DJGPP__)
+ ScreenClear ();
+ ScreenSetCursor (0, 0);
+#else
+ if (_rl_term_clrpag)
+ {
+ tputs (_rl_term_clrpag, 1, _rl_output_character_function);
+ if (clrscr && _rl_term_clrscroll)
+ tputs (_rl_term_clrscroll, 1, _rl_output_character_function);
+ }
+ else
+ rl_crlf ();
+#endif /* __DJGPP__ */
+}
+
+/* Insert COUNT characters from STRING to the output stream at column COL. */
+static void
+insert_some_chars (char *string, int count, int col)
+{
+ open_some_spaces (col);
+ _rl_output_some_chars (string, count);
+}
+
+/* Insert COL spaces, keeping the cursor at the same position. We follow the
+ ncurses documentation and use either im/ei with explicit spaces, or IC/ic
+ by itself. We assume there will either be ei or we don't need to use it. */
+static void
+open_some_spaces (int col)
+{
+#if !defined (__MSDOS__) && (!defined (__MINGW32__) || defined (NCURSES_VERSION))
+ char *buffer;
+ register int i;
+
+ /* If IC is defined, then we do not have to "enter" insert mode. */
+ if (_rl_term_IC)
+ {
+ buffer = tgoto (_rl_term_IC, 0, col);
+ tputs (buffer, 1, _rl_output_character_function);
+ }
+ else if (_rl_term_im && *_rl_term_im)
+ {
+ tputs (_rl_term_im, 1, _rl_output_character_function);
+ /* just output the desired number of spaces */
+ for (i = col; i--; )
+ _rl_output_character_function (' ');
+ /* If there is a string to turn off insert mode, use it now. */
+ if (_rl_term_ei && *_rl_term_ei)
+ tputs (_rl_term_ei, 1, _rl_output_character_function);
+ /* and move back the right number of spaces */
+ _rl_backspace (col);
+ }
+ else if (_rl_term_ic && *_rl_term_ic)
+ {
+ /* If there is a special command for inserting characters, then
+ use that first to open up the space. */
+ for (i = col; i--; )
+ tputs (_rl_term_ic, 1, _rl_output_character_function);
+ }
+#endif /* !__MSDOS__ && (!__MINGW32__ || NCURSES_VERSION)*/
+}
+
+/* Delete COUNT characters from the display line. */
+static void
+delete_chars (int count)
+{
+ if (count > _rl_screenwidth) /* XXX */
+ return;
+
+#if !defined (__MSDOS__) && (!defined (__MINGW32__) || defined (NCURSES_VERSION))
+ if (_rl_term_DC && *_rl_term_DC)
+ {
+ char *buffer;
+ buffer = tgoto (_rl_term_DC, count, count);
+ tputs (buffer, count, _rl_output_character_function);
+ }
+ else
+ {
+ if (_rl_term_dc && *_rl_term_dc)
+ while (count--)
+ tputs (_rl_term_dc, 1, _rl_output_character_function);
+ }
+#endif /* !__MSDOS__ && (!__MINGW32__ || NCURSES_VERSION)*/
+}
+
+void
+_rl_update_final (void)
+{
+ int full_lines, woff, botline_length;
+
+ if (line_structures_initialized == 0)
+ return;
+
+ full_lines = 0;
+ /* If the cursor is the only thing on an otherwise-blank last line,
+ compensate so we don't print an extra CRLF. */
+ if (_rl_vis_botlin && _rl_last_c_pos == 0 &&
+ visible_line[vis_lbreaks[_rl_vis_botlin]] == 0)
+ {
+ _rl_vis_botlin--;
+ full_lines = 1;
+ }
+ _rl_move_vert (_rl_vis_botlin);
+ woff = W_OFFSET(_rl_vis_botlin, wrap_offset);
+ botline_length = VIS_LLEN(_rl_vis_botlin) - woff;
+ /* If we've wrapped lines, remove the final xterm line-wrap flag. */
+ if (full_lines && _rl_term_autowrap && botline_length == _rl_screenwidth)
+ {
+ char *last_line, *last_face;
+
+ /* LAST_LINE includes invisible characters, so if you want to get the
+ last character of the first line, you have to take WOFF into account.
+ This needs to be done for both calls to _rl_move_cursor_relative,
+ which takes a buffer position as the first argument, and any direct
+ subscripts of LAST_LINE. */
+ last_line = &visible_line[vis_lbreaks[_rl_vis_botlin]]; /* = VIS_CHARS(_rl_vis_botlin); */
+ last_face = &vis_face[vis_lbreaks[_rl_vis_botlin]]; /* = VIS_CHARS(_rl_vis_botlin); */
+ cpos_buffer_position = -1; /* don't know where we are in buffer */
+ _rl_move_cursor_relative (_rl_screenwidth - 1 + woff, last_line, last_face); /* XXX */
+ _rl_clear_to_eol (0);
+ puts_face (&last_line[_rl_screenwidth - 1 + woff],
+ &last_face[_rl_screenwidth - 1 + woff], 1);
+ }
+ _rl_vis_botlin = 0;
+ if (botline_length > 0 || _rl_last_c_pos > 0)
+ rl_crlf ();
+ fflush (rl_outstream);
+ rl_display_fixed++;
+}
+
+/* Move to the start of the current line. */
+static void
+cr (void)
+{
+ _rl_cr ();
+ _rl_last_c_pos = 0;
+}
+
+/* Redraw the last line of a multi-line prompt that may possibly contain
+ terminal escape sequences. Called with the cursor at column 0 of the
+ line to draw the prompt on. */
+static void
+redraw_prompt (char *t)
+{
+ char *oldp;
+
+ oldp = rl_display_prompt;
+ rl_save_prompt ();
+
+ rl_display_prompt = t;
+ local_prompt = expand_prompt (t, PMT_MULTILINE,
+ &prompt_visible_length,
+ &prompt_last_invisible,
+ &prompt_invis_chars_first_line,
+ &prompt_physical_chars);
+ local_prompt_prefix = (char *)NULL;
+ local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
+
+ rl_forced_update_display ();
+
+ rl_display_prompt = oldp;
+ rl_restore_prompt();
+}
+
+/* Redisplay the current line after a SIGWINCH is received. */
+void
+_rl_redisplay_after_sigwinch (void)
+{
+ char *t;
+
+ /* Clear the last line (assuming that the screen size change will result in
+ either more or fewer characters on that line only) and put the cursor at
+ column 0. Make sure the right thing happens if we have wrapped to a new
+ screen line. */
+ if (_rl_term_cr)
+ {
+ rl_clear_visible_line ();
+ if (_rl_last_v_pos > 0)
+ _rl_move_vert (0);
+ }
+ else
+ rl_crlf ();
+
+ if (_rl_screenwidth < prompt_visible_length)
+ _rl_reset_prompt (); /* update local_prompt_newlines array */
+
+ /* Redraw only the last line of a multi-line prompt. */
+ t = strrchr (rl_display_prompt, '\n');
+ if (t)
+ redraw_prompt (++t);
+ else
+ rl_forced_update_display ();
+}
+
+void
+_rl_clean_up_for_exit (void)
+{
+ if (_rl_echoing_p)
+ {
+ if (_rl_vis_botlin > 0) /* minor optimization plus bug fix */
+ _rl_move_vert (_rl_vis_botlin);
+ _rl_vis_botlin = 0;
+ fflush (rl_outstream);
+ rl_restart_output (1, 0);
+ }
+}
+
+void
+_rl_erase_entire_line (void)
+{
+ cr ();
+ _rl_clear_to_eol (0);
+ cr ();
+ fflush (rl_outstream);
+}
+
+void
+_rl_ttyflush (void)
+{
+ fflush (rl_outstream);
+}
+
+/* return the `current display line' of the cursor -- the number of lines to
+ move up to get to the first screen line of the current readline line. */
+int
+_rl_current_display_line (void)
+{
+ int ret, nleft;
+
+ /* Find out whether or not there might be invisible characters in the
+ editing buffer. */
+ if (rl_display_prompt == rl_prompt)
+ nleft = _rl_last_c_pos - _rl_screenwidth - rl_visible_prompt_length;
+ else
+ nleft = _rl_last_c_pos - _rl_screenwidth;
+
+ if (nleft > 0)
+ ret = 1 + nleft / _rl_screenwidth;
+ else
+ ret = 0;
+
+ return ret;
+}
+
+void
+_rl_refresh_line (void)
+{
+ rl_clear_visible_line ();
+ rl_redraw_prompt_last_line ();
+ rl_keep_mark_active ();
+}
+
+#if defined (HANDLE_MULTIBYTE)
+/* Calculate the number of screen columns occupied by STR from START to END.
+ In the case of multibyte characters with stateful encoding, we have to
+ scan from the beginning of the string to take the state into account. */
+static int
+_rl_col_width (const char *str, int start, int end, int flags)
+{
+ WCHAR_T wc;
+ mbstate_t ps;
+ int tmp, point, width, max;
+
+ if (end <= start)
+ return 0;
+ if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ /* this can happen in some cases where it's inconvenient to check */
+ return (end - start);
+
+ memset (&ps, 0, sizeof (mbstate_t));
+
+ point = 0;
+ max = end;
+
+ /* Try to short-circuit common cases. The adjustment to remove wrap_offset
+ is done by the caller. */
+ /* 1. prompt string */
+ if (flags && start == 0 && end == local_prompt_len && memcmp (str, local_prompt, local_prompt_len) == 0)
+ return (prompt_physical_chars + wrap_offset);
+ /* 2. prompt string + line contents */
+ else if (flags && start == 0 && local_prompt_len > 0 && end > local_prompt_len && local_prompt && memcmp (str, local_prompt, local_prompt_len) == 0)
+ {
+ tmp = prompt_physical_chars + wrap_offset;
+ /* XXX - try to call ourselves recursively with non-prompt portion */
+ tmp += _rl_col_width (str, local_prompt_len, end, flags);
+ return (tmp);
+ }
+
+ while (point < start)
+ {
+ if (_rl_utf8locale && UTF8_SINGLEBYTE(str[point]))
+ {
+ memset (&ps, 0, sizeof (mbstate_t));
+ tmp = 1;
+ }
+ else
+ tmp = mbrlen (str + point, max, &ps);
+ if (MB_INVALIDCH ((size_t)tmp))
+ {
+ /* In this case, the bytes are invalid or too short to compose a
+ multibyte character, so we assume that the first byte represents
+ a single character. */
+ point++;
+ max--;
+
+ /* Clear the state of the byte sequence, because in this case the
+ effect of mbstate is undefined. */
+ memset (&ps, 0, sizeof (mbstate_t));
+ }
+ else if (MB_NULLWCH (tmp))
+ break; /* Found '\0' */
+ else
+ {
+ point += tmp;
+ max -= tmp;
+ }
+ }
+
+ /* If START is not a byte that starts a character, then POINT will be
+ greater than START. In this case, assume that (POINT - START) gives
+ a byte count that is the number of columns of difference. */
+ width = point - start;
+
+ while (point < end)
+ {
+ if (_rl_utf8locale && UTF8_SINGLEBYTE(str[point]))
+ {
+ tmp = 1;
+ wc = (WCHAR_T) str[point];
+ }
+ else
+ tmp = MBRTOWC (&wc, str + point, max, &ps);
+ if (MB_INVALIDCH ((size_t)tmp))
+ {
+ /* In this case, the bytes are invalid or too short to compose a
+ multibyte character, so we assume that the first byte represents
+ a single character. */
+ point++;
+ max--;
+
+ /* and assume that the byte occupies a single column. */
+ width++;
+
+ /* Clear the state of the byte sequence, because in this case the
+ effect of mbstate is undefined. */
+ memset (&ps, 0, sizeof (mbstate_t));
+ }
+ else if (MB_NULLWCH (tmp))
+ break; /* Found '\0' */
+ else
+ {
+ point += tmp;
+ max -= tmp;
+ tmp = WCWIDTH(wc);
+ width += (tmp >= 0) ? tmp : 1;
+ }
+ }
+
+ width += point - end;
+
+ return width;
+}
+#endif /* HANDLE_MULTIBYTE */
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..20a3618
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,272 @@
+# This makefile for Readline library documentation is in -*- text -*- mode.
+# Emacs likes it that way.
+
+# Copyright (C) 1996-2009 Free Software Foundation, Inc.
+
+# 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/>.
+
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+
+topdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+
+datarootdir = @datarootdir@
+
+docdir = @docdir@
+infodir = @infodir@
+
+mandir = @mandir@
+manpfx = man
+
+man1ext = .1
+man1dir = $(mandir)/$(manpfx)1
+man3ext = .3
+man3dir = $(mandir)/$(manpfx)3
+
+# set this to a value to have the HTML documentation installed
+htmldir =
+
+# Support an alternate destination root directory for package building
+DESTDIR =
+
+SHELL = @MAKE_SHELL@
+RM = rm -f
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+BUILD_DIR = @BUILD_DIR@
+TEXINPUTDIR = $(srcdir)
+
+MAKEINFO = LANGUAGE= makeinfo
+TEXI2DVI = $(srcdir)/texi2dvi
+TEXI2HTML = $(srcdir)/texi2html
+QUIETPS = #set this to -q to shut up dvips
+PAPERSIZE = letter
+PSDPI = 600
+DVIPS = dvips -D ${PSDPI} $(QUIETPS) -t ${PAPERSIZE} -o $@ # tricky
+# experimental; uses external texi2dvi for now; this needs pdftex to be present
+TEXI2PDF = texi2dvi --pdf
+
+# These tools might not be available; they're not required
+DVIPDF = dvipdfm -o $@ -p ${PAPERSIZE}
+PSPDF = gs -sPAPERSIZE=${PAPERSIZE} -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sOutputFile=$@
+
+RLSRC = $(srcdir)/rlman.texi $(srcdir)/rluser.texi \
+ $(srcdir)/rltech.texi $(srcdir)/version.texi \
+ $(srcdir)/rluserman.texi $(srcdir)/fdl.texi
+HISTSRC = $(srcdir)/history.texi $(srcdir)/hsuser.texi \
+ $(srcdir)/hstech.texi $(srcdir)/version.texi $(srcdir)/fdl.texi
+
+# This should be a program that converts troff to an ascii-readable format
+NROFF = groff -Tascii
+
+# This should be a program that converts troff to postscript
+GROFF = groff
+
+DVIOBJ = readline.dvi history.dvi rluserman.dvi
+INFOOBJ = readline.info history.info rluserman.info
+PSOBJ = readline.ps history.ps rluserman.ps readline_3.ps history_3.ps
+HTMLOBJ = readline.html history.html rluserman.html
+TEXTOBJ = readline.0 history.0
+PDFOBJ = readline.pdf history.pdf rluserman.pdf
+
+INTERMEDIATE_OBJ = rlman.dvi
+
+DIST_DOCS = $(DVIOBJ) $(PSOBJ) $(HTMLOBJ) $(INFOOBJ) $(TEXTOBJ) $(PDFOBJ)
+
+.SUFFIXES: .0 .3 .ps .txt .dvi .html .pdf
+
+.3.0:
+ $(RM) $@
+ -${NROFF} -man $< > $@
+
+.ps.pdf:
+ $(RM) $@
+ -${PSPDF} $<
+
+.dvi.pdf:
+ $(RM) $@
+ -${DVIPDF} $<
+
+#.texi.pdf:
+# $(RM) $@
+# -${TEXI2PDF} $<
+
+all: info dvi html ps text pdf
+nodvi: info html text
+
+xdist: $(DIST_DOCS)
+
+info: $(INFOOBJ)
+dvi: $(DVIOBJ)
+ps: $(PSOBJ)
+html: $(HTMLOBJ)
+text: $(TEXTOBJ)
+pdf: $(PDFOBJ)
+
+readline.dvi: $(RLSRC)
+ TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rlman.texi
+ mv rlman.dvi readline.dvi
+
+readline.info: $(RLSRC)
+ $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rlman.texi
+
+rluserman.dvi: $(RLSRC)
+ TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rluserman.texi
+
+rluserman.info: $(RLSRC)
+ $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rluserman.texi
+
+history.dvi: ${HISTSRC}
+ TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/history.texi
+
+history.info: ${HISTSRC}
+ $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/history.texi
+
+readline.ps: readline.dvi
+ $(RM) $@
+ $(DVIPS) readline.dvi
+
+rluserman.ps: rluserman.dvi
+ $(RM) $@
+ $(DVIPS) rluserman.dvi
+
+history.ps: history.dvi
+ $(RM) $@
+ $(DVIPS) history.dvi
+
+#
+# This leaves readline.html and rlman.html -- rlman.html is for www.gnu.org
+#
+readline.html: ${RLSRC}
+ $(MAKEINFO) -o $@ --html --no-split -I$(TEXINPUTDIR) $(srcdir)/rlman.texi
+
+rlman.html: ${RLSRC}
+ $(MAKEINFO) -o $@ --html --no-split -I$(TEXINPUTDIR) $(srcdir)/rlman.texi
+
+rluserman.html: ${RLSRC}
+ $(MAKEINFO) --html --no-split -I$(TEXINPUTDIR) $(srcdir)/rluserman.texi
+
+history.html: ${HISTSRC}
+ $(MAKEINFO) --html --no-split -I$(TEXINPUTDIR) $(srcdir)/history.texi
+
+readline.0: readline.3
+
+readline_3.ps: $(srcdir)/readline.3
+ ${RM} $@
+ ${GROFF} -man < $(srcdir)/readline.3 > $@
+
+history.0: history.3
+
+history_3.ps: $(srcdir)/history.3
+ ${RM} $@
+ ${GROFF} -man < $(srcdir)/history.3 > $@
+
+readline.pdf: $(RLSRC)
+ TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2PDF) $(srcdir)/rlman.texi
+ mv rlman.pdf $@
+
+history.pdf: $(HISTSRC)
+ TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2PDF) $(srcdir)/history.texi
+
+rluserman.pdf: $(RLSRC)
+ TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2PDF) $(srcdir)/rluserman.texi
+
+clean:
+ $(RM) *.aux *.bak *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps \
+ *.pgs *.bt *.bts *.rw *.rws *.fns *.kys *.tps *.vrs *.o \
+ core *.core
+
+mostlyclean: clean
+
+distclean: clean maybe-clean
+ $(RM) $(INTERMEDIATE_OBJ)
+ $(RM) Makefile
+
+maybe-clean:
+ -if test "X$(topdir)" != "X.." && test "X$(topdir)" != "X$(BUILD_DIR)"; then \
+ $(RM) $(DIST_DOCS); \
+ fi
+
+maintainer-clean: clean
+ $(RM) $(DIST_DOCS)
+ $(RM) $(INTERMEDIATE_OBJ)
+ $(RM) $(PDFOBJ)
+ $(RM) Makefile
+
+installdirs: $(topdir)/support/mkdirs
+ -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(infodir) $(DESTDIR)$(man3dir)
+ -if test -n "${htmldir}" ; then \
+ $(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(htmldir) ; \
+ fi
+
+install: installdirs
+ if test -f readline.info; then \
+ ${INSTALL_DATA} readline.info $(DESTDIR)$(infodir)/readline.info; \
+ else \
+ ${INSTALL_DATA} $(srcdir)/readline.info $(DESTDIR)$(infodir)/readline.info; \
+ fi
+ if test -f rluserman.info; then \
+ ${INSTALL_DATA} rluserman.info $(DESTDIR)$(infodir)/rluserman.info; \
+ else \
+ ${INSTALL_DATA} $(srcdir)/rluserman.info $(DESTDIR)$(infodir)/rluserman.info; \
+ fi
+ if test -f history.info; then \
+ ${INSTALL_DATA} history.info $(DESTDIR)$(infodir)/history.info; \
+ else \
+ ${INSTALL_DATA} $(srcdir)/history.info $(DESTDIR)$(infodir)/history.info; \
+ fi
+ -if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
+ install-info --dir-file=$(DESTDIR)$(infodir)/dir \
+ $(DESTDIR)$(infodir)/readline.info ; \
+ install-info --dir-file=$(DESTDIR)$(infodir)/dir \
+ $(DESTDIR)$(infodir)/history.info ; \
+ install-info --dir-file=$(DESTDIR)$(infodir)/dir \
+ $(DESTDIR)$(infodir)/rluserman.info ; \
+ else true; fi
+ -${INSTALL_DATA} $(srcdir)/readline.3 $(DESTDIR)$(man3dir)/readline$(man3ext)
+ -${INSTALL_DATA} $(srcdir)/history.3 $(DESTDIR)$(man3dir)/history$(man3ext)
+ -if test -n "${htmldir}" ; then \
+ if test -f readline.html; then \
+ ${INSTALL_DATA} readline.html $(DESTDIR)$(htmldir)/readline.html; \
+ else \
+ ${INSTALL_DATA} $(srcdir)/readline.html $(DESTDIR)$(htmldir)/readline.html; \
+ fi ; \
+ if test -f history.html; then \
+ ${INSTALL_DATA} history.html $(DESTDIR)$(htmldir)/history.html; \
+ else \
+ ${INSTALL_DATA} $(srcdir)/history.html $(DESTDIR)$(htmldir)/history.html; \
+ fi ; \
+ if test -f rluserman.html; then \
+ ${INSTALL_DATA} rluserman.html $(DESTDIR)$(htmldir)/rluserman.html; \
+ else \
+ ${INSTALL_DATA} $(srcdir)/rluserman.html $(DESTDIR)$(htmldir)/rluserman.html; \
+ fi ; \
+ fi
+
+uninstall:
+ $(RM) $(DESTDIR)$(infodir)/readline.info
+ $(RM) $(DESTDIR)$(infodir)/rluserman.info
+ $(RM) $(DESTDIR)$(infodir)/history.info
+ $(RM) $(DESTDIR)$(man3dir)/readline$(man3ext)
+ $(RM) $(DESTDIR)$(man3dir)/history$(man3ext)
+ -if test -n "${htmldir}" ; then \
+ $(RM) $(DESTDIR)$(htmldir)/readline.html ; \
+ $(RM) $(DESTDIR)$(htmldir)/rluserman.html ; \
+ $(RM) $(DESTDIR)$(htmldir)/history.html ; \
+ fi
diff --git a/doc/fdl.texi b/doc/fdl.texi
new file mode 100644
index 0000000..8805f1a
--- /dev/null
+++ b/doc/fdl.texi
@@ -0,0 +1,506 @@
+@c The GNU Free Documentation License.
+@center Version 1.3, 3 November 2008
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+@uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The ``Document'', below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as ``you''. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification. Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''. Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''. You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@page
+@heading ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+ Copyright (C) @var{year} @var{your name}.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.'' line with this:
+
+@smallexample
+@group
+ with the Invariant Sections being @var{list their titles}, with
+ the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+ being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
+
diff --git a/doc/history.0 b/doc/history.0
new file mode 100644
index 0000000..2bf3b1a
--- /dev/null
+++ b/doc/history.0
@@ -0,0 +1,505 @@
+HISTORY(3) Library Functions Manual HISTORY(3)
+
+
+
+NAME
+ history - GNU History Library
+
+COPYRIGHT
+ The GNU History Library is Copyright (C) 1989-2020 by the Free Software
+ Foundation, Inc.
+
+DESCRIPTION
+ Many programs read input from the user a line at a time. The GNU His-
+ tory library is able to keep track of those lines, associate arbitrary
+ data with each line, and utilize information from previous lines in
+ composing new ones.
+
+HISTORY EXPANSION
+ The history library supports a history expansion feature that is iden-
+ tical to the history expansion in bash. This section describes what
+ syntax features are available.
+
+ History expansions introduce words from the history list into the input
+ stream, making it easy to repeat commands, insert the arguments to a
+ previous command into the current input line, or fix errors in previous
+ commands quickly.
+
+ History expansion is usually performed immediately after a complete
+ line is read. It takes place in two parts. The first is to determine
+ which line from the history list to use during substitution. The sec-
+ ond is to select portions of that line for inclusion into the current
+ one. The line selected from the history is the event, and the portions
+ of that line that are acted upon are words. Various modifiers are
+ available to manipulate the selected words. The line is broken into
+ words in the same fashion as bash does when reading input, so that sev-
+ eral words that would otherwise be separated are considered one word
+ when surrounded by quotes (see the description of history_tokenize()
+ below). History expansions are introduced by the appearance of the
+ history expansion character, which is ! by default. Only backslash (\)
+ and single quotes can quote the history expansion character.
+
+ Event Designators
+ An event designator is a reference to a command line entry in the his-
+ tory list. Unless the reference is absolute, events are relative to
+ the current position in the history list.
+
+ ! Start a history substitution, except when followed by a blank,
+ newline, = or (.
+ !n Refer to command line n.
+ !-n Refer to the current command minus n.
+ !! Refer to the previous command. This is a synonym for `!-1'.
+ !string
+ Refer to the most recent command preceding the current position
+ in the history list starting with string.
+ !?string[?]
+ Refer to the most recent command preceding the current position
+ in the history list containing string. The trailing ? may be
+ omitted if string is followed immediately by a newline. If
+ string is missing, the string from the most recent search is
+ used; it is an error if there is no previous search string.
+ ^string1^string2^
+ Quick substitution. Repeat the last command, replacing string1
+ with string2. Equivalent to ``!!:s^string1^string2^'' (see Mod-
+ ifiers below).
+ !# The entire command line typed so far.
+
+ Word Designators
+ Word designators are used to select desired words from the event. A :
+ separates the event specification from the word designator. It may be
+ omitted if the word designator begins with a ^, $, *, -, or %. Words
+ are numbered from the beginning of the line, with the first word being
+ denoted by 0 (zero). Words are inserted into the current line sepa-
+ rated by single spaces.
+
+ 0 (zero)
+ The zeroth word. For the shell, this is the command word.
+ n The nth word.
+ ^ The first argument. That is, word 1.
+ $ The last word. This is usually the last argument, but will ex-
+ pand to the zeroth word if there is only one word in the line.
+ % The first word matched by the most recent `?string?' search, if
+ the search string begins with a character that is part of a
+ word.
+ x-y A range of words; `-y' abbreviates `0-y'.
+ * All of the words but the zeroth. This is a synonym for `1-$'.
+ It is not an error to use * if there is just one word in the
+ event; the empty string is returned in that case.
+ x* Abbreviates x-$.
+ x- Abbreviates x-$ like x*, but omits the last word. If x is miss-
+ ing, it defaults to 0.
+
+ If a word designator is supplied without an event specification, the
+ previous command is used as the event.
+
+ Modifiers
+ After the optional word designator, there may appear a sequence of one
+ or more of the following modifiers, each preceded by a `:'. These mod-
+ ify, or edit, the word or words selected from the history event.
+
+ h Remove a trailing file name component, leaving only the head.
+ t Remove all leading file name components, leaving the tail.
+ r Remove a trailing suffix of the form .xxx, leaving the basename.
+ e Remove all but the trailing suffix.
+ p Print the new command but do not execute it.
+ q Quote the substituted words, escaping further substitutions.
+ x Quote the substituted words as with q, but break into words at
+ blanks and newlines. The q and x modifiers are mutually exclu-
+ sive; the last one supplied is used.
+ s/old/new/
+ Substitute new for the first occurrence of old in the event
+ line. Any character may be used as the delimiter in place of /.
+ The final delimiter is optional if it is the last character of
+ the event line. The delimiter may be quoted in old and new with
+ a single backslash. If & appears in new, it is replaced by old.
+ A single backslash will quote the &. If old is null, it is set
+ to the last old substituted, or, if no previous history substi-
+ tutions took place, the last string in a !?string[?] search.
+ If new is null, each matching old is deleted.
+ & Repeat the previous substitution.
+ g Cause changes to be applied over the entire event line. This is
+ used in conjunction with `:s' (e.g., `:gs/old/new/') or `:&'.
+ If used with `:s', any delimiter can be used in place of /, and
+ the final delimiter is optional if it is the last character of
+ the event line. An a may be used as a synonym for g.
+ G Apply the following `s' or `&' modifier once to each word in the
+ event line.
+
+PROGRAMMING WITH HISTORY FUNCTIONS
+ This section describes how to use the History library in other pro-
+ grams.
+
+ Introduction to History
+ A programmer using the History library has available functions for re-
+ membering lines on a history list, associating arbitrary data with a
+ line, removing lines from the list, searching through the list for a
+ line containing an arbitrary text string, and referencing any line in
+ the list directly. In addition, a history expansion function is avail-
+ able which provides for a consistent user interface across different
+ programs.
+
+ The user using programs written with the History library has the bene-
+ fit of a consistent user interface with a set of well-known commands
+ for manipulating the text of previous lines and using that text in new
+ commands. The basic history manipulation commands are identical to the
+ history substitution provided by bash.
+
+ The programmer can also use the readline library, which includes some
+ history manipulation by default, and has the added advantage of command
+ line editing.
+
+ Before declaring any functions using any functionality the History li-
+ brary provides in other code, an application writer should include the
+ file <readline/history.h> in any file that uses the History library's
+ features. It supplies extern declarations for all of the library's
+ public functions and variables, and declares all of the public data
+ structures.
+
+ History Storage
+ The history list is an array of history entries. A history entry is
+ declared as follows:
+
+ typedef void * histdata_t;
+
+ typedef struct _hist_entry {
+ char *line;
+ char *timestamp;
+ histdata_t data;
+ } HIST_ENTRY;
+
+ The history list itself might therefore be declared as
+
+ HIST_ENTRY ** the_history_list;
+
+ The state of the History library is encapsulated into a single struc-
+ ture:
+
+ /*
+ * A structure used to pass around the current state of the history.
+ */
+ typedef struct _hist_state {
+ HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+ int offset; /* The location pointer within this array. */
+ int length; /* Number of elements within this array. */
+ int size; /* Number of slots allocated to this array. */
+ int flags;
+ } HISTORY_STATE;
+
+ If the flags member includes HS_STIFLED, the history has been stifled.
+
+History Functions
+ This section describes the calling sequence for the various functions
+ exported by the GNU History library.
+
+ Initializing History and State Management
+ This section describes functions used to initialize and manage the
+ state of the History library when you want to use the history functions
+ in your program.
+
+ void using_history (void)
+ Begin a session in which the history functions might be used. This
+ initializes the interactive variables.
+
+ HISTORY_STATE * history_get_history_state (void)
+ Return a structure describing the current state of the input history.
+
+ void history_set_history_state (HISTORY_STATE *state)
+ Set the state of the history list according to state.
+
+
+ History List Management
+ These functions manage individual entries on the history list, or set
+ parameters managing the list itself.
+
+ void add_history (const char *string)
+ Place string at the end of the history list. The associated data field
+ (if any) is set to NULL. If the maximum number of history entries has
+ been set using stifle_history(), and the new number of history entries
+ would exceed that maximum, the oldest history entry is removed.
+
+ void add_history_time (const char *string)
+ Change the time stamp associated with the most recent history entry to
+ string.
+
+ HIST_ENTRY * remove_history (int which)
+ Remove history entry at offset which from the history. The removed el-
+ ement is returned so you can free the line, data, and containing struc-
+ ture.
+
+ histdata_t free_history_entry (HIST_ENTRY *histent)
+ Free the history entry histent and any history library private data as-
+ sociated with it. Returns the application-specific data so the caller
+ can dispose of it.
+
+ HIST_ENTRY * replace_history_entry (int which, const char *line, hist-
+ data_t data)
+ Make the history entry at offset which have line and data. This re-
+ turns the old entry so the caller can dispose of any application-spe-
+ cific data. In the case of an invalid which, a NULL pointer is re-
+ turned.
+
+ void clear_history (void)
+ Clear the history list by deleting all the entries.
+
+ void stifle_history (int max)
+ Stifle the history list, remembering only the last max entries. The
+ history list will contain only max entries at a time.
+
+ int unstifle_history (void)
+ Stop stifling the history. This returns the previously-set maximum
+ number of history entries (as set by stifle_history()). history was
+ stifled. The value is positive if the history was stifled, negative if
+ it wasn't.
+
+ int history_is_stifled (void)
+ Returns non-zero if the history is stifled, zero if it is not.
+
+
+ Information About the History List
+ These functions return information about the entire history list or in-
+ dividual list entries.
+
+ HIST_ENTRY ** history_list (void)
+ Return a NULL terminated array of HIST_ENTRY * which is the current in-
+ put history. Element 0 of this list is the beginning of time. If
+ there is no history, return NULL.
+
+ int where_history (void)
+ Returns the offset of the current history element.
+
+ HIST_ENTRY * current_history (void)
+ Return the history entry at the current position, as determined by
+ where_history(). If there is no entry there, return a NULL pointer.
+
+ HIST_ENTRY * history_get (int offset)
+ Return the history entry at position offset. The range of valid values
+ of offset starts at history_base and ends at history_length - 1. If
+ there is no entry there, or if offset is outside the valid range, re-
+ turn a NULL pointer.
+
+ time_t history_get_time (HIST_ENTRY *)
+ Return the time stamp associated with the history entry passed as the
+ argument.
+
+ int history_total_bytes (void)
+ Return the number of bytes that the primary history entries are using.
+ This function returns the sum of the lengths of all the lines in the
+ history.
+
+
+ Moving Around the History List
+ These functions allow the current index into the history list to be set
+ or changed.
+
+ int history_set_pos (int pos)
+ Set the current history offset to pos, an absolute index into the list.
+ Returns 1 on success, 0 if pos is less than zero or greater than the
+ number of history entries.
+
+ HIST_ENTRY * previous_history (void)
+ Back up the current history offset to the previous history entry, and
+ return a pointer to that entry. If there is no previous entry, return
+ a NULL pointer.
+
+ HIST_ENTRY * next_history (void)
+ If the current history offset refers to a valid history entry, incre-
+ ment the current history offset. If the possibly-incremented history
+ offset refers to a valid history entry, return a pointer to that entry;
+ otherwise, return a NULL pointer.
+
+
+ Searching the History List
+ These functions allow searching of the history list for entries con-
+ taining a specific string. Searching may be performed both forward and
+ backward from the current history position. The search may be an-
+ chored, meaning that the string must match at the beginning of the his-
+ tory entry.
+
+ int history_search (const char *string, int direction)
+ Search the history for string, starting at the current history offset.
+ If direction is less than 0, then the search is through previous en-
+ tries, otherwise through subsequent entries. If string is found, then
+ the current history index is set to that history entry, and the value
+ returned is the offset in the line of the entry where string was found.
+ Otherwise, nothing is changed, and a -1 is returned.
+
+ int history_search_prefix (const char *string, int direction)
+ Search the history for string, starting at the current history offset.
+ The search is anchored: matching lines must begin with string. If di-
+ rection is less than 0, then the search is through previous entries,
+ otherwise through subsequent entries. If string is found, then the
+ current history index is set to that entry, and the return value is 0.
+ Otherwise, nothing is changed, and a -1 is returned.
+
+ int history_search_pos (const char *string, int direction, int pos)
+ Search for string in the history list, starting at pos, an absolute in-
+ dex into the list. If direction is negative, the search proceeds back-
+ ward from pos, otherwise forward. Returns the absolute index of the
+ history element where string was found, or -1 otherwise.
+
+
+ Managing the History File
+ The History library can read the history from and write it to a file.
+ This section documents the functions for managing a history file.
+
+ int read_history (const char *filename)
+ Add the contents of filename to the history list, a line at a time. If
+ filename is NULL, then read from ~/.history. Returns 0 if successful,
+ or errno if not.
+
+ int read_history_range (const char *filename, int from, int to)
+ Read a range of lines from filename, adding them to the history list.
+ Start reading at line from and end at to. If from is zero, start at
+ the beginning. If to is less than from, then read until the end of the
+ file. If filename is NULL, then read from ~/.history. Returns 0 if
+ successful, or errno if not.
+
+ int write_history (const char *filename)
+ Write the current history to filename, overwriting filename if neces-
+ sary. If filename is NULL, then write the history list to ~/.history.
+ Returns 0 on success, or errno on a read or write error.
+
+
+ int append_history (int nelements, const char *filename)
+ Append the last nelements of the history list to filename. If filename
+ is NULL, then append to ~/.history. Returns 0 on success, or errno on
+ a read or write error.
+
+ int history_truncate_file (const char *filename, int nlines)
+ Truncate the history file filename, leaving only the last nlines lines.
+ If filename is NULL, then ~/.history is truncated. Returns 0 on suc-
+ cess, or errno on failure.
+
+
+ History Expansion
+ These functions implement history expansion.
+
+ int history_expand (char *string, char **output)
+ Expand string, placing the result into output, a pointer to a string.
+ Returns:
+ 0 If no expansions took place (or, if the only change in
+ the text was the removal of escape characters preceding
+ the history expansion character);
+ 1 if expansions did take place;
+ -1 if there was an error in expansion;
+ 2 if the returned line should be displayed, but not exe-
+ cuted, as with the :p modifier.
+ If an error occurred in expansion, then output contains a descriptive
+ error message.
+
+ char * get_history_event (const char *string, int *cindex, int qchar)
+ Returns the text of the history event beginning at string + *cindex.
+ *cindex is modified to point to after the event specifier. At function
+ entry, cindex points to the index into string where the history event
+ specification begins. qchar is a character that is allowed to end the
+ event specification in addition to the ``normal'' terminating charac-
+ ters.
+
+ char ** history_tokenize (const char *string)
+ Return an array of tokens parsed out of string, much as the shell
+ might. The tokens are split on the characters in the history_word_de-
+ limiters variable, and shell quoting conventions are obeyed.
+
+ char * history_arg_extract (int first, int last, const char *string)
+ Extract a string segment consisting of the first through last arguments
+ present in string. Arguments are split using history_tokenize().
+
+
+ History Variables
+ This section describes the externally-visible variables exported by the
+ GNU History Library.
+
+ int history_base
+ The logical offset of the first entry in the history list.
+
+ int history_length
+ The number of entries currently stored in the history list.
+
+ int history_max_entries
+ The maximum number of history entries. This must be changed using sti-
+ fle_history().
+
+ int history_write_timestamps
+ If non-zero, timestamps are written to the history file, so they can be
+ preserved between sessions. The default value is 0, meaning that time-
+ stamps are not saved. The current timestamp format uses the value of
+ history_comment_char to delimit timestamp entries in the history file.
+ If that variable does not have a value (the default), timestamps will
+ not be written.
+
+ char history_expansion_char
+ The character that introduces a history event. The default is !. Set-
+ ting this to 0 inhibits history expansion.
+
+ char history_subst_char
+ The character that invokes word substitution if found at the start of a
+ line. The default is ^.
+
+ char history_comment_char
+ During tokenization, if this character is seen as the first character
+ of a word, then it and all subsequent characters up to a newline are
+ ignored, suppressing history expansion for the remainder of the line.
+ This is disabled by default.
+
+ char * history_word_delimiters
+ The characters that separate tokens for history_tokenize(). The de-
+ fault value is " \t\n()<>;&|".
+
+ char * history_no_expand_chars
+ The list of characters which inhibit history expansion if found immedi-
+ ately following history_expansion_char. The default is space, tab,
+ newline, \r, and =.
+
+ char * history_search_delimiter_chars
+ The list of additional characters which can delimit a history search
+ string, in addition to space, tab, : and ? in the case of a substring
+ search. The default is empty.
+
+ int history_quotes_inhibit_expansion
+ If non-zero, double-quoted words are not scanned for the history expan-
+ sion character or the history comment character. The default value is
+ 0.
+
+ rl_linebuf_func_t * history_inhibit_expansion_function
+ This should be set to the address of a function that takes two argu-
+ ments: a char * (string) and an int index into that string (i). It
+ should return a non-zero value if the history expansion starting at
+ string[i] should not be performed; zero if the expansion should be
+ done. It is intended for use by applications like bash that use the
+ history expansion character for additional purposes. By default, this
+ variable is set to NULL.
+
+FILES
+ ~/.history
+ Default filename for reading and writing saved history
+
+SEE ALSO
+ The Gnu Readline Library, Brian Fox and Chet Ramey
+ The Gnu History Library, Brian Fox and Chet Ramey
+ bash(1)
+ readline(3)
+
+AUTHORS
+ Brian Fox, Free Software Foundation
+ bfox@gnu.org
+
+ Chet Ramey, Case Western Reserve University
+ chet.ramey@case.edu
+
+BUG REPORTS
+ If you find a bug in the history library, you should report it. But
+ first, you should make sure that it really is a bug, and that it ap-
+ pears in the latest version of the history library that you have.
+
+ Once you have determined that a bug actually exists, mail a bug report
+ to bug-readline@gnu.org. If you have a fix, you are welcome to mail
+ that as well! Suggestions and `philosophical' bug reports may be
+ mailed to bug-readline@gnu.org or posted to the Usenet newsgroup
+ gnu.bash.bug.
+
+ Comments and bug reports concerning this manual page should be directed
+ to chet.ramey@case.edu.
+
+
+
+GNU History 8.1 2020 July 17 HISTORY(3)
diff --git a/doc/history.3 b/doc/history.3
new file mode 100644
index 0000000..06419cf
--- /dev/null
+++ b/doc/history.3
@@ -0,0 +1,687 @@
+.\"
+.\" MAN PAGE COMMENTS to
+.\"
+.\" Chet Ramey
+.\" Information Network Services
+.\" Case Western Reserve University
+.\" chet.ramey@case.edu
+.\"
+.\" Last Change: Fri Jul 17 09:43:01 EDT 2020
+.\"
+.TH HISTORY 3 "2020 July 17" "GNU History 8.1"
+.\"
+.\" File Name macro. This used to be `.PN', for Path Name,
+.\" but Sun doesn't seem to like that very much.
+.\"
+.de FN
+\fI\|\\$1\|\fP
+..
+.ds lp \fR\|(\fP
+.ds rp \fR\|)\fP
+.\" FnN return-value fun-name N arguments
+.de Fn1
+\fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3\fP\\*(rp
+.br
+..
+.de Fn2
+.if t \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3,\|\\$4\fP\\*(rp
+.if n \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3, \\$4\fP\\*(rp
+.br
+..
+.de Fn3
+.if t \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3,\|\\$4,\|\\$5\fP\|\\*(rp
+.if n \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3, \\$4, \\$5\fP\\*(rp
+.br
+..
+.de Vb
+\fI\\$1\fP \fB\\$2\fP
+.br
+..
+.SH NAME
+history \- GNU History Library
+.SH COPYRIGHT
+.if t The GNU History Library is Copyright \(co 1989-2020 by the Free Software Foundation, Inc.
+.if n The GNU History Library is Copyright (C) 1989-2020 by the Free Software Foundation, Inc.
+.SH DESCRIPTION
+Many programs read input from the user a line at a time. The GNU
+History library is able to keep track of those lines, associate arbitrary
+data with each line, and utilize information from previous lines in
+composing new ones.
+.PP
+.SH "HISTORY EXPANSION"
+The history library supports a history expansion feature that
+is identical to the history expansion in
+.BR bash.
+This section describes what syntax features are available.
+.PP
+History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+.PP
+History expansion is usually performed immediately after a complete line
+is read.
+It takes place in two parts.
+The first is to determine which line from the history list
+to use during substitution.
+The second is to select portions of that line for inclusion into
+the current one.
+The line selected from the history is the \fIevent\fP,
+and the portions of that line that are acted upon are \fIwords\fP.
+Various \fImodifiers\fP are available to manipulate the selected words.
+The line is broken into words in the same fashion as \fBbash\fP
+does when reading input,
+so that several words that would otherwise be separated
+are considered one word when surrounded by quotes (see the
+description of \fBhistory_tokenize()\fP below).
+History expansions are introduced by the appearance of the
+history expansion character, which is \^\fB!\fP\^ by default.
+Only backslash (\^\fB\e\fP\^) and single quotes can quote
+the history expansion character.
+.SS Event Designators
+An event designator is a reference to a command line entry in the
+history list.
+Unless the reference is absolute, events are relative to the current
+position in the history list.
+.PP
+.PD 0
+.TP
+.B !
+Start a history substitution, except when followed by a
+.BR blank ,
+newline, = or (.
+.TP
+.B !\fIn\fR
+Refer to command line
+.IR n .
+.TP
+.B !\-\fIn\fR
+Refer to the current command minus
+.IR n .
+.TP
+.B !!
+Refer to the previous command. This is a synonym for `!\-1'.
+.TP
+.B !\fIstring\fR
+Refer to the most recent command
+preceding the current position in the history list
+starting with
+.IR string .
+.TP
+.B !?\fIstring\fR\fB[?]\fR
+Refer to the most recent command
+preceding the current position in the history list
+containing
+.IR string .
+The trailing \fB?\fP may be omitted if
+.I string
+is followed immediately by a newline.
+If \fIstring\fP is missing, the string from the most recent search is used;
+it is an error if there is no previous search string.
+.TP
+.B \d\s+2^\s-2\u\fIstring1\fP\d\s+2^\s-2\u\fIstring2\fP\d\s+2^\s-2\u
+Quick substitution. Repeat the last command, replacing
+.I string1
+with
+.IR string2 .
+Equivalent to
+``!!:s\d\s+2^\s-2\u\fIstring1\fP\d\s+2^\s-2\u\fIstring2\fP\d\s+2^\s-2\u''
+(see \fBModifiers\fP below).
+.TP
+.B !#
+The entire command line typed so far.
+.PD
+.SS Word Designators
+Word designators are used to select desired words from the event.
+A
+.B :
+separates the event specification from the word designator.
+It may be omitted if the word designator begins with a
+.BR ^ ,
+.BR $ ,
+.BR * ,
+.BR \- ,
+or
+.BR % .
+Words are numbered from the beginning of the line,
+with the first word being denoted by 0 (zero).
+Words are inserted into the current line separated by single spaces.
+.PP
+.PD 0
+.TP
+.B 0 (zero)
+The zeroth word. For the shell, this is the command
+word.
+.TP
+.I n
+The \fIn\fRth word.
+.TP
+.B ^
+The first argument. That is, word 1.
+.TP
+.B $
+The last word. This is usually the last argument, but will expand to the
+zeroth word if there is only one word in the line.
+.TP
+.B %
+The first word matched by the most recent `?\fIstring\fR?' search,
+if the search string begins with a character that is part of a word.
+.TP
+.I x\fB\-\fPy
+A range of words; `\-\fIy\fR' abbreviates `0\-\fIy\fR'.
+.TP
+.B *
+All of the words but the zeroth. This is a synonym
+for `\fI1\-$\fP'. It is not an error to use
+.B *
+if there is just one
+word in the event; the empty string is returned in that case.
+.TP
+.B x*
+Abbreviates \fIx\-$\fP.
+.TP
+.B x\-
+Abbreviates \fIx\-$\fP like \fBx*\fP, but omits the last word.
+If \fBx\fP is missing, it defaults to 0.
+.PD
+.PP
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+.SS Modifiers
+After the optional word designator, there may appear a sequence of
+one or more of the following modifiers, each preceded by a `:'.
+These modify, or edit, the word or words selected from the history event.
+.PP
+.PD 0
+.PP
+.TP
+.B h
+Remove a trailing file name component, leaving only the head.
+.TP
+.B t
+Remove all leading file name components, leaving the tail.
+.TP
+.B r
+Remove a trailing suffix of the form \fI.xxx\fP, leaving the
+basename.
+.TP
+.B e
+Remove all but the trailing suffix.
+.TP
+.B p
+Print the new command but do not execute it.
+.TP
+.B q
+Quote the substituted words, escaping further substitutions.
+.TP
+.B x
+Quote the substituted words as with
+.BR q ,
+but break into words at
+.B blanks
+and newlines.
+The \fBq\fP and \fBx\fP modifiers are mutually exclusive; the last one
+supplied is used.
+.TP
+.B s/\fIold\fP/\fInew\fP/
+Substitute
+.I new
+for the first occurrence of
+.I old
+in the event line.
+Any character may be used as the delimiter in place of /.
+The final delimiter is optional if it is the last character of the
+event line.
+The delimiter may be quoted in
+.I old
+and
+.I new
+with a single backslash. If & appears in
+.IR new ,
+it is replaced by
+.IR old .
+A single backslash will quote the &.
+If
+.I old
+is null, it is set to the last
+.I old
+substituted, or, if no previous history substitutions took place,
+the last
+.I string
+in a
+.B !?\fIstring\fR\fB[?]\fR
+search.
+If
+.I new
+is null, each matching
+.I old
+is deleted.
+.TP
+.B &
+Repeat the previous substitution.
+.TP
+.B g
+Cause changes to be applied over the entire event line. This is
+used in conjunction with `\fB:s\fP' (e.g., `\fB:gs/\fIold\fP/\fInew\fP/\fR')
+or `\fB:&\fP'. If used with
+`\fB:s\fP', any delimiter can be used
+in place of /, and the final delimiter is optional
+if it is the last character of the event line.
+An \fBa\fP may be used as a synonym for \fBg\fP.
+.TP
+.B G
+Apply the following `\fBs\fP' or `\fB&\fP' modifier once to each word
+in the event line.
+.PD
+.SH "PROGRAMMING WITH HISTORY FUNCTIONS"
+This section describes how to use the History library in other programs.
+.SS Introduction to History
+A programmer using the History library has available functions
+for remembering lines on a history list, associating arbitrary data
+with a line, removing lines from the list, searching through the list
+for a line containing an arbitrary text string, and referencing any line
+in the list directly. In addition, a history \fIexpansion\fP function
+is available which provides for a consistent user interface across
+different programs.
+.PP
+The user using programs written with the History library has the
+benefit of a consistent user interface with a set of well-known
+commands for manipulating the text of previous lines and using that text
+in new commands. The basic history manipulation commands are
+identical to
+the history substitution provided by \fBbash\fP.
+.PP
+The programmer can also use the readline library, which
+includes some history manipulation by default, and has the added
+advantage of command line editing.
+.PP
+Before declaring any functions using any functionality the History
+library provides in other code, an application writer should include
+the file
+.FN <readline/history.h>
+in any file that uses the
+History library's features. It supplies extern declarations for all
+of the library's public functions and variables, and declares all of
+the public data structures.
+.SS History Storage
+The history list is an array of history entries. A history entry is
+declared as follows:
+.PP
+.Vb "typedef void *" histdata_t;
+.PP
+.nf
+typedef struct _hist_entry {
+ char *line;
+ char *timestamp;
+ histdata_t data;
+} HIST_ENTRY;
+.fi
+.PP
+The history list itself might therefore be declared as
+.PP
+.Vb "HIST_ENTRY **" the_history_list;
+.PP
+The state of the History library is encapsulated into a single structure:
+.PP
+.nf
+/*
+ * A structure used to pass around the current state of the history.
+ */
+typedef struct _hist_state {
+ HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+ int offset; /* The location pointer within this array. */
+ int length; /* Number of elements within this array. */
+ int size; /* Number of slots allocated to this array. */
+ int flags;
+} HISTORY_STATE;
+.fi
+.PP
+If the flags member includes \fBHS_STIFLED\fP, the history has been
+stifled.
+.SH "History Functions"
+This section describes the calling sequence for the various functions
+exported by the GNU History library.
+.SS Initializing History and State Management
+This section describes functions used to initialize and manage
+the state of the History library when you want to use the history
+functions in your program.
+
+.Fn1 void using_history void
+Begin a session in which the history functions might be used. This
+initializes the interactive variables.
+
+.Fn1 "HISTORY_STATE *" history_get_history_state void
+Return a structure describing the current state of the input history.
+
+.Fn1 void history_set_history_state "HISTORY_STATE *state"
+Set the state of the history list according to \fIstate\fP.
+
+.SS History List Management
+These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+
+.Fn1 void add_history "const char *string"
+Place \fIstring\fP at the end of the history list. The associated data
+field (if any) is set to \fBNULL\fP.
+If the maximum number of history entries has been set using
+\fBstifle_history()\fP, and the new number of history entries would exceed
+that maximum, the oldest history entry is removed.
+
+.Fn1 void add_history_time "const char *string"
+Change the time stamp associated with the most recent history entry to
+\fIstring\fP.
+
+.Fn1 "HIST_ENTRY *" remove_history "int which"
+Remove history entry at offset \fIwhich\fP from the history. The
+removed element is returned so you can free the line, data,
+and containing structure.
+
+.Fn1 "histdata_t" free_history_entry "HIST_ENTRY *histent"
+Free the history entry \fIhistent\fP and any history library private
+data associated with it. Returns the application-specific data
+so the caller can dispose of it.
+
+.Fn3 "HIST_ENTRY *" replace_history_entry "int which" "const char *line" "histdata_t data"
+Make the history entry at offset \fIwhich\fP have \fIline\fP and \fIdata\fP.
+This returns the old entry so the caller can dispose of any
+application-specific data. In the case
+of an invalid \fIwhich\fP, a \fBNULL\fP pointer is returned.
+
+.Fn1 void clear_history "void"
+Clear the history list by deleting all the entries.
+
+.Fn1 void stifle_history "int max"
+Stifle the history list, remembering only the last \fImax\fP entries.
+The history list will contain only \fImax\fP entries at a time.
+
+.Fn1 int unstifle_history "void"
+Stop stifling the history. This returns the previously-set
+maximum number of history entries (as set by \fBstifle_history()\fP).
+history was stifled. The value is positive if the history was
+stifled, negative if it wasn't.
+
+.Fn1 int history_is_stifled "void"
+Returns non-zero if the history is stifled, zero if it is not.
+
+.SS Information About the History List
+
+These functions return information about the entire history list or
+individual list entries.
+
+.Fn1 "HIST_ENTRY **" history_list "void"
+Return a \fBNULL\fP terminated array of \fIHIST_ENTRY *\fP which is the
+current input history. Element 0 of this list is the beginning of time.
+If there is no history, return \fBNULL\fP.
+
+.Fn1 int where_history "void"
+Returns the offset of the current history element.
+
+.Fn1 "HIST_ENTRY *" current_history "void"
+Return the history entry at the current position, as determined by
+\fBwhere_history()\fP. If there is no entry there, return a \fBNULL\fP
+pointer.
+
+.Fn1 "HIST_ENTRY *" history_get "int offset"
+Return the history entry at position \fIoffset\fP.
+The range of valid values of \fIoffset\fP starts at \fBhistory_base\fP
+and ends at \fBhistory_length\fP \- 1.
+If there is no entry there, or if \fIoffset\fP is outside the valid
+range, return a \fBNULL\fP pointer.
+
+.Fn1 "time_t" history_get_time "HIST_ENTRY *"
+Return the time stamp associated with the history entry passed as the argument.
+
+.Fn1 int history_total_bytes "void"
+Return the number of bytes that the primary history entries are using.
+This function returns the sum of the lengths of all the lines in the
+history.
+
+.SS Moving Around the History List
+
+These functions allow the current index into the history list to be
+set or changed.
+
+.Fn1 int history_set_pos "int pos"
+Set the current history offset to \fIpos\fP, an absolute index
+into the list.
+Returns 1 on success, 0 if \fIpos\fP is less than zero or greater
+than the number of history entries.
+
+.Fn1 "HIST_ENTRY *" previous_history "void"
+Back up the current history offset to the previous history entry, and
+return a pointer to that entry. If there is no previous entry, return
+a \fBNULL\fP pointer.
+
+.Fn1 "HIST_ENTRY *" next_history "void"
+If the current history offset refers to a valid history entry,
+increment the current history offset.
+If the possibly-incremented history offset refers to a valid history
+entry, return a pointer to that entry;
+otherwise, return a \fBNULL\fP pointer.
+
+.SS Searching the History List
+
+These functions allow searching of the history list for entries containing
+a specific string. Searching may be performed both forward and backward
+from the current history position. The search may be \fIanchored\fP,
+meaning that the string must match at the beginning of the history entry.
+
+.Fn2 int history_search "const char *string" "int direction"
+Search the history for \fIstring\fP, starting at the current history offset.
+If \fIdirection\fP is less than 0, then the search is through
+previous entries, otherwise through subsequent entries.
+If \fIstring\fP is found, then
+the current history index is set to that history entry, and the value
+returned is the offset in the line of the entry where
+\fIstring\fP was found. Otherwise, nothing is changed, and a -1 is
+returned.
+
+.Fn2 int history_search_prefix "const char *string" "int direction"
+Search the history for \fIstring\fP, starting at the current history
+offset. The search is anchored: matching lines must begin with
+\fIstring\fP. If \fIdirection\fP is less than 0, then the search is
+through previous entries, otherwise through subsequent entries.
+If \fIstring\fP is found, then the
+current history index is set to that entry, and the return value is 0.
+Otherwise, nothing is changed, and a -1 is returned.
+
+.Fn3 int history_search_pos "const char *string" "int direction" "int pos"
+Search for \fIstring\fP in the history list, starting at \fIpos\fP, an
+absolute index into the list. If \fIdirection\fP is negative, the search
+proceeds backward from \fIpos\fP, otherwise forward. Returns the absolute
+index of the history element where \fIstring\fP was found, or -1 otherwise.
+
+.SS Managing the History File
+The History library can read the history from and write it to a file.
+This section documents the functions for managing a history file.
+
+.Fn1 int read_history "const char *filename"
+Add the contents of \fIfilename\fP to the history list, a line at a time.
+If \fIfilename\fP is \fBNULL\fP, then read from \fI~/.history\fP.
+Returns 0 if successful, or \fBerrno\fP if not.
+
+.Fn3 int read_history_range "const char *filename" "int from" "int to"
+Read a range of lines from \fIfilename\fP, adding them to the history list.
+Start reading at line \fIfrom\fP and end at \fIto\fP.
+If \fIfrom\fP is zero, start at the beginning. If \fIto\fP is less than
+\fIfrom\fP, then read until the end of the file. If \fIfilename\fP is
+\fBNULL\fP, then read from \fI~/.history\fP. Returns 0 if successful,
+or \fBerrno\fP if not.
+
+.Fn1 int write_history "const char *filename"
+Write the current history to \fIfilename\fP, overwriting \fIfilename\fP
+if necessary.
+If \fIfilename\fP is \fBNULL\fP, then write the history list to \fI~/.history\fP.
+Returns 0 on success, or \fBerrno\fP on a read or write error.
+
+
+.Fn2 int append_history "int nelements" "const char *filename"
+Append the last \fInelements\fP of the history list to \fIfilename\fP.
+If \fIfilename\fP is \fBNULL\fP, then append to \fI~/.history\fP.
+Returns 0 on success, or \fBerrno\fP on a read or write error.
+
+.Fn2 int history_truncate_file "const char *filename" "int nlines"
+Truncate the history file \fIfilename\fP, leaving only the last
+\fInlines\fP lines.
+If \fIfilename\fP is \fBNULL\fP, then \fI~/.history\fP is truncated.
+Returns 0 on success, or \fBerrno\fP on failure.
+
+.SS History Expansion
+
+These functions implement history expansion.
+
+.Fn2 int history_expand "char *string" "char **output"
+Expand \fIstring\fP, placing the result into \fIoutput\fP, a pointer
+to a string. Returns:
+.RS
+.PD 0
+.TP
+0
+If no expansions took place (or, if the only change in
+the text was the removal of escape characters preceding the history expansion
+character);
+.TP
+1
+if expansions did take place;
+.TP
+-1
+if there was an error in expansion;
+.TP
+2
+if the returned line should be displayed, but not executed,
+as with the \fB:p\fP modifier.
+.PD
+.RE
+If an error occurred in expansion, then \fIoutput\fP contains a descriptive
+error message.
+
+.Fn3 "char *" get_history_event "const char *string" "int *cindex" "int qchar"
+Returns the text of the history event beginning at \fIstring\fP +
+\fI*cindex\fP. \fI*cindex\fP is modified to point to after the event
+specifier. At function entry, \fIcindex\fP points to the index into
+\fIstring\fP where the history event specification begins. \fIqchar\fP
+is a character that is allowed to end the event specification in addition
+to the ``normal'' terminating characters.
+
+.Fn1 "char **" history_tokenize "const char *string"
+Return an array of tokens parsed out of \fIstring\fP, much as the
+shell might.
+The tokens are split on the characters in the
+\fBhistory_word_delimiters\fP variable,
+and shell quoting conventions are obeyed.
+
+.Fn3 "char *" history_arg_extract "int first" "int last" "const char *string"
+Extract a string segment consisting of the \fIfirst\fP through \fIlast\fP
+arguments present in \fIstring\fP. Arguments are split using
+\fBhistory_tokenize()\fP.
+
+.SS History Variables
+
+This section describes the externally-visible variables exported by
+the GNU History Library.
+
+.Vb int history_base
+The logical offset of the first entry in the history list.
+
+.Vb int history_length
+The number of entries currently stored in the history list.
+
+.Vb int history_max_entries
+The maximum number of history entries. This must be changed using
+\fBstifle_history()\fP.
+
+.Vb int history_write_timestamps
+If non-zero, timestamps are written to the history file, so they can be
+preserved between sessions. The default value is 0, meaning that
+timestamps are not saved.
+The current timestamp format uses the value of \fIhistory_comment_char\fP
+to delimit timestamp entries in the history file. If that variable does
+not have a value (the default), timestamps will not be written.
+
+.Vb char history_expansion_char
+The character that introduces a history event. The default is \fB!\fP.
+Setting this to 0 inhibits history expansion.
+
+.Vb char history_subst_char
+The character that invokes word substitution if found at the start of
+a line. The default is \fB^\fP.
+
+.Vb char history_comment_char
+During tokenization, if this character is seen as the first character
+of a word, then it and all subsequent characters up to a newline are
+ignored, suppressing history expansion for the remainder of the line.
+This is disabled by default.
+
+.Vb "char *" history_word_delimiters
+The characters that separate tokens for \fBhistory_tokenize()\fP.
+The default value is \fB"\ \et\en()<>;&|"\fP.
+
+.Vb "char *" history_no_expand_chars
+The list of characters which inhibit history expansion if found immediately
+following \fBhistory_expansion_char\fP. The default is space, tab, newline,
+\fB\er\fP, and \fB=\fP.
+
+.Vb "char *" history_search_delimiter_chars
+The list of additional characters which can delimit a history search
+string, in addition to space, tab, \fI:\fP and \fI?\fP in the case of
+a substring search. The default is empty.
+
+.Vb int history_quotes_inhibit_expansion
+If non-zero, double-quoted words are not scanned for the history expansion
+character or the history comment character. The default value is 0.
+
+.Vb "rl_linebuf_func_t *" history_inhibit_expansion_function
+This should be set to the address of a function that takes two arguments:
+a \fBchar *\fP (\fIstring\fP)
+and an \fBint\fP index into that string (\fIi\fP).
+It should return a non-zero value if the history expansion starting at
+\fIstring[i]\fP should not be performed; zero if the expansion should
+be done.
+It is intended for use by applications like \fBbash\fP that use the history
+expansion character for additional purposes.
+By default, this variable is set to \fBNULL\fP.
+.SH FILES
+.PD 0
+.TP
+.FN ~/.history
+Default filename for reading and writing saved history
+.PD
+.SH "SEE ALSO"
+.PD 0
+.TP
+\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIbash\fP(1)
+.TP
+\fIreadline\fP(3)
+.PD
+.SH AUTHORS
+Brian Fox, Free Software Foundation
+.br
+bfox@gnu.org
+.PP
+Chet Ramey, Case Western Reserve University
+.br
+chet.ramey@case.edu
+.SH BUG REPORTS
+If you find a bug in the
+.B history
+library, you should report it. But first, you should
+make sure that it really is a bug, and that it appears in the latest
+version of the
+.B history
+library that you have.
+.PP
+Once you have determined that a bug actually exists, mail a
+bug report to \fIbug\-readline\fP@\fIgnu.org\fP.
+If you have a fix, you are welcome to mail that
+as well! Suggestions and `philosophical' bug reports may be mailed
+to \fPbug-readline\fP@\fIgnu.org\fP or posted to the Usenet
+newsgroup
+.BR gnu.bash.bug .
+.PP
+Comments and bug reports concerning
+this manual page should be directed to
+.IR chet.ramey@case.edu .
diff --git a/doc/history.dvi b/doc/history.dvi
new file mode 100644
index 0000000..bf33fe4
--- /dev/null
+++ b/doc/history.dvi
Binary files differ
diff --git a/doc/history.html b/doc/history.html
new file mode 100644
index 0000000..3c258f4
--- /dev/null
+++ b/doc/history.html
@@ -0,0 +1,1751 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!-- Created by GNU Texinfo 6.8, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<!-- This document describes the GNU History library
+(version 8.2, 19 September 2022),
+a programming tool that provides a consistent user interface for
+recalling lines of previously typed input.
+
+Copyright (C) 1988-2022 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+"GNU Free Documentation License".
+ -->
+<title>GNU History Library</title>
+
+<meta name="description" content="GNU History Library">
+<meta name="keywords" content="GNU History Library">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="#Top" rel="start" title="Top">
+<link href="#Concept-Index" rel="index" title="Concept Index">
+<link href="#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="#Using-History-Interactively" rel="next" title="Using History Interactively">
+<style type="text/css">
+<!--
+a.copiable-anchor {visibility: hidden; text-decoration: none; line-height: 0em}
+a.summary-letter {text-decoration: none}
+blockquote.indentedblock {margin-right: 0em}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+kbd {font-style: oblique}
+pre.display {font-family: inherit}
+pre.format {font-family: inherit}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+span.nolinebreak {white-space: nowrap}
+span.roman {font-family: initial; font-weight: normal}
+span.sansserif {font-family: sans-serif; font-weight: normal}
+span:hover a.copiable-anchor {visibility: visible}
+ul.no-bullet {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<h1 class="settitle" align="center">GNU History Library</h1>
+
+
+
+
+
+
+
+
+
+<div class="top" id="Top">
+<div class="header">
+<p>
+Next: <a href="#Using-History-Interactively" accesskey="n" rel="next">Using History Interactively</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="GNU-History-Library"></span><h1 class="top">GNU History Library</h1>
+
+<p>This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+</p>
+
+
+
+<div class="Contents_element" id="SEC_Contents">
+<h2 class="contents-heading">Table of Contents</h2>
+
+<div class="contents">
+
+<ul class="no-bullet">
+ <li><a id="toc-Using-History-Interactively-1" href="#Using-History-Interactively">1 Using History Interactively</a>
+ <ul class="no-bullet">
+ <li><a id="toc-History-Expansion-1" href="#History-Interaction">1.1 History Expansion</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Event-Designators-1" href="#Event-Designators">1.1.1 Event Designators</a></li>
+ <li><a id="toc-Word-Designators-1" href="#Word-Designators">1.1.2 Word Designators</a></li>
+ <li><a id="toc-Modifiers-1" href="#Modifiers">1.1.3 Modifiers</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-Programming-with-GNU-History-1" href="#Programming-with-GNU-History">2 Programming with GNU History</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Introduction-to-History-1" href="#Introduction-to-History">2.1 Introduction to History</a></li>
+ <li><a id="toc-History-Storage-1" href="#History-Storage">2.2 History Storage</a></li>
+ <li><a id="toc-History-Functions-1" href="#History-Functions">2.3 History Functions</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Initializing-History-and-State-Management-1" href="#Initializing-History-and-State-Management">2.3.1 Initializing History and State Management</a></li>
+ <li><a id="toc-History-List-Management-1" href="#History-List-Management">2.3.2 History List Management</a></li>
+ <li><a id="toc-Information-About-the-History-List-1" href="#Information-About-the-History-List">2.3.3 Information About the History List</a></li>
+ <li><a id="toc-Moving-Around-the-History-List-1" href="#Moving-Around-the-History-List">2.3.4 Moving Around the History List</a></li>
+ <li><a id="toc-Searching-the-History-List-1" href="#Searching-the-History-List">2.3.5 Searching the History List</a></li>
+ <li><a id="toc-Managing-the-History-File-1" href="#Managing-the-History-File">2.3.6 Managing the History File</a></li>
+ <li><a id="toc-History-Expansion-2" href="#History-Expansion">2.3.7 History Expansion</a></li>
+ </ul></li>
+ <li><a id="toc-History-Variables-1" href="#History-Variables">2.4 History Variables</a></li>
+ <li><a id="toc-History-Programming-Example-1" href="#History-Programming-Example">2.5 History Programming Example</a></li>
+ </ul></li>
+ <li><a id="toc-GNU-Free-Documentation-License-1" href="#GNU-Free-Documentation-License">Appendix A GNU Free Documentation License</a></li>
+ <li><a id="toc-Concept-Index-1" href="#Concept-Index" rel="index">Appendix B Concept Index</a></li>
+ <li><a id="toc-Function-and-Variable-Index-1" href="#Function-and-Variable-Index" rel="index">Appendix C Function and Variable Index</a></li>
+</ul>
+</div>
+</div>
+<hr>
+<div class="chapter" id="Using-History-Interactively">
+<div class="header">
+<p>
+Next: <a href="#Programming-with-GNU-History" accesskey="n" rel="next">Programming with GNU History</a>, Previous: <a href="#Top" accesskey="p" rel="prev">GNU History Library</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU History Library</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Using-History-Interactively-1"></span><h2 class="chapter">1 Using History Interactively</h2>
+
+
+<p>This chapter describes how to use the <small>GNU</small> History Library interactively,
+from a user&rsquo;s standpoint. It should be considered a user&rsquo;s guide. For
+information on using the <small>GNU</small> History Library in your own programs,
+see <a href="#Programming-with-GNU-History">Programming with GNU History</a>.
+</p>
+
+
+<ul class="section-toc">
+<li><a href="#History-Interaction" accesskey="1">History Expansion</a></li>
+</ul>
+<hr>
+<div class="section" id="History-Interaction">
+<div class="header">
+<p>
+Up: <a href="#Using-History-Interactively" accesskey="u" rel="up">Using History Interactively</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="History-Expansion-1"></span><h3 class="section">1.1 History Expansion</h3>
+<span id="index-history-expansion"></span>
+
+<p>The History library provides a history expansion feature that is similar
+to the history expansion provided by <code>csh</code>. This section
+describes the syntax used to manipulate the history information.
+</p>
+<p>History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+</p>
+
+<p>History expansion takes place in two parts. The first is to determine
+which line from the history list should be used during substitution.
+The second is to select portions of that line for inclusion into the
+current one. The line selected from the history is called the
+<em>event</em>, and the portions of that line that are acted upon are
+called <em>words</em>. Various <em>modifiers</em> are available to manipulate
+the selected words. The line is broken into words in the same fashion
+that Bash does, so that several words
+surrounded by quotes are considered one word.
+History expansions are introduced by the appearance of the
+history expansion character, which is &lsquo;<samp>!</samp>&rsquo; by default.
+</p>
+<p>History expansion implements shell-like quoting conventions:
+a backslash can be used to remove the special handling for the next character;
+single quotes enclose verbatim sequences of characters, and can be used to
+inhibit history expansion;
+and characters enclosed within double quotes may be subject to history
+expansion, since backslash can escape the history expansion character,
+but single quotes may not, since they are not treated specially within
+double quotes.
+</p>
+
+
+
+<ul class="section-toc">
+<li><a href="#Event-Designators" accesskey="1">Event Designators</a></li>
+<li><a href="#Word-Designators" accesskey="2">Word Designators</a></li>
+<li><a href="#Modifiers" accesskey="3">Modifiers</a></li>
+</ul>
+<hr>
+<div class="subsection" id="Event-Designators">
+<div class="header">
+<p>
+Next: <a href="#Word-Designators" accesskey="n" rel="next">Word Designators</a>, Up: <a href="#History-Interaction" accesskey="u" rel="up">History Expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Event-Designators-1"></span><h4 class="subsection">1.1.1 Event Designators</h4>
+<span id="index-event-designators"></span>
+
+<p>An event designator is a reference to a command line entry in the
+history list.
+Unless the reference is absolute, events are relative to the current
+position in the history list.
+<span id="index-history-events"></span>
+</p>
+<dl compact="compact">
+<dt><span><code>!</code></span></dt>
+<dd><p>Start a history substitution, except when followed by a space, tab,
+the end of the line, or &lsquo;<samp>=</samp>&rsquo;.
+</p>
+</dd>
+<dt><span><code>!<var>n</var></code></span></dt>
+<dd><p>Refer to command line <var>n</var>.
+</p>
+</dd>
+<dt><span><code>!-<var>n</var></code></span></dt>
+<dd><p>Refer to the command <var>n</var> lines back.
+</p>
+</dd>
+<dt><span><code>!!</code></span></dt>
+<dd><p>Refer to the previous command. This is a synonym for &lsquo;<samp>!-1</samp>&rsquo;.
+</p>
+</dd>
+<dt><span><code>!<var>string</var></code></span></dt>
+<dd><p>Refer to the most recent command
+preceding the current position in the history list
+starting with <var>string</var>.
+</p>
+</dd>
+<dt><span><code>!?<var>string</var>[?]</code></span></dt>
+<dd><p>Refer to the most recent command
+preceding the current position in the history list
+containing <var>string</var>.
+The trailing
+&lsquo;<samp>?</samp>&rsquo; may be omitted if the <var>string</var> is followed immediately by
+a newline.
+If <var>string</var> is missing, the string from the most recent search is used;
+it is an error if there is no previous search string.
+</p>
+</dd>
+<dt><span><code>^<var>string1</var>^<var>string2</var>^</code></span></dt>
+<dd><p>Quick Substitution. Repeat the last command, replacing <var>string1</var>
+with <var>string2</var>. Equivalent to
+<code>!!:s^<var>string1</var>^<var>string2</var>^</code>.
+</p>
+</dd>
+<dt><span><code>!#</code></span></dt>
+<dd><p>The entire command line typed so far.
+</p>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Word-Designators">
+<div class="header">
+<p>
+Next: <a href="#Modifiers" accesskey="n" rel="next">Modifiers</a>, Previous: <a href="#Event-Designators" accesskey="p" rel="prev">Event Designators</a>, Up: <a href="#History-Interaction" accesskey="u" rel="up">History Expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Word-Designators-1"></span><h4 class="subsection">1.1.2 Word Designators</h4>
+
+<p>Word designators are used to select desired words from the event.
+A &lsquo;<samp>:</samp>&rsquo; separates the event specification from the word designator. It
+may be omitted if the word designator begins with a &lsquo;<samp>^</samp>&rsquo;, &lsquo;<samp>$</samp>&rsquo;,
+&lsquo;<samp>*</samp>&rsquo;, &lsquo;<samp>-</samp>&rsquo;, or &lsquo;<samp>%</samp>&rsquo;. Words are numbered from the beginning
+of the line, with the first word being denoted by 0 (zero). Words are
+inserted into the current line separated by single spaces.
+</p>
+<p>For example,
+</p>
+<dl compact="compact">
+<dt><span><code>!!</code></span></dt>
+<dd><p>designates the preceding command. When you type this, the preceding
+command is repeated in toto.
+</p>
+</dd>
+<dt><span><code>!!:$</code></span></dt>
+<dd><p>designates the last argument of the preceding command. This may be
+shortened to <code>!$</code>.
+</p>
+</dd>
+<dt><span><code>!fi:2</code></span></dt>
+<dd><p>designates the second argument of the most recent command starting with
+the letters <code>fi</code>.
+</p></dd>
+</dl>
+
+<p>Here are the word designators:
+</p>
+<dl compact="compact">
+<dt><span><code>0 (zero)</code></span></dt>
+<dd><p>The <code>0</code>th word. For many applications, this is the command word.
+</p>
+</dd>
+<dt><span><code><var>n</var></code></span></dt>
+<dd><p>The <var>n</var>th word.
+</p>
+</dd>
+<dt><span><code>^</code></span></dt>
+<dd><p>The first argument; that is, word 1.
+</p>
+</dd>
+<dt><span><code>$</code></span></dt>
+<dd><p>The last argument.
+</p>
+</dd>
+<dt><span><code>%</code></span></dt>
+<dd><p>The first word matched by the most recent &lsquo;<samp>?<var>string</var>?</samp>&rsquo; search,
+if the search string begins with a character that is part of a word.
+</p>
+</dd>
+<dt><span><code><var>x</var>-<var>y</var></code></span></dt>
+<dd><p>A range of words; &lsquo;<samp>-<var>y</var></samp>&rsquo; abbreviates &lsquo;<samp>0-<var>y</var></samp>&rsquo;.
+</p>
+</dd>
+<dt><span><code>*</code></span></dt>
+<dd><p>All of the words, except the <code>0</code>th. This is a synonym for &lsquo;<samp>1-$</samp>&rsquo;.
+It is not an error to use &lsquo;<samp>*</samp>&rsquo; if there is just one word in the event;
+the empty string is returned in that case.
+</p>
+</dd>
+<dt><span><code><var>x</var>*</code></span></dt>
+<dd><p>Abbreviates &lsquo;<samp><var>x</var>-$</samp>&rsquo;
+</p>
+</dd>
+<dt><span><code><var>x</var>-</code></span></dt>
+<dd><p>Abbreviates &lsquo;<samp><var>x</var>-$</samp>&rsquo; like &lsquo;<samp><var>x</var>*</samp>&rsquo;, but omits the last word.
+If &lsquo;<samp>x</samp>&rsquo; is missing, it defaults to 0.
+</p>
+</dd>
+</dl>
+
+<p>If a word designator is supplied without an event specification, the
+previous command is used as the event.
+</p>
+<hr>
+</div>
+<div class="subsection" id="Modifiers">
+<div class="header">
+<p>
+Previous: <a href="#Word-Designators" accesskey="p" rel="prev">Word Designators</a>, Up: <a href="#History-Interaction" accesskey="u" rel="up">History Expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Modifiers-1"></span><h4 class="subsection">1.1.3 Modifiers</h4>
+
+<p>After the optional word designator, you can add a sequence of one or more
+of the following modifiers, each preceded by a &lsquo;<samp>:</samp>&rsquo;.
+These modify, or edit, the word or words selected from the history event.
+</p>
+<dl compact="compact">
+<dt><span><code>h</code></span></dt>
+<dd><p>Remove a trailing pathname component, leaving only the head.
+</p>
+</dd>
+<dt><span><code>t</code></span></dt>
+<dd><p>Remove all leading pathname components, leaving the tail.
+</p>
+</dd>
+<dt><span><code>r</code></span></dt>
+<dd><p>Remove a trailing suffix of the form &lsquo;<samp>.<var>suffix</var></samp>&rsquo;, leaving
+the basename.
+</p>
+</dd>
+<dt><span><code>e</code></span></dt>
+<dd><p>Remove all but the trailing suffix.
+</p>
+</dd>
+<dt><span><code>p</code></span></dt>
+<dd><p>Print the new command but do not execute it.
+</p>
+
+</dd>
+<dt><span><code>s/<var>old</var>/<var>new</var>/</code></span></dt>
+<dd><p>Substitute <var>new</var> for the first occurrence of <var>old</var> in the
+event line.
+Any character may be used as the delimiter in place of &lsquo;<samp>/</samp>&rsquo;.
+The delimiter may be quoted in <var>old</var> and <var>new</var>
+with a single backslash. If &lsquo;<samp>&amp;</samp>&rsquo; appears in <var>new</var>,
+it is replaced by <var>old</var>. A single backslash will quote
+the &lsquo;<samp>&amp;</samp>&rsquo;.
+If <var>old</var> is null, it is set to the last <var>old</var>
+substituted, or, if no previous history substitutions took place,
+the last <var>string</var>
+in a !?<var>string</var><code>[?]</code>
+search.
+If <var>new</var> is null, each matching <var>old</var> is deleted.
+The final delimiter is optional if it is the last
+character on the input line.
+</p>
+</dd>
+<dt><span><code>&amp;</code></span></dt>
+<dd><p>Repeat the previous substitution.
+</p>
+</dd>
+<dt><span><code>g</code></span></dt>
+<dt><span><code>a</code></span></dt>
+<dd><p>Cause changes to be applied over the entire event line. Used in
+conjunction with &lsquo;<samp>s</samp>&rsquo;, as in <code>gs/<var>old</var>/<var>new</var>/</code>,
+or with &lsquo;<samp>&amp;</samp>&rsquo;.
+</p>
+</dd>
+<dt><span><code>G</code></span></dt>
+<dd><p>Apply the following &lsquo;<samp>s</samp>&rsquo; or &lsquo;<samp>&amp;</samp>&rsquo; modifier once to each word
+in the event.
+</p>
+</dd>
+</dl>
+
+<hr>
+</div>
+</div>
+</div>
+<div class="chapter" id="Programming-with-GNU-History">
+<div class="header">
+<p>
+Next: <a href="#GNU-Free-Documentation-License" accesskey="n" rel="next">GNU Free Documentation License</a>, Previous: <a href="#Using-History-Interactively" accesskey="p" rel="prev">Using History Interactively</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU History Library</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Programming-with-GNU-History-1"></span><h2 class="chapter">2 Programming with GNU History</h2>
+
+<p>This chapter describes how to interface programs that you write
+with the <small>GNU</small> History Library.
+It should be considered a technical guide.
+For information on the interactive use of <small>GNU</small> History, see <a href="#Using-History-Interactively">Using History Interactively</a>.
+</p>
+
+<ul class="section-toc">
+<li><a href="#Introduction-to-History" accesskey="1">Introduction to History</a></li>
+<li><a href="#History-Storage" accesskey="2">History Storage</a></li>
+<li><a href="#History-Functions" accesskey="3">History Functions</a></li>
+<li><a href="#History-Variables" accesskey="4">History Variables</a></li>
+<li><a href="#History-Programming-Example" accesskey="5">History Programming Example</a></li>
+</ul>
+<hr>
+<div class="section" id="Introduction-to-History">
+<div class="header">
+<p>
+Next: <a href="#History-Storage" accesskey="n" rel="next">History Storage</a>, Up: <a href="#Programming-with-GNU-History" accesskey="u" rel="up">Programming with GNU History</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Introduction-to-History-1"></span><h3 class="section">2.1 Introduction to History</h3>
+
+<p>Many programs read input from the user a line at a time. The <small>GNU</small>
+History library is able to keep track of those lines, associate arbitrary
+data with each line, and utilize information from previous lines in
+composing new ones.
+</p>
+<p>A programmer using the History library has available functions
+for remembering lines on a history list, associating arbitrary data
+with a line, removing lines from the list, searching through the list
+for a line containing an arbitrary text string, and referencing any line
+in the list directly. In addition, a history <em>expansion</em> function
+is available which provides for a consistent user interface across
+different programs.
+</p>
+<p>The user using programs written with the History library has the
+benefit of a consistent user interface with a set of well-known
+commands for manipulating the text of previous lines and using that text
+in new commands. The basic history manipulation commands are similar to
+the history substitution provided by <code>csh</code>.
+</p>
+<p>The programmer can also use the Readline library, which
+includes some history manipulation by default, and has the added
+advantage of command line editing.
+</p>
+<p>Before declaring any functions using any functionality the History
+library provides in other code, an application writer should include
+the file <code>&lt;readline/history.h&gt;</code> in any file that uses the
+History library&rsquo;s features. It supplies extern declarations for all
+of the library&rsquo;s public functions and variables, and declares all of
+the public data structures.
+</p>
+<hr>
+</div>
+<div class="section" id="History-Storage">
+<div class="header">
+<p>
+Next: <a href="#History-Functions" accesskey="n" rel="next">History Functions</a>, Previous: <a href="#Introduction-to-History" accesskey="p" rel="prev">Introduction to History</a>, Up: <a href="#Programming-with-GNU-History" accesskey="u" rel="up">Programming with GNU History</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="History-Storage-1"></span><h3 class="section">2.2 History Storage</h3>
+
+<p>The history list is an array of history entries. A history entry is
+declared as follows:
+</p>
+<div class="example">
+<pre class="example">typedef void *histdata_t;
+
+typedef struct _hist_entry {
+ char *line;
+ char *timestamp;
+ histdata_t data;
+} HIST_ENTRY;
+</pre></div>
+
+<p>The history list itself might therefore be declared as
+</p>
+<div class="example">
+<pre class="example">HIST_ENTRY **the_history_list;
+</pre></div>
+
+<p>The state of the History library is encapsulated into a single structure:
+</p>
+<div class="example">
+<pre class="example">/*
+ * A structure used to pass around the current state of the history.
+ */
+typedef struct _hist_state {
+ HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+ int offset; /* The location pointer within this array. */
+ int length; /* Number of elements within this array. */
+ int size; /* Number of slots allocated to this array. */
+ int flags;
+} HISTORY_STATE;
+</pre></div>
+
+<p>If the flags member includes <code>HS_STIFLED</code>, the history has been
+stifled.
+</p>
+<hr>
+</div>
+<div class="section" id="History-Functions">
+<div class="header">
+<p>
+Next: <a href="#History-Variables" accesskey="n" rel="next">History Variables</a>, Previous: <a href="#History-Storage" accesskey="p" rel="prev">History Storage</a>, Up: <a href="#Programming-with-GNU-History" accesskey="u" rel="up">Programming with GNU History</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="History-Functions-1"></span><h3 class="section">2.3 History Functions</h3>
+
+<p>This section describes the calling sequence for the various functions
+exported by the <small>GNU</small> History library.
+</p>
+
+<ul class="section-toc">
+<li><a href="#Initializing-History-and-State-Management" accesskey="1">Initializing History and State Management</a></li>
+<li><a href="#History-List-Management" accesskey="2">History List Management</a></li>
+<li><a href="#Information-About-the-History-List" accesskey="3">Information About the History List</a></li>
+<li><a href="#Moving-Around-the-History-List" accesskey="4">Moving Around the History List</a></li>
+<li><a href="#Searching-the-History-List" accesskey="5">Searching the History List</a></li>
+<li><a href="#Managing-the-History-File" accesskey="6">Managing the History File</a></li>
+<li><a href="#History-Expansion" accesskey="7">History Expansion</a></li>
+</ul>
+<hr>
+<div class="subsection" id="Initializing-History-and-State-Management">
+<div class="header">
+<p>
+Next: <a href="#History-List-Management" accesskey="n" rel="next">History List Management</a>, Up: <a href="#History-Functions" accesskey="u" rel="up">History Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Initializing-History-and-State-Management-1"></span><h4 class="subsection">2.3.1 Initializing History and State Management</h4>
+
+<p>This section describes functions used to initialize and manage
+the state of the History library when you want to use the history
+functions in your program.
+</p>
+<dl class="def">
+<dt id="index-using_005fhistory"><span class="category">Function: </span><span><em>void</em> <strong>using_history</strong> <em>(void)</em><a href='#index-using_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Begin a session in which the history functions might be used. This
+initializes the interactive variables.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fget_005fhistory_005fstate"><span class="category">Function: </span><span><em>HISTORY_STATE *</em> <strong>history_get_history_state</strong> <em>(void)</em><a href='#index-history_005fget_005fhistory_005fstate' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return a structure describing the current state of the input history.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fset_005fhistory_005fstate"><span class="category">Function: </span><span><em>void</em> <strong>history_set_history_state</strong> <em>(HISTORY_STATE *state)</em><a href='#index-history_005fset_005fhistory_005fstate' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set the state of the history list according to <var>state</var>.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="History-List-Management">
+<div class="header">
+<p>
+Next: <a href="#Information-About-the-History-List" accesskey="n" rel="next">Information About the History List</a>, Previous: <a href="#Initializing-History-and-State-Management" accesskey="p" rel="prev">Initializing History and State Management</a>, Up: <a href="#History-Functions" accesskey="u" rel="up">History Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="History-List-Management-1"></span><h4 class="subsection">2.3.2 History List Management</h4>
+
+<p>These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+</p>
+<dl class="def">
+<dt id="index-add_005fhistory"><span class="category">Function: </span><span><em>void</em> <strong>add_history</strong> <em>(const char *string)</em><a href='#index-add_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Place <var>string</var> at the end of the history list. The associated data
+field (if any) is set to <code>NULL</code>.
+If the maximum number of history entries has been set using
+<code>stifle_history()</code>, and the new number of history entries would exceed
+that maximum, the oldest history entry is removed.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-add_005fhistory_005ftime"><span class="category">Function: </span><span><em>void</em> <strong>add_history_time</strong> <em>(const char *string)</em><a href='#index-add_005fhistory_005ftime' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Change the time stamp associated with the most recent history entry to
+<var>string</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-remove_005fhistory"><span class="category">Function: </span><span><em>HIST_ENTRY *</em> <strong>remove_history</strong> <em>(int which)</em><a href='#index-remove_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Remove history entry at offset <var>which</var> from the history. The
+removed element is returned so you can free the line, data,
+and containing structure.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-free_005fhistory_005fentry"><span class="category">Function: </span><span><em>histdata_t</em> <strong>free_history_entry</strong> <em>(HIST_ENTRY *histent)</em><a href='#index-free_005fhistory_005fentry' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Free the history entry <var>histent</var> and any history library private
+data associated with it. Returns the application-specific data
+so the caller can dispose of it.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-replace_005fhistory_005fentry"><span class="category">Function: </span><span><em>HIST_ENTRY *</em> <strong>replace_history_entry</strong> <em>(int which, const char *line, histdata_t data)</em><a href='#index-replace_005fhistory_005fentry' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Make the history entry at offset <var>which</var> have <var>line</var> and <var>data</var>.
+This returns the old entry so the caller can dispose of any
+application-specific data. In the case
+of an invalid <var>which</var>, a <code>NULL</code> pointer is returned.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-clear_005fhistory"><span class="category">Function: </span><span><em>void</em> <strong>clear_history</strong> <em>(void)</em><a href='#index-clear_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Clear the history list by deleting all the entries.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-stifle_005fhistory"><span class="category">Function: </span><span><em>void</em> <strong>stifle_history</strong> <em>(int max)</em><a href='#index-stifle_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Stifle the history list, remembering only the last <var>max</var> entries.
+The history list will contain only <var>max</var> entries at a time.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-unstifle_005fhistory"><span class="category">Function: </span><span><em>int</em> <strong>unstifle_history</strong> <em>(void)</em><a href='#index-unstifle_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Stop stifling the history. This returns the previously-set
+maximum number of history entries (as set by <code>stifle_history()</code>).
+The value is positive if the history was
+stifled, negative if it wasn&rsquo;t.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fis_005fstifled"><span class="category">Function: </span><span><em>int</em> <strong>history_is_stifled</strong> <em>(void)</em><a href='#index-history_005fis_005fstifled' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Returns non-zero if the history is stifled, zero if it is not.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Information-About-the-History-List">
+<div class="header">
+<p>
+Next: <a href="#Moving-Around-the-History-List" accesskey="n" rel="next">Moving Around the History List</a>, Previous: <a href="#History-List-Management" accesskey="p" rel="prev">History List Management</a>, Up: <a href="#History-Functions" accesskey="u" rel="up">History Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Information-About-the-History-List-1"></span><h4 class="subsection">2.3.3 Information About the History List</h4>
+
+<p>These functions return information about the entire history list or
+individual list entries.
+</p>
+<dl class="def">
+<dt id="index-history_005flist"><span class="category">Function: </span><span><em>HIST_ENTRY **</em> <strong>history_list</strong> <em>(void)</em><a href='#index-history_005flist' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return a <code>NULL</code> terminated array of <code>HIST_ENTRY *</code> which is the
+current input history. Element 0 of this list is the beginning of time.
+If there is no history, return <code>NULL</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-where_005fhistory"><span class="category">Function: </span><span><em>int</em> <strong>where_history</strong> <em>(void)</em><a href='#index-where_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Returns the offset of the current history element.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-current_005fhistory"><span class="category">Function: </span><span><em>HIST_ENTRY *</em> <strong>current_history</strong> <em>(void)</em><a href='#index-current_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the history entry at the current position, as determined by
+<code>where_history()</code>. If there is no entry there, return a <code>NULL</code>
+pointer.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fget"><span class="category">Function: </span><span><em>HIST_ENTRY *</em> <strong>history_get</strong> <em>(int offset)</em><a href='#index-history_005fget' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the history entry at position <var>offset</var>.
+The range of valid
+values of <var>offset</var> starts at <code>history_base</code> and ends at
+<var>history_length</var> - 1 (see <a href="#History-Variables">History Variables</a>).
+If there is no entry there, or if <var>offset</var> is outside the valid
+range, return a <code>NULL</code> pointer.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fget_005ftime"><span class="category">Function: </span><span><em>time_t</em> <strong>history_get_time</strong> <em>(HIST_ENTRY *entry)</em><a href='#index-history_005fget_005ftime' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the time stamp associated with the history entry <var>entry</var>.
+If the timestamp is missing or invalid, return 0.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005ftotal_005fbytes"><span class="category">Function: </span><span><em>int</em> <strong>history_total_bytes</strong> <em>(void)</em><a href='#index-history_005ftotal_005fbytes' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the number of bytes that the primary history entries are using.
+This function returns the sum of the lengths of all the lines in the
+history.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Moving-Around-the-History-List">
+<div class="header">
+<p>
+Next: <a href="#Searching-the-History-List" accesskey="n" rel="next">Searching the History List</a>, Previous: <a href="#Information-About-the-History-List" accesskey="p" rel="prev">Information About the History List</a>, Up: <a href="#History-Functions" accesskey="u" rel="up">History Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Moving-Around-the-History-List-1"></span><h4 class="subsection">2.3.4 Moving Around the History List</h4>
+
+<p>These functions allow the current index into the history list to be
+set or changed.
+</p>
+<dl class="def">
+<dt id="index-history_005fset_005fpos"><span class="category">Function: </span><span><em>int</em> <strong>history_set_pos</strong> <em>(int pos)</em><a href='#index-history_005fset_005fpos' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set the current history offset to <var>pos</var>, an absolute index
+into the list.
+Returns 1 on success, 0 if <var>pos</var> is less than zero or greater
+than the number of history entries.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-previous_005fhistory"><span class="category">Function: </span><span><em>HIST_ENTRY *</em> <strong>previous_history</strong> <em>(void)</em><a href='#index-previous_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Back up the current history offset to the previous history entry, and
+return a pointer to that entry. If there is no previous entry, return
+a <code>NULL</code> pointer.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-next_005fhistory"><span class="category">Function: </span><span><em>HIST_ENTRY *</em> <strong>next_history</strong> <em>(void)</em><a href='#index-next_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If the current history offset refers to a valid history entry,
+increment the current history offset.
+If the possibly-incremented history offset refers to a valid history
+entry, return a pointer to that entry;
+otherwise, return a <code>BNULL</code> pointer.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Searching-the-History-List">
+<div class="header">
+<p>
+Next: <a href="#Managing-the-History-File" accesskey="n" rel="next">Managing the History File</a>, Previous: <a href="#Moving-Around-the-History-List" accesskey="p" rel="prev">Moving Around the History List</a>, Up: <a href="#History-Functions" accesskey="u" rel="up">History Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Searching-the-History-List-1"></span><h4 class="subsection">2.3.5 Searching the History List</h4>
+<span id="index-History-Searching"></span>
+
+<p>These functions allow searching of the history list for entries containing
+a specific string. Searching may be performed both forward and backward
+from the current history position. The search may be <em>anchored</em>,
+meaning that the string must match at the beginning of the history entry.
+<span id="index-anchored-search"></span>
+</p>
+<dl class="def">
+<dt id="index-history_005fsearch"><span class="category">Function: </span><span><em>int</em> <strong>history_search</strong> <em>(const char *string, int direction)</em><a href='#index-history_005fsearch' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search the history for <var>string</var>, starting at the current history offset.
+If <var>direction</var> is less than 0, then the search is through
+previous entries, otherwise through subsequent entries.
+If <var>string</var> is found, then
+the current history index is set to that history entry, and the value
+returned is the offset in the line of the entry where
+<var>string</var> was found. Otherwise, nothing is changed, and a -1 is
+returned.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fsearch_005fprefix"><span class="category">Function: </span><span><em>int</em> <strong>history_search_prefix</strong> <em>(const char *string, int direction)</em><a href='#index-history_005fsearch_005fprefix' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search the history for <var>string</var>, starting at the current history
+offset. The search is anchored: matching lines must begin with
+<var>string</var>. If <var>direction</var> is less than 0, then the search is
+through previous entries, otherwise through subsequent entries.
+If <var>string</var> is found, then the
+current history index is set to that entry, and the return value is 0.
+Otherwise, nothing is changed, and a -1 is returned.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fsearch_005fpos"><span class="category">Function: </span><span><em>int</em> <strong>history_search_pos</strong> <em>(const char *string, int direction, int pos)</em><a href='#index-history_005fsearch_005fpos' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search for <var>string</var> in the history list, starting at <var>pos</var>, an
+absolute index into the list. If <var>direction</var> is negative, the search
+proceeds backward from <var>pos</var>, otherwise forward. Returns the absolute
+index of the history element where <var>string</var> was found, or -1 otherwise.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Managing-the-History-File">
+<div class="header">
+<p>
+Next: <a href="#History-Expansion" accesskey="n" rel="next">History Expansion</a>, Previous: <a href="#Searching-the-History-List" accesskey="p" rel="prev">Searching the History List</a>, Up: <a href="#History-Functions" accesskey="u" rel="up">History Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Managing-the-History-File-1"></span><h4 class="subsection">2.3.6 Managing the History File</h4>
+
+<p>The History library can read the history from and write it to a file.
+This section documents the functions for managing a history file.
+</p>
+<dl class="def">
+<dt id="index-read_005fhistory"><span class="category">Function: </span><span><em>int</em> <strong>read_history</strong> <em>(const char *filename)</em><a href='#index-read_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Add the contents of <var>filename</var> to the history list, a line at a time.
+If <var>filename</var> is <code>NULL</code>, then read from <samp>~/.history</samp>.
+Returns 0 if successful, or <code>errno</code> if not.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-read_005fhistory_005frange"><span class="category">Function: </span><span><em>int</em> <strong>read_history_range</strong> <em>(const char *filename, int from, int to)</em><a href='#index-read_005fhistory_005frange' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Read a range of lines from <var>filename</var>, adding them to the history list.
+Start reading at line <var>from</var> and end at <var>to</var>.
+If <var>from</var> is zero, start at the beginning. If <var>to</var> is less than
+<var>from</var>, then read until the end of the file. If <var>filename</var> is
+<code>NULL</code>, then read from <samp>~/.history</samp>. Returns 0 if successful,
+or <code>errno</code> if not.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-write_005fhistory"><span class="category">Function: </span><span><em>int</em> <strong>write_history</strong> <em>(const char *filename)</em><a href='#index-write_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Write the current history to <var>filename</var>, overwriting <var>filename</var>
+if necessary.
+If <var>filename</var> is <code>NULL</code>, then write the history list to
+<samp>~/.history</samp>.
+Returns 0 on success, or <code>errno</code> on a read or write error.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-append_005fhistory"><span class="category">Function: </span><span><em>int</em> <strong>append_history</strong> <em>(int nelements, const char *filename)</em><a href='#index-append_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Append the last <var>nelements</var> of the history list to <var>filename</var>.
+If <var>filename</var> is <code>NULL</code>, then append to <samp>~/.history</samp>.
+Returns 0 on success, or <code>errno</code> on a read or write error.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005ftruncate_005ffile"><span class="category">Function: </span><span><em>int</em> <strong>history_truncate_file</strong> <em>(const char *filename, int nlines)</em><a href='#index-history_005ftruncate_005ffile' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Truncate the history file <var>filename</var>, leaving only the last
+<var>nlines</var> lines.
+If <var>filename</var> is <code>NULL</code>, then <samp>~/.history</samp> is truncated.
+Returns 0 on success, or <code>errno</code> on failure.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="History-Expansion">
+<div class="header">
+<p>
+Previous: <a href="#Managing-the-History-File" accesskey="p" rel="prev">Managing the History File</a>, Up: <a href="#History-Functions" accesskey="u" rel="up">History Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="History-Expansion-2"></span><h4 class="subsection">2.3.7 History Expansion</h4>
+
+<p>These functions implement history expansion.
+</p>
+<dl class="def">
+<dt id="index-history_005fexpand"><span class="category">Function: </span><span><em>int</em> <strong>history_expand</strong> <em>(char *string, char **output)</em><a href='#index-history_005fexpand' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Expand <var>string</var>, placing the result into <var>output</var>, a pointer
+to a string (see <a href="#History-Interaction">History Expansion</a>). Returns:
+</p><dl compact="compact">
+<dt><span><code>0</code></span></dt>
+<dd><p>If no expansions took place (or, if the only change in
+the text was the removal of escape characters preceding the history expansion
+character);
+</p></dd>
+<dt><span><code>1</code></span></dt>
+<dd><p>if expansions did take place;
+</p></dd>
+<dt><span><code>-1</code></span></dt>
+<dd><p>if there was an error in expansion;
+</p></dd>
+<dt><span><code>2</code></span></dt>
+<dd><p>if the returned line should be displayed, but not executed,
+as with the <code>:p</code> modifier (see <a href="#Modifiers">Modifiers</a>).
+</p></dd>
+</dl>
+
+<p>If an error occurred in expansion, then <var>output</var> contains a descriptive
+error message.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-get_005fhistory_005fevent"><span class="category">Function: </span><span><em>char *</em> <strong>get_history_event</strong> <em>(const char *string, int *cindex, int qchar)</em><a href='#index-get_005fhistory_005fevent' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Returns the text of the history event beginning at <var>string</var> +
+<var>*cindex</var>. <var>*cindex</var> is modified to point to after the event
+specifier. At function entry, <var>cindex</var> points to the index into
+<var>string</var> where the history event specification begins. <var>qchar</var>
+is a character that is allowed to end the event specification in addition
+to the &ldquo;normal&rdquo; terminating characters.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005ftokenize"><span class="category">Function: </span><span><em>char **</em> <strong>history_tokenize</strong> <em>(const char *string)</em><a href='#index-history_005ftokenize' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return an array of tokens parsed out of <var>string</var>, much as the
+shell might. The tokens are split on the characters in the
+<var>history_word_delimiters</var> variable,
+and shell quoting conventions are obeyed as described below.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005farg_005fextract"><span class="category">Function: </span><span><em>char *</em> <strong>history_arg_extract</strong> <em>(int first, int last, const char *string)</em><a href='#index-history_005farg_005fextract' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Extract a string segment consisting of the <var>first</var> through <var>last</var>
+arguments present in <var>string</var>. Arguments are split using
+<code>history_tokenize</code>.
+</p></dd></dl>
+
+<hr>
+</div>
+</div>
+<div class="section" id="History-Variables">
+<div class="header">
+<p>
+Next: <a href="#History-Programming-Example" accesskey="n" rel="next">History Programming Example</a>, Previous: <a href="#History-Functions" accesskey="p" rel="prev">History Functions</a>, Up: <a href="#Programming-with-GNU-History" accesskey="u" rel="up">Programming with GNU History</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="History-Variables-1"></span><h3 class="section">2.4 History Variables</h3>
+
+<p>This section describes the externally-visible variables exported by
+the <small>GNU</small> History Library.
+</p>
+<dl class="def">
+<dt id="index-history_005fbase"><span class="category">Variable: </span><span><em>int</em> <strong>history_base</strong><a href='#index-history_005fbase' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The logical offset of the first entry in the history list.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005flength"><span class="category">Variable: </span><span><em>int</em> <strong>history_length</strong><a href='#index-history_005flength' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The number of entries currently stored in the history list.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fmax_005fentries"><span class="category">Variable: </span><span><em>int</em> <strong>history_max_entries</strong><a href='#index-history_005fmax_005fentries' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The maximum number of history entries. This must be changed using
+<code>stifle_history()</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fwrite_005ftimestamps"><span class="category">Variable: </span><span><em>int</em> <strong>history_write_timestamps</strong><a href='#index-history_005fwrite_005ftimestamps' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, timestamps are written to the history file, so they can be
+preserved between sessions. The default value is 0, meaning that
+timestamps are not saved.
+</p>
+<p>The current timestamp format uses the value of <var>history_comment_char</var>
+to delimit timestamp entries in the history file. If that variable does
+not have a value (the default), timestamps will not be written.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fexpansion_005fchar"><span class="category">Variable: </span><span><em>char</em> <strong>history_expansion_char</strong><a href='#index-history_005fexpansion_005fchar' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The character that introduces a history event. The default is &lsquo;<samp>!</samp>&rsquo;.
+Setting this to 0 inhibits history expansion.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fsubst_005fchar"><span class="category">Variable: </span><span><em>char</em> <strong>history_subst_char</strong><a href='#index-history_005fsubst_005fchar' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The character that invokes word substitution if found at the start of
+a line. The default is &lsquo;<samp>^</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fcomment_005fchar"><span class="category">Variable: </span><span><em>char</em> <strong>history_comment_char</strong><a href='#index-history_005fcomment_005fchar' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>During tokenization, if this character is seen as the first character
+of a word, then it and all subsequent characters up to a newline are
+ignored, suppressing history expansion for the remainder of the line.
+This is disabled by default.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fword_005fdelimiters"><span class="category">Variable: </span><span><em>char *</em> <strong>history_word_delimiters</strong><a href='#index-history_005fword_005fdelimiters' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The characters that separate tokens for <code>history_tokenize()</code>.
+The default value is <code>&quot; \t\n()&lt;&gt;;&amp;|&quot;</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fsearch_005fdelimiter_005fchars"><span class="category">Variable: </span><span><em>char *</em> <strong>history_search_delimiter_chars</strong><a href='#index-history_005fsearch_005fdelimiter_005fchars' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The list of additional characters which can delimit a history search
+string, in addition to space, TAB, &lsquo;<samp>:</samp>&rsquo; and &lsquo;<samp>?</samp>&rsquo; in the case of
+a substring search. The default is empty.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fno_005fexpand_005fchars"><span class="category">Variable: </span><span><em>char *</em> <strong>history_no_expand_chars</strong><a href='#index-history_005fno_005fexpand_005fchars' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The list of characters which inhibit history expansion if found immediately
+following <var>history_expansion_char</var>. The default is space, tab, newline,
+carriage return, and &lsquo;<samp>=</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fquotes_005finhibit_005fexpansion"><span class="category">Variable: </span><span><em>int</em> <strong>history_quotes_inhibit_expansion</strong><a href='#index-history_005fquotes_005finhibit_005fexpansion' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, the history expansion code implements shell-like quoting:
+single-quoted words are not scanned for the history expansion
+character or the history comment character, and double-quoted words may
+have history expansion performed, since single quotes are not special
+within double quotes.
+The default value is 0.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005fquoting_005fstate"><span class="category">Variable: </span><span><em>int</em> <strong>history_quoting_state</strong><a href='#index-history_005fquoting_005fstate' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>An application may set this variable to indicate that the current line
+being expanded is subject to existing quoting. If set to &lsquo;<samp>'</samp>&rsquo;, the
+history expansion function will assume that the line is single-quoted and
+inhibit expansion until it reads an unquoted closing single quote; if set
+to &lsquo;<samp>&quot;</samp>&rsquo;, history expansion will assume the line is double quoted until
+it reads an unquoted closing double quote. If set to zero, the default,
+the history expansion function will assume the line is not quoted and
+treat quote characters within the line as described above.
+This is only effective if <var>history_quotes_inhibit_expansion</var> is set.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-history_005finhibit_005fexpansion_005ffunction"><span class="category">Variable: </span><span><em>rl_linebuf_func_t *</em> <strong>history_inhibit_expansion_function</strong><a href='#index-history_005finhibit_005fexpansion_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This should be set to the address of a function that takes two arguments:
+a <code>char *</code> (<var>string</var>)
+and an <code>int</code> index into that string (<var>i</var>).
+It should return a non-zero value if the history expansion starting at
+<var>string[i]</var> should not be performed; zero if the expansion should
+be done.
+It is intended for use by applications like Bash that use the history
+expansion character for additional purposes.
+By default, this variable is set to <code>NULL</code>.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="section" id="History-Programming-Example">
+<div class="header">
+<p>
+Previous: <a href="#History-Variables" accesskey="p" rel="prev">History Variables</a>, Up: <a href="#Programming-with-GNU-History" accesskey="u" rel="up">Programming with GNU History</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="History-Programming-Example-1"></span><h3 class="section">2.5 History Programming Example</h3>
+
+<p>The following program demonstrates simple use of the <small>GNU</small> History Library.
+</p>
+<div class="example">
+<pre class="example">#include &lt;stdio.h&gt;
+#include &lt;readline/history.h&gt;
+
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char line[1024], *t;
+ int len, done = 0;
+
+ line[0] = 0;
+
+ using_history ();
+ while (!done)
+ {
+ printf (&quot;history$ &quot;);
+ fflush (stdout);
+ t = fgets (line, sizeof (line) - 1, stdin);
+ if (t &amp;&amp; *t)
+ {
+ len = strlen (t);
+ if (t[len - 1] == '\n')
+ t[len - 1] = '\0';
+ }
+
+ if (!t)
+ strcpy (line, &quot;quit&quot;);
+
+ if (line[0])
+ {
+ char *expansion;
+ int result;
+
+ result = history_expand (line, &amp;expansion);
+ if (result)
+ fprintf (stderr, &quot;%s\n&quot;, expansion);
+
+ if (result &lt; 0 || result == 2)
+ {
+ free (expansion);
+ continue;
+ }
+
+ add_history (expansion);
+ strncpy (line, expansion, sizeof (line) - 1);
+ free (expansion);
+ }
+
+ if (strcmp (line, &quot;quit&quot;) == 0)
+ done = 1;
+ else if (strcmp (line, &quot;save&quot;) == 0)
+ write_history (&quot;history_file&quot;);
+ else if (strcmp (line, &quot;read&quot;) == 0)
+ read_history (&quot;history_file&quot;);
+ else if (strcmp (line, &quot;list&quot;) == 0)
+ {
+ register HIST_ENTRY **the_list;
+ register int i;
+
+ the_list = history_list ();
+ if (the_list)
+ for (i = 0; the_list[i]; i++)
+ printf (&quot;%d: %s\n&quot;, i + history_base, the_list[i]-&gt;line);
+ }
+ else if (strncmp (line, &quot;delete&quot;, 6) == 0)
+ {
+ int which;
+ if ((sscanf (line + 6, &quot;%d&quot;, &amp;which)) == 1)
+ {
+ HIST_ENTRY *entry = remove_history (which);
+ if (!entry)
+ fprintf (stderr, &quot;No such entry %d\n&quot;, which);
+ else
+ {
+ free (entry-&gt;line);
+ free (entry);
+ }
+ }
+ else
+ {
+ fprintf (stderr, &quot;non-numeric arg given to `delete'\n&quot;);
+ }
+ }
+ }
+}
+</pre></div>
+
+<hr>
+</div>
+</div>
+<div class="appendix" id="GNU-Free-Documentation-License">
+<div class="header">
+<p>
+Next: <a href="#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previous: <a href="#Programming-with-GNU-History" accesskey="p" rel="prev">Programming with GNU History</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU History Library</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="GNU-Free-Documentation-License-1"></span><h2 class="appendix">Appendix A GNU Free Documentation License</h2>
+
+<div align="center">Version 1.3, 3 November 2008
+</div>
+
+<div class="display">
+<pre class="display">Copyright &copy; 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+<a href="http://fsf.org/">http://fsf.org/</a>
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></div>
+
+<ol start="0">
+<li> PREAMBLE
+
+<p>The purpose of this License is to make a manual, textbook, or other
+functional and useful document <em>free</em> in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+</p>
+<p>This License is a kind of &ldquo;copyleft&rdquo;, which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+</p>
+<p>We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+</p>
+</li><li> APPLICABILITY AND DEFINITIONS
+
+<p>This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The &ldquo;Document&rdquo;, below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as &ldquo;you&rdquo;. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</p>
+<p>A &ldquo;Modified Version&rdquo; of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+</p>
+<p>A &ldquo;Secondary Section&rdquo; is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document&rsquo;s overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+</p>
+<p>The &ldquo;Invariant Sections&rdquo; are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+</p>
+<p>The &ldquo;Cover Texts&rdquo; are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+</p>
+<p>A &ldquo;Transparent&rdquo; copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not &ldquo;Transparent&rdquo; is called &ldquo;Opaque&rdquo;.
+</p>
+<p>Examples of suitable formats for Transparent copies include plain
+<small>ASCII</small> without markup, Texinfo input format, LaTeX input
+format, <acronym>SGML</acronym> or <acronym>XML</acronym> using a publicly available
+<acronym>DTD</acronym>, and standard-conforming simple <acronym>HTML</acronym>,
+PostScript or <acronym>PDF</acronym> designed for human modification. Examples
+of transparent image formats include <acronym>PNG</acronym>, <acronym>XCF</acronym> and
+<acronym>JPG</acronym>. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, <acronym>SGML</acronym> or
+<acronym>XML</acronym> for which the <acronym>DTD</acronym> and/or processing tools are
+not generally available, and the machine-generated <acronym>HTML</acronym>,
+PostScript or <acronym>PDF</acronym> produced by some word processors for
+output purposes only.
+</p>
+<p>The &ldquo;Title Page&rdquo; means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, &ldquo;Title Page&rdquo; means
+the text near the most prominent appearance of the work&rsquo;s title,
+preceding the beginning of the body of the text.
+</p>
+<p>The &ldquo;publisher&rdquo; means any person or entity that distributes copies
+of the Document to the public.
+</p>
+<p>A section &ldquo;Entitled XYZ&rdquo; means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as &ldquo;Acknowledgements&rdquo;,
+&ldquo;Dedications&rdquo;, &ldquo;Endorsements&rdquo;, or &ldquo;History&rdquo;.) To &ldquo;Preserve the Title&rdquo;
+of such a section when you modify the Document means that it remains a
+section &ldquo;Entitled XYZ&rdquo; according to this definition.
+</p>
+<p>The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+</p>
+</li><li> VERBATIM COPYING
+
+<p>You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+</p>
+<p>You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</p>
+</li><li> COPYING IN QUANTITY
+
+<p>If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document&rsquo;s license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+</p>
+<p>If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+</p>
+<p>If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+</p>
+<p>It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+</p>
+</li><li> MODIFICATIONS
+
+<p>You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+</p>
+<ol type="A" start="1">
+<li> Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+</li><li> List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+</li><li> State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+</li><li> Preserve all the copyright notices of the Document.
+
+</li><li> Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+</li><li> Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+</li><li> Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document&rsquo;s license notice.
+
+</li><li> Include an unaltered copy of this License.
+
+</li><li> Preserve the section Entitled &ldquo;History&rdquo;, Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled &ldquo;History&rdquo; in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+</li><li> Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the &ldquo;History&rdquo; section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+</li><li> For any section Entitled &ldquo;Acknowledgements&rdquo; or &ldquo;Dedications&rdquo;, Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+</li><li> Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+</li><li> Delete any section Entitled &ldquo;Endorsements&rdquo;. Such a section
+may not be included in the Modified Version.
+
+</li><li> Do not retitle any existing section to be Entitled &ldquo;Endorsements&rdquo; or
+to conflict in title with any Invariant Section.
+
+</li><li> Preserve any Warranty Disclaimers.
+</li></ol>
+
+<p>If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version&rsquo;s license notice.
+These titles must be distinct from any other section titles.
+</p>
+<p>You may add a section Entitled &ldquo;Endorsements&rdquo;, provided it contains
+nothing but endorsements of your Modified Version by various
+parties&mdash;for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</p>
+<p>You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+</p>
+<p>The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+</p>
+</li><li> COMBINING DOCUMENTS
+
+<p>You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+</p>
+<p>The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+</p>
+<p>In the combination, you must combine any sections Entitled &ldquo;History&rdquo;
+in the various original documents, forming one section Entitled
+&ldquo;History&rdquo;; likewise combine any sections Entitled &ldquo;Acknowledgements&rdquo;,
+and any sections Entitled &ldquo;Dedications&rdquo;. You must delete all
+sections Entitled &ldquo;Endorsements.&rdquo;
+</p>
+</li><li> COLLECTIONS OF DOCUMENTS
+
+<p>You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+</p>
+<p>You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+</p>
+</li><li> AGGREGATION WITH INDEPENDENT WORKS
+
+<p>A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an &ldquo;aggregate&rdquo; if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation&rsquo;s users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+</p>
+<p>If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document&rsquo;s Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+</p>
+</li><li> TRANSLATION
+
+<p>Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+</p>
+<p>If a section in the Document is Entitled &ldquo;Acknowledgements&rdquo;,
+&ldquo;Dedications&rdquo;, or &ldquo;History&rdquo;, the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</p>
+</li><li> TERMINATION
+
+<p>You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+</p>
+<p>However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+</p>
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+</p>
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+</p>
+</li><li> FUTURE REVISIONS OF THIS LICENSE
+
+<p>The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+<a href="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</a>.
+</p>
+<p>Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License &ldquo;or any later version&rdquo; applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy&rsquo;s public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+</p>
+</li><li> RELICENSING
+
+<p>&ldquo;Massive Multiauthor Collaboration Site&rdquo; (or &ldquo;MMC Site&rdquo;) means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+&ldquo;Massive Multiauthor Collaboration&rdquo; (or &ldquo;MMC&rdquo;) contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+</p>
+<p>&ldquo;CC-BY-SA&rdquo; means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+</p>
+<p>&ldquo;Incorporate&rdquo; means to publish or republish a Document, in whole or
+in part, as part of another Document.
+</p>
+<p>An MMC is &ldquo;eligible for relicensing&rdquo; if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+</p>
+<p>The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+</p>
+</li></ol>
+
+<span id="ADDENDUM_003a-How-to-use-this-License-for-your-documents"></span><h3 class="heading">ADDENDUM: How to use this License for your documents</h3>
+
+<p>To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+</p>
+<div class="example">
+<pre class="example"> Copyright (C) <var>year</var> <var>your name</var>.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+</pre></div>
+
+<p>If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the &ldquo;with&hellip;Texts.&rdquo; line with this:
+</p>
+<div class="example">
+<pre class="example"> with the Invariant Sections being <var>list their titles</var>, with
+ the Front-Cover Texts being <var>list</var>, and with the Back-Cover Texts
+ being <var>list</var>.
+</pre></div>
+
+<p>If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</p>
+<p>If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+</p>
+
+
+<hr>
+</div>
+<div class="appendix" id="Concept-Index">
+<div class="header">
+<p>
+Next: <a href="#Function-and-Variable-Index" accesskey="n" rel="next">Function and Variable Index</a>, Previous: <a href="#GNU-Free-Documentation-License" accesskey="p" rel="prev">GNU Free Documentation License</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU History Library</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Concept-Index-1"></span><h2 class="appendix">Appendix B Concept Index</h2>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Concept-Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="index-cp" border="0">
+<tr><td></td><th align="left">Index Entry</th><td>&nbsp;</td><th align="left"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-anchored-search">anchored search</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-the-History-List">Searching the History List</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-event-designators">event designators</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Event-Designators">Event Designators</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history-events">history events</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Event-Designators">Event Designators</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history-expansion">history expansion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Interaction">History Interaction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-History-Searching">History Searching</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-the-History-List">Searching the History List</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Concept-Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+</td></tr></table>
+
+<hr>
+</div>
+<div class="appendix" id="Function-and-Variable-Index">
+<div class="header">
+<p>
+Previous: <a href="#Concept-Index" accesskey="p" rel="prev">Concept Index</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU History Library</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Function-and-Variable-Index-1"></span><h2 class="appendix">Appendix C Function and Variable Index</h2>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-W"><b>W</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="index-vr" border="0">
+<tr><td></td><th align="left">Index Entry</th><td>&nbsp;</td><th align="left"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_vr_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-add_005fhistory"><code>add_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-List-Management">History List Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-add_005fhistory_005ftime"><code>add_history_time</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-List-Management">History List Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-append_005fhistory"><code>append_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Managing-the-History-File">Managing the History File</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_vr_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-clear_005fhistory"><code>clear_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-List-Management">History List Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-current_005fhistory"><code>current_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Information-About-the-History-List">Information About the History List</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_vr_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-free_005fhistory_005fentry"><code>free_history_entry</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-List-Management">History List Management</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_vr_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-get_005fhistory_005fevent"><code>get_history_event</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Expansion">History Expansion</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_vr_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005farg_005fextract"><code>history_arg_extract</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Expansion">History Expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fbase"><code>history_base</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fcomment_005fchar"><code>history_comment_char</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fexpand"><code>history_expand</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Expansion">History Expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fexpansion_005fchar"><code>history_expansion_char</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fget"><code>history_get</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Information-About-the-History-List">Information About the History List</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fget_005fhistory_005fstate"><code>history_get_history_state</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Initializing-History-and-State-Management">Initializing History and State Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fget_005ftime"><code>history_get_time</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Information-About-the-History-List">Information About the History List</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005finhibit_005fexpansion_005ffunction"><code>history_inhibit_expansion_function</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fis_005fstifled"><code>history_is_stifled</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-List-Management">History List Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005flength"><code>history_length</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005flist"><code>history_list</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Information-About-the-History-List">Information About the History List</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fmax_005fentries"><code>history_max_entries</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fno_005fexpand_005fchars"><code>history_no_expand_chars</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fquotes_005finhibit_005fexpansion"><code>history_quotes_inhibit_expansion</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fquoting_005fstate"><code>history_quoting_state</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fsearch"><code>history_search</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-the-History-List">Searching the History List</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fsearch_005fdelimiter_005fchars"><code>history_search_delimiter_chars</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fsearch_005fpos"><code>history_search_pos</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-the-History-List">Searching the History List</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fsearch_005fprefix"><code>history_search_prefix</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-the-History-List">Searching the History List</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fset_005fhistory_005fstate"><code>history_set_history_state</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Initializing-History-and-State-Management">Initializing History and State Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fset_005fpos"><code>history_set_pos</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Moving-Around-the-History-List">Moving Around the History List</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fsubst_005fchar"><code>history_subst_char</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005ftokenize"><code>history_tokenize</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Expansion">History Expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005ftotal_005fbytes"><code>history_total_bytes</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Information-About-the-History-List">Information About the History List</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005ftruncate_005ffile"><code>history_truncate_file</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Managing-the-History-File">Managing the History File</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fword_005fdelimiters"><code>history_word_delimiters</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_005fwrite_005ftimestamps"><code>history_write_timestamps</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-Variables">History Variables</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_vr_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-next_005fhistory"><code>next_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Moving-Around-the-History-List">Moving Around the History List</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_vr_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-previous_005fhistory"><code>previous_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Moving-Around-the-History-List">Moving Around the History List</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_vr_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-read_005fhistory"><code>read_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Managing-the-History-File">Managing the History File</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-read_005fhistory_005frange"><code>read_history_range</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Managing-the-History-File">Managing the History File</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-remove_005fhistory"><code>remove_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-List-Management">History List Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-replace_005fhistory_005fentry"><code>replace_history_entry</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-List-Management">History List Management</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_vr_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-stifle_005fhistory"><code>stifle_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-List-Management">History List Management</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_vr_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unstifle_005fhistory"><code>unstifle_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History-List-Management">History List Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-using_005fhistory"><code>using_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Initializing-History-and-State-Management">Initializing History and State Management</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_vr_letter-W">W</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-where_005fhistory"><code>where_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Information-About-the-History-List">Information About the History List</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-write_005fhistory"><code>write_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Managing-the-History-File">Managing the History File</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_vr_letter-W"><b>W</b></a>
+ &nbsp;
+</td></tr></table>
+
+</div>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/history.info b/doc/history.info
new file mode 100644
index 0000000..a6799c3
--- /dev/null
+++ b/doc/history.info
@@ -0,0 +1,1426 @@
+This is history.info, produced by makeinfo version 6.8 from
+history.texi.
+
+This document describes the GNU History library (version 8.2, 19
+September 2022), a programming tool that provides a consistent user
+interface for recalling lines of previously typed input.
+
+ Copyright (C) 1988-2022 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.3 or any later version published by the Free Software
+ Foundation; with no Invariant Sections, no Front-Cover Texts, and
+ no Back-Cover Texts. A copy of the license is included in the
+ section entitled "GNU Free Documentation License".
+
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* History: (history). The GNU history library API.
+END-INFO-DIR-ENTRY
+
+
+File: history.info, Node: Top, Next: Using History Interactively, Up: (dir)
+
+GNU History Library
+*******************
+
+This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+
+* Menu:
+
+* Using History Interactively:: GNU History User's Manual.
+* Programming with GNU History:: GNU History Programmer's Manual.
+* GNU Free Documentation License:: License for copying this manual.
+* Concept Index:: Index of concepts described in this manual.
+* Function and Variable Index:: Index of externally visible functions
+ and variables.
+
+
+File: history.info, Node: Using History Interactively, Next: Programming with GNU History, Prev: Top, Up: Top
+
+1 Using History Interactively
+*****************************
+
+This chapter describes how to use the GNU History Library interactively,
+from a user's standpoint. It should be considered a user's guide. For
+information on using the GNU History Library in your own programs, *note
+Programming with GNU History::.
+
+* Menu:
+
+* History Interaction:: What it feels like using History as a user.
+
+
+File: history.info, Node: History Interaction, Up: Using History Interactively
+
+1.1 History Expansion
+=====================
+
+The History library provides a history expansion feature that is similar
+to the history expansion provided by 'csh'. This section describes the
+syntax used to manipulate the history information.
+
+ History expansions introduce words from the history list into the
+input stream, making it easy to repeat commands, insert the arguments to
+a previous command into the current input line, or fix errors in
+previous commands quickly.
+
+ History expansion takes place in two parts. The first is to
+determine which line from the history list should be used during
+substitution. The second is to select portions of that line for
+inclusion into the current one. The line selected from the history is
+called the "event", and the portions of that line that are acted upon
+are called "words". Various "modifiers" are available to manipulate the
+selected words. The line is broken into words in the same fashion that
+Bash does, so that several words surrounded by quotes are considered one
+word. History expansions are introduced by the appearance of the
+history expansion character, which is '!' by default.
+
+ History expansion implements shell-like quoting conventions: a
+backslash can be used to remove the special handling for the next
+character; single quotes enclose verbatim sequences of characters, and
+can be used to inhibit history expansion; and characters enclosed within
+double quotes may be subject to history expansion, since backslash can
+escape the history expansion character, but single quotes may not, since
+they are not treated specially within double quotes.
+
+* Menu:
+
+* Event Designators:: How to specify which history line to use.
+* Word Designators:: Specifying which words are of interest.
+* Modifiers:: Modifying the results of substitution.
+
+
+File: history.info, Node: Event Designators, Next: Word Designators, Up: History Interaction
+
+1.1.1 Event Designators
+-----------------------
+
+An event designator is a reference to a command line entry in the
+history list. Unless the reference is absolute, events are relative to
+the current position in the history list.
+
+'!'
+ Start a history substitution, except when followed by a space, tab,
+ the end of the line, or '='.
+
+'!N'
+ Refer to command line N.
+
+'!-N'
+ Refer to the command N lines back.
+
+'!!'
+ Refer to the previous command. This is a synonym for '!-1'.
+
+'!STRING'
+ Refer to the most recent command preceding the current position in
+ the history list starting with STRING.
+
+'!?STRING[?]'
+ Refer to the most recent command preceding the current position in
+ the history list containing STRING. The trailing '?' may be
+ omitted if the STRING is followed immediately by a newline. If
+ STRING is missing, the string from the most recent search is used;
+ it is an error if there is no previous search string.
+
+'^STRING1^STRING2^'
+ Quick Substitution. Repeat the last command, replacing STRING1
+ with STRING2. Equivalent to '!!:s^STRING1^STRING2^'.
+
+'!#'
+ The entire command line typed so far.
+
+
+File: history.info, Node: Word Designators, Next: Modifiers, Prev: Event Designators, Up: History Interaction
+
+1.1.2 Word Designators
+----------------------
+
+Word designators are used to select desired words from the event. A ':'
+separates the event specification from the word designator. It may be
+omitted if the word designator begins with a '^', '$', '*', '-', or '%'.
+Words are numbered from the beginning of the line, with the first word
+being denoted by 0 (zero). Words are inserted into the current line
+separated by single spaces.
+
+ For example,
+
+'!!'
+ designates the preceding command. When you type this, the
+ preceding command is repeated in toto.
+
+'!!:$'
+ designates the last argument of the preceding command. This may be
+ shortened to '!$'.
+
+'!fi:2'
+ designates the second argument of the most recent command starting
+ with the letters 'fi'.
+
+ Here are the word designators:
+
+'0 (zero)'
+ The '0'th word. For many applications, this is the command word.
+
+'N'
+ The Nth word.
+
+'^'
+ The first argument; that is, word 1.
+
+'$'
+ The last argument.
+
+'%'
+ The first word matched by the most recent '?STRING?' search, if the
+ search string begins with a character that is part of a word.
+
+'X-Y'
+ A range of words; '-Y' abbreviates '0-Y'.
+
+'*'
+ All of the words, except the '0'th. This is a synonym for '1-$'.
+ It is not an error to use '*' if there is just one word in the
+ event; the empty string is returned in that case.
+
+'X*'
+ Abbreviates 'X-$'
+
+'X-'
+ Abbreviates 'X-$' like 'X*', but omits the last word. If 'x' is
+ missing, it defaults to 0.
+
+ If a word designator is supplied without an event specification, the
+previous command is used as the event.
+
+
+File: history.info, Node: Modifiers, Prev: Word Designators, Up: History Interaction
+
+1.1.3 Modifiers
+---------------
+
+After the optional word designator, you can add a sequence of one or
+more of the following modifiers, each preceded by a ':'. These modify,
+or edit, the word or words selected from the history event.
+
+'h'
+ Remove a trailing pathname component, leaving only the head.
+
+'t'
+ Remove all leading pathname components, leaving the tail.
+
+'r'
+ Remove a trailing suffix of the form '.SUFFIX', leaving the
+ basename.
+
+'e'
+ Remove all but the trailing suffix.
+
+'p'
+ Print the new command but do not execute it.
+
+'s/OLD/NEW/'
+ Substitute NEW for the first occurrence of OLD in the event line.
+ Any character may be used as the delimiter in place of '/'. The
+ delimiter may be quoted in OLD and NEW with a single backslash. If
+ '&' appears in NEW, it is replaced by OLD. A single backslash will
+ quote the '&'. If OLD is null, it is set to the last OLD
+ substituted, or, if no previous history substitutions took place,
+ the last STRING in a !?STRING'[?]' search. If NEW is null, each
+ matching OLD is deleted. The final delimiter is optional if it is
+ the last character on the input line.
+
+'&'
+ Repeat the previous substitution.
+
+'g'
+'a'
+ Cause changes to be applied over the entire event line. Used in
+ conjunction with 's', as in 'gs/OLD/NEW/', or with '&'.
+
+'G'
+ Apply the following 's' or '&' modifier once to each word in the
+ event.
+
+
+File: history.info, Node: Programming with GNU History, Next: GNU Free Documentation License, Prev: Using History Interactively, Up: Top
+
+2 Programming with GNU History
+******************************
+
+This chapter describes how to interface programs that you write with the
+GNU History Library. It should be considered a technical guide. For
+information on the interactive use of GNU History, *note Using History
+Interactively::.
+
+* Menu:
+
+* Introduction to History:: What is the GNU History library for?
+* History Storage:: How information is stored.
+* History Functions:: Functions that you can use.
+* History Variables:: Variables that control behaviour.
+* History Programming Example:: Example of using the GNU History Library.
+
+
+File: history.info, Node: Introduction to History, Next: History Storage, Up: Programming with GNU History
+
+2.1 Introduction to History
+===========================
+
+Many programs read input from the user a line at a time. The GNU
+History library is able to keep track of those lines, associate
+arbitrary data with each line, and utilize information from previous
+lines in composing new ones.
+
+ A programmer using the History library has available functions for
+remembering lines on a history list, associating arbitrary data with a
+line, removing lines from the list, searching through the list for a
+line containing an arbitrary text string, and referencing any line in
+the list directly. In addition, a history "expansion" function is
+available which provides for a consistent user interface across
+different programs.
+
+ The user using programs written with the History library has the
+benefit of a consistent user interface with a set of well-known commands
+for manipulating the text of previous lines and using that text in new
+commands. The basic history manipulation commands are similar to the
+history substitution provided by 'csh'.
+
+ The programmer can also use the Readline library, which includes some
+history manipulation by default, and has the added advantage of command
+line editing.
+
+ Before declaring any functions using any functionality the History
+library provides in other code, an application writer should include the
+file '<readline/history.h>' in any file that uses the History library's
+features. It supplies extern declarations for all of the library's
+public functions and variables, and declares all of the public data
+structures.
+
+
+File: history.info, Node: History Storage, Next: History Functions, Prev: Introduction to History, Up: Programming with GNU History
+
+2.2 History Storage
+===================
+
+The history list is an array of history entries. A history entry is
+declared as follows:
+
+ typedef void *histdata_t;
+
+ typedef struct _hist_entry {
+ char *line;
+ char *timestamp;
+ histdata_t data;
+ } HIST_ENTRY;
+
+ The history list itself might therefore be declared as
+
+ HIST_ENTRY **the_history_list;
+
+ The state of the History library is encapsulated into a single
+structure:
+
+ /*
+ * A structure used to pass around the current state of the history.
+ */
+ typedef struct _hist_state {
+ HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+ int offset; /* The location pointer within this array. */
+ int length; /* Number of elements within this array. */
+ int size; /* Number of slots allocated to this array. */
+ int flags;
+ } HISTORY_STATE;
+
+ If the flags member includes 'HS_STIFLED', the history has been
+stifled.
+
+
+File: history.info, Node: History Functions, Next: History Variables, Prev: History Storage, Up: Programming with GNU History
+
+2.3 History Functions
+=====================
+
+This section describes the calling sequence for the various functions
+exported by the GNU History library.
+
+* Menu:
+
+* Initializing History and State Management:: Functions to call when you
+ want to use history in a
+ program.
+* History List Management:: Functions used to manage the list
+ of history entries.
+* Information About the History List:: Functions returning information about
+ the history list.
+* Moving Around the History List:: Functions used to change the position
+ in the history list.
+* Searching the History List:: Functions to search the history list
+ for entries containing a string.
+* Managing the History File:: Functions that read and write a file
+ containing the history list.
+* History Expansion:: Functions to perform csh-like history
+ expansion.
+
+
+File: history.info, Node: Initializing History and State Management, Next: History List Management, Up: History Functions
+
+2.3.1 Initializing History and State Management
+-----------------------------------------------
+
+This section describes functions used to initialize and manage the state
+of the History library when you want to use the history functions in
+your program.
+
+ -- Function: void using_history (void)
+ Begin a session in which the history functions might be used. This
+ initializes the interactive variables.
+
+ -- Function: HISTORY_STATE * history_get_history_state (void)
+ Return a structure describing the current state of the input
+ history.
+
+ -- Function: void history_set_history_state (HISTORY_STATE *state)
+ Set the state of the history list according to STATE.
+
+
+File: history.info, Node: History List Management, Next: Information About the History List, Prev: Initializing History and State Management, Up: History Functions
+
+2.3.2 History List Management
+-----------------------------
+
+These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+
+ -- Function: void add_history (const char *string)
+ Place STRING at the end of the history list. The associated data
+ field (if any) is set to 'NULL'. If the maximum number of history
+ entries has been set using 'stifle_history()', and the new number
+ of history entries would exceed that maximum, the oldest history
+ entry is removed.
+
+ -- Function: void add_history_time (const char *string)
+ Change the time stamp associated with the most recent history entry
+ to STRING.
+
+ -- Function: HIST_ENTRY * remove_history (int which)
+ Remove history entry at offset WHICH from the history. The removed
+ element is returned so you can free the line, data, and containing
+ structure.
+
+ -- Function: histdata_t free_history_entry (HIST_ENTRY *histent)
+ Free the history entry HISTENT and any history library private data
+ associated with it. Returns the application-specific data so the
+ caller can dispose of it.
+
+ -- Function: HIST_ENTRY * replace_history_entry (int which, const char
+ *line, histdata_t data)
+ Make the history entry at offset WHICH have LINE and DATA. This
+ returns the old entry so the caller can dispose of any
+ application-specific data. In the case of an invalid WHICH, a
+ 'NULL' pointer is returned.
+
+ -- Function: void clear_history (void)
+ Clear the history list by deleting all the entries.
+
+ -- Function: void stifle_history (int max)
+ Stifle the history list, remembering only the last MAX entries.
+ The history list will contain only MAX entries at a time.
+
+ -- Function: int unstifle_history (void)
+ Stop stifling the history. This returns the previously-set maximum
+ number of history entries (as set by 'stifle_history()'). The
+ value is positive if the history was stifled, negative if it
+ wasn't.
+
+ -- Function: int history_is_stifled (void)
+ Returns non-zero if the history is stifled, zero if it is not.
+
+
+File: history.info, Node: Information About the History List, Next: Moving Around the History List, Prev: History List Management, Up: History Functions
+
+2.3.3 Information About the History List
+----------------------------------------
+
+These functions return information about the entire history list or
+individual list entries.
+
+ -- Function: HIST_ENTRY ** history_list (void)
+ Return a 'NULL' terminated array of 'HIST_ENTRY *' which is the
+ current input history. Element 0 of this list is the beginning of
+ time. If there is no history, return 'NULL'.
+
+ -- Function: int where_history (void)
+ Returns the offset of the current history element.
+
+ -- Function: HIST_ENTRY * current_history (void)
+ Return the history entry at the current position, as determined by
+ 'where_history()'. If there is no entry there, return a 'NULL'
+ pointer.
+
+ -- Function: HIST_ENTRY * history_get (int offset)
+ Return the history entry at position OFFSET. The range of valid
+ values of OFFSET starts at 'history_base' and ends at
+ HISTORY_LENGTH - 1 (*note History Variables::). If there is no
+ entry there, or if OFFSET is outside the valid range, return a
+ 'NULL' pointer.
+
+ -- Function: time_t history_get_time (HIST_ENTRY *entry)
+ Return the time stamp associated with the history entry ENTRY. If
+ the timestamp is missing or invalid, return 0.
+
+ -- Function: int history_total_bytes (void)
+ Return the number of bytes that the primary history entries are
+ using. This function returns the sum of the lengths of all the
+ lines in the history.
+
+
+File: history.info, Node: Moving Around the History List, Next: Searching the History List, Prev: Information About the History List, Up: History Functions
+
+2.3.4 Moving Around the History List
+------------------------------------
+
+These functions allow the current index into the history list to be set
+or changed.
+
+ -- Function: int history_set_pos (int pos)
+ Set the current history offset to POS, an absolute index into the
+ list. Returns 1 on success, 0 if POS is less than zero or greater
+ than the number of history entries.
+
+ -- Function: HIST_ENTRY * previous_history (void)
+ Back up the current history offset to the previous history entry,
+ and return a pointer to that entry. If there is no previous entry,
+ return a 'NULL' pointer.
+
+ -- Function: HIST_ENTRY * next_history (void)
+ If the current history offset refers to a valid history entry,
+ increment the current history offset. If the possibly-incremented
+ history offset refers to a valid history entry, return a pointer to
+ that entry; otherwise, return a 'BNULL' pointer.
+
+
+File: history.info, Node: Searching the History List, Next: Managing the History File, Prev: Moving Around the History List, Up: History Functions
+
+2.3.5 Searching the History List
+--------------------------------
+
+These functions allow searching of the history list for entries
+containing a specific string. Searching may be performed both forward
+and backward from the current history position. The search may be
+"anchored", meaning that the string must match at the beginning of the
+history entry.
+
+ -- Function: int history_search (const char *string, int direction)
+ Search the history for STRING, starting at the current history
+ offset. If DIRECTION is less than 0, then the search is through
+ previous entries, otherwise through subsequent entries. If STRING
+ is found, then the current history index is set to that history
+ entry, and the value returned is the offset in the line of the
+ entry where STRING was found. Otherwise, nothing is changed, and a
+ -1 is returned.
+
+ -- Function: int history_search_prefix (const char *string, int
+ direction)
+ Search the history for STRING, starting at the current history
+ offset. The search is anchored: matching lines must begin with
+ STRING. If DIRECTION is less than 0, then the search is through
+ previous entries, otherwise through subsequent entries. If STRING
+ is found, then the current history index is set to that entry, and
+ the return value is 0. Otherwise, nothing is changed, and a -1 is
+ returned.
+
+ -- Function: int history_search_pos (const char *string, int direction,
+ int pos)
+ Search for STRING in the history list, starting at POS, an absolute
+ index into the list. If DIRECTION is negative, the search proceeds
+ backward from POS, otherwise forward. Returns the absolute index
+ of the history element where STRING was found, or -1 otherwise.
+
+
+File: history.info, Node: Managing the History File, Next: History Expansion, Prev: Searching the History List, Up: History Functions
+
+2.3.6 Managing the History File
+-------------------------------
+
+The History library can read the history from and write it to a file.
+This section documents the functions for managing a history file.
+
+ -- Function: int read_history (const char *filename)
+ Add the contents of FILENAME to the history list, a line at a time.
+ If FILENAME is 'NULL', then read from '~/.history'. Returns 0 if
+ successful, or 'errno' if not.
+
+ -- Function: int read_history_range (const char *filename, int from,
+ int to)
+ Read a range of lines from FILENAME, adding them to the history
+ list. Start reading at line FROM and end at TO. If FROM is zero,
+ start at the beginning. If TO is less than FROM, then read until
+ the end of the file. If FILENAME is 'NULL', then read from
+ '~/.history'. Returns 0 if successful, or 'errno' if not.
+
+ -- Function: int write_history (const char *filename)
+ Write the current history to FILENAME, overwriting FILENAME if
+ necessary. If FILENAME is 'NULL', then write the history list to
+ '~/.history'. Returns 0 on success, or 'errno' on a read or write
+ error.
+
+ -- Function: int append_history (int nelements, const char *filename)
+ Append the last NELEMENTS of the history list to FILENAME. If
+ FILENAME is 'NULL', then append to '~/.history'. Returns 0 on
+ success, or 'errno' on a read or write error.
+
+ -- Function: int history_truncate_file (const char *filename, int
+ nlines)
+ Truncate the history file FILENAME, leaving only the last NLINES
+ lines. If FILENAME is 'NULL', then '~/.history' is truncated.
+ Returns 0 on success, or 'errno' on failure.
+
+
+File: history.info, Node: History Expansion, Prev: Managing the History File, Up: History Functions
+
+2.3.7 History Expansion
+-----------------------
+
+These functions implement history expansion.
+
+ -- Function: int history_expand (char *string, char **output)
+ Expand STRING, placing the result into OUTPUT, a pointer to a
+ string (*note History Interaction::). Returns:
+ '0'
+ If no expansions took place (or, if the only change in the
+ text was the removal of escape characters preceding the
+ history expansion character);
+ '1'
+ if expansions did take place;
+ '-1'
+ if there was an error in expansion;
+ '2'
+ if the returned line should be displayed, but not executed, as
+ with the ':p' modifier (*note Modifiers::).
+
+ If an error occurred in expansion, then OUTPUT contains a
+ descriptive error message.
+
+ -- Function: char * get_history_event (const char *string, int *cindex,
+ int qchar)
+ Returns the text of the history event beginning at STRING +
+ *CINDEX. *CINDEX is modified to point to after the event
+ specifier. At function entry, CINDEX points to the index into
+ STRING where the history event specification begins. QCHAR is a
+ character that is allowed to end the event specification in
+ addition to the "normal" terminating characters.
+
+ -- Function: char ** history_tokenize (const char *string)
+ Return an array of tokens parsed out of STRING, much as the shell
+ might. The tokens are split on the characters in the
+ HISTORY_WORD_DELIMITERS variable, and shell quoting conventions are
+ obeyed as described below.
+
+ -- Function: char * history_arg_extract (int first, int last, const
+ char *string)
+ Extract a string segment consisting of the FIRST through LAST
+ arguments present in STRING. Arguments are split using
+ 'history_tokenize'.
+
+
+File: history.info, Node: History Variables, Next: History Programming Example, Prev: History Functions, Up: Programming with GNU History
+
+2.4 History Variables
+=====================
+
+This section describes the externally-visible variables exported by the
+GNU History Library.
+
+ -- Variable: int history_base
+ The logical offset of the first entry in the history list.
+
+ -- Variable: int history_length
+ The number of entries currently stored in the history list.
+
+ -- Variable: int history_max_entries
+ The maximum number of history entries. This must be changed using
+ 'stifle_history()'.
+
+ -- Variable: int history_write_timestamps
+ If non-zero, timestamps are written to the history file, so they
+ can be preserved between sessions. The default value is 0, meaning
+ that timestamps are not saved.
+
+ The current timestamp format uses the value of HISTORY_COMMENT_CHAR
+ to delimit timestamp entries in the history file. If that variable
+ does not have a value (the default), timestamps will not be
+ written.
+
+ -- Variable: char history_expansion_char
+ The character that introduces a history event. The default is '!'.
+ Setting this to 0 inhibits history expansion.
+
+ -- Variable: char history_subst_char
+ The character that invokes word substitution if found at the start
+ of a line. The default is '^'.
+
+ -- Variable: char history_comment_char
+ During tokenization, if this character is seen as the first
+ character of a word, then it and all subsequent characters up to a
+ newline are ignored, suppressing history expansion for the
+ remainder of the line. This is disabled by default.
+
+ -- Variable: char * history_word_delimiters
+ The characters that separate tokens for 'history_tokenize()'. The
+ default value is '" \t\n()<>;&|"'.
+
+ -- Variable: char * history_search_delimiter_chars
+ The list of additional characters which can delimit a history
+ search string, in addition to space, TAB, ':' and '?' in the case
+ of a substring search. The default is empty.
+
+ -- Variable: char * history_no_expand_chars
+ The list of characters which inhibit history expansion if found
+ immediately following HISTORY_EXPANSION_CHAR. The default is
+ space, tab, newline, carriage return, and '='.
+
+ -- Variable: int history_quotes_inhibit_expansion
+ If non-zero, the history expansion code implements shell-like
+ quoting: single-quoted words are not scanned for the history
+ expansion character or the history comment character, and
+ double-quoted words may have history expansion performed, since
+ single quotes are not special within double quotes. The default
+ value is 0.
+
+ -- Variable: int history_quoting_state
+ An application may set this variable to indicate that the current
+ line being expanded is subject to existing quoting. If set to ''',
+ the history expansion function will assume that the line is
+ single-quoted and inhibit expansion until it reads an unquoted
+ closing single quote; if set to '"', history expansion will assume
+ the line is double quoted until it reads an unquoted closing double
+ quote. If set to zero, the default, the history expansion function
+ will assume the line is not quoted and treat quote characters
+ within the line as described above. This is only effective if
+ HISTORY_QUOTES_INHIBIT_EXPANSION is set.
+
+ -- Variable: rl_linebuf_func_t * history_inhibit_expansion_function
+ This should be set to the address of a function that takes two
+ arguments: a 'char *' (STRING) and an 'int' index into that string
+ (I). It should return a non-zero value if the history expansion
+ starting at STRING[I] should not be performed; zero if the
+ expansion should be done. It is intended for use by applications
+ like Bash that use the history expansion character for additional
+ purposes. By default, this variable is set to 'NULL'.
+
+
+File: history.info, Node: History Programming Example, Prev: History Variables, Up: Programming with GNU History
+
+2.5 History Programming Example
+===============================
+
+The following program demonstrates simple use of the GNU History
+Library.
+
+ #include <stdio.h>
+ #include <readline/history.h>
+
+ main (argc, argv)
+ int argc;
+ char **argv;
+ {
+ char line[1024], *t;
+ int len, done = 0;
+
+ line[0] = 0;
+
+ using_history ();
+ while (!done)
+ {
+ printf ("history$ ");
+ fflush (stdout);
+ t = fgets (line, sizeof (line) - 1, stdin);
+ if (t && *t)
+ {
+ len = strlen (t);
+ if (t[len - 1] == '\n')
+ t[len - 1] = '\0';
+ }
+
+ if (!t)
+ strcpy (line, "quit");
+
+ if (line[0])
+ {
+ char *expansion;
+ int result;
+
+ result = history_expand (line, &expansion);
+ if (result)
+ fprintf (stderr, "%s\n", expansion);
+
+ if (result < 0 || result == 2)
+ {
+ free (expansion);
+ continue;
+ }
+
+ add_history (expansion);
+ strncpy (line, expansion, sizeof (line) - 1);
+ free (expansion);
+ }
+
+ if (strcmp (line, "quit") == 0)
+ done = 1;
+ else if (strcmp (line, "save") == 0)
+ write_history ("history_file");
+ else if (strcmp (line, "read") == 0)
+ read_history ("history_file");
+ else if (strcmp (line, "list") == 0)
+ {
+ register HIST_ENTRY **the_list;
+ register int i;
+
+ the_list = history_list ();
+ if (the_list)
+ for (i = 0; the_list[i]; i++)
+ printf ("%d: %s\n", i + history_base, the_list[i]->line);
+ }
+ else if (strncmp (line, "delete", 6) == 0)
+ {
+ int which;
+ if ((sscanf (line + 6, "%d", &which)) == 1)
+ {
+ HIST_ENTRY *entry = remove_history (which);
+ if (!entry)
+ fprintf (stderr, "No such entry %d\n", which);
+ else
+ {
+ free (entry->line);
+ free (entry);
+ }
+ }
+ else
+ {
+ fprintf (stderr, "non-numeric arg given to `delete'\n");
+ }
+ }
+ }
+ }
+
+
+File: history.info, Node: GNU Free Documentation License, Next: Concept Index, Prev: Programming with GNU History, Up: Top
+
+Appendix A GNU Free Documentation License
+*****************************************
+
+ Version 1.3, 3 November 2008
+
+ Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+ <http://fsf.org/>
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document "free" in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book. We
+ recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it can
+ be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You accept
+ the license if you copy, modify or distribute the work in a way
+ requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in the
+ notice that says that the Document is released under this License.
+ If a section does not fit the above definition of Secondary then it
+ is not allowed to be designated as Invariant. The Document may
+ contain zero Invariant Sections. If the Document does not identify
+ any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images composed
+ of pixels) generic paint programs or (for drawings) some widely
+ available drawing editor, and that is suitable for input to text
+ formatters or for automatic translation to a variety of formats
+ suitable for input to text formatters. A copy made in an otherwise
+ Transparent file format whose markup, or absence of markup, has
+ been arranged to thwart or discourage subsequent modification by
+ readers is not Transparent. An image format is not Transparent if
+ used for any substantial amount of text. A copy that is not
+ "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and standard-conforming
+ simple HTML, PostScript or PDF designed for human modification.
+ Examples of transparent image formats include PNG, XCF and JPG.
+ Opaque formats include proprietary formats that can be read and
+ edited only by proprietary word processors, SGML or XML for which
+ the DTD and/or processing tools are not generally available, and
+ the machine-generated HTML, PostScript or PDF produced by some word
+ processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ The "publisher" means any person or entity that distributes copies
+ of the Document to the public.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow the
+ conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the title
+ equally prominent and visible. You may add other material on the
+ covers in addition. Copying with changes limited to the covers, as
+ long as they preserve the title of the Document and satisfy these
+ conditions, can be treated as verbatim copying in other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a machine-readable
+ Transparent copy along with each Opaque copy, or state in or with
+ each Opaque copy a computer-network location from which the general
+ network-using public has access to download using public-standard
+ network protocols a complete Transparent copy of the Document, free
+ of added material. If you use the latter option, you must take
+ reasonably prudent steps, when you begin distribution of Opaque
+ copies in quantity, to ensure that this Transparent copy will
+ remain thus accessible at the stated location until at least one
+ year after the last time you distribute an Opaque copy (directly or
+ through your agents or retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of copies,
+ to give them a chance to provide you with an updated version of the
+ Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with the
+ Modified Version filling the role of the Document, thus licensing
+ distribution and modification of the Modified Version to whoever
+ possesses a copy of it. In addition, you must do these things in
+ the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of previous
+ versions (which should, if there were any, be listed in the
+ History section of the Document). You may use the same title
+ as a previous version if the original publisher of that
+ version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on the
+ Title Page. If there is no section Entitled "History" in the
+ Document, create one stating the title, year, authors, and
+ publisher of the Document as given on its Title Page, then add
+ an item describing the Modified Version as stated in the
+ previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in the
+ "History" section. You may omit a network location for a work
+ that was published at least four years before the Document
+ itself, or if the original publisher of the version it refers
+ to gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section
+ all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document, unaltered
+ in their text and in their titles. Section numbers or the
+ equivalent are not considered part of the section titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option designate
+ some or all of these sections as invariant. To do this, add their
+ titles to the list of Invariant Sections in the Modified Version's
+ license notice. These titles must be distinct from any other
+ section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end of
+ the list of Cover Texts in the Modified Version. Only one passage
+ of Front-Cover Text and one of Back-Cover Text may be added by (or
+ through arrangements made by) any one entity. If the Document
+ already includes a cover text for the same cover, previously added
+ by you or by arrangement made by the same entity you are acting on
+ behalf of, you may not add another; but you may replace the old
+ one, on explicit permission from the previous publisher that added
+ the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination all
+ of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the documents
+ in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow this
+ License in all other respects regarding verbatim copying of that
+ document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of a
+ storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly and
+ finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from you
+ under this License. If your rights have been terminated and not
+ permanently reinstated, receipt of a copy of some or all of the
+ same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ <http://www.gnu.org/copyleft/>.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If the
+ Document does not specify a version number of this License, you may
+ choose any version ever published (not as a draft) by the Free
+ Software Foundation. If the Document specifies that a proxy can
+ decide which future versions of this License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+ "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ "Incorporate" means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is "eligible for relicensing" if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with
+ the Front-Cover Texts being LIST, and with the Back-Cover Texts
+ being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of free
+software license, such as the GNU General Public License, to permit
+their use in free software.
+
+
+File: history.info, Node: Concept Index, Next: Function and Variable Index, Prev: GNU Free Documentation License, Up: Top
+
+Appendix B Concept Index
+************************
+
+
+* Menu:
+
+* anchored search: Searching the History List.
+ (line 10)
+* event designators: Event Designators. (line 6)
+* history events: Event Designators. (line 8)
+* history expansion: History Interaction. (line 6)
+* History Searching: Searching the History List.
+ (line 6)
+
+
+File: history.info, Node: Function and Variable Index, Prev: Concept Index, Up: Top
+
+Appendix C Function and Variable Index
+**************************************
+
+
+* Menu:
+
+* add_history: History List Management.
+ (line 9)
+* add_history_time: History List Management.
+ (line 16)
+* append_history: Managing the History File.
+ (line 28)
+* clear_history: History List Management.
+ (line 37)
+* current_history: Information About the History List.
+ (line 17)
+* free_history_entry: History List Management.
+ (line 25)
+* get_history_event: History Expansion. (line 26)
+* history_arg_extract: History Expansion. (line 41)
+* history_base: History Variables. (line 9)
+* history_comment_char: History Variables. (line 37)
+* history_expand: History Expansion. (line 8)
+* history_expansion_char: History Variables. (line 29)
+* history_get: Information About the History List.
+ (line 22)
+* history_get_history_state: Initializing History and State Management.
+ (line 14)
+* history_get_time: Information About the History List.
+ (line 29)
+* history_inhibit_expansion_function: History Variables. (line 77)
+* history_is_stifled: History List Management.
+ (line 50)
+* history_length: History Variables. (line 12)
+* history_list: Information About the History List.
+ (line 9)
+* history_max_entries: History Variables. (line 15)
+* history_no_expand_chars: History Variables. (line 52)
+* history_quotes_inhibit_expansion: History Variables. (line 57)
+* history_quoting_state: History Variables. (line 65)
+* history_search: Searching the History List.
+ (line 12)
+* history_search_delimiter_chars: History Variables. (line 47)
+* history_search_pos: Searching the History List.
+ (line 31)
+* history_search_prefix: Searching the History List.
+ (line 21)
+* history_set_history_state: Initializing History and State Management.
+ (line 18)
+* history_set_pos: Moving Around the History List.
+ (line 9)
+* history_subst_char: History Variables. (line 33)
+* history_tokenize: History Expansion. (line 35)
+* history_total_bytes: Information About the History List.
+ (line 33)
+* history_truncate_file: Managing the History File.
+ (line 33)
+* history_word_delimiters: History Variables. (line 43)
+* history_write_timestamps: History Variables. (line 19)
+* next_history: Moving Around the History List.
+ (line 19)
+* previous_history: Moving Around the History List.
+ (line 14)
+* read_history: Managing the History File.
+ (line 9)
+* read_history_range: Managing the History File.
+ (line 14)
+* remove_history: History List Management.
+ (line 20)
+* replace_history_entry: History List Management.
+ (line 30)
+* stifle_history: History List Management.
+ (line 40)
+* unstifle_history: History List Management.
+ (line 44)
+* using_history: Initializing History and State Management.
+ (line 10)
+* where_history: Information About the History List.
+ (line 14)
+* write_history: Managing the History File.
+ (line 22)
+
+
+
+Tag Table:
+Node: Top850
+Node: Using History Interactively1495
+Node: History Interaction2003
+Node: Event Designators3901
+Node: Word Designators5175
+Node: Modifiers6935
+Node: Programming with GNU History8477
+Node: Introduction to History9221
+Node: History Storage10899
+Node: History Functions12034
+Node: Initializing History and State Management13023
+Node: History List Management13835
+Node: Information About the History List16129
+Node: Moving Around the History List17743
+Node: Searching the History List18836
+Node: Managing the History File20761
+Node: History Expansion22581
+Node: History Variables24510
+Node: History Programming Example28490
+Node: GNU Free Documentation License31167
+Node: Concept Index56339
+Node: Function and Variable Index57044
+
+End Tag Table
+
+
+Local Variables:
+coding: utf-8
+End:
diff --git a/doc/history.pdf b/doc/history.pdf
new file mode 100644
index 0000000..0732585
--- /dev/null
+++ b/doc/history.pdf
Binary files differ
diff --git a/doc/history.ps b/doc/history.ps
new file mode 100644
index 0000000..3776eab
--- /dev/null
+++ b/doc/history.ps
@@ -0,0 +1,6666 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 2022.1 (TeX Live 2022) Copyright 2022 Radical Eye Software
+%%Title: history.dvi
+%%CreationDate: Tue Sep 20 14:17:06 2022
+%%Pages: 24
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: CMBX12 CMR10 CMTT10 CMSY10 CMCSC10 CMSL10 CMSLTT10
+%%+ CMSS10 CMTT9 CMR9 CMMI9
+%%DocumentPaperSizes: Letter
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 600 -t letter -o history.ps history.dvi
+%DVIPSParameters: dpi=600
+%DVIPSSource: TeX output 2022.09.20:1017
+%%BeginProcSet: tex.pro 0 0
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S
+/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy
+setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask
+restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3
+def}B/p{dir 2 eq{-90 rotate show 90 rotate}{dir 3 eq{-90 rotate show 90
+rotate}{show}ifelse}ifelse}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0
+N/Ry 0 N/V{}B/RV/v{/Ry X/Rx X V}B statusdict begin/product where{pop
+false[(Display)(NeXT)(LaserWriter 16/600)]{A length product length le{A
+length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}
+forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{
+BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat
+{BDot}imagemask grestore}}ifelse B/QV{gsave newpath transform round exch
+round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0
+rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B
+/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}
+B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p
+-3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{
+0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+%%BeginProcSet: texps.pro 0 0
+%!
+TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
+index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0
+ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{
+pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get
+div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type
+/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end
+definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup
+sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll
+mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[
+exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if}
+forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def
+end
+
+%%EndProcSet
+%%BeginFont: CMMI9
+%!PS-AdobeFont-1.0: CMMI9 003.002
+%%Title: CMMI9
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMMI9.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMMI9 known{/CMMI9 findfont dup/UniqueID known{dup
+/UniqueID get 5087384 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMMI9 def
+/FontBBox {-29 -250 1075 750 }readonly def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMMI9.) readonly def
+/FullName (CMMI9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+/ascent 750 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 58 /period put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5
+45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4
+7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7
+72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E
+BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89
+974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674
+11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBD07FC5A8862A8DB
+7E2B90C16137614CDAFB584A32E50C0935109679E31306B8BDD29F1756946A67
+7A7C2D9BA6FAB9B20A424AA0E6F4BA64C2801C2FB5A1156CBEED0ACB95F697B8
+BC2A6E6AA7EB1F9FD8E3C9B1A16697EE1F0E7400421A7765AB218FC837A49365
+82DC6B2C877A7DA84A81E6126EE96DB25C17A207D3020A045DCDAA064360DFFC
+E3CD50E21ED239D2A6450D04F879A26443ADEB6A20ACC504989876476C7D1A74
+91564FEA1F4CC2C8C8FDF666DB537F315AE1886C73CB5B00E67E7B398A6C018E
+540EAEE98BB8136C4F044EDD63C33431D2CF9740F051DF365A4045D9D8782112
+7BB5D494D9235BA98CF2F30CB119F5A904C32AD04C960C43FC1F5FD8DA7D90D8
+93AFB59F3FF4F796481AE2A7548F948FECFC6C127C4D3F159B08F206AE8C296D
+EE470DB2F879EA79475E029D22D7A8535C09A18689DB0609CC233E5199C02756
+972CC9C94D9FCE264DEE5D75C8D651E4E2D1189AD9588CB815722BB5EE3C379A
+6F31C2E6AE1AE4CCEB29766190AFA20EA937114978752189F1A9F42B39483149
+796FCFA123BA9CCD1D9BE28289660BCAE16C40B5B504058D55CFCBFB4F4E3D94
+DDBF39F157E63946534DA81C018B1C01B9F10DDB55E0A5C2B3985ED1977C039B
+D6755EA42CD09E27751E159C30B93F376DBE61CD3AED34BA36A768F232EB3B80
+E3E6B77C4A48D408217818E398B83D995AB6BC871F20991DF57313D6EB0C793D
+0F28088EBDB7F38DAF7E01AAB3476EC24D7BB38A9889A7D3038D930FF4289B83
+F54A7BE1E2D98A3822098D2E4D067A0D400C20C0B2B4BBD74C13ED1B827490F9
+ECF48F8C3994C1C5AAC9CF783BFA4F307528F51EAB55F961808A42ED53F00C97
+72A432EAEDCFCFB622389BDA707B6ACC9433B065CF29EBFE93AD14B8ECD5F47F
+F073F11822C49B8BE924CDFA6348C3A75E9BB9BF3F31C41716B34794B28CDAC9
+4DB8B087E180A9B3B17680F73D9C12C8D86A922C948093629F5D7F542ED882A1
+692F4F6696865E53E3E2DD43B2D5E8C989CFAA5CA5C4C5999045E170BDE9921C
+BACD6F2863F5553EAB2BA2D4A9034729EC0C4201DE90DA89B0A27C5A5C974109
+4E37BFB3F46B3A506169FB0C68E1CAFC844419A8D261A1FD86A3BB78E33D5FB1
+CFC687A5975987CE45155E5FDFAF0CC5FD5568CB1C26212F92E88255F0549F59
+41B33125946DE43436BEC00804063FBF03EC796E3361B1C852EC3038D107F80A
+9198968265D5488B26D7670B22C2D75EDFFD1B7B4AAFA36DFD94640C9D0E2D20
+5BCA18683EFB91834A3939AB8EB60E2F09655BE003582634C52770DA9668C292
+2E02929D812EE2B0CC65F020064AD5BDAC5F5693B30508F40ED8E20E87149BD5
+8DD41AFF83FD1944804017DC5A04512E593549FFFAE501131CE2FDB65EFD0B8B
+33809CBAEE411B3941C241550B9C30DD28088708F1C0CC3125CBEDCD985EAD28
+03313741F67DB5744A87B381147D5BA70AE1145C27F794854628D87D6C1ECCA1
+749E3465B950175D3C3F40E344297BD92D3190041A4392033A79BEAEAABB8DBE
+CC14E39612F43721CFAE6F79074429221CA588AA2501DE520A464DE157A03AFE
+3C082FAE7628FC0C57FFC61D0330AE6332D20FDBB09BF36848FE05E782D6379F
+64F9C82C45402481B0A35989027F9756BF5A79DA2D96E10F39167ADB4305578F
+90B509B6891338FA1D67DCFD61804AA6621526B2EE4769589A2646581712AC05
+DA6E98D16494F07D612743058F54FEE516BD89A8EC3E03F9D7F905175D3412C8
+F7329077FD6EB25213F3CAC94BA0C3363B759401B6EF7548C7D709F3241D030D
+4EB46A1AE81863C412BDDAEA6084C37143A4C5E41BC646315B1CD09F934186CF
+49D1D8239E363A435307030BD79536B50B723A39DD763DB539F24A10DDA12BD4
+E467339D2D6DB177D6FC539FA77D2DE4118EBAC161E928749F7C753ADEF86117
+58619F1155C563DF2E11ACA8347908B98113AED58FCD0394150EEC94B7F986EE
+88BF7171D208D8F1774B1DD478F0C2958AE372D257E7EDF0F6B5D6059CC4D5D3
+B00FCBD2E9CBE79235B9A5A3E943CC27AABB58728C95C7DBD4F4A1F8A4DA99AE
+7377B0CC0BFBD454794398AE0D5F7281771FFE87B25A819F36E692286A42D776
+01794A43CA9BB30FB8FFDAAF014F909A369E34C2F6C75B7D4EB9DB0580E33F46
+19654443AFF8384B95600B86FF8E41FEFD032355626D60C7507C058EF832DF41
+194B48A36F11082D1DCF4723E21401E0C7447AABFAB4639B26E3D2730E348F55
+53EBFF39CDD03E06E2FA5FB379603C879EDB7E1A10F89695C9C47DEEE52BE0A3
+F446F187AB9D7E93E6F9387F21129034F36DF40605D28FD526AF82CA9D232BE4
+412567F06B38ECCD496EF40A7B243E46C9FEBA4F1BF4B1ECA029C5EC239353D6
+C0B100BF7E7DB33BD1277DE104F15AA19F37340A777741AD1AD693BC76DA48CC
+C6F83CD84591ECFEE375979972B0FAC4C10B625E4BFB261B9FFFA83C31DA0108
+4FFB6377466E9739E0EB64424BD9FC7239C7DD834EC6788A0F97FE714AF92831
+E1BA36A8A9E24739F1DC82DC26CC3CE28C210AA7C569B19E1784D663A0CA4E81
+AFF43E86D6F5F63778847700072CEB77A4EB946DC1F23DBC00BCE773203F76DF
+00F0B085F31420672974DDC642D885E95BA6BBE43E1CA8ABF464D9881CDECC7A
+E98E31B9754C9B72A8BD5CF6D4D214DBC3BA7A0CDF6635953F5AC1E7639C4A91
+C7AECE4C75CA3389C348F656FC2CC96C84C85A926237B6504DB51937C9CFCDAC
+B75C31ED570D180757884E27757783DB2D5F35ECC48C496CDA342D49AA947BF8
+2FDAD2F19DFE8CD1C76A8FA08F33681F3E12E229D7DAB45BE3A3F258B5ED4980
+F15340CF20D965252843E026803E8AEE736EC41CCA82167401977AB719AA2F50
+0B791EEAA82027B3C712D2EB9D14BF8F94FBDE2227609BCAC41EC08DE2BAC023
+28352F913F7DF08D4E1C66E83F764578B22B4EB7191E852B91ADCCB1BCFDB1F4
+E63DFD152E86FA9DE9BC8908130EFDE29CC4401339C05B5B9764CF8EFF14951A
+C6C13AF979546996BF22F2B96D3D585B90CD27DADEC78914DA48432C6ACBDD42
+20EF583FD41F2F6D6D10C3DF7DD077304B5940BB0462656E306CBD91EB9B756B
+7014B1884A36201EC582FC9345C386043DD2818FC301EF78791C1D7854F8FACE
+5DE9801DE9F59D5B4271E003AB897B2EF49501589D681D59CFFD9B03F722EEF4
+74ABD29997515DA3591496B62666744EA76DCA45504F8075C0652D6779DBEAE4
+90430C2945FBD60AD53B51DDBEFC7ED703C418B4B244C8FFA5A3C1B7600C5A55
+3EBDB93C16AC191C3A28EB2279BD3F0D67C826BC6A73D3C0AD02262368AB4621
+98A1605F2887BC5880E1AF2780330E0FD01D7CAACBB0F008A42C427F38236066
+54799594E515B289044BAC4DADF8B3686B4372C5110201221FDA923F131E07E7
+93C44BAD406838BA4D1C277EF74098B8C0EDC41EEDD58C195D7DFF5FEDBF96FC
+19CEBC6C3006DD2CBF76916B4298BB915663C2F61AFD7747E03A03BD7280197A
+9DA590E3D081C6F53DBF94E8D6FDDDD910A70AB18A0F6D48A590FFAB314D6CFD
+E3FB20C1F3C91063F00726A2C13A3D48323F9854839405E5A29D66A43E6E2B84
+A8B3765F1D817071D4D6FF42BC785C2D11AB2B9452F141696CE19C6AFB9777DB
+107D6E22D8CC6C26440BC48248AD8805C4329D46BF433741CB519B21663392DA
+5DC7FC9BF37E5BC396BFADD7263D09F6B4D69594AB386B7BDFCF3BACB97A0E08
+22013E716E642592A20136CF9CFD61D4E515D80E06A4CB4FC9D9B916C93CEA95
+B83B98C48CF36C1D02291D4F5C0419338D64E33C90C90EDD2BA3B96D70FAFE0D
+403A060CFF448D3E28A9B1E3916018465E86095BAAB4706CF7ED350D7C554789
+D7F4FE5F180767DE8739259E68CF142040BE1E2E8C6152DE3417C1FAEA7584B6
+20781DC4A9796431EE713DAC4E713C839D7A4FDC8AB6BFEFFE767AFD8B67FDA6
+943AD387E5D3BCB09039ADB64ECC2BE2620C6EC269E708DD06C311F450099E33
+AF46AEC644222E7DC4DBB9371EE12CFBC4F9B27AB46AD1DA96CE006E1DF8291F
+A550A93026CBFFC1087B134EC6EA76F5E109CDA58FF47338A0039A786A575F70
+B8A03A4F9C8D07A4C856C77D9BCC8E3EAA740172D0C2D0A15BA35C9E5717D7FA
+2691774DDE730BB9D7C70D7AE103DB8D35F3728470C76EBA0E670634E1A0BA84
+2FA102BAD7271DF2680D86A4CA6FC353869987700E5E3FD778165456033D624F
+E9B3E80EBF431ACC934AA0357E824B8AD73E222B510DE8445C55C07C8E5DE46D
+E478F832BDDECAF2EBB11941DCF84CCD887043FAED9AA90D12BC8CA9A0C8D94F
+8D3BF1F80B14B6CAE6BB1C6AA405AA64BB94D5A82CFEA548BA070796A02F9642
+87326D066101435AB9EB40BA9EA9E61B363F5F5E3B924369796E8B78DE3414A4
+2B79C6A13ECB2F34E6299658D07D2B3DEF3D4383CE009A927F0EF5C196652842
+D96B857AB5E905201E7E8BA21A5EBED1FC6863BA9A1A6E5390407F75055E2EEC
+512FBDB3E82CEA13663F1A1944DA072C765D8CED06AB461470C5723BDC1271D4
+4D1D049D3EB131743F1EC9A6ADDAA038ACA2C41D139DC6A84EC3C61AC7F1E559
+6155CC2F49171F6E07CF56D721D9728E87FC7DCBCAC46455A3694C765FE807E9
+9CBC2D304AF37E0F28CCB22F239541B53A4D24D09C662559267467EA487BD33A
+0BEFD4899B581D20582930703A868655C31BE935364CA6A95FBCB22CB714C040
+9718824DFE97929D0482430726CCB5A5307957DD2432A9B6271E849148DEB76B
+FAA290FF6D0B18DC5B76407852E81C105EC6CFAB0F620C6DC9DA555A33C167B1
+430A8BC338BFC7D75B7099CC906AD923FA107C74D3FBB719D77A4E5A685FF9D8
+56424EE4AA074434B809D894ED50F6A60A035C5223EA25DD8983B9B34210DABE
+718D7B2BEB293FF1B63CFB1CBDAFC69552963D90F5E3FF533A3FDBB626E9FAA3
+F3C119E5E01C7BFF832A033C3515BF049E29558B1DAD652F2888E339E67D15AE
+95F9BD14E3253DFE9072B24C0E7E85025B71096AF51C86AECB2921126A43156B
+EC812B32B1164BD9B2B947D503C015616DBF2024F5C8CB3236C1DCA653D661FE
+6B1C19A22D272A176B7F1B7F9E67AF40DB0EFD4940E58B2A050249CA4E55CAF7
+6ACFD84FB46FEF952D18552B3972D79D808B4C263B8C7E1BB647A2D03E102867
+630D5C3F2C917F765A4F6FB8106BA6A9D0093E27A4CB6049C2371287D94B5111
+6E7020776EBD744C6C920464BBBC0AC206033E8240017F8CCB112596ECD7CAFA
+89950CF43FD87ACA750C03A778A37FBCE9C82C2F5ABB135BB02DA8E8C0D24475
+3BEA9D79372D0022FF1ABD378C151417DBC69FE5C9CA38D23A3900E34BF924A2
+90777ACDC37930B67DD44A2E76DDBD9B89598D5F626BFD325A978D277265DA47
+38CFAF16E7FF1946E15F41CA73F7B4B02E5AE8FC4C37B115BC567E4EEEFEFC34
+EC8974B1465AE57759EDDA28DD38A9210871D35D331AE1BE6097C3EC21C770C9
+B25D040B2ECCC3AEB1EA1BF99E0C2C0F192C13BB9152CFCF75332E03F9CEC376
+9B8C285A35F53655BE38713E09AE34BA2DA9C06FA42A6FD2D00CBF2AFD2BADB9
+1571629C65DA38A431710CF5B01FCA68E8B8569922FBC3F9B64A5509B6F677AF
+1B97E91FFFEB6308AB68AC58F9BA43DB5E764021E75B56170EB44C2C0A7DB86C
+62B8982256D3621EBE3DB3994DBF5C5A14CF34B4AF3BD5697F8E3203085DE9D5
+84B0598169760B925463E93DC87CE70AF4C2DF0F4287D2F2069847BCCF7A37A2
+AD451D5ACE4DBCCB2E14D5DF38B226952E7446BF87BEC736EF3D5AE793304618
+D66D3299AB9F9CA1D13F134FAEDF36750046E27706C7CBD8E0877BB6276E5196
+BC2A355D109C0253644918E1CC11B717DE6FBDA201E769812752888CD66268F6
+4ACF4A9449378F9F9923D584BA1B51F33663BE7A306887BC14A37E3C5A4654E6
+531D6EB63DE3946BD8BA95CFB037991174F36D61D842071E6625605CAA350A24
+FE551025D10871FE0E2599A63900C8520EF4911C53A03897C8BEE152451708E2
+43FCF4E700C583A5E8DBCC03BF9CAB864DBD19E1760945DEA0EC0BA38BEA8256
+D3A8D4F70F6685A99C6BD2BA8B412A26C002D76138CFCC7DF6802931E5D97BA6
+0151F6A4C572235B4196B22B7B2D14B32886DF0D2CA8A277ABAAC53B63F64CE4
+E4C088192AAB674497E8AF81961359C389B51F4A257373D907C615030BFBEF53
+DBD99058FD06E352450B658478C10454AC8FC0232B70D5CB916981978053E358
+99D322A07294748BA427FFD1E45C909171017B52B7C742FD77A8560852D819DD
+8DD53211A14D7B2FD11E42941722FD3985D627FDAF87EB57326A0D290B5077D1
+8A4230BEB40523A8565F95E0D44F036A571DB698EDD9D94FEC9512369E5E5E73
+A3CA5C142617944F4F99C0697ED088ACAC007FCE06E5A6EDE7D0E03A3399DCE5
+362271BC31533866BA79FD1FB3F608B22CCD4111FFB1BA35D920A23AD157C6B3
+C3DAE11069D5E46DEDA7158C6478D8B8C0D9DC237CDF0CC6633911673C43FB79
+E4F9B7F27495201E5ADE66255BC2CBE9D9F237DECB62A19D62CB41A1C92432D2
+07F0629E913A71B3F1AAF8B8C5AC66D3C8605A48F8913E39C859E163DB1DBC8F
+0ACFEE80A40B6172032E95A76B752B873FB4DF23CF3A655AF1A1B88C8DC156C6
+190DE72973950565454C0A188A33395FD3D529A88F2B578356DE8EBBC12F04C4
+5B899F667D9E6F3A4EC6DD8DE71FD4C2E2B6D56823EE4E0526679D71FF1B868D
+F261489F06F97B010CCBE640E2F57BA3DC3332B329F7958394BA9777D833AB50
+005E8E9232547104065ACE33396772B0E0BD66D2C6CC54DEDD071E444D8C95F8
+6F88B31E20FDB80F77C83151B7E25BD3736B4F9BDC52EE78C41E9475E5A6D94C
+D348AB42F5E36B4F167D29EBDFBD43B03F77EB296B06A36880FF17D412E77EA9
+F2E7C25FD05E16BEC6732681EA21AC3FF6893B93FC09316A370CDDB86D9E6087
+F6042C3F9ECD742778389170F5F041329782FB9F9702F7533E51F355F71825AE
+2BF4F8FE50D413AC9A20C41B42537FDBE8DDC5A5C793D3760C1EE13716068752
+F0AF10812250BEDFB4D7133FD58F4587BACD572505C84A7D3802D27443175FE0
+0D89C3398B55176D8642AFBAB5CBCDFD6220C8488564B4306D74A58CD2921AAD
+73CF803C754DAC2F30A5324886E273064FA51781D5BC596BFEDDCE3982EA1AA2
+62CA7BAA1B16C6EBB99B2AAC4E6C9CEFB3D10F19987045C4918DB239E6E63D79
+5F44B9D097118D081153AFF96E5EB39CBFBB99A3BE30909F614869031358EB98
+F07A97EA78AE50375941B2474DB46AF3305F2B208D45921F93743A6CB8AC584F
+6BEBE25ECAADD5A789EF60C9F54446687E7B030DA3E5243189F02BA46BFD28B7
+DC14822E136AC7E40CE20458DDBF356488045C95907363864CD6943643BF0109
+EE027A3091C11EA392EA91320EBFEA3B857370AD8EB86D73F035A476F7058222
+E8CDE78CA1AA9EA69A8AA6EBFF3E67324C567B914134DE042D6F8F18A9373107
+536E8D90189917D343F5299024239E2EC1D2D177D82DC8E344A7CF2AC71AEC18
+36F139E7A4EB59A67192BCA9ED0EB25DE13032F6FEAFC3B1F4FC81BB0EDC41DF
+B9EB92618667C59EA499B788CD26C2137D70F1B0AF793AF5AD0D0941F2E746E3
+F5A7F0288BC1EE11E982EAAE763CA422D72FBBC0D754AD58FBF92629DC8866A0
+431213513744DB48E52EFC89C83FEB082588E4F30D7DA77BB598E51CAE7E4900
+5CD570C914EFBA426BAFF7A56FC775ECF5BE13F2C42E51EF96784E5201C0B64C
+074AC229FF0BFDF71E6D5E08D8755D2C12B770B6466A9C9C61C15582DCD2FF78
+E9E74DC2B1CAA344EC0339EBFF92CD2CC1D62E2FA8FF15E7459A83C6CFA58A77
+2F1A40BD276E76B675FD6834052B33BF9190F04DF6AA5FA3BB7D77A88DD5B600
+324C5E28216F47682EC29EABF35BA842BA2294A3D72B126EBB852AB741186C9F
+FC84B12DC4A6CEC08F2D03EE61B65C845841EE17F1B765649A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMR9
+%!PS-AdobeFont-1.0: CMR9 003.002
+%%Title: CMR9
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMR9.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMR9 known{/CMR9 findfont dup/UniqueID known{dup
+/UniqueID get 5000792 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMR9 def
+/FontBBox {-39 -250 1036 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMR9.) readonly def
+/FullName (CMR9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 48 /zero put
+dup 49 /one put
+dup 55 /seven put
+dup 57 /nine put
+dup 72 /H put
+dup 83 /S put
+dup 97 /a put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 118 /v put
+dup 120 /x put
+dup 121 /y put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9AF72336CC4AD340
+15A449513D5F74BFB9A68ABC471020464E3E6E33008238B123DEDE18557D712E
+ED5223722892A4DAC477120B8C9F3FE3FD334EACD3E8AABDC3C967C61FF003B4
+B10C56D6A490CE9594D57A2D431B9E5E10FE3D8832E227A7087611431ABCD029
+85F4865E17E17F8CFBD2CADC97E0A8820E3ACEC873F31464466A9545E967E53C
+DBDDB8478E69063FBB891566BAF88B7660A4405B16834761F041CCF7650AF955
+F9E853AA9F5F4382E1FE7D0C5BB4023818A2383F91249D48CE021250EC9EEB1D
+2835E18FB73026250B32A8849067D5E2258797C917F998F2D4121D96560C5FB5
+B5D3471216639A8671B6DFAC5E3554EC36D9A72518525A795590C74DD70DA3A7
+78BFC43E51D6F2BA52F17D4DD00D389D3983EC54912AFF73684A8A7E345537B7
+E62361C04A47859DA084BC72EA53512DC54132EB2EE671793603015652EAFDE3
+41C4B6B679BD60AEC5153EA0D2200CB1D097DAD770F5F31E6FC475A225995277
+B867B731D5401E2D02B85BA85158C80FF7E2BBCC42B98AC867E67D25DB656072
+55A0D32AB7AA483A5A9686CEA4E2B3031D90D84DB3E2DEE7706C91BA81CB8DAA
+700E5F61E07D6998C9552C81B66FD10A10033D49EF3BCB0FF22ED0A3737523C9
+8F851C61C4BF8A213BF6EC70C956AE48B5BD276CC0437C72BF6515B10739919A
+F00F6ADD2798CB211668842349171A5AEB0664D2C44397E55A4A9EBDF54A3EF4
+FBBCDAD9DAEF4B0CAEF7112FA828F2F8D9F633D37E5516AB5ECEA87342EF8DC4
+3A50548490F5BC9A8A1F98AC7AEAD9D913BFA10CA86D73AEB5BACC1FEEFDCC15
+B3655522CCA2C772E902FAB2A6FC153597D52763EB44AB7489FF061F7F58E8F2
+AEAAF4D17F36CBFC00D3C653F335D14240C87DB4339DA9D30A5BD1F502BC9013
+461B9DB2FBEEC01BB18990439A0E9CA6576BC9CF6B1A3DB9386C4A5D4AA6A5DC
+CFA45FB75F22E10ECB72565DB441A194902C91427B4F676E531C661F7A2C3C85
+CD534D1C89B6779B2EDC8E44667B992C20C70B663BFBF680A6CF4383EB7CA26C
+4D1F06B5EF4025BBE65795F1EDB5CCB97050872D6C07BC2974F905ACDB7A765F
+291365D6C8152153E7F017A25FB4476C60FD9EAF9A121633DBEAC32F62850223
+D6418566AB350F90F4B35F19598478F76B63E347D4C61E203D4DB8ECB9889181
+C387F4B663A502C638761D2782BB96EAC81A0108D7BD6938F67FEBB69218D115
+D8E89CFABCE15C6ACC7FEB983332A51A6A73CF4E341574F366713D7FB29956D9
+9BF238A87483D37E526A2EA2F101EDD34E34CB92730DCA7235AA0027189BE405
+2DAB4AA021A30C28B26C50808E1E965C02F6212EC7C72F5683339425A7739380
+A422E6191ED8453AF0CAAA424AE44DFA7CC5C2F6EAA8D73A5101D8E9517DBCFB
+2858D0E8ECB7DC430EF23A9E4428CB7DED8D035D6050251AC101A2D0E884721E
+2F21E573F948048BB8FF888911C508CC198BD750083B339500C426AFCD5634A6
+AAAC1C7E91249667B231BBFC64B4317192FE07FE9DA0DDB5E517D097AAE46577
+9555F29D45C67CDE9812CAD03F220B20519F2FF32DCA56A554D4296FE2D1F3FB
+B209B5270E0E695EA5A0EF1144957CE045881AEB8D05D72CE57F4D34617AED67
+0D3AF0472CD8D60933651626550366E300E72A9C89ACD475C2E2ED9BD44B472D
+9DAFE943F8E02A6DC38E447EED964624C37C3130E48211CA279BB6A0BD59466B
+42F3D89B5746F29E084E22CF58395AF0F29E55113F3A3F2F52CB3A6DF3D026D0
+C81754B8E2E4A15F6943BE9D0087D5166060734FD07C4C57D7C7D90E8C9C1F35
+623CEEE3ABAE75E1A18A1E3B50B7266BD2D8E812CFEB4A46B856885B185640D6
+B9C22179551002B94282F57FB433B7FF157D2F0D240836B72AF4A331668AE5D4
+E6B85415F4E8B9D2F9AF90FAFAA0A3866DF417CA5A31348CF9B41B8F5F4D2F97
+CCF7ADE851B5E2E2F6E319AAF5792EBB9DA2C6AA8B73D889F3CDAA42932CDA7D
+07A7E59183CD89520DDFC36E5D513BFD8AD0886046585F29B4D7F42CC0C27AA7
+53915AB1167D292FE91957E94A57FEE2D49C20C9070ECD736BDEE0F046E60350
+EA539DC298156A4E0D019E7D481FDDA6861E20678516AB80ABEC1F09B126BCB9
+52E8272A06BB6DD87ACFC423B4A4FC9A3DC8DCAEBB807C5F748F1FF8B17B8B88
+F426206BF1B7B7D239D26BC3CF0776C467A98CFBBCA5FB6145D5900137ED19DC
+D002F10704AA680EC753C22E29AAB15712EF22AF73D80820A1EEE953463D4EA3
+81FAF99518D4FD0F862A324FC44C4B9542A92C5B60CC983CC8F647CE5BDB4D6D
+B92B380E0E5F7208A9CD91FA9A469548162C761C1BA05AC9D60B766764D821B6
+B4E17F56CE455F06EA1EE2D38FE47581746C4C5FBA63AEE2B58E877D1A8FA83A
+31C972D53B64E92EEEA147426A92CFBF76FC614119C6E9C6476FD6A069C803BF
+E949FBE50B5AB1F1463F9747E8D353F7BBD991C4F90F920BC9407D8E24720293
+846D052214E60390C3CB926D38C83AF697425D80C2B4FC4706615B905516B733
+46ACA325CEA68FB21B2D17CF0B68BA4DF249368625CF83441EDBF2B86C957C1E
+44CD722BD2537CE84FBA07EC7AE15C840041B9F7F3040072E6084CD55B301C08
+A64A53BD4D3DC30DCAC6C152F316ABC59B8EE978793EBD568849DCC2A75A495A
+BC83470D503F8E389F54B4A4A31624E83C601B43AC1E52CB811FAA7CA6B644A5
+1AE0BFD4FC774C9C9DFC2769ABFA9C83F900BE2DD4010416053A1D4874E6ECF4
+D86E44B4CAB15D53E5630C144B0C15B58DAAD785BA298B1893D1B09BA5D40344
+6678FD2D17FF6674433C976D6DAC659175CED26139967C9B2B9CFFD78FC2570A
+E5142141C2888DBF2DC8503F9137CE7CB21A1EBC2D65BF33FCEFBC85C9CB736E
+24E8595CE934AB032CC70BD6A3B0F3BDBFBBE185512FDB7BE3D4A6620478453E
+75D044BF770B44C9741E31985E6DAF5A318D7BED12B02A4BCFE60D25EF12843D
+EFC9BAE2A3F2EFAD66D7858E83EB46BB09D2FF8AE9C43844A7001C86ED97AF51
+C511E3A89A1BE349FF5215D1A57843EF51456B9838133846F19BE79AAA5C1AB0
+5F400E5E8E7B0BF96EFCA3B8F0894BE589F2C9FB6C97BD16D38F0A237CD4F034
+099C41F85C7E2C7BEC8E02C4F327306A53B4B48B26A8926670CEEF96F6DF2281
+7C2DAD99EF8B81BBB777227C2475AE7400DC393D9C0445E925DB1E955950F7AE
+53E9AC4306794239346A419F7B5DF4168382EF5956B81F83BD4BB7635B3BCC84
+7D84D05AEDC02D14675D777CD19B08124001A4F4EA96990D96000C082A12F00F
+7FEF793A7FA69D56D3A38D012168C5458B667190AFE80E02C816CAFF0A71953C
+D80B085CD286027E2FDBB05452AA762FD7C813B2E19A79C74190E04E746C4933
+CE1E300CAF5DD53B08110509BDA404EF07FA1BC5224BF1205DE8E0C3276A13DD
+866675103B960C5F36644F96B4FAC16F5D6E91F74629B318FCCC8E8CB13EB76B
+B0B7B90718D913A52A04732EA3667674994A325A7973C601A7DDD50F658E0826
+ACB8E53D4914B0274AED98D7BC3B2B7F9D48A7ECC2F8ABEE05CF2C4F2B90360B
+B7DF779EAF3E103D1D83EDBE32DDA873768D8C37DC10A5354A94B4153049AD64
+FF3E0BB51AB91D7C0B4134D8731CD0270DAAF19BED9EAD800A14B65B68EEE89B
+40DD624111670DDC7C030DEFE0D1B96420E249332445C155BA96231C88E70643
+D526BDF3CA1E05FEE72CE2B881CFC01ED780C10E89F0828AD55FE29043BC56E8
+2750A6DD15AADD54492F6092618F4CC6A31766B17FC60766D18C307EFC9BB787
+39047DAD6B38419EFBA46B4E2C932F97451FE78AD75FA90DE409FC6DD46585D2
+1941F5ED47A8FBAEF5A917A240959E8D9F9917DEA3247D9CAE6BF7A88DB4C4A4
+F9F5A6DCE542420A032FF3392FE0F3357B51F884D6181583A554F75B1DF192E9
+253CC828FF06B0D992D5316435980B044BB191508C7C45CD90F797F88856424B
+14A5707459C50EDCF3E3D8D1667AAA83015405354CE744C66D9A5728F29E0085
+6DBF740717FA0799E3BCC4ED7841588B496A5E549B953A7FD288B4A045DB611E
+E3B2F35963FF18ACCB1C968BEEA2CBF52B3999AAF89A05320BB2E97F52CFE06B
+9F10E3A79865A3059A957F97972D80ADF678A36E2B586C101FC6AFA4D137C13E
+EE7102C9B8EF78CB057F8B7476F146E8FF5C897FD5503DD198128CFF7B5FB339
+FAD0AF0EA967F77B07B367A4AC9F668F8BED99B98E87FAC750EE045602D76C3F
+289FC9D97694C96AAC0AD1BD3FA94DF2CBCEA24B40F47B9B59E54EECEE7AC4C3
+A3F5D19160E4C1EA830D57FBE10D8D46AC5CA0260F22FAA45236F0F542BEA9C5
+5A88F878F68B36114E0573900C65E305462B22A3429A17C7A567694414DDDA46
+5F30542B8FD4F00F6C295B2E8D3A986B953D96822DB2ECD48E8BB1763434E652
+152EF3717F5E7FA10FF0B01D9F64E22C5DBD7254629658887BACEC0ABDE972EE
+67299FB84A05B3EFE22B6976DB4CCA384232DDAE38C31623A4E39EA2E82C1EA3
+BBB68F1A7DBF405DEC37CB7203A895C36A44BD2D63F45B3888AF91D37B510A59
+3C921BB44DA620892AD87B665F69F6FA510B071ECC403CB2BE2F54B3969C9E88
+713244BC97C1466DA8216DA7600C221E7E7EF5C789D2E12B36422023A03E11BF
+2790FD6062FE6BF62F5010A92F0A104B76E255A0975E04F6F20F760881BDA7F5
+D834D1D328B6EC19AA7D5E5678A84C74C82553DBE8BB5765E84F5A8789032143
+6020940B4B8D45FC3433D356E28C25F42D0C19F911213D85951B2B00D01B77BB
+A4C72E964F9D95422BEDE582A05CD52E03D28A996E6CC8FCD910CBAB728073F9
+F9FAEED5470FFA55930447C5BA816F826F983D53EC9941EC8364B3060FD74C95
+26D4F5CA753B574FD2FA4D1D333785241D8741B79E628BC852FDC35478C5ED9A
+C1BE88C5EE7302816E65C12B58EA16FEDD4672EB3E24B6EDAD5DCE263BA8A970
+350B651E5A9F3C281D85BC3F44EADD0D93402E36489BA5185E7D388974B0B700
+70575188BB610CCA20F081E2CBDA13DCC6F72567962ADB342E02C1E763B673C5
+F7384E24C6E1730A3A790D690A2103AEF88E0C1D4480DC9B25E5C8C9E1919C95
+F83320179B4C7C4A26D559BFB24D7D596FB73758C9990C451E77FCDDD17763B8
+9C30A9534E3CB6680D3D419D4B70B0B0A0D160FCCDE169714E373F65B7144CC2
+DB9A44E041211E1517D3148E65A2486CBE5E74E625261CCF65392FB4F3091473
+F9E8DF327D59A58558E5C9F7190DB577D5DC658F5E36258291C708B3D224653D
+064BB6079F91293FC733710893AD1C96169B30CBFE4E9D52E7EFAE4AFEE68FEF
+1AFD5E7E9DFCE8DE332B0FDC0514F9B3090AC85BBFB527FD8034DD33E9576325
+A8769AE09AF1BA792447DDD932B98FC9486B39E0B04DDB3EFB7A30DA0940B33E
+E27490E0E841E87B1C90E5248A91742ABEDC10F43A8AF0F9C5B4A4930B1AADAF
+01874B9AC3B8D0DBECCDA6CD7E96471FAA15CB7F8A599C5746327CE392224C3C
+40BD60AF97BCA6FF6FCAB2FEA114D7300B89E91C3BC92D5B3E2C83BB37992D8C
+72F661EFD0AA034C738C019DFB79BF40651A1A34BC1EB9F5AAF58F8B3DA32645
+24AFF8636486F08BC21533B5FF7391B0679A78DFDCB03DAF6BB7475A1D51DAC1
+EE4BE9B986655D1FDB6936445EF99B58B303FE79F11275EEA96A9F6808EA8775
+D873D1052FAC93769789C700F20EB2ED6D15676F6E563A769CA9298E463FC311
+83281483B1C953370D196727A6A0E66D32D9480AB1B6DCA77868C1A2D5DB6483
+5F31EB6B18EEFEF1CDC31533E69B0AFC6B30FC9912DC89BAAEEADC30BE14F448
+1A6B70D36A5D9B01799BEEA686066114910842D022EB464A9A1E8F0A5628BA69
+AA9A1925CCADD44703BC67A89F3B48E4680726DC4360274185CF3C8AB747A8FC
+4B928AD62B092EFE48B01E33ED756DB696171FDB775396BBA138E056F71EDAE3
+7A1E4CC272B8418114B0E81DE0BC43DB3C133167344488820A92DF10FFA26FB9
+65FCA2C87D302E956DE6B4FE145145440C83DB43A68F8B29A592B127BDF49063
+B7F11E155CD4CAE305525BEA56B7C412A6260426407BD892A3F2B444AC3421E6
+FB6E6425EB5C3053C5644666B80405530FA0012B54557327C98E0F4F064099A6
+4ACAAFC1870359C1B6FBE7606BB8A26026AE20C212210449905E628AF1B20490
+8CE908B7EF3E3DB551C85AEB0F7FEB6A8D215B97998E5DD9C7CCFB2A9402B8B6
+1770D4023777D4B45A73F471355353412C51D4CE71FAD1E0AFBD87B5F86307F3
+10D0B94F1194EFFB64AD5DA54A4200490F609CA8B912E149F8217ABB1E9EBB3B
+C4470E7365CF5E1E761AA1945044B225BD53D142F6588C50E0644740F7DD55E4
+8F73201E5354A8BC78339211AFC4935F44701FBA043AAC4BA4698E9D7700029A
+C79F992F62627C91EB855F64C4B251718FDA71EDAF082A0C7B00550949D617A0
+7071FB14F05620CCF2180941341D8E60FC88823438FD728A4042AFA8B853107F
+852F631518B61B234565291B5D5B89DA818DEE3AE3B68A2869DFA63255CC882C
+3B16BBA08FCE3632E57FF7A07F857A1F0FDCADAB39D77960BD827CCC8661A997
+648BF5BEBC0FD2286C2A112A8DEB9CCB6330A049170D5D68EEEEA011D3EF3EBD
+855236B9380087CBBB6BE24191F728B7EAC5B50F7A547AA0989B7C7D3437DBCE
+1669341264E290646F2C8C5A3ACAAC7CB63DC692FAAE13E9B40E8BD39FE16A0C
+1660CE66872D061056C04DDDC265C024BEF8B7E3C3AEE76FE5C9702002C28BE0
+B180295EE00E567FA2E5CD1638226D24A7C732E1BD8103B476EF5702768689C7
+D4FCD47F2AB94A2B1FBAE6ABF87B09E7713C773FB65CA83F7318035B332B9F99
+24A2C8897527021321D003AAD7C273E4BFA2710B9BB26C2CFD3D9A5D7ED1096C
+552D50028AE2476FCD6D12A5D0A897521313ED1A3A8456A70C16EAA50A3E6733
+6DC89FEC56AB54A579EF264377A103939D5EE00A90B4F2206D0023AF9491FBE0
+800C6540FC945199E20E945F46CEEA2E885F6800B9DF042BCEF4291A4B1A62C8
+6A7ACFF872B25FA3AE69E0093F3D0FF13A3313430C06F1AF94D500431566F659
+E8C859A5F80F5BD2E85C8E32603D3745628E8FE6FBC50FA68F9C3811A2BEFEA4
+5852CAE2AE5AAD3230ED050593BAD0A9581EB7B327C6916B8FC348F4C23E6FA2
+00FA28AAACCB3091C1D83F7BB88672A53A2EA3B8C7C24374E400C57F0F01019F
+E52D5C47F389D4C9AF126F4080F9AB8D1C8F470932BBECCEC72A9796F6E965A4
+82057DDB43D68298A00880D4C2E2496F26F015FD83C5549215753459310339B7
+6B2961EEEE74DA31FEC8E2BDDA42D4080A32372AC372524BDDA580EF6634ACE3
+128C69D04D890DCA337212B109585C665AA83EFE47D5BABC2627A86EAD11BF7D
+744176652C7F9497785A7A06A994ED8414BBE8B26E74D48CB83FA24AAFBDD507
+84A90195EA3D77BCE8C2BEDDD1DC52E8164DF15D65B916EBDF3A8A76849653DF
+AE3CAF9561AF3B705F75B9E5DFD6758DB65A2FD54683759912E0D0035CFBCD86
+5C7A69BCDFE8ECE3C5F1C047BDAC4B2DAF36832BB25487385C650FC3C30A0894
+2CEB8973FA2E6C749D88789C550C32B2230FB689F0DB5E9F5E2A8133F6477232
+AD8B11FBDB46362C03A2967EC7E875CC0D0C94437517736307F4B8887FD275E2
+E346171058EC303E62B84EA810FCEBB2905DC186B95AFC6AD4127429E71BFC7B
+79E612C18501DFE5AC0E7921BF1C6BD483FD867BC2938609EE52C0271A7ED1FD
+EFEA3CC6F0872C28108F7EBBF5BF770C0BA6C712275E1239FA44736247CBAAD5
+B856D7BD6E5E186AC4C3913293D99529B8F9EAC85FE548406DE5D90A058F1106
+F98799495DBB3A05C04BD649053FD29380E217942F71F70C30735423F6F13DC7
+F5015DA9043FA42C1045FD7E0F586CBF2D967E468B2E8E763415D60AEBA2BE7A
+BC199BFE58FA66F52AD7C5ED80B4481C08EC85B51D5111091F54823FDAAC9DDF
+DDFCC6DD16186911750F761F9907A438DDF4506C6ADBAE868F8AE594EDD14B67
+2F4AE01822A99E924DFA530CE96B6A830ECE92ED0AA54E82D971689EA5AACDB6
+EF5562BF5C5C05996D08F30998D4C5AABCEBA2668C779577B2ECF422EB0192CA
+E5A6376D0A7DD36AE46B713D0F7BA51039E05F76B3DC275C95EE5FAF3A6D8765
+36B55707F5DA048F27E64850AF042F96BFFFD3B3903C60869AB41C1D92AA8ABD
+1FDBE17E30BD3C035BAEBD18239DAA330A84A5FFE1F4E73AB0D97814C976112B
+9DE60C280C67CE7B6B5CCD4A00A4866D2F89FB374260E9C0D1047C26DAA81658
+42A4DDD43FC3AB8DADBB4D53C5BC7FCBD0403E755FE896AA75B11435C7A68AA7
+2F30E648E53BC96D108520D9CE9193DA216221F842FD0F3FC6533B95EA18BBA9
+22286C98403528F049DF779B434B60BDE95597FF0AABEFDF460AA0BE6AC0D179
+D8120F9E6B053113D442CC584FD6EA91C4F94FEDE368E0B9DE473F786B0FE914
+21F3099CCD799C271639CC314F9940AE48775B4094985B207F8A833037FDCE9A
+CC73F75B045E923878E5F33D28C98CD7E3D8B59B2FDC4A483CDFE067EE6BB49A
+AA5DC515825A9FCF3BB17187332CE5CC9FE34A8AAB8931883A177C37610A75DE
+C881A5C5EC31782C568D1B04D2233CE0930FA5D878A7BD6CAB5CC86EDEB29124
+A9E47F4F5A8A95B780B4286397595596B95B7422964D5D2D609CFE3440E62146
+C04C75E9EFA7845A3A760AD00863134C211BE72DD261ABBAE39CC898A634A429
+F9D0B4733117E3217EC749F520C8AEA79C2D61038BA7A2B491D23FD512B31710
+8280D8DF30D8CA287A2B040C71F73911C8D5C8917C242C02A331EE280CECAEA7
+FE970E55A74B44A3EEE8ABE0E207824D81AB21C8AFCF5D4BAEA507A2B669177F
+E94D14189B0552342C288137DCE659AD2F629533B07E8A668E68D117A3EAD47C
+D56112F27F9B4CDC7D414D3B7B50B4F489556C7BA0A3DB7E8C29DB3630B72D10
+2B874A871540D45D3F9B39005F6F4D8095A21EC9F557EB81CB08D826B257A40A
+C29D2907B33C90D28E6FC5BF776DB2466800F8B10325A5A826C7C959ECC2D2DB
+3DD7EBAD12E1955C958FE51559594C29EDD3DE5931CC13C766F9223C555CCFB1
+6BD1571D1F0F61584608EE366E37AA4B5DE50459E00A2F7DBF7232980A348B0C
+AD0009DCFBAF1970B2A8022199FAF4079610E9E335396BBE2B43906C5D49FD87
+0013EF41B79E49B5EBDE37373B8179748A2208ECC9987F45BACF7B4FD3D56A0A
+64873020DCE8EDE7ED99A63327FD3D695A193EDBF90DC8A018BCA317B08759FB
+45133229F99FFC9557D0FCCB67758049A446061AE96830DA3951E84323A7DDE5
+75937E1E8FC44D1B4B272C6F2FBF4E1A4F314B548E46EA8A4DD6076BA24CB572
+B26681037ADCB67BE340151001642913BF172ACF92FA3787D8743830492E2781
+D54E9771414C185B58E15953350D2486757F78CC5E099001627AFF7B58C206AB
+CCBC550797B79F6DE84CDF2049AFCB62812CEE8454A918504C1463A0BE0B5664
+DA447AB71A060B517ACEC106C6BF9AE03A6D15026DC7BCF3AA98FC41B2D263A9
+9D7889A5C15AB3EBA00DFC9E095BCC4C44547D566AE9831B7AC4B253C2658571
+06DB8A68192AD9586DC7E5145B47DF21660523F680D85246E3756169B3FBD813
+8EC48A865241182332BEF52606D9D8F980575A7A8CAADA6136AC9CE8532125D3
+6C3EB26E2257F6EB80314143177A167F533171AB5C16D71F28FDBC1F16E06499
+4688185850778D7372DFA56845D468CD19396FF3EF1AAE7F596542A55730ADD1
+9574BB00A15289BDBE8796C599B0D4627FCA53C1486F7124FA047093707020F2
+B161B3C343CE9B31FC9E9E37619FA30D58A082F41601EE3E7BB420DEF4C8A0FD
+6254E9EB5D2927452C649DDF5D0B2925126FA9EC4D65D711CF943FCD7F58C518
+9BAED942FA06619E39BA7EB20492EBC7EC93D95965C6121CDE165CA660A8FA9B
+DD40C3EB89C0E2E963440FF61F98F039974ED30A1E080D5AE6E801B081D89235
+DB8FD7D0EFDB5386ACB4B5ABA03E7D9F82C7F3F2C57D6A4DE8F972075FB1979D
+1537F128E94BB3B4CCABF46E2033DDCB213F15B16469F7410E70499F15950CCF
+6E1F83C4B87C25FCEA468F8E5B973AFCD5EF74438A5ADB3BB0D91A0C38329070
+9EAF71DF918A74D81228B1860BAD29FAFF284E6979D5CFE5F745A90E14C5FD71
+8F856C4DDA56D045EE22877F25F3330D16A825F61551CA52EA1852ECC7A2CBE1
+9584C756FA0A322CCAD06D9A1875BD14690A0ED6115C23DD0C3223EDD5E79A9D
+CF18EF3B3240DEA92AF27D0D44BBA56788BA3AC4F97782D02F742721C068B702
+62D59D8FFB2D2C5862F5CE393E2D9AAD5A7969D22F7C8AEC9BA90F2ECCFF54DE
+98CFCA43192EBC2BA294810AEE0DFF0D98ACA9305D1A33F8912919C03580F2C5
+2AE44C0C1255A876EC4298E12F1BC17BE3F3E9F43616D3E3440DA8E0D5044DD0
+35895C4DC1BC280ED84A564F79227CC2BCCA1B39DAD02789B13FD15C9B60B3C3
+9C9C47442DCCCB9377E8823D7157FDC1F734EFB6A53396BFD22839A97CB026C3
+E29CACE7A9E8D9AFFE49AF1AAF800E013A8ED5A22CB3FC0504F1FE34F2068813
+229C62C9435372C81312CC73465370BB4540E24A7D35701A4F0E598BFDFF939C
+164481A395C61BA61748BA0FA396F7360ACE2A6E8AFCC9081AC259D7F8C4C4B3
+5FE223CF1C93B3F1B75917E855A5BDDE3976A31887049A4AD6C8234E1C0D3E31
+C504CCCF33E22E3A7707C0398E2F994EA40B47AFAB3B6B7C6C5887B79C16E255
+3033428DC3A0AAE04486F36E1881DB296AE845A2F422E7A79F4A048077CA31C5
+7531E2B5F5F5D7D91F8C5B6711952C5D744BEC6DEA810510F9CD16E95C9143AF
+9227F14C4F2C5EE75C82A62C5C8D80ED13DC518BB3465BE921BD31ECFE0AEECE
+EB94D3C5C7687BE86CD137055077E60BC1F134E9BEB3E4F709528A893B54B4A3
+5B48529DF1A4FAE03DAB8C28D821339B384F4F5962581CCDA583C0EC09D6263F
+96F61A14840557EC0FD9C17C33C1D507F0B152D5AC297135C2C6A331A4FCCC6D
+501A08969CD6C091EF9AB457755680F34D61DC0F1C5474CBE940C68ADE951D8F
+9ECEF97273115AE580D2756462AAC8B5047EEE3F3ABBB03EA8DA7E3F331185A3
+755A826B27915EC8C9BC4A4528990E5F84EAB95BF8F14A6A3A0ACF99ADF30921
+87029D30353ECB1760279B8677A55A0D71F70620D66E1BFC747D4B901A462E47
+C87F864B6CA670FF56F6548E38AD161AC74F8525CB8D4DA880506ACCAED5F8D3
+4B7D484F76F4C54529888A9F8BBD2DE8876930F334CDB54D9CD72A66BC03C549
+3FE123DBFF46D80FE89993F03A8585E5C90F47DE133674BCBB7D19FDE6E8A89E
+EB90176F92AA3C095825F515627CBC11E4B0D8EA20D3B435D2050104716BC1A1
+89F3C00B4AE327C643074D5D7CCF3133C39967DDE5652861DF69D94324CA68D0
+A8B8518A829D4A0884B1B8A3A06A2E144B8B73BB90419EFA4512B181301507D6
+7EC25983C83C544A7A8B6DE922AD09BBB7B378A3C53E260744EB821ADE6FA512
+40004D22029EBB932450C6A6A703D5DF1F7944D12EE69F5ADA72BAA3E69786B0
+DB79B8D16CFB37C0B6CAE7A94C9498654AAA21B76D51FD067A00FF477A6FEC5A
+27525F85273B01575E49F10F8A14531E9750FD38666427B020024CB981696A89
+079D10650FED50A1989C1A9C509170C4C296DD40E87CF9F8F78C8904E7AE5D90
+F872EFBCECD772C622458C09503CD98C1EDDEE09AECF940640D979B5087013FF
+D1AA7582CC928483F8CBD2A8CE5D2545BC45FCAD47E48FB0A0A3F9A1AC37FE8D
+531380F14718773ADCA01C090104119844DFDB128801D1BF8A086CC6142E4644
+AA58DD23B910DCD4A88D4BD0CF65CBB006421CEE74EE1B279A7A51D9C04D2E42
+23EFC041C1B943E694A389B4A9E3901632A5CA640F91D1EFDB6C88072BDDA54D
+EC583FBB93FDA9C9C61D1D98AA1FB1A2BA4C72B1390F87688027F29B6FAF70F0
+E9D48093324B2895F129AEF3187649C6FD3C26185A812E489159ACCA2F2FE797
+D283B0A26A07652415D9D4A02D46E6420D2D890E26D23FE47589ABE8CE9B4A94
+8D880612325E470D820B30E842D2A46F498E3C6EBC68FB53E5F7FE8EDEF8F7CE
+85C8158DC36BDB6F3584B46E3843013FDDF31229215045733B3078E344211AD7
+8DAC4332A5DD8CD8B1BB6B9C654DAE5BD33E813C70A0C90A187BAAD38C39CF4E
+0C46C54F0B282AA168B3B77DB004678EC86B38601E34E989B5E82B4573133F27
+47FB6FFC01A26A4C1BA9CA5B69EFD9288B62E53756161EB3EF1407C426199524
+26CC7E5318B3D36345FC17734B971CEB33703A2BD3882B5E360EA54F48BC4441
+A5947F2917E184AF56FAC34FF504A8212B794E212646F0BE71EF55E013DDAD18
+7255F33E0A209DB1A0C45BB8212E46DC626F08121850C0177E916C98FD2B4BC6
+6AEC7AACF4B3D19630A5BEFBA00FE0AC7EE873FEC27854BA0EB16DCFDAA17C2F
+C0057C85BAC9244AD05F88CC05D2A09CAC0AD4B01EF0FABFE565F3CC71111A7C
+6AE1FEB3C657B982AF72ED527491863AFBD1C8473A7C28C6769C8A10AE18145F
+99C87772D625C02A6224799B01B67E21CB2202719C309BB2A5A781A9B67BA67A
+56C18BDD7749A684464FF0528A40EA576EE8ACD132C78B81E012827708DE9504
+733E9F692C17365DB8D4BADCA04D3F5F968D21F77111AEDFA9BD53D1BC39D68A
+DB875CADA1AD9E50E79516A37F11BEACD46B02B3AE11842178CFFE9990B2B16D
+D5AB4F1CF9EC349D141F080DF768BBD6CB785DE6A665CD74823ADA7B737006F9
+7BBA98A9B44965813A441931DA18873CE327DFD35E8192C8809F02BBED8183BC
+17AF50BB95750F660288D5B3E13001A1D330056D50D4D069403595B8A18DF321
+BDEC558D0210BC679C135D8C2BB83A5E5613EDD51E76BD2DAA67FA8E74A26A75
+71F2849B4E3B4593757DAA4270A3600DF96A242EBB69E947140CA154B443B908
+44698C41B488227F5AF0EFB0D8A2E015FB9A90D28D9F7707FBC2B2C65F63E289
+69575B2845A823F03F6CEE1BF783568C70E4796D387F03D4CF3E4328173D2B08
+CEC1D2694B13C395B981C0EC9169EA35808A26527C1B7F15316426697804157B
+76EF0BBE41A42F5590CCF7AA901AABB3DC32DBEEF7A24A1924B10DE655C73EBD
+3071FEF7276EF38FEEC7F544AC1B68769CBE98237AB8EE411EF435E71D51373F
+64C55CB88B3C482D3B47DAD804586E5077F678E72B67F6C85FCBD0A6A9BFAA49
+F87CED403626DAA867C300F3B2D2C597DBADC3DF8B15746B33887B2C4C4CCF53
+EC3AACB2DACB914B458B9E0C373C2B323372FBC8489D30777148AD3167784E28
+22F5CA86A3C54E144CC6FE93F0A2F7D95222DF69B0F4B896AE9E4E12600C4054
+CA7CC585809E64724ADA88EC845D87F81C314D5A1EEEC25DAA1544DA0169163E
+87416F4222793775B0FF349EFBCD14A32291FA6B63F2E6A0183645EAF31E2D85
+E8BF8BDF43790F86CD11F90153FE852FA79E57E465C41E4E5A6B7E7913035B71
+D7AAB0E5B7FC2C953558DF1B403D9791BFE2BAC479E2BBAFA9AAB4D749DE02DB
+F2A9D3CF3D2CF8C4521D453478024D1824DE9C21F34CC387A965570351253EEE
+BE8D920B219106CB0401569E7C81ACBC7B3DC3B1C4FF14F017366EDA62493257
+B099439672EF7B0BF954774CEDF3B0EC19887613338A66821E9CAAE0B2864E68
+C0969234882AA39E2AA90AE9E3B2CA22DB3178D29D4106B27B781C4752302EBC
+56DE145488C0306CFB3B4E23A3FB9D1D3156EEE5CE6040CE446D6EEB8037736C
+176A8A855C8F665F6B55878D9F3A10B9CC2838474095E13DF61D6AAEB95900A5
+3DFE4D7D25E4885A19EC5856AF7617AFE79182DB185FA4656061E36F260C4316
+42A4589E7CA8B2C95DF751A861C2EF2921B6A8181C30A7E0112015FCD9F20590
+26AEAE99AF8F170CFAE5EC19BC396DFCD32CC78CBC47A485ED6E88D4871C5D61
+CE271F3AE45222C8EBAB0EBE432D3D2BD9CD69CDBC9E2F47961C9F74589382E3
+F7D6C133D7CA2E7C52835C48AA83452C69E7127F031DFD26B40CF409D3408D88
+56F8576972EFBC947400C8485F55267579C41C83D5418BA24AC9ED39DE4001E9
+68D0062ED8B8CFC5ABAA91E59D2B33B77F42D70CF896F3CA5408951A25CA3A4C
+9B31EF3BEEFFB5C9F62BDDBD38029B27D2FF99461F3A9DA8500CBA6A4F46F489
+89F51D149470F18DB41F5DFBD78D82011019D3F6EBFCB4F9A6959B87466C259D
+BDD14B284F1954ED9BEC8AABD2A94043F8BEF7F14E15BB7901151B67B4DCF824
+FCA42BC7DA7CB54062AEAD59ACB7F5A0B48985D2F408C6702FD25BA5869A658F
+80024778A4A078AFF95332A0E113D9F0C71051F46D3D2657AE8191CA7FD9A813
+32A50908D672983773DDB25A9D06A174B750A19AF2F06BE981A5FBC999F20171
+3060FE8BF2DED7628FF1C2A22BD4D288AFE44FA6E0515D48C35F60BCE52A847D
+C5F340DACB8FA15544552D52D819293765B7BA4184C504A8656797F91765EC53
+BD0A8E2EDEF3C5F89D7AE357E1C5CB10C5689AC67D0998C0BFE07B0BF1FF0E51
+F0F93EE4D49CBD3C29394A1AAE2D9E7D899029D9F5C768B7D70177B44A3BA335
+02E7AEDA13E132AC1D91FE66A194827B00453C72647EEFF3BCDA0BEB7F6D2AAB
+50D477D017DF0341EE249E8CDB07D8764DEC30B217967EF9422ED96D7BA3278B
+BA6A9659A7AB945CA306399726CEE1FE24856DA2CD70E5ADCAFBEE37F2F4E19E
+FC780DFF2899C82FFAA0A2FE9A5A3DD6A8AAEC10998A377DA8AF8CE7CB2CF4B8
+7AE85B74674370669A06F7A3C4C19312318C7BEA80C5282F18A1C870EA786671
+3B5123B88BBA35EC72B1855EF6539F00EBE6B574BF0D26A528441588A191F6F8
+A49C8AF170CF9455BEF83152DC0438DF17B350FEE2B9CAEBD92DF32205990FCA
+BA6455388C5CB8CF444C1DAD0A1028B369E6DEE21EFC40F557EBF6A8BC91603D
+1775A1A0DB52DDD9B0F8F86334D76018B90808A3569701471CC6A9543345070E
+D981CA923C7A49E22C758B639D085B001C2ED5D54331AFE2D95FA1D77C9655A7
+8D920659F7A0127ACEAC6E687B9D4F5D452761CA30B7EE6BF7B17F86B7715422
+902AA3FCC3B04FF410B5184A2C665F24E0B2A0E0F06E0A5E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMSLTT10
+%!PS-AdobeFont-1.0: CMSLTT10 003.002
+%%Title: CMSLTT10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSLTT10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMSLTT10 known{/CMSLTT10 findfont dup/UniqueID known{dup
+/UniqueID get 5000800 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMSLTT10 def
+/FontBBox {-20 -233 617 696 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSLTT10.) readonly def
+/FullName (CMSLTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch true def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 49 /one put
+dup 50 /two put
+dup 97 /a put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE33C33655F6FF751F340A8D6C01E3
+2E02C24E186BA91B34A1F538959D4450CB683EAE5B034D030186901B458D3777
+6B3942BD2E07121385120248891AEC2EB33C4E3A0CF00828D0F130C31A918C18
+979FE94379C648EF21ABF659253E43CD1253866F157F1DF85AE7E8714F061B1E
+ABA3AD094FE8D6293916FA82EE4F486C7E513A06D4C9BE44306A8287970B4ABF
+B6D1F9274A5A0BB6ECF713ADBD1260D5D6C4420D357FD486470A74B2F0621B59
+A9373ABECDBF32FA68AABB66FAB0C970A3354A335FEDDA1C288245E6C890B8DA
+3D0EB953283ABFE372221EEB1586B0167F634E3F29CADCAB484B81A243CE1E3F
+D5106AD6BDB1AEC91123377F816711CB9D5140120FEA84B8205B79D1569509FC
+6B671211985CEF51691C45A168740BD826464B2CB0ABC575E7D453161328F80F
+3AF1C99EC219010EC6C95E0A8D1909719CF18BE424967E90DF67537220E60C3C
+4345B154D08F9EA684710E659DFFB0BA1B7FDDCD519305900A5E1CDA219A6C90
+DF8BD712A3686DAB90344E8784C7A9AF3318550285039B701B9FA1D3A3C3B6C2
+753F1E794A3463A173C99A9EC0E2AB5737134CEC2C97CD6A37E38692ADB4B131
+54697B7BBBB23680C72CE96066D8007B90AF0FC5958232AB4F21826691E9874D
+107F47DAC1026298D787989BD77CB43A09FC95F6997DB00D8483AE9C2716CBD3
+7CDF02DA34FDA2F0754ED0968270E118DDD8BAAAA65C41D699E2BCC2556AA231
+328187D2F50FD518CF458B0BA1F7DBAF4B231CFD61D5DC56335B53C3013BCCC9
+85690E19E992ACE55EEF2BA7A75DEE6DC33933C226FC1494269B7CA4CBAE987C
+2C787386400172AE3F44AE47115F4117EED866713BDDCA4A7AF658C49F913CB7
+308635000043F63BA210410A66E192289592882C477B2EEA0B2A339F0E7CF450
+CA0EF79D3A6C28598825CA03FD688DA60C95EF707C6E67CB7E57DE7A80545195
+739ACBDF27069F34C9E0216C3D17CFE7A652B910FCC9B9AECC2E646809C22D93
+FAFAD465DE794755AFF5BEC17160C9563B5C51D07022E2D3A256FB5CACE131D6
+F4B30F591A0419D957D8F0DCAA0A8D65A8D83422AD7C2613FF13A302E152B312
+3F1ABB45E42084EAC894FE335C07324849C9736D00C872C4551997DB889AF17A
+A52C5AA77DEB548B0103B77F65717F70B90C1BBAEA7BCB4959F32851A9882A3F
+55673F24103D6BF7FB3AD3EC3CC50FD8FBB4A6B13C3D278174320713A7B327CC
+A71F01E50840B33D0FC3F5F6A6F2B0F2D0E38494B1C73096A430510F927235FB
+69E931DA8CE5415EE88D0248565E3347353621A48F7948AC9EAB5F5057541B50
+82BA955D90BBC82E582FD71904445A59186022FB928015235B60830DA59813D0
+8DA3FC306C43FF8BB2CB6772B1F7BA3C1AA4B2343E7DA7E065EA53A4E5E28DC8
+0790F2D5CFB203CB135A08DCC9702B59A63290444F202756E55B9FB053F773D6
+0F69C63E74DE593E49186FF4304E8FA76C3E3006358DE549E946DB69431981E8
+1261C9C9A884E4EC708F69E6AF5D22C5BAC49F2AE85903E3D48D03B7B97054F1
+D2937A0C685D912D6D20A75A77712164DCBF8FE4D5460DACE139C5A934EEA09F
+B94DBF168A4BC03A9D689936D833018FF43837DF9519AD10F357F00BC068E737
+170FC9FC6715165F733A0B6FADB9ABB48B845167DBE6D771C916577FC2132863
+767DC6E3D460E779254194AA690983184D934F5E858C1176B3862B69B42EBE7D
+EC9AC4E020085D474093F7694C8A8C2025D4B0163E29320C384D62A9F3FBCB1F
+AB5A374EF3DBA48AC2147A207AEFE8B78BECEBC55C97B538F3A0FF4589D171E3
+826342C8A5186224FEE54E4C6AD5EB02BCB4088B132FA1A48362824BEF161235
+8E661DCFDFD8429C65CCEF63902D0E07C2FEC1DC2756D942F13FECCB7E8A8048
+345338F24B7808E46A04A915C111F939E2669A12FAC0BA4F74B832EAC83EABEE
+67E2817C058E69C2010F2572FDD15194CD8DF0FE9F827D349C0444A18D1A86FD
+802BC120A5114FA3523C221242C7E767B0AAF6AD15DA1561CE8EB18A2401D71E
+20481FA5F1E247CB5288F47795A6A3A3BB186E89EAAC4A54AC91405427136127
+5B151203426830F7CADABDB3FF63B40CA29CF8E667E71615869978E99E6F3F07
+0170EACDE3DC62DC05681D7680E2E96C30002AE34A4E5EAEDF88577601A82C36
+22D625A03B0451D7BBAAAE0C396711500E94A482EA787495073F16A76D1657DC
+4EA7C7B83BC30CE7F145B65B6E2ADC207D192CE3B5FEF7031F4BD64F57E1BEFF
+CCFFE06F1E4ECA48B442DF413766A70DA626359183A9B24C70419487423C816B
+4BCB067E661E47E172563090D6328BD738D2B0FE41A0C1D7A47576A79BAFC880
+0473229D134F998909898301CEF50A82B627A9A06DF59D0B9C530EC5D877F1E5
+220D3A1ABD2ACBFDF1933F92B3137B22B9F95A961D93B729307749A50D8A6403
+7AD0F9C40743E39B8D198CFCF7C033D99440D46D821D97545B930EF92E7AE005
+27F2FC766FDD4790FD1913C7A13328E73E587618ABD9008022C5C6C23935CEFE
+B5ECA2CEBA1D25DD846B48423F7186E03B1F61C8F1D5AC95CE03C83B2F221300
+7A761D6CB5F7F9251D3F9A7F4B25B99EE7A1347ED3059A811A82A35A033E9B07
+A4FB2A95009576F48665605C478E5F6C1B135016FEB4AE6A6BE4B4359836E04D
+45AA11366992162973FB6266547C2E570B8F56F6D992D2C0F63950A16839FE10
+F56E59D93A37573E3268C5892C9F3358753D1FAD6379E82BE740FA17236E96F7
+C53A2FF785FAB86AD17EB1DE8A6AA9C69B91C9D9B43B5188E51F6939FEC21B65
+AF17DCE95DD3BA4F1DD51F0BD5E5869A1ECA7398B6E664EB0D189181E9C23012
+DC1E54C146842A90909DBEC03B79B58909205F2CB2A7F83C66B437D7F7DB9781
+FF0C67F004E979C95B706D8D85255CCD827CF6196D847DB380B56980109E96CA
+997157BE78A4F758CE59D78158A854EF2C20099438F74777D3B0298D45BA86D4
+3C0AC30C984718FD62ABA0567AF0A70C1DD41953E3E7212D5C562085177E650A
+2ACD49940551E3F7619B4CC31DBF67AC15D938619B95DBF66E6D1300B1BB8605
+31C4011379FB5388CA49E4A9BD6C921560CB8D513F8716A0733D2A7D77E62D22
+A69B54E9048CA168D210816E613CF6357706EF6B118A1263B858B7E19AA98891
+43BD675B06C893579957BAB97199ACB82C080593ECB8B66A7334779CC16E4D0D
+4AF365CA6AF9727AE29417B61A5FD52452873B1D666044F8E7C1F6C6AA3397B5
+94A5780F4005FB5E41698FADD1594B505A58253D68D2AE3320E22165D198050E
+425820CC0A43FF1D61F168D87CDD30C14D387610B6CDB63BAA39B3EC9B3CA616
+FF1CC679227749DED3DDEA26B4D97C633090DCB8D8A6E5E07E3579E4A99BF1D5
+51E43D1D7F139C9CB1D76D8F693A3F23A74EFBE79F01E0B850BC6B6C7F62C2E9
+859469A144853434895D73DA6BD2B348A48BA80E79327ABD96539F2EA2209852
+E1BF6B0B819D7C68A9A1D0F6F39416E3EC4AC21DCD3C51D3B5B8D417EFAE165F
+2A7E0B76E558AC9F685A76FEC7E3C73CD607D9025DE6113BE5D0401887A53910
+82A813B026A502B51D484797D9D7E79A25B6624940AEDB4A15F2C73CA1AF60FA
+22D15BFBF268EB044FAE17822511AC6580D1D74DBA3C3335217780B29FEE792D
+200B00B8CD888A8BFF15D938FC758BB5CD9B3E08E1AC6CD1669E663BE86711A5
+892684DFCAF70C11E803164994BDAD89128AAD6461D4558AC2ECA3E05EB56D32
+0290AB16A6DF7133DDCBDEAE89C6CD83552792E23CBF567D57E46548EEB0A140
+437492B53C14419B6FE7E64AC23923A9E85F56A9DF209DC4E6BCAF1E045F9CA3
+BB904BFA150F4083C18B0CB5580450CDB657EA768E71222C71DA911A722AB9D9
+E18B6847F417125C40EA8A0CA1F551A4548712D098209C78DF9C3F78605E5402
+DA2DBE2218E49B819296D5AC88D17DDBA982E171733D1E9E295B3157C9B90BF1
+CE68CB185947D1E3D7544155B741296D14B064BEFD3E6AF25C74006CF6800551
+80FCAAEE6FC9105E1674EDFE68C45617D8D3E2264CD395EE94EDD017EB85884F
+FDF530EDF4F3F14750CA066F149E688FAF8EF4B5FE6AB515CD298E8D170346CA
+9B32BAD1D86DC147BD12EBEDF6CE1E749C5B48314F512470A568C172C35CFA41
+031E34586A89404CB5372D7B2C7A6D96F420D4D7C2D4C08184F4AF86B4536A90
+9367598424112A7B05D7107B23695CBCD569002290599E0FF4EC5C852C31F5F3
+9BD56BB840DC17DEEA579E7A7A9F764788D4E3774BD523D21267869224D68891
+4523070E80A123B58F7B579866332FC38A41A5915EC06F2D14FBE4A6CAF59AEB
+57E98D661637EBB885AA5D74AD429CCFF64E5149815E7350118E6385F4C74E0B
+2EB474A6DED021D429F01C9B0634A09250C40E22B3BFE1B7246D18116D585F39
+0E06E9B5F27A6CB77C8E9462189CB900CFEF08F798CAE15FBD94587F33816EE9
+03FB2DA6826EB69D8C284AB9F7B00630D0420EB6E35E0E288BA25F5C2345C067
+22412633898AF99C2FB232D1469025BF262B567F29A05F4816FE8EEF5F02BD79
+06202F6A1E3E5D4B3C91BA8D5FF53D5136BF70E5FAEF441A7310CA83721711FC
+39EE48BFB2FF287234B1A6102AF146B10A632A53AF97E11FFAC3A2A86BBAE3BD
+E0459ECF0305366078066F2CC628A3918E775E4236651B3D817AF1684B07A163
+A0142D16F55D2FB5F2255A8813B8E54EF3E801E95A4A226AB8C0476AC5EDCAD6
+9258ACB6F7C0CBDD298A0B816560622A1871FBE2FAEBFE697A8216A0D8FE30C6
+B1BA6C3E975F78182743842E7F851064037394142AC91B2530FB1D511EB20F3F
+79EDD8B7E1579D35F6E7B2883C47A46B6C1A458BECD6BE58AAFD834A7D82A553
+2FE4E66878E4699856DEDE964F454638F768AEDB595A883E380408F558015FB5
+8720954ECE2704AFAD4D62E8BB2657C4FA920D72248B3F762B2F12D125B796AA
+1C4BD6B42D766EC1C9B2C7AA4B6A3474BF753742DE8AB76D0AB0DD9A20EE2DCA
+0F34CB25995ED3183759CA83ABC32B8BDF0B06EF169252587971F7D37463BFA2
+BE36B2E45559DD73DE7CBE29DE92B9BE6B9F8093F934BA311D81E18A8DA92FC3
+312E3FAB43C53E803975981F0076EBB8F257C123908450661B6FA79E7ECE98F3
+B0A94E0DE3A4DCC8E0FEC106CDEDAA297A75BF1E40F3C2419BF72A644F452E2F
+9A8793810319885EB3AB23B1E80E8B62A889311355C73722C18E62711A7E6A16
+A5B923408444B13F6522FECA9A60B067EE332B83E1A69CD835C9D69B5D8859D6
+91F9276863D2E2E8193641E4239F4ED15E2C482C735BF5434BAA454EC2830C1F
+7CF766DAC9E924F17F03093132627673BA3D99DC2DBFC89E5BA032C16D3C1C8D
+78B3C464081044DB53C7A29E925F4157EEEE928C8E28EDA5F0A4BB6E0042D8AC
+7595C350645118172D04FBF06B2C9A9F3603A54B57999E2960C993724CCD6A09
+766BDF73F66E07FCA9BD09079CE8010E6CFECBE2E5DE1EA4E280AB78D5184C11
+016385007CB5AC0BC95955A1E88EA1A1D8EFEA886007708BA063F556D9284D4D
+C764E75CECA51BEE3D35DFCEBF6175953D30FDAC00F23B1721A1DD577945B5E3
+8176A21A649D907B5F63C71718ECF32ECCF1B26BF15AF694F1045CF98FC75278
+E9782ACD3D83CBDBEE690D29B3176E745AAE436382D258CB22F3DEDD02E441FC
+6A9931AC2F61156DE258DAAD5EDAD41E6C0DFC902173168BB4F51DFA7EA615C8
+B0F92FDB118378CBAC3D56B6B9BB0883C0C14EAA67396AAA7987222A132B7959
+44FC1E9D6DB6D549DFBEF8D2DD8C53DD3B66935FC239E74E2C440CCA13C068EB
+C4A3B69F499F573D076E2C92E24F2C69B806591B0807CD903E078683854963EE
+5125C3640860CEF37BE186DB781475554BFE6C528A9633AD5772BD53244E24AB
+42CA2D1123AF45FA257940CE611D83014DF04E60220E9AF27CB2A2247BBB004A
+F5722A5EF058FDC7DC2B6ED1406649DBAA58DF2ED3A91483D60F11C4A39BAF57
+CB1E320A987B790672CDD3E3BEF4A67032244DED2FF4588B2072CDABFEB36009
+9F4BCBEE16F811A44CEC77F8AE873C90C0F4C975E51014ECBD45A56A63F034C2
+82212977023A132E5C88AAA826D841FDE9CBCE7A01E4B6F0EBDDB9A69EFEBD72
+0B41EDA807CEDB791084047624BC11CE10B7A0A311272EFC9E013FA374D97EA5
+F7998FD908748CA72D8CABFD0F01220C2114D3B462B22FB71A23B284B1CBC7D9
+EA20BE71F8ACCED21F096009A14A7C7B51450BA51514707EB46B9FAAB31CFBEA
+E1DDA6F5D9AF0B6E7D05A1EEEEECD606427B0F2363D1B882B50140466B9D3CBD
+D00DB06DDD1BD4681E367DAA4B7C405C6281B67FFF794041738FC6A01D261CDD
+F6E0A330985F2CA782CBCC02B6F4EE5993434F656B91A51CC03B1D73FFA6629F
+14F6075EBFD83B702D8844A96CFB5C14051595BC7DB2218156A6DEDA5C98CAD8
+BEB5284D9D9F86406A8C1AE85857185991C360E5F44DEF352A1F301207BE94C2
+9A3A11BA468FACB3FA2D683419C44EFDD7C8F1079659F3ABD89D7F168B1591E5
+6105F9B3FA481BA953CD34CCFE73E427D3AFC46E5C58C2981198BA284DB8B37A
+6647BEAA561799877DD6858FCA71CA6003F2961FAA529906673EA94D82D78116
+4DAC81011FD175DA707C1E15D4B6FF19F8720A4E05E6E103E2DE880FA9C192BE
+C5ABE7C311C2ECCBCE8F9713DBA74AEC37A61C8F21F271B35F0F7C88B182525B
+A4183377597ACDA9A6E2F181725D427795B975BC4168A408D292CAA484BD1B8C
+9DC62E737ABC805C8FCB7E96454DA032B601345570EAE0379BDA84BB6D15D780
+42FA1E068A7D62F152B43B788513E13724666FAB4E2B4F04B0448194E46582CE
+7389BAF0D1DD4435BAA6B82AC305C04686B89FD51197C721D941BD2893596024
+1598E6C2BD84527EDA6FAB782033E4BB4F964FBACD96CAEC3F3CF89CBABF6B4D
+4D3AD14A03D4BE931632BB03BC2B92842FAD51A19A756892D5B978DB695D0540
+CC9D030C612E2B201D60D09F56332DD0BA1351EE62816C21A35C33DC11B37BE4
+D2F164ACD836A5CA1553CBC733E3B159860454B17064B4E22D3764FF6293BC81
+CFA3B2325C8E072857F6FF4ADAA8818247D431A28D3C5FDFBFB24A6CAA327AC1
+0B3630C84ED9F0D33B8255A3CAA9C5A0C79F7BF6BA3B9801C3BD0B30AEF7CCA9
+92F25E332EA97A7CC653C93D1497992D6B76363885B92ADE34C2A33E30A3B1A0
+57E9C16D8CEC189565808D3FAC92973C71CDE74DE9D8781CCAF88747758014C4
+5B62667D4D2CC5EBEBE77C5AD00C6A69D1819F5A786964501E077EB3BBEA52A4
+57729AEDF35253F7E1D31F2DD1587BC15CCFC1B0CA930DA83E2031B099A38158
+8D1849E7145AC74777A3C7136DEABB0C787E5A218309A65EC7D128147EDE3AE0
+C0AC039B56F767A22555CFCC12DCBC7F5A5A3B4E86EF5A69EEA93DF0BAF2A3F3
+7504F5C6A7A67388D2F9045BD755BEB7DFBC2EED679497EBEC808BE20FDCB5C7
+B586463BBB898DECCCF7249E9047DA943FAF0718A2050FCFDF8A4C2029FBA674
+EA64003AC03A847185936FC375CC67B3006EA681F61F640C3640A78D0C7FF521
+D477981E23E5956BAF42252463FDBEC49BB560A9428D248B0C5250CFA2A49CD9
+DBCEF73123C13BA382D3CF6A7B8A8CA3191D379A659F0E2C6E9CAFE9DA2AC074
+F622E397A2F7C73347364AE249B11AE2C34AA7F0D27B5F35D548D5AD1228597D
+D16A478C901D3A34D870BA39F770885B7DE62298F0114752435050E99EA4E5E0
+56B965EA185E8DF96B9FE97EE23DD45AADBFE02B427222B9FC99DA94FB2648B8
+46BD30F881BAD3820DCA4D8093BA0FE70E03482CC063B751439125623FA7AE40
+52DB2A380D89D5E37BF264CC73DA9A1540031587F481A0F146C6ED6F3F2957FA
+19477F075ACF608CD94CE466C1FC3EDAEA3ED25C96FE89A7CBFE528A33C4E84D
+465FE6FB031B48D904C5120D428D6B51F3232847CB0B7521E5CEA887FFC56F02
+0882B3BB7F5B0B954E7078DE3E31D8AE65F9EA55F4C169DB7C35DB9645617AFE
+078E03BF9A1BCE4E489AC9495A1E6CC7D1FFDCC03CEC1A32490186FE8B53B09B
+DBA7F0E23C8F5E5270D039B409D504203A458EEF12C035039A8AA12C719C0339
+F766BE6275511D585F82E9D4AC9B5424312755C4B74383FD094BBB24817D6291
+4663BAB0C9AF29F46951712C354B1EB67CF3FFF6DB1FD83F056774CC7F2283B2
+49B075479604C9B305D9C4587AC495570DF9C4F05525921AFF53D81C0D5AB7B5
+6F00251395F7675345C050C6679867C964E82EE6981E93684B0B28AEEE03B79E
+4C26DF3A514E97F57A397BEA4315C09652254E780916102F48220688AF69BE44
+0C2CD2F43A576F4606BF4F1817C78B7068368AE36D593EC32F0C344B0D728A55
+089C518FC3D903FBF3FC98EAC7567224389B666D105516F48B7F46FF5A13572C
+AA7A87B6AD749B9718946CFD1AE8B6D3CC90CF6A87B9B2F0C2F56D5FDA37CB61
+6AC4D8EFFF054CC016233A437E615F13A2A393CF269C603D2D57683047A0685A
+E19032F5857E84E9DF2D16FCCDCE2C3679DD509E5A6058CC9FD78A7846017FD0
+178C712CA8D1B9A9D2DFEF19887D01D19B7C3AB4A02D5CFDED33131B7E46AB35
+3091A04328F530A8296C6F35EFA6182ABBB64C78682160034BC4D9F68EFD6000
+0B844CCF122E632068853944E646E33AA88CB79B127254FB45132447BA9D7AC4
+219AD1D5FD4D77723C4026768A051FFCF2AF1B7E22D2D598D0BB54669B0B81F6
+E010506C1FFF5BF04BC512CD766A955212B373C41EFA8733798257736CFF8B51
+52BE941B6791353A134E451A83BEA38C0A187DDFD23C2B7EEAC1A2505D0355DF
+840C695952357E8780A6C9F47BD189EAC599A7C278B5E1E61467EB671953C2A1
+C71E035F3C66D88DF56CD37A37A400BB39D5CFB15A5007F9B339A5DD70ECA10C
+BA6B38B84502FD74512D99E4B8E06409664C7523EB035E6188DD37140CD7FE55
+3878C6AA72F2065C7DC50D34DF0308A2798BA4E69E96AF19B916002EFAD38731
+EF1E8CB091AD21DBB2CDF345E5833EC2E51984A841B3EF04E0AE87D470288B7D
+D42BB81C4A732FDED84096C947AC915AC401AED151DB68FAAC3A721833673B14
+3F7BB8111DC05BB7F707A9F57ABAD8B53337203640BA33B1689C9E431991EA36
+EEB231066F374E62432DDD055189844E5695469DC4511CFFD616FC4803C864D0
+873874A028907E5D0B8308DB5A19C65348926A62DF837AC247E7D6A55E23C696
+5313A67FFD96DE214B403B5A8CDD93E4CA1945C89EC9057D0456621EFCC1C42F
+61E7C1DBA1F6EDE6A4BDD6D319C6341059F62609F14EF9E82C965D20C44BCBC6
+06B539365913C49FC2942C94E574415896FD459F5BCA2AE963891433545C5A11
+A85AE5ACC8E5995CFEA2482BD2BB3CC844F2D3A83821ADD3724A180D1F042206
+00581E061573D63C543AC5B9585B2A5D201A84A3434595C18761BEFDD00CA4E7
+2956D4486197F5AA7024E5FBE2FE197BB6491508E89A67574A63AE346019D4D7
+D4D23DE0B9D1D544ED82E0068BEDC5CB1E953204D731D9FA5AD7E8567E10B3F9
+F54F745A44FE06E6B2CEF76DCE87281F2D4B57C343844CAC894C1E3074873B21
+CC6DD0DDB106CBC6FF0DC13CE3132E9B86DC5DEAF638C0B240151ECC41DEABCA
+0F1573C9B6A83E176FE8B160770AEB16E1AC0BE350165E28DBE259ED7BB1200D
+83708D25774547C2D86354CD161F8DF70140EEB8DFEBF8B916005C5A5D3C1D59
+6FBD8EAAC2A93F3061E700D2CD04E803DA26401743B9AC7CCBA5F99E88E401C0
+453CBFB8309877E1003A65A898AF76F89C54FE4D5A4B51F07920967757FEEE7B
+0836ECB7F66E922DAF520F32D9ECD0B83CD7719CB95579B6FC27D6E3E7DE3E8B
+03965C6925CF9FCA4F06EDFE9EA48244C7A315B866D6B3F5C767B2B15FBCCD5E
+A609DB4FCAB2C2246D320DF17D60DEBD6C2E78FF32CB7D120E9D1251E0866D14
+8B393910D9FBB4225C1B384BAD153C2B1FED53725B3F4FA46CB6DB649F6F1380
+9ADDBD04FFF2A8F3E53A6AFD44A55A1C394E2FCC723EFE4A30FE24963472BC9A
+F349542BDE1FC7CE25DF0484ED3A1A344007FD9BDB04E863BBFB60996570557A
+71EE4C77B244331147C5A70059A74064B3F2556E0B70E3A4BE685712379C35A4
+E616230DD8C716EFC1E318BFC8770272A3A7DBA0E0EEB60419207B6B2855124E
+70575EB86D2DABC9738141D3C2DAA80F4488F1AA94B3F0FAA24683F2370B1ABF
+6D06D5C0BB9063171E0F8FA31D56A9793738B7653E05EC4D5F136BA8C6BE6256
+2B0B79DAF5F989CEF8E5F0F42888D8EC9A32F2074DC9174776DEC9C3166E5B81
+F44F7AFB85FF7F7E244D3D64856D71340A13B267D04F25CD68126F443E1215EB
+3615891A22B8A27FACCABEAEDAAEF7F7DF4C0BB15C1B652ED6033A76C4538F10
+324713DB4683F0A7C272895A0D9AAED5BDEC07080F9F19D61934A6B344216873
+A618463B816701EAF3F507FA0C10FC3BD12A1118E5357F2C502DD25315363362
+D0FA6C0BC28691C752DF717A651E8B0FB5B88696BC3ED7E23020CA9D6BD8D03F
+7292E2C07399C40B9EDB7D161908BA250227EF489C16217EBDC6C3465481973B
+72146FB3051DF328ADBD7A98986E7227821E2C24DF994A24884266AD2BCF0AC6
+B36A938DAF8E8A40AB859290FA078CEDAC6B0210A181ADBC199AAEE6793F4F61
+5504E4CCFD6DCA48F246F7F969633C70C5667B663E229592963ACD8A6982C6F8
+F52F5116DEEEDE61302F89D92EE1CE0B1BA22CF9F017D7747394BC2ED5BC0141
+6B247B07D0D2CFDAF75ECFCFA5D1CCE76CC9FFEC345B1B3A34194EDB4C75A06A
+B03502F7702D368F2BC048F42CDD18829CA3D96CC07946DB257A3580787A5C40
+802A085E900E4785B1B9081DF4F0CC55CD292B034B4FFDC1E8326FB3170653CB
+844636627878DDFFDE6CD0F6D8EE3FAC7AF79E03C3238AB517874DF858BF4D17
+971BDC9EE0152E969BB876784D35317FF452AE220819D1F48DEF67D8F296735D
+BF445BD8815B21C3D9CB5A262DFCE53AC150206B32889B1E6A6C48452AA56EE8
+E66A7F99EE0F7B5AA66109DA632FAA425646350E58EE8D9FDDAF4DAFCC33DADD
+C64D2A62092406E28C9483DB256D0BE9876D3E95F2715264B842193BF2860BA0
+98A8DBD3043742744C8C60E4AF996C733570050B09D1CDEC63CA7AAC157CA349
+B9E6188BA077DFE2FFAC844F6B6C3152670DB3C7FD149DDE67054B869A6EB19C
+C8756AD1987CEE857262450FC870503F54A0B2A6574F9BA63F43B72DE9CF0528
+52BEE0FE270AA0D2E6B0D87B361CEFCB7F4635E4ACB38311428542A954C551D9
+BF33B8194311C20FA0D97D411ECED2312DA77197E09239660AC6A9465B06E3A3
+2AE9EAACF07AAE6D297DA00E3A366B0465E48117600936C8EFAB79D9D2A156E3
+EF0EEA375EBAE7DE404ADACBDBB45F830E8BD185C8348316EE978598A80C83B7
+24F89C1BA0BCCB2AA96B71D51BD66C3B87F58F9951F9872033109BE5CF1B4D68
+B17EE96C0AA378FB7E1163A6F6BC130AFD2666C214414383D9E0EBCD993C7A32
+0206A4DA1040CBE19B348701EC6015EF37BD273A46BDB64CDD80927BCB9D7B49
+B5F7F69DB66215CFBAA85F8CE86B788520DE516F36F7ABC6AEB7EDAA268F8523
+6008CA78284EA582E23C0F6E09B8C67C24711D65FC2C7C3AF48F8630D6AB7516
+CC29F74199D60E0EDE2F50B3A1CE95354CBD122E1DEB06128527016F23E8696B
+053936A66BBEF29330F33D578CF456CC65EF39AC87BF10B0C677C4E6D8B06915
+ECFF2EAA9CF67139BA9249D581E9243AAD3E59FDAAC3B28A87758412D6F5D8F8
+F79EC4C47A045BA16D3D6AE0F9AFB29C7A20DEA61B932FD7240087F64EBC6379
+DC0E3F1DB7388853857E457D3B09536455528047E4DA6AA7938E3F656986B61A
+21E73D3773CC66D813DC3DDD01C5E60E3CC098764E3C4EB309B6482A10F2C928
+B10AF5138C4225967A8A801F0DEE929E63B1A16FCF9A4D75723BD63EA3458FC2
+E3218E41839E091E134B655ED4049352A59B9BB7447BE1987ADB2C8309ABC25F
+6743C6CBA2C0049869BCF800838E8356B5754274ADBCDA4F42034B5F49B971A9
+E2FF41AC8951BDC0BCB23F90919477D227FB3DE0C205C53C6D1D4A995212AF25
+06255B0BA2AB068CCE1685842774F1325B2594DD2C59BF414C6235879089A789
+6AD3DCEA1F8271CA3F41269AA934CC3A60C25A91FC73FCAA66D7068176C8F777
+01002FEB2343AB559B310FC5ECAE480FE0FC6A3D10B6037831852A654E2C326A
+4EB26FE7155EAE63324E6796724B435522DC5935691F11D0B1DA1040F720768A
+DCEE90219413C6358C7A602B978339B22103890EC4ACB3425DA4A1DE274BF619
+281DD83B9FBFFF431B06164A34F15CE90D76642D0587036FBE526ABFF1FA0694
+526C25F271910751C5DB07ACB4429059B6B9C5644FFFE2C622F5F7B6ED859249
+DD3E98EF0C0D6E0DB6CA03DD87BB9331797889A65C4708FE9A696041FC5D1EBF
+107589B49CF9A04EE49AFBD59FA7FE9E3DAD2C46F44F6F54237302E498B80C61
+A975FFF794971CB55252D049E414DB833A05BFB0AD2FF340D73893A3286A17AB
+C4ED27AE133D7FFD9FF0F2C9B96E83E566EBA52E5626CAACC6A569327C4F74C3
+ECF1DA1AA4E562073458A21785766FB65F487CB2DB656C438FCD2D6D33692FF7
+AA14958C5AAF35F8056304978BCA5901BFF9879441A81CBD9C270230A19269BF
+110EE3382AC29404412E2B975D6C11CC5AD1825E10F74C632A7F54834C6BC433
+0EA2A0B303057D8AF4C222CE233E408D02E0E8DC600BAA5A6D14025CE0459A34
+B57B8CB8AF49A804EBDFED5276AD608FF1C8A9F299B9B5802225ACC1016F627C
+9F457B3CDA742A6EC8507782C5009DD5F26090A1FB624186840F174609517773
+DC17E6EF8DEEBDABCD84172AEAE450A585EA54FFCABB66E652B885000A457D7D
+17B159385131907E7B82A978B73ECE7ADFA85E755CF11D4123BBE0991BB733E6
+17F193AB516AF3D0D2A17FE00A9B3264953206CE596101D32EC850F5A5890CEF
+00C261F646555B7BC183
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMR10
+%!PS-AdobeFont-1.0: CMR10 003.002
+%%Title: CMR10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMR10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMR10 known{/CMR10 findfont dup/UniqueID known{dup
+/UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMR10 def
+/FontBBox {-40 -250 1009 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMR10.) readonly def
+/FullName (CMR10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 33 /exclam put
+dup 34 /quotedblright put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 63 /question put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9B8591E5F01442D8
+569672CF86B91C3F79C5DDC97C190EE0082814A5B5A2A5E77C790F087E729079
+24A5AC880DDED58334DD5E8DC6A0B2BD4F04B17334A74BF8FF5D88B7B678A04A
+2255C050CB39A389106B0C672A1912AFA86A49EFD02E61E6509E50EE35E67944
+8FC63D91C3D2794B49A0C2993832BC4CDC8F7BD7575AD61BCDF42E2E421AA93E
+3FF9E4FAD980256D8B377043A07FC75D6169338028692CCA8CD1FE92FD60AD26
+D57B7519B80A8F8DCE9CEE5CDF720AF268D3C14099498A843D76E3B6C0328F24
+D36EFE7F5C4E5B5C612786200C8DE3A41EE5F1FFAF4097653CFCDC8F4FD32E0B
+03EDB3E413283B9EFB0AC33B055617005BC9B0057FD68C52D1B0E67F0C571685
+767F2AA85ADE4E0104A1C777733D5E318A22A9944336E5B98D965E50D31F357A
+8B6EA5A0EA98E1B027CE68C2EDB149EDDD04ED74A1B3D206D471A0C11C11449B
+DE190BBFEBC08C9E1B7513B43DA3134D6B11A2516E6E86B67F68C970A320D05E
+94FEC57FB347606DF89989C33482BD09D011C55AA920319E7B26A205D3D0F004
+22466F09C0482A164CFB27EF6ED2B040ECCC3DCAF345B5A73676F193D43123B7
+72FD6CFC5E37930E61EBD5A6307E4DE70194E6384EC0D79DB6AD86D3B319A31C
+8B0589D0FE28241D8ACE280D0530EE99C80723E560BB72AE9D53F4713181F491
+344B06D3027BA4E9E94D4305BE1D817197C54C8FF56CD6964165F6448ECC8A8A
+64B48B4F0FD69299A137589E2491A283509B21A3A5772F75B7602A9F60AE559B
+07A58436D04222C73EAEA72DE9A5A441F88D27C11F4F91255EFE280E91A4ACAC
+1E98A4E5E6C57B9AE86FD218C3CD8F24A4104156A80F13821384E529783C52C8
+78B94AB3A0096090867ED32E8A30980E737922037F75F062BD83BF4F5929BC51
+CC22AEE2DBBAAA001CFFBFF41D258424FAD888FFF1BEAB796A44E3126159E120
+7E4025C676CF94888A1971AEF8B6764B3AF4A92D36FAF6FC56FD049710EE3782
+BC2CD84FE2473F133BE03C1346B875463F126DCAB15C7A9BCC9A727D23611462
+4E8D2BFD2466600285D79518712B8681ABCD69608E6AA9578F7BD771EC36E01A
+5A17BC17E375020ECA59B43790ABEB9DF5F4FBBEF807E5699EFEAC563E1ACC5D
+EFA336E75DE6D8248E9381BB110884FDC89C2F9A41EBBC9A8A1F98E6A41F68BE
+EE30E25CA148C1EFF42DFF8C214A6537AB11F260B8C329A4947B5FC8DC9C5622
+4DF7BF4FBFB00380D47BABB03BC30627AA74103E553F55278F538EDD8C1E64CE
+0F1398CA0AB5A86630139B4A7E8FC02804CAFF3830114640AE50D2FDA3B561B5
+C63AD7EE3347804CBB40FB1E77A6C89735DD870351C3A1811591AB493251B904
+314F65791963C0412377C1D02362C5E9655F1C3D4803CD379A8EF24C48218C2E
+DF1165840462BF37DDE1B8D5FF09FA2C3B261E2F1A65ECFBE5D4EAD43B52C029
+EEB3948CB8A252CBAF545C8FA1C31E920E23A12DD7222CEF2D2A513BD758EA13
+DA33BF5FBF1D734653EB83DA2D374A5B9A0CE316F24EE375D6DF6BDA49954C2E
+DB25A88821193636119D469BA66E5DAA9C92520FD4F84426A4E54273FA469084
+7517817A6EE3E21176D333825E88046F50B3CF6938AF9BA79A2F51398239EB91
+1A2D07F7FCD948427FF62F40FF95E39FE1A1AA8451411563FD5388472251C155
+69BDE9283B41900B21EB1190D06E6B13B7794FED020D2C1BDD205AE77B084BCE
+EF628249398B496DE85B406FC2E1939EF00DFC84C07E26CF72EC401BAAE756E5
+7F6673216E7560D1C2A723CB405EE5CA474A07F61B81F8836482F73DC9516D67
+CE0CB770EAD755B6B356198B4B97EBB29C63456953270CCC8D5650C1D006E69D
+38DE2DFEAB27DAD50A817F0D645D30AF5B75A7B53CBD3D2B8D87BD0A7E525AF3
+22F7ADDFCE31716914C2318260C2E2B4664893921B68C5A93334A361D94A759C
+0D7B146D6FD94F0442D672BDA0F6432E18F3C5DFA37ADA378D95B75F413C9ED1
+BB5C606A3EC7DFB3F796F59B0478C13FD1900381EFE0BB5242D5B5D34D03AF1D
+4BDC93EAF8020E26CA23C8B0E7DDEBBC6762A557067A4CE05A524188A8F02E2F
+3625DA38DFCF381727887F5646A3995A8A38A5FB1E5D5EBB395FDD0B7C8E71AD
+B48EEDB62AB2CE99D121435EFBBFCEEA69AE9ED8238B60CC7288DE33C766CDFE
+15B767B4AE2E6CE0965E77272AC9F86023DA620548CFAC85BC751C44218A29C9
+849F1C2DCBDFAD895B54E51A569952ED50F82DC8A19F367E7E44643854EFD6B3
+FCAEB04E55E4661C82D31E2932611748480EF61FB2FBFB0CFB940BEA81AFCD84
+4C6A6332D7A600170E38A8EAFCD4F93DC153C43175434C86BC747348FAC61B76
+1FEC9027C1A193E55C80F1F20B5317AA0A05AAA36AE235F6E49F06E570FEE798
+84857D7552EA92EF3EFAD52DE39C2F8F43C59E3A957B7B926FC95FC4B60186DF
+7F3523EE2AB74E294C8C4BCD8B4975E84849E0FBDA6C0B0F24A636DFA578B122
+CF97BC5089E21E9F5298D1C9F30CB8BAFF6A3A11BB4D9A0A5CF2B18D055C44CA
+4FD4D8FE1AF3630907DE7E585AA811F9CD11FB2C8FC791851D651009FA5DF20B
+3C33FD2FF848A9E3F5652BD294965A332DD3F246C91B0ADA34017FF2451D1394
+F9C3C95AAC6EC8062BE98E8914D51DA6A164AD13938693D446044859D03A949D
+F9AC5DF4A000CDA98BB516D762CB9F6D44B5268FD0C26E88BC4A760C0F75A140
+DEBDECA4F511128B7D2805872160C55236F0A0FA7637FF0D4E94AC079CD3C8A7
+D03A5A56F26B0438B577C46011A10532FEBCAD14FBD6032E224F45691A726886
+56F305231EB2FCDF59C8BBFCB5DBD2D093A0E84D62AC93A2312CA69295E937C4
+8DBA1802B85F54B5E7E6D6216A918F911FF705D3B5CF055F1D873B96283A0B53
+59344D910CD396D883F6F7836BA65FAB4393A773A8F6BC298069E5BA38210EED
+49C9D920F718E3FCE692527DC7CCE6963BF744F2C91BC5952564196D60574E86
+87A0FAB21F2DB2BD5A51D7FBD8FC19946D24E5A228462C4772F978E650ADCE3B
+8D66B9C21279C531CA1C3A8ECE3420BB65837287A7222CC3673A2A5F8BBFDB60
+C719CD073EF9A23675198462C7C87B24CC92D6AEE5C25AC63855CC3281494342
+D28F3D2FDE0C183486769A4FD5B0143193D31FCB2C2A14E487BBD96D0BADBB64
+D1B56021C363A795BF10E2DB448261C363A54A4AC1182B470C457AA82DF3F5D1
+F4B329806141EBD53CAE309319B94133D7EBDC2D0453A905ADD207364371E178
+0A95C2686E3B34C4A978BFC0EE968C39ABA00889BC5149162C2B54483D44FD3B
+5CFF41F611C7E03B94945F414560E874D7CF27FFD0630890D7D7EA66CBD15448
+229059E1C436BB33D69552B5367AB5D53591C4678D0C704DD3EA23F5D9E8A7AC
+17D003C19E333E726FFFA2961F33C70F429085F7BFE3E2510F59B78F58B19CB4
+01B48E184BAD9020FECCE3AF52048A056981DAEA02AE78197E65855DDB170616
+F54278395D9EA50DC83761AE759F9CDEF9E1948E7002414FC05286ED793E6662
+3347F2A9AF8917493D7305B92CF93E8E9185F70015F5594084298A6C2F9FD3C0
+689F262AC9FEDC9B89577ECDE92F08D3142209FBCE7B5C0A840CC767BCA56C20
+4E4E545E2BE4D21C53855CEE4CD0AB35D1A604C0FFFF77DBAE4289752276559F
+A05FEE65F45ECAF44E95E23FAB6052195C7948AF0B1126482D4E02D72BF8AB03
+DE0F1A632F7672AD9DDE70EDC82AA993678A82BEAD0BC2649C4707FD8509810D
+364B5C6FE0E10772E95288C622C2F06C634F4DF8C7FD1432BC9310D5F24FEE3F
+7AB324863D6DABAA1576E70643CA79EF4D7DF4105093D66CEE0F3B87D2164A7F
+26EA05F5C4645B22D3E1BFD2219657712C168FD90DE801FB0F32759E80DEC1E1
+43CEEB19FED12D757205043FC98FEC62D6A8D8B97BC083B4A0E985AF7850D6FD
+8716B9957C1C35A0675BC53DF672C425C79F43FDABAEE7D63F092CF271C9A9D7
+C41F40C4189510987887942E60A412B3EEC84C9A6E1AC7D54D528F5604B72C08
+94B7882621A5BF1F325B92FF96B80878CC550D1AE4D8196E41CB1251856609A5
+C4D3BD05A922D0D45E039D9450DEF8490A3E924E41434194910BF60BA1B08BE1
+B41824345627745541A4F1703E956328F6227D11C74946B38CFB096139979E56
+4E723B889B44C6D78673868C89912F8B4F0B4B485F1587A637B630F92E6072D5
+7F3B44EA6FD96BBD4FC28A6C1D90805E3BE3E42A7BC9C880762966C55BC04E01
+204D083AE976FAE6F37C94F27E68F8C0F28D52B17F6C0FD7C9150701FD78F8CE
+B8E8DC9260E3974005EB5CA728171F482D765016C94D4ADFE4A42EF42212BC56
+7E4EEEE8B0D2A7856CD4E44F55C0BAB762F92CB8D64C17022D4BF3A47C12F5E6
+279FC23101FEE93753653CE8CEDC3B75C9CCB29BF1D4554C6120DE8EE750FCBB
+E38B5D915206974962E320362E59B3F21B3AB1875703191043D03284D4467346
+CFF2F98CEB4845B73ED8E003E0DC94251B73E13A9B51A3F1430BCF6A21EB9B7A
+65E17FA411F53BE6432F1506232B8159E008FA257F884A4A01AC53BE91754D78
+BF14A5B0FBFB9C31BF4908355F8A762052968DF526D118708CCB0B7CB5BEE285
+6DAB6CD2E3934178E60BECB11AAB5478623CF6C50C92F8BB5D1A583609028FA7
+B8A53B791BDC9EF76A124F3F7641857E4BEA0837CB36176EC9A522EA7F41B8D3
+63C37D1145367BD300F17B54522A834BBB74DE12BF9EB26ACE6F24A046D58F89
+4D4B7DF74875F1A0C1C9D97BE0849593D7B398EB4B00BEBC8C8D1497B6EF831A
+A35380FFB7F1AFA4D888AA52C9482E8B1755CC209905F98F40D95B44D4DCBCB6
+67423D1BC2F3560FF0A8B4F0CAC352A4EE2C1D946E45AAEC8A6AD40303F3382C
+DF0756BFA3B1ED64C169E56ED1C760F2FF0E24DC5C9F41306EF8D2628153D30A
+5DCB0791126BEFD4947D7EF08301FE015F2B0008DFFCBF9F2D4D859FD43EC7D9
+C5BE237E9BF6665B7B1BEBB362F0C0C3A8D86010B9C97FA741C97C2E0513386C
+9C26C235B14DD2A58BFDAC7B5F63DB4DA6D5D37D0098175A9071590E1DF66A3D
+B8173A047C29D7D35557F06132CC920B5460B8AFC11D23D09A4E45D089F5EB51
+963FA1A6256E359D485107FD143B2BF21FDE9DA5744BC2615E86C31C89470CF0
+D06C6397D9FCCB316EA9989430240759D2C4945D941F159FC02327F34B042BAB
+B5C3A47C78E8C1A6FBCD396B1A51CC4B020B8AD401841EDABACECDB482D6EC5B
+72D2BFEB4556720FADD49D07307C8B22ACB7E310CA4151A85C71EEF70E8D15DE
+B3B00F26E0E166C14647A65ADA228A3D1C89025BE059306565DB1B1EFC37D358
+8C1EB024254AFD049BA977BD4C2C605050E17940A89D0D4C5D963E792320F5DB
+3706682E03D25D9E02487247819551465092CC22B6B56E93F3AB528038FEC3F0
+668F866707A19B0463BE706EC729D2EE1653AAC7E29BD25BFB3241D4792F5152
+ED415B4E7FA92C2EE5A22E27E8B75542C492E56D811C192E95542A6FE0BFE5A5
+69273C2ABED4300D491B92D2AECDD278404CB84B1BB1BD7AFEC858215837D118
+C0E928BE7E07CFEEB51A6D21375B772B8248C994564014015232A0DA4BEA1754
+3274F407FED0837A236371F1A32056240F2015B1E7F4B2CA72C6B58610A66F13
+407CFFBA5E0A2893C1F572D50F51286E9133B5A84239C9493B0574E77D281D01
+11D00683354A000C9700EAFBC1FD104EA19DFCB87470190E7E2CE26E3A6FD0FF
+2620B87B82AC8686B6206B530F17E9348BC7D04B948348802CE53A312443DB87
+4DBBA5313A6A2A8DAB8A1CC9A594FF8C299281C0A261C8CB2226B732FBEEDE40
+2C6ACC74A1A61379E2E1CD5548CD908268A32FA83D8504C442EA0E183ADBF7FF
+9FD09C037AB03516ECCA93FF048235BD11A25DB07F164512A079C5392AC7F889
+CE96AE5C8D9580BCAFCC087C35E76EED1A671E87C12E3045E15A687134736DF8
+DA984772AFD189D68571A2ED7256F1E204230E41D3D9DD876F938951714A3973
+0CA9310489F8E807C1C7A4E51AEA5BC030610A5D7263FF7E0F9FDE3E5E37A362
+5B919000BD94D978583B942EB79CF2BEAC33FEBC9A67272EB10865BA8FB75FD7
+9D280AB59F91B96C16C982DE848D76D8FA8620DFD7C80B7DEAE7264350D6FB3A
+EF04794DA3305844A7CF718F6D1A4A3AFF6826173A076A1372ABFC54ED3AC6C2
+09C9287FC830556CA694E21CA5342ECA7B10C90AFC4783D841D7B1E34FA3DB7A
+2B706F3E21B0FBAB23E7257962FC3BC309CEA2C7239A9D6B44CC96825115ABD2
+AF9A2566D2F3382C01569FBDB94C8D664A5DA0F7DC3DD140CA77C743D7BC1420
+324ECF9E4780280EB119885E96A6C619CE3C0C8E1E264E2DEB137E5DC8149786
+486D65667ECF47B1A1E20E9E6E4FC8323E0BC8E61BDD3BCDFC6575C69C03E31A
+EFFC290472CBBD049DE3F840AEE37A2486034240F80E75D8A79E0762377DF660
+52B12EAA16D678990B11A9BFBC03C1D4FCDA9FD4FFBB3E88352438102F10B7C5
+9F04C013B6575B5E948FAB58EA691984A0E54E6B9F3F505FFFEF74D06FA1CDF3
+4B8A95904C8A2763AA8AF5B71D00F5DE09DC1CDF87A08B6D181453063E14C12D
+B7BB3775A6E2A901636273D9EEB833EA8CF20FD83AE899E28DADE10EEEC20BD7
+BD93085A4B1AC80AC1AE8280C14767F1A487BD066007A0D050317BD081131A14
+6EA0898ED59E46DA7B6254BDCCBC660686E2EDA0E77A705A653733BB5C5497D0
+B130359F866CF293FB6EF0C2AC5BAA2DB0DED045E2DED3A2612D078333260359
+16CF0CCB272D34767EA069E0F0B0D42327A18529D72E890EDA6195C2688438ED
+E9ACDBEED41E81CA8EB5E43C2B09CE266EFCA03F2D7FF57F12B06F9E54FCC6A6
+546676F6FFC5B8B7D3F0982B6FF0D21D949309F0C0B175CC1D0976F8C55C6AED
+6E821C39041E22D91AB30922F2B2EC2746BC7DAB484991542FBC82D87B487507
+559AB466F73EE23C2D3194DC5CE4C9AE66D3164613AC5CBB3DB501B64DA7C91B
+C7ED2EE9027FC0906820B35D4F2CF66C4F9CE4A884B7C07155BCA884ECA5EB3A
+ABB83F84DB1F5639599DC7D3F51241AB5D95C3BCB7AB1EC90B4BC989F74FB354
+04B2D7366A34D335A47B8C00C05CB423482BF6C7970A95545424A08AFF9A035B
+7F83F52B65A9799CE76E303B85664B624C65E9CA58184C7BE2BB9D9C86A4DE5A
+8165EE3DA2E652B5022EE7893896BABD88931DE1D538F615787645DF5ACBBA0B
+A8E5B899A37321AA7D4B283AC9234978C2DD81813A1EE5DB6EC170DAC1B6EF02
+94892635B498765C07A38D2E9DB0B7581B11056C28278F89B0E60998379C07EB
+C0EAEDC32AA69B8B836F92A61AFD35688315B2C3F860632FC13E4BDFB63214BC
+41CC6859EAB3AC3034449213CAB99FA1D216563419CD6D6CE4E1B56F33E6C654
+7AA9DCB5B05FC068DF02AC32408C8010AD004F6CCA9887830927F8CBCD49CDB5
+18CAC1EAFF815FF2F6F527F936948201565003022C6C7390B4E3C2B219FB4F76
+9F12BD25CA7B3B61D1A2F8DFEE795D04D5428B42FB66E0C254AF7B7A10CEF7FD
+E5ADA5E217BE24851180E9A1700FBA66C7D2B0D7BFDE4F4EED1D24B821A40947
+5620363657F6D048E651A689822CF815E72FC8AE9D835BE31D1DD8B54C9A717F
+4DC319B4B59AE073936EA40B070524C7E71D5A7B64436DA107749746B516E29F
+E3BBCB8F8C473E706670E11E5B221716F315FF097CD1841D0069FA69EA1898FF
+9F9EC2518C77806A19730C97F54BEAD604548D553D4A6EDB247853225E24E7E9
+89D71F6BC94DB986467E755CCC99069B313F5745B02B4BB608A39F0A0A732B87
+7EA2DED68219754BF1FBCA350327572D769C962EF9242132D93A5C8E9725D8D3
+AAAEC15ED0F362471AA58488620156F3474FA59CA080EA96FE995D2B3DEEADF3
+3141D157481C66507725ACA5953CBBE1ACEE7E3F02C72C6552D15EB3D612730E
+61A06A43575568DC3CF3844BABF04CA767E2995196097015E0C4F622C4356B6B
+F41DBAFD797A4B9D7AC22332C552043EF98913D0D9B50CA6B7CDAF903BC5C04F
+D20A952BA5CC35B646ACD0A287C956B98C450051AF6AAF79DF37F8954473F8F6
+652BF03AE2AE82B99D820CF93F5FC0BA17EBD7AF90313E70594EB5C354023BFA
+07912408F1757319C7288E99872B907D5AB583B082EEED8AB079C63E38B07D11
+6744856E689A479CB3A8BC081F33CB06755926204981DC0A45B3ACC18F6865BB
+EE2C50DB43B62E3630FC1D9B1FFB3BFFAA6D0A20C0381ADF48E4D916BEE85BA2
+BB40F538F55C11D50F882B73913840B45161262BC8B0012694C3EF26452F9B77
+2CD7C7AD6BFEEAFE31C8A721C2D46AA00C10681BA9970D09F1E10DDC250E2AC3
+9A160EC8C9654FCEB36AC2B586E978D54744FC8A0E963D8EF6E228ADD22D093B
+B889C940206F504F14DD921D909BE06EC9BACBC23EB9E9D137FBC983570FFD2E
+CC5D2EB5D2A4A8604A4AD418B800EDC6B89809E00091A2315EA8C071AB631CCD
+04C3EA77541646B7F9D70B7EA564D92A65C4DED8966517660EFB9F77E172CD8F
+1B5FA83270898C3709DE964B0C4A899418435F92C13E94F5C1C5B9D7DF3E8793
+5F9E83CE1430E3EF275C26835080FD2AC78DE88BF65298A8EB4181F215181356
+A09245577F997AB5F23F31DB7E081C7385F461B083E96E3F08890BCEFBFBB6FC
+E597C3F22E0F0F7B6A93C55879A8EA022411E0C1864E987D2F00CE0427E4E8DE
+D92F9621E3F7751A3CE5CF1EC306A78C0D1CC6781A016A285C0D195E17B59A63
+C593D2DC78B6071636FFBF968B8E7970871E4B60DF79B9BF341528C4F0C5008F
+191FABC891AD46A68212B20FCC87E25AE386DFA935CC1563EA96F1339B6CC859
+CEA88CCE5DD0993F19E3902D9683ADA47980535FB5597CF57C046C48E0D0140A
+C40AF806F16E94FA0C046C0F32AB5BE121A7157A42654E7C1FCBA31379FDA9F7
+BFA8A0D0384D3B29B9DEA1500AFBE314EF78B201E5F679AA38F12A87D1E1512F
+F71D12EF75F3DC48BD8BA01A6D091F0C5B2B961F4371E588F79C825EBC124C1C
+E334BD4714EDEBB709068CE0669738B49AF675692317C3E530C6AE57CA21B59A
+0B542AC77FF404DEEF116796DFAF46DD8C9290CDCA4A16FFE88A0D60ACD6CB47
+440014F30DA7C27C199D99A1E6D89D0A0C31CD1AD4891668DFF5FFFAE992F10E
+C7B88872E9AC808E0663929D199AB424136E03E284D8F44DF9235246B9D22C9D
+79BBFCC936171A58B943DF0EA5ADFE2818992B46DF97AE05915E078FD6AAF8B7
+1047AD85A1CB13CAF70D095264B8AF9A3FFE6A603B10EFC6A20DD56A9947DC94
+06DE0A6AC5B655C71870FA1BA99322E51D46A52D3E7AEF8189C9F1DE58AC9833
+7B325CC59375D0F61488AD740909A855DC069F260A465080F5570CE7D41CBADA
+47C1AB404D32CBE9E1B8220A27C8003ADE08A63AB714709CE4312179218E4924
+6CDEBDCAE80C39AC4063789B6A407EA9C19D12688DF86B62D63BC05E9D65ACD6
+CD5DBF04B896DA28B466D584426F531F4A3F9C4A717A0C5ED8C8CB4191E950DB
+CCD311A20B14B417714501AEB2F6F8510242AF91BEDB6D70B1A52B91FB3BBC8F
+A8F9731E745F2BA8ED8B00CFD8A93B2BB05DC2DFFB5EF265CAE08E9B046C3F0D
+9DD51BECA540149E202F9042A94113745077BCC293DDF27CEB36D7B0C78E1B9C
+0308C3A413492F0D59409D923BB699CC6F59285CBF31CF7F1B464AF4BC054880
+B279621391D022E71427F275BF550881FEFF31BA2071293421FF99BCAC2D5483
+B7E56EDB7929BFF410A35BC193DEB96C4A1894D3D262DDCE224ADC5C6E85178B
+40FE0E15AD22D7B2F6D066B0DB42E32B026967088FC62BF250842B195D82AB30
+4A5263BEC475A33ADE6EF9B4205BC44543AE6912F1B9BB3D694AF8E9CFA440C2
+E2CA5DD42B637763D9C96DA8DCE38246532ACA6AC4BD7B8F2D348A0A4BBFFCA3
+4CF17A22BF7AF3BC490D254639584011D9D515EEBB719246499AA89CCFBAF34C
+77541F2112ABE03FF03C5C8B2BB07DDA99390C222C7CBC96AAAFAB4EE6391224
+6BF97923CCA98DDAF09E5E01C94798C4AE609E954BF1E40330D66423C3CF96A8
+F6879E2135374C80689F757F71375E333A3582C2886F0615F2379DB47721F6B4
+04385DAC971DE716D5AA2CA014EAE9FD0859A89CC62667BD404A071154F7015C
+4E1C734081F61F33176F8805AEA5A95E427712789EF20881BAC36C6190971AFD
+B876670811FEB1DBC25014AA98D3D0D9A29CA7D853C8118DDE2DC2402DC99211
+438F8A380EF1BD24B442988AE5DD9FE3A87B54BB834F2AB8F69241E7A10559EE
+9E1F3DD7597A041F96313568639B2BB50A76FE62D7714AB955DA07C374F642E5
+2060C46160DE1F11ED73A837DEB4EF5FEF9BA654837203FE8BCEAC3F500A0957
+9E673A257569C4D4E6B00BF84FBE1A8C9A566A77B3693FD20159F95F66AF9559
+A80D47C776CD363E299BEEE2D5BB9B10B58B1AF2A76242D59997773834D8945E
+F42FBB1E75B90B6BDE5E4DB2E2FE96BB5B8E485E42682E9F4ECF97D61D441707
+9D2DCF09A0E67F4027A9D1072FA8934106E9D7156F7333342BC640D6094EC706
+5BED449D636E42046EEF2AE810351BF1E38581FC71D1BE17BA690B2567F52A39
+1205F2704B712B22C4AA4684CB74785537AE120F66EE7FBB73A8C475477E1E83
+8D6CE79D788B1AE7A159013A2E070123EBDA58BE4DFC8BB39C3D561E2A2917CF
+1B3F64217ED680EAF63F04F9415D7F9CB6A5D3E0BC2A6EA4165E69CD8F93727A
+4F4E9EDA653BCA0422BFECC33066DFDF3E4AFB32361ACA3A0C339E1B4B1F99EE
+EF4C3C3ED1FC3E7078F7FE282F0F6793A4C18A484F1062F780D2947F2AFF2E84
+182DCBFBE1BA25E8346045859715EA2437263F6CE83BE0B858CEE6A5CAD60BBB
+45723E3858702B52B9AC50EA918DACB15EC541ACDF19782024143AE9ADC39A0C
+AF0B2E4FCD4E97EB36923F31341B9D72B917711F55F4ABE40E6B5F732D46C76F
+02BF82C68500194FF7CDEE3CAFE3316C4643295F769C4BD964C3BD4196F7DD45
+EA2E80DA6C2B8A23DADADD50BD28E2DD1BE5852CB88CAA6FB71C40F8EECDA3BD
+CE874BAABB668133D5001FA651BE928981AD1A8D95ACDFD83095F12B3E460DF7
+2B68B2C84DB441EB1ABA2DED0E9BF8A04B1572284498AFA3F6DBD1D4DAE8D4EA
+877B0AF0944DCF4B6F6B55ED1D99ECBB2A7393DDB4634FC166A47B4D5236C543
+F066200A255781DC3E2E583A0288C1874BE8C25A7C13214A79DA8062B0274429
+57264A9AD87F246982C80FF9E34473082B8A836A0C83FBB736DA740688432090
+3EC63BE175131C8CC487F76FF44F247B7951454D01876332B4DFC27CCEE5476B
+68B432744A0C3689D1D79F2B876A30975783B96F904B92F39D2D3FAE7ACB1DFE
+A19A42AFE6A2318B0E3542440A40A69FAC261313DAF36C61FBA307C908682BF6
+658BB9FAF140EE91B182D763130FCDF172B811359D669E86C106679FADF3E2C1
+F83685B6CA73CB8E1D58323B6A733EEEBC0323A6F23BE68E5977EB3D881522F2
+0E49440AF248939790089CD9615F24D9370355054A7077585637E6D80E13574E
+B802422BDE06ABFA0D1601D78E215DEBFEA118A5CB82E68C5EA656FE97A5E1AD
+01A8CD577848C5DA4B9D780BD1B0B4362FA271BEA800890613D8247171938596
+CEBD54A77CA281A5326F2E6F6111C5CB507FF35387ED3D870BEE3C9F06E6E756
+7E84D952B39B49905AC2C1BFF606AD3C07E45A768BA1969F865C58F3455FA101
+2657884B120E69D4D515F8BED9D9FBE928CEAC720A707BA004D95434D4236957
+86A7AB03ECCC79A9D33039559291483B27C66EFF11B3540F7A0E8716584BB29C
+EA6259399E5FE1962DCEE55E4AFE699A7BE7E2C5081D6F025F66E4A236E95C01
+9ED2BC2B369D0F7DBDE3F53DEF90FC9F29DDADA413EE3589BA2C9B802F9B5F44
+E00109A44BBAB43AA4E86B63C6E1FE10E8C7049EA6ABAB908C0386FC64BD8C6B
+BD8A089A521EB06ED2F433059D5AF5B4E1E86D6F0ACC65A5AA9665651E82F38F
+10ACD33897B4612A7D0E08C92FB67193C5F16DAE8017F3F246E509422F8AA656
+ED88EAE8608354A2F6334559DE541445AC1EAB60FC9D4A66110AE5DED90584F3
+EE278836F121144C3038D3B47D9751E0E2285085544558F53464BD908A71B94B
+57A71E94C110C8D8DB565A8C6E527BF7E7030848FD2BA4E6748459CB4ED3D0BB
+3017EFB793B2A8627F7AD99A9602161C8FA3B0A8B89334D2082370A87CBBF01C
+5F420760AB1F70F2794B3C98CDB70BCD5F437BF4593B1BCCFCEDA9577FB496F3
+7E86D7D3235A4CCB9D4320925AC726AE1A27113235E24FAD6CF43365609990F0
+466CEE79F0C0EDE02D2102CB024C9DD90E9863AC9F2C8A6E1ED0C4A2193103BD
+C2426B358A2CD7ADC8C1F875D672E220883FFED285666956EC8CCD2F6D5BBDA9
+4907A3E13EC09DA98DEFA48721B1B1E140ABF1CCECC3D17D364D5CE4021B8D28
+546FAEB139027DEF6E4A11312A6357B25B6601E8F6816C413BB16D9CB7535E89
+3CDCFD4A08C51D5310A114E474CF1C48B06C87FBE85E2186D1B8081A3C9BFA67
+6CE5AB3C5ED7539F05344A2A061F5D409EC6D03E5769BC69C6BA042714A6DA0F
+890B03838426C5C69D393469CD8FC4BF4C5D7BAAACF20F905FD7BC3246189A36
+E1EEDEFD3F488362478967755E9C2476A76E8197F91F855586B9D8D8E79FC4F0
+66C4D6E151ACA5B821C74BE4A19E86229BFCB3EEF07A2F6DD59F4CB5511FBA40
+378633B1E5B6040ADCBBBD31C7722A828642A38E80A42A90A1984881D9107671
+91F2A5E50887AA1B0D3E96673A3FB85D73EA75007D7E30D21C54FC8224944F8B
+6FF866AC71499C6F5F38A54EA4269AE591E9BE9543FCD72C49BCDE00A2FDDCDF
+130133FE649CBA9A607428F71FD761EF81046CCA214F7DDCC1A0BE0EFC7B05BE
+85D1DF5606F398DDB0413766DDE50E614EEEE1EF52500129D3C6E25E09B7594D
+E5F86EBEDC9A262FBC012BE5E4044B64E8F86327FB10EE5AF01746A46971BF45
+73A7804D9FBFFC791A2B38674EB34688108D1A05C6A58117CF47CE531FB6B84D
+7419C0C6A3E29C6BFDD122FB1D4675D2510F27032BCBEC6BA2705EBB37367CDB
+40EB8C8ECF19E2B507FA4B64F1C1293578380F289D6F006E78428669BE48730C
+9DFEF090304F4EA254E12F422316BCF1D3BE6FC7DCCF5963A646A909380BC6A2
+32B67F5C312FEA9A1AC7281EFCBDB4D7ED9FACD9616DBC2B14D513BBE956F29D
+191748D03650D722C48A49F12CA6A7C5E211E526AA7071D951511CDA58BD0CD8
+A6F821F4D20C219BE6DCBEC9C04B61CD7EA0BDC7A528FBAF88A5003DEE761F17
+32A465D05343ECCCDBBD9E410084DE2EA145AE58482B5EDEE78A4BECCA5D50E1
+FE61847CD91FCFA32C5D83F97651FBE30DFD72BD9536641298F062669FDD8FF5
+06F837C2927B3DAAA6EC88DDF23FAC5A77A4D79E4D6501288458897E6682666F
+C94EA8ECC173CD268236D759A04337A123A5D499CE0328168B6B13E6470200D0
+725B87023AEEC48256D4ADB2BD7B6C960F2C6BDE3D2DEED6EC5C270CDB33195E
+78CD19CCE6A80C7495628B11355F2E560721C29AF77CC7CB9B2B3EE5DBDE2185
+47ABA4CB28E69F351FCADA2765CB7457DA00A683EB485EACB21A3D72CFE027E7
+3FAFDBA8B5A44F46F817690D484E5F57C00B139B5B8195701CEAAD3E0C4E225F
+369AFB09115B8CFE8B09A31AA43CDA4F6A70C188183A7695DFC0E6FE024DF9A7
+796933FC2F94A70B64576B8DFF20DB12888E0C0E6C69EC10A3787DEAC56DFD0B
+9DE60C1081EC41D49B63C8E93A29657DD944093DC8E43BA31396F7BB08D6A773
+5E6DCF48F5FFB922EF5C084592914AE4D236F9D227CFC55CA687F1FDD8BA31A6
+309110D25EB61F5882A6B3326D3FE04099B986DFD407D75B21DFCEA02551CA95
+2C8A9606039BF8C268CA3F761274457F6E08260529E8EA65B16BC30EFBB1FF0B
+181EEED4230A43529E2D95E7ED03CEE2FEE295B1616E6DA77F50EF6190702BA6
+B0DB00F3AB9ECD4561DDFC45B4FCF78F81AA3132C273F4FAB4839DDE5644DA35
+1504DABE027DE826F331F655E28D7EF3BD8848439F4A265D5F78A20B8E626DF7
+684B174333448C107EB6937F8E9730A86EBC26D86415EB8B2EAE82E384882822
+C03090F25DB59F163596547E62A25B4C5A514447522C9A2DBA21023D31EBB946
+51DD3229B562ED5604E4D85D54D17EFB6A03AB5C59AC2E1FF5FD951BA5F85419
+90550337BC83F44C4C503609AAF3EF76845C50744FD18571900164DE71BD06C4
+CA06177A36EEA8C1BCAA73D5468981227964ADA6C27B06519421D000C0E1E11E
+B210F818665010B3E8DF82277C8B1E6BA61D51A87B0B1175E75A6A88BA55CED8
+C564F583090C12A3CFE29303CABF1E88819F226D8F29DD2C2D999A35C8121ED5
+15F7AE050E5ADFEB0F8A87065A3FED16AF811F7A74B0A9AD18F2F6F5CEC824CD
+FCA9781998B67088F5D6C0203DBD9C43D886844B9C0970DA4BA88799B4ADBE5C
+2E2B7D1EFD3FFD0FD130E544083FDE0E3793A354711F1D6CEFD8ED99CD29A5E2
+32F7B1EB4ABDBD7D86FBDD8B9D22C429F1C50277E859039E8E6D6A6F3EED2CF4
+4BD04AB88B70C071175FC6400304EA0BFBD02FEDA05CBFEC31699A0A244986C4
+C688E733DACD7775386DD2CE86716AFB5EC33EF1AB10E63C85B820044A540703
+9FF2DDA0C9B0A4F90970DCDCF75A022AF83013DE7A3D9E544486225AC1601CA5
+21F356B84BD903067AF45598964A0FFB06DE209D6569D00190C0140B3F2B6D54
+C9172B77422B25001D50BDC26DB1705CC2A2C09C582E1945BF8D20208F505FDE
+DBAB67848B8F29300EACBE3F393B2648EDE71F5B3ED721F81807B7624A7D3B75
+C458A8211FC0CBB1D2125082EB9E0A37E468F2FFD1866862D3C3A2CC9D8FB07B
+0B457AE1A3CC54474A1BCC93CD21BDAC95A36239DE043A431839263509389733
+79249412851DFCFAE1B2163738CA5DC64AE5322FECD2F1FF852554292DFEF94F
+BE8ED5A3E72E7F8DBC91EB990D3C055E4C91990D389C511747D8D7F7BC33B34B
+F3EB81905DAD0E88A31C0ABB4CAE612F7911E9D338F3F5498AA389C20F30EB11
+6953F4AF288850CB7425349719DEF18A290CF40B27D625207FAD6557F80898C2
+EC247A4FBCD884C459DBA0D3A083EFF8D0A133C0597CE5B2B803933530EE1C10
+A88C85564AD8F7CF7BE09AA5406917E26937AADF884723F1BCC3D5B4171074B0
+B21AE144538B141791B901E3A12E7B4C26CE3ADC9E2A80305F6B983F8B3262B7
+23981BF5DB92443B3CC866C0D17136D3C045036F2C7F39C33536E4A09F76700A
+E1CC6880D251EA090FB88F555FCF201D4707CC95169F6AB9878A2D342DE5BB38
+82A2F02186490DC055DF783118EE78C1E02685E4F05A0616CCEC0DFAA9ED09EB
+847E2F9911D2F5276538A481A17A8E9B2A25D63242918A78F920660B2D77B7C4
+12DF7F369BC3DB114A7E9CEC7993598FD71CFB92DFFD8359E22AE1B1B124A856
+EC29D9F05A660506D49167544588FA9BD8BF8D23D9CF6559180C532680B1CAF1
+9B776E24F1F8DAC95083EEF00EBBD775619173F7CF4139C45804C23C0C736414
+303C465159DAF5CB5153D9A6638C8E31CDAD0907B6E4BB41555F8E0FB5B799CF
+BC46A80CD1D14ADCC7EF0D2E16A955CEAAAA7554C70D27328B4DDE0EB50DD8CF
+62E2A4A40740F5A13DFF032AC5FAB6EB0AC3F6AAFC32F0AC635323538E91D8C3
+FE69E72F66ACA72F289FE2A94B699958F5123BB7864AE46E1C2BDEA67946BE1B
+2A65EF0D2373B40FBD107E619AE03B2FBC3CD29FF68BD79F86CC6CEF3C354C3B
+08825FC1A96E2A993EB37F8B2DF2FBCF2CCCFB032351AEEAF24950E8F428FC67
+A6F668B6F8956411E70AA3224B7E24FC18F0E9251DC4E7FBF2FAF57125576412
+33BF3AC7B1EE19C164525EC17483F68ED41CBC6182D882799DBEBF250E9334B9
+1E201D5D08BAF01FAEA5389AB934479A29BCB99F3CF8D9FB5022454C6A9CBBF2
+05EC3BC73DB4AFC552B8148F42774AF8392C5CE42EEB1780E003F7F5D61265E5
+EB18F7B139EDA4169FD97593C10CCCADE160437ACCD537FAE3BD1C0C10A6663E
+ACA01304DB5EDBB612BF5DD24CCF6D1362278B3BFEFEA590B255D2DF95AE4193
+3F33C268C47B75B9D008B9F5E17E7D13EE72C1030A05AF676FE29368D4847055
+B8EB37074295EE705B9EE6229155E578BEB24A8E0106D20F475AC4B6CED93D40
+CFCBD74C0551A1F532F2E19923248030F3FE1A717B9A9AFD494918300A396DE4
+3A2544B6C6A8D8FF2E28B4711AB72D25791B8E8FBC57A698AF3CC9F17B18F07F
+A86CF80D0F4ECD065A579743FD7974877360CD910B1E7BD3099B4036D6FD0BC3
+A80C96598B59B8AAE0BE7578B7A68258A1F6EEDB774FBA7FCB4952F90705DD5D
+F8A0E1B6FCC7220DBEE1582A9168571A80D95C939DE1A3A404DB4328E107C672
+AE8122A745C918280472EF626D7137AC72E88A296174E5CAC33E59C955A55A2B
+49970C8D84558F3CD22F53942959A830FF71FDAB7A73E0F64210CE46818A781B
+071FF5CDBE768ECD3D6D1BD52856C236284B4C0CF40E377C694D74D165A61DB3
+192E4D4C197EBEFCBAD48CCAEB50AC8A4D52C2C1E7A4930768FE6AFE6D286F70
+BFAAC5295CA89B6329FAF994B8013868A7E9F5C6D6C71D667950996C2DED0B80
+7F0A8F1A525397D9A41AA2934D3B8C2441C010888154A14499DC6D3A0F0C247F
+37D8FB45847AA94F37C8CB299D24F608F01EFF597BC9026724E200BC00629354
+21B2736A497796630DE340AE317E2B04F20482EA0206D01F90A83B7A56E29474
+5F0196DF23D2E8219E681908BD6D2074794C620B2330FD5B0E6AFAB092FAFA45
+BB2ED8599166A24DB77ADC449699547DA0B6683BC153135FFE59D9E650E78518
+CEB174C35115A94B8689B16AEA36D25A49B694D5B72DA72568D8FB2E10878B93
+88D754D6EF8E035ABC26382C2FA13A75040A1B332C050044A81441238859D8A6
+0A33E2DB068D8F32D3047EE64E31A6E79D9BC344A8B498823519372F5D9E3310
+7809F989C979BE5ED9F8E2CA6E0FB8C68B39BF957C8E425860D6B1E75DCA7867
+E044250791F3757D649BA897246E233A8D7B686F137EEA37251001F008DE01DF
+BCD2443819603C03EA1301E4D809B32DCD2F525EBB839469D0F764FC978D82ED
+AE597DF1EB131486B00F65BCC29396FDB8F75728AB03E71911C74E5DA6DD6E59
+8C4B1F45F77854B200DFDB656898CEDE1B7DB619B9BD75B90C075FF88E1BD95B
+5314EF039611A4A793C31FF4F2FDE7FE3F9A51C6DA4080A7BC7DBB1D7723488C
+E668E78E025B4D2F82C5E663B02C5024CC35459FFCFA5C5BE9C9BAC09020C603
+AB653316994DE4EBAE83A2BD866D392B6D46D83B9E7E0DC2AB098F7C86431D31
+D07C1F41955C777C635B022CE5F2F503D0D812B3318E9A792E42CE4926661CD2
+950F1A3855D694B2B061ED5CC64E6EAEFA1081A5CC322FFAC259C01D272C8A30
+4416D3B622EAD1D1B2B6BF7EBD395AE45922CF3956D9E9BB557E2783F5C8544D
+C3509410DCD994247B50DE3626C33650F9F76334CBDDE3E90E9D9618ED5A78F3
+FF7A6D01071AB4BA91FB47BFCBB3B8E54528E6540D75BD5EB6A4E301C2B49330
+B6866A4BD4AB5CDCD23A8BC873D212C2A6592D62EB573140A6B79EF9ADE701F9
+9D2F8A7205A36AFD20572C1A5C5F55FB8FEE492D999FDE3C641BD8FE201F7975
+2D9EA9C65979BB45D2EB33F5C3A85573834C75DF4556C6254A90C7499F684D22
+7B434CFAAF6C118DAE59E0C79F327F4D8D260D9A633DA0B02079947316C84D88
+05975C05A1734C88FB0A48BB85F87560F1BB214259EE46F5F3406E418B6EE281
+0F93F058DAD0F43B7B0EE4F7C809FFC30366560E98DDC13D82DFD58C0F8BE287
+374BD8655C4691E39F4660F5273E5A545A10BC582D0592CE2DF452D9A8731351
+54B163AF681FB97288647058DF71A290D1EA6DE31E60A4CB7DB4AD2E2928D738
+3FA9E4801278B8D78664E5E3F7691783F71AB1CB2053567466D21CDADAF4F97D
+4DCCE8DC1CDE465AF48A37E21DDF443906F91731614029D6F3B8ED69A7F77800
+F3C6ECDF7BDCD03276CC54E1237F47EAC383742E5DCE2346A715A8CA9A5BC487
+0A996E7EF0F44F349B581C7E537A3968492B28CBDBEA4CAE3E6E34550AB706BC
+220354C6CC45F3EC16CC1ACDEB8FBB25873CB5DEAF3072312669518AC3BCF57C
+500269761D11BAA25B73C1B4B0F44B1F085BDBC1F849225A14C30A9FD245E72F
+DDE99E0E31B57C3C9F3170D0CD7C5FD0CEB32A379F0AA9F32CA92BAFA82273BD
+FC8FAFDC0CBA3EB8A074F78A505A52619D5546E5FFD31640D1E14810172184B2
+2D278B5BE71360A739C949C3D4C46DB023040A993519A8F24335BA854460F51E
+777771BB912A3900BBAA2258D178BB9552FE18E4AE9A453D89A4133B5EAB1061
+6182B3C80A4CA11A7B706E44DE5DEABE7D80DEDBEDDCB304C548BFCB1A0C17F8
+06899F6C5ABC9DE62210C390C33FE92665477562A97AA07D16173CFFEC45736D
+C6451F1C6B64AEC235A0139CC8A4DC96847470CDF08CE08D0A58583884C7A35D
+DBADB9DB07C17BE52B1259DF1841CAC042F9FACCD3590104B619151B34EE822F
+B4B753A6A8198B0A2D6EE580F8C4A21FDF415FEADBE7AAE5C59508523E9BAB02
+3F49DB2E19E7DCD504944FB0FE660626A1CE5554728C1ECD6B2AEA7FE6C512DB
+E056AF6C1226A25547A8CEDE7C961B158365C99E574A0D6B81B2356364A61664
+B92D006607E6167A4002BBDF9951E8251142C4DFE4924E227CDCA028F6A42C33
+4011F0CC83B59E5852CEEDC6CAF1A94ABFF15122A698E5FB6247DA6AC6A8EC32
+000557DEC06FE0135DBC6B56CDCE6EA59764AF9E7E5AB79CC1D71ABAB2BF1916
+843AE75A64C177ECF1BFD83F713CFFB6278918624FAA4BF2B5FCA38C634E550F
+FA25E51768F931AB7D2C2E3000FCBBB1B1E22E7381A53C358AB4AD42EE7BC991
+913C633CA0EF25B9230CA9681B91D22880BCF44D4FEBF6F132FE120EBF104761
+6FDAFE8F33FCD2248B12B8BE283B37089B0383745324EE468DFBB3926A30F4F7
+6AC4B9EAF19D663BF1DE3B085ED88D9CFBFB36C2C53F12BB1FC55E3234A68C3E
+D6EBA530B8D23B99D098521DD3F1005D4F5E4E333E50C5C9F607D551019B0110
+2B8A931F27824ABF72C26615FB82859E6D527694EB41A17F6B08C9BB329AB6DA
+16D9CDBB7F00A0286EE119E7AC89A959EB16D9D06D6149D0C073D771B67E7BB8
+CBC6A3FD291BB1EBDC68428214BB371996544FF8A4F38A672AF2DA2F820437B5
+AEFE65350F6327F1772C9C9632A517A0EF4CB5C7ED1159887BC65C4F1311D1F6
+156964E2AF01F91CB4DF824AB0B3409908611FDD799A12C51B705E6DAD1BA8CA
+F0066A66C20A8871EFAFB0BCA7A22DFEDD54654E0BE31767BAF9CF894B00B435
+C9FA8F63F32FC2F23C80640C0CAA01BF46FADBD147DFCB10B988ABA1F2169AE0
+65E5779FD0FABE6A8C60F166CC1C8EE6EB1532A8491FBF84A824125B436E455B
+01C64FB89ED5AA77CE3148C135D76837CA45E7EA92EC857AC3A5B723DD7DC830
+CF1458512499217162FAF4EDCA0195A42EE1721482E56028B4895ABFFECE721F
+CA5FC8BE5DB4B7C6D026BCAA58AD7B9BEC349E395E16B897AD1404C27F0FDC9B
+5F706354C2E2F135E3A20B450D6788FB9AAAFDE95813AA09AFE116EAA7B9C76C
+F3D61AEBFEADB20580E3906E72F76CAD27D854381A10F56FDFA77EA5C8B15457
+E6278FA20742413B0BC95C1AF12E948905E2D8501E81BCF4095EDF9B941E1AC5
+E2B9EF45599AD38DCBBFCAD80405659D828DAC269825271518AE3721585DB57C
+520FAC927E8440B8306FDF0D2149B2CEAA73839A16681C6DDB6E596446B01BD3
+DF66AF8D7B391472DFE40B13BCD9C03A46B65814E06C2332404C4F1CA8D0EDD7
+37ACE6CD13620B84A3A80A122620E57E9BD33FAC8F2D9569A5AD18246A720B0E
+4EAEB68D73EEE587ABDF93F8684157595D5299CDCA11A72203B664C505EC8B17
+49D76E555CE3DC2DAD377D04A854B7A6066E5824CABD48C2F5585C4187AA81C5
+BA883542E97C87339B34823A5E32C83E1344D6D59AB2C64C6AFCFEC6767946FE
+001B6501171FB0AFD07D20840447E9F692A88C8162DD8E753D1D984B1893C019
+691930563E2935E4AB3DFD1437F4A2741636B5CC2AAAC5AE74E5181D28F643F6
+9DD08F5A28921CB8384E43532B16A9AA64A4537FFD1ABAB417CCEF27F373B58B
+2D0C78D40078B03AC3DCEB3922CBA12BC4CCCB6F3972AF9C16522E6B05D68B3F
+FFCADA33B2A7CF4445D6DC0E94BB089CBEC2A1603BC6F704C9107ACF0FFE1C07
+319DB0DABB3F3317E0CA977E70FE310BBBCA339ADE39E17A0E0644A9155ACFF1
+4E1C8FB9EE6E917E0830CD37498E3DFF20604766D25925576B599ED7997F272D
+11F53CE4000FFB0E89506A2E7B3CD818309F586966AB21C6226E70297FD093A2
+0A0DE3BEA5A2841C59DD1A48555235CA8B2654413E13EFCEC9C3D1ADB555EB22
+BD634C01514D76EEC3181A14C5264F5DD143A21D3626CB611F9F90D7BC05AEEE
+9F947743CA9429F2BBF30176821365D15C419B27A085DB7CE7BDD6F28ED3BD68
+6E91938951303521F260F7C1636A39726E03C0DF3A08942DEB17280EAF7AA849
+66F95D56116501CDA299E005A7D303BA09E9033CF45C0469593C7AFA2A5C9F03
+28D64726083EBFCF05DDE3564BB12AC5C90FB0786153D10DDDBBD41269FF9537
+836DF30F71A587A3935D91E24EB56403A2A4F5C6E995A89AAB2A42EDF8586C81
+52BD65DD33C8B10AB18FA9F93895FAA1639A62D553FDE5F976CBDB5059F099E5
+91BB6C1489F9C66E2FB7ABCC579FEF05E75083FB02D8CD2E4C37D438CB64B920
+81DD594F55047309C66258BEB1108B4A52A4AC52384E2861DAFD6DC2B0A88F6F
+0DAEE75B35222DEDCE1490BC77F808D56985E390AC2EADE948B377E051B2CCB4
+2CE6D1A8B6C56DFDE8874773C8D9E8EB0BC66E3272E7970621DD41103CC78165
+CE745AE462BE3CE12765A2353D89AD2B2C74658C5BF922A3A2E4E5FA79111525
+01A082205FC54279ED5F656FD80EA1E3A988E7EC83CE2439D8E9D4EA2EC6A11F
+DA81B6B259503BB7F66C3373A40AC6474A85B71B79A66BFA105EE8B90B1C204B
+5DC2D4EB387D4A1D36AF0AB4C2B20D6B06206DE70805ABDDCD7F1A9A6C3AA5EF
+1E59AD9703BF74A032B5F458A4B19E296D4770D7315F05877D1D9346DAA742BE
+C941D937156610F1075661F679BD680000E6F210DCBC2508D4EA5484625CFE83
+774073B2BCA4BCB71E64B3755E69BC6E39BF59341D3FC71BF0A97D3F139A9765
+CEB0FA137A1AA226BF329CBF14B1C509EF36D417D4993DF331BCB79F29267291
+D9523735BCFB3837839F26108BF833B1E3E4AF576A2045289860E7ADB936DDCF
+818CB035558E4C444D06C74D5865768C9CB901EFE53A92CD2EBAEC0A8EB15EE7
+867940DE7D7B61216B67FAEE1A72C06A916F3F2F7D766FB3ED6BB50A02550B25
+9EC6E7B65CFA667A505F200DF4CF743F37B0E876A0A5A6742A0329C9D22FFD1A
+0FE985931AD6A124A25A4340D2848230E73BC52FF698B5DD9A3DCC6B530047EF
+79BBDCA20FE02236C25BAA421995E202E09C41E24EB424EA401679B15988F8BC
+E1DE0C0838B32F0AD240F9C217F7E94118917A7BFCE878C423C0537CBA1C62BB
+3D7DE687FE49193FD2E8737DC18990772E1CEAF4FC5BEC50BD603CEA326E948A
+3ECAFCCF56346F9DCDA5C70AD7F1ABF751AE962CEE507A5489D4E86B512B53B8
+40AEB1AA263944CFF84D5D80CCB63AFFEF8026FD69BE94BEF7D15E07062B9F5B
+43D7420588F26015FD5E4357473C1853C4D600579BFAC96BA963DDA2AF04FED1
+2244E91B8A097AE961F45685B9159C8A1B14D25672740B5313F18CC262992CDF
+4E50C76B74C198955DB662569CC9C18432B448CAC4F8C64A3A80E7336EB29BF0
+9BD4BDBBBF1C05868296DEE024548D3E52DBF0A00897CC9E7A0AD30AA683A898
+6DA657559DE0EDCDC82986200485435CBED48A4A5B9B4416941A737DA4A43865
+50900743A13040965178B71853D2194E73C6BFE4FECBC76030FF25448D623DC2
+802B1CDFF958690833A7AB636B30475C54F34944976233E0AC952CE4593E63A9
+A5CA3A8AC18E53B37F8E60A3B8ED4FDEE0FE5A69F280CBD531DB0A9E36A1D80B
+19AA485604F64F7A2F3D0005A55927A7C4393190A09A3F386170325D427D01B0
+BBF1D02BED32E5E929C9EA7B8273C34BC5FA1CC076A0A4D42ADE112A24EB4CF7
+39F7CDD3F0337C0A70EF6858DA5D76694B7870C2FF84BB2D4E8D4CCEFBDD8BFF
+E650DB24EDC4FF041C21769FA7C15374F938467B46E518F2206FE3C70851C667
+D4F35857B33462A603AF8AE50E78AA616D699781FDE049CFF60AB24DC796551C
+D3E4B4BB39726EC682E8FEC0030905B89F2C2853D41D5D039AC6F68AA52D4C26
+217586E7CD877C011D0A0672F392400066FAEC7CE19760EA67D657FE5336680F
+6ADCE6A294F81DF1BF69AD6E55D7CFB4262C2EEC8D1348F3F707E2CA6D041AD4
+4D1F888FF99691546C3EB5E79C3B9EB73F50895B8163F80CB8BACFFA86E01CA0
+5953CAF2C7C9EC7BBC065081128CCAD4836699D30AFF499D8E00369CD6A0C4F7
+0ECD965091FDA3C2ECA853E805C5A55E36BCFCBB5EE8949C38A2D42C685E370D
+A1A9172A76874D53AA6C52D2926F5E5797B6A73B75F0F5FBC3E8D10EA913368D
+6B6ACB2DE7F528795911678498ED557F7FB6383B657D17C85B31BC06F1C0E908
+C212B0D11EEB8C2E61A929FCDC9C5F4F9EA9A1730E9A81EE313F103CF736254B
+B67AC0595FC838689E33D2F1922416B1E24892160CA8F04B502244014EC5BE45
+1D288C43D0D00FCD418FABDC7FE016A4E3586C14D22E1BEB4691D13E58C9E66F
+435A85CAE6173F3591B0FE2E727DFC579B16B2A95933E7854EAD8F8946A6E527
+E1119B0F029A1C4209F00F09E03769F00C7F13CD11B91CB07FC41BB31E6F1E12
+7917DC9E91E790B644581AB087D78DA43A621BB0C80DA75A08E09D7A6DD98AB5
+2AE5C74394B0C42BD7E7D222D3554215C6F1C04BE694B2A841BD9F606A01ED52
+B6DD7B7283C7971ABB732BF93CD11CD2C407B7F68DAB86E7DD380F8684F3F768
+692756D6879D8867870F39BC955CE0213E400EA1F40F76E46AED18C6814854E3
+AA2700D296CCBAFA4EF58C3E1163D88198845582F52DDB0641AC31FB36A130F7
+FE16F12FCB3D09E386A5DF2073C56F01A7A89346EC1DAD1038BBE20138492861
+0091D8A9F091616CCA67051700B90746423C002FDEEC4D86CB9DE72FF87FFA15
+B6E9A9B58A7CB8D98E3DAC7A522DFB45906ED1C58392C9CB204ECC263F098864
+2AD1E02CBCC95A104FC6DB30DC6A603DFFF7694181B4E64D06BFB3E19086B55F
+C653925A2678E6957CBE6F68F1DD12AFD9795072B122D72B23F0E0916D7FD554
+6DBA60BF6FB8D1A99822099BD96957381A7001EE267E773F3D9AC79460C5C092
+3A2EC8EABEBF5492AC3BA22D0D1DD5F6725D71B5B363D13F99BD08A114950A16
+C6C9B99FE48D05065AE2111B16DEAE00B1910B7CD0FACB1DDADF1E7BC57169B4
+4215A14F63A223979B6068967C045C7443BD920E8F406BEEA35897C3C9AEC183
+4FEECA6DAA76AF17EE3FFF748A2BA63DF94BCD21DFF30218DFE6B04853CA2D6A
+CC230131DB265BE32EE6D21102935D70FD223C79F7FD0926D68BE38481639849
+82FDFBA040734A19311350D7A74A895D8D45E177BEB8FE2A22B11FF69A9A8C95
+DE72184CA297379E7621F642815ED6C54100FC1613A18FA632739A5B2AD60D8F
+7B2B756528F96C86ACE4EF1BD851F72426EFBF5B70306A4BE758A15D0E367E9C
+BA0D5A378DE7EABADA5D75D687049FD5AC0033AC1F2336E5C716BEC683EFBBE3
+36ABF0B965B2317C681F0B7F4F6D8B7093855FFFD725EF4C2312DBAC2F715CCE
+0FD786A46D06820DC3FE7EF87C59D7D84D11E877808F590C5754F94C6BF2A306
+405D3EA8A1064CEBA85FFD472B72F64AEA7B81147ABF52C05D17D13AE4D32C04
+C20170DB4125F85FCE3665ECF7458169A62DA7A928AC3E58A5E9F69D2E051086
+FB380BF8E39D48D653D75C5C83B924449ADD13CA3493A7590E27B3D98D24E320
+2F9700C26E797D1F78EA39169074E365E62B9B6D730DE95DB3007AFC44086E50
+60C18957CCAF3389A18060FADA8D5C329CDB6EA2DF5C5882840A1147115ACDE9
+4357A24F095E2EAAF0D7201555687B56AD5224859203C059C63194C092DBE505
+6B118FFCB885E58F8D40988D2E14A73AA40303D6A935A97DB6A8E7D5889EB21B
+3A01063599DA829927380AD6134EF4661418DA85AC42AF2C455ABEC0413B3D9D
+684E852E69B743B1324F7671B8D75D815C2F1C425327B4410E013BEAD314DAA5
+FE193719A5BFEF3E5FAA0C5E4CA2B1EFF6CF921B56017526CC62293036F76E51
+1A999063CB2F93517614C0937BA9708728BE1C381CA8D0768EF314427A0DB447
+BE59B9A034A8296AE3F848C75784517C47D019141FABF56F2B110C6A768BF493
+BD5C38879397A86AFA7905804E2EB3AE253038E267098F3B7674C3510985FB41
+09A5E02E5F4F7CDAF6E12CB47346647A58CB05D9AFABFD5A9A538F947E205FE3
+C6480C7A1A940C21CEF21CF1EF48F15FEA6C0734A5B8FC23CB315BE3B420E65F
+AA895CF17377F0CBC197191B3CB8336A2588E8C26BC988BC6E51C67E21B64972
+7FA5F4F1E95CB29E217A4FC4998A54B480B7861400CEF84E18095C55702C8F78
+F3B8CAE65BD5F4DE369C583EAC060E69EA40F595213F8ACFBD6B55AD0F5CBCC6
+11707FEECC47B1E28C9A8CCE499E248A2B108FB29C309558F8B12EC74AD295B5
+B5E8072C15AB09FFA698D0265B38F88D0D4724528F79A97776B8BE04C29E1D16
+703A23EF60B67A3ED14EF29179FF9F719A9F274E0F73EA8CA198F7053B6E8C5E
+A912738F68128EA32E2764DE57C99080482C11FCA714412D3B6AFAE4A2C9F044
+721C372CF6D8861182DDBD2BFF1B2FCF894F0C0799DFCDE0D8083E16A855E2FA
+D5E660989B98A7A9F3057AC99B76854DA2E75E510AB2E53C6789750149DD1438
+367D28A8FEFDE2042BFE791D28ABB435C807E7B7AAAE140EB065646207FC75D4
+559CD14A44E0DF2EBEA232A4057C72C65A595905A56F2C2C0FFE326EF9B3CA7C
+C2CC7F3A8BC588AFEA2624616ADE803C1D0067463F4DD78C97D2616E14562D70
+AD7BB516183630C1182BD2813D8E282B26B18F4C1ED4FFBC86A090A036E54877
+7DBDF63E27E7446304BDDA5D5E5C2DB68374E76D698CBD3657AE037324A75E16
+B1E656932F8C7253C8F1EDC06642D8F74612498F9ECB96A9375152046C2169DF
+9B3D0654663948351E48C0EC24E9D691748DBCF758D60EA3643623C7ECE568C5
+5168171E8D2ED9BA5049018DB73E2EA3F9E60683856D3CDC4F0C930BB1B126E8
+AC776C33525BBC280FD87904D5DFEA512A3B073CBA5AC823B3B2FF68D289C558
+58553E0EF0617B4156665007C8895492F2C19AB138EEF10A977C9A61AA554866
+32F446EF885346CA0372C001223769F7C01CB76977EE84E76C178FB444E33804
+B4E72782ADE86D811BD395A15C329E11973B021C8882969DDD5F9E4B3FAB0D2D
+60CB9370DC3000772E3263E693A4699F2EE60E4C022090F4273F6134729987CC
+ECA36D229EAD946149831037B9701B0C50FE9B4304CFB73ADF8C829D36F285F6
+FF9C056045A0369FF759FFC5994DC0B40B87E547CC46274BC40823C22D90B9E9
+D01F41FC59B7BCF259C4C2E301C5F7EC3163DB07FAAFCE8F0CC08CFA7A07107A
+483779E4DD39EA89B3B9CEA198765C6A52BD80C624C3CCEF16A6CF3E21FA1BB5
+BA78FB5AA13759CE5D822DA725A07CEE1D39E63D4D86FFB30FA1D070B27D34B2
+80B335AD7C86688BAF25B2FD2910A2EAA186C500120AC2898F66AED320EC43C2
+1C9D8BE8888AB84F09D16B61167FC6E42DBBA1D3DAB971576160E8B85FF5DAAE
+F37D9872B22CD19A436BEC7E7C27DB2D7F7BDF4266E515516C0A2F8A899BB1B2
+D7D5811CE7ABB71AE427FB019D07E0BDD635D3527D677620275525781A1A9F8D
+B339C3E4D5817FEDF135EB150144EC6FDA234066FB0082C52C1A851CAA19AE8F
+A1960216743A9EF3B6CD2CA93FAA3FFFDA3D144DE465DD11AAFECDBC9A694A76
+93EE2F2B10E37D26F2CCE520D0A358E13A541CA963B239C132D1680D147AD8F3
+0E162C56D0F4D423890E36A2FCE66C11AD14B2FD4F7B84B2197AC12B49DEE166
+6C157079FB2B538817C030506C318698C10A5C4FF2731E31ECFCE48282398A79
+0B3730964A1D7DDFD6964E62293E2E6D35E8F9C9C675D95F375F4714CDF5FD59
+5A506FF7FCB08A9F5B9F3989C847C92AC53DBEAE739E2596377DC1DA1949E7BC
+62573D838E4BE9D025946E1C7F6DF511965BE847FE138E87A646FC1E1F43E822
+EE272145B75265C69C1C9D8DE3AA9F9E3DAB873A8146D7606B2DB7AD9D815D68
+50ADFB48776F11F97631AE5C59B4AF8CDF8011CC76D8058AC70C6826AE88D109
+F50B6FBA868F63EF089F428873E6E24DF8DDC504CF34862BC1E53055B3DE8012
+9F86F50B0ACD428124A97867C3B51C83929EF73E78B78F8D09A83BBE59591A78
+3182284C7035875981A4B68097D9DAB5A1901A4E398B219089554DDEE17CCB46
+94FDF29575367973279C4676D9864B0ADFCC0B2A27405B5144865352209FE496
+020017FD425F2A84A5EA6D006A4B0D1782C7C9443BA8671CCA3B30F3E7C0CD48
+5806DB28764F94AC413A5BD9DECA1B119900A82D3009499998C925377D637052
+57687CE3EF5B5EB49D49BE3AFBD8A4531606AE86CEF07E058CFDC4FD1764C9FF
+1DEC0ADC674C30DA9C9A24A4267A7D694626E9E9C9AEAF66D0381854AA05BD14
+177AC9CF2A0C0677F0B8F496F325D78AA336B04CEF7E6ADE30569A4DA09B2847
+F754A24E3309472B0B50CB43181E56D7AF316A5E9044DA230403CA6E013C0D85
+2CE3D19C611DD70D79EEF35ACEAF797AA94A6B4C52E27E140C43BCA68723F2B6
+DEAFC3117D4652F9ECE33C4C51F564C464428ED27B302750C0309EEE5FE0483B
+182F1D43D8F7B460BAC7C0D0250042013EC0C3AEB5C4FD9F882F9A3557C15DBF
+324BDDFAB515E1B069F210F96F6648A8F96F9E61A36B2F7E2E06CF67912A1869
+FD85F47B84AD9E879BC4E3C48B39138406C6A2549AEA55F7A9D79D9638F97151
+4B0C7A41AF770C575CB1327FA3BDF66D83600F1271B04D484BC4285CBD5ADF0D
+DAB6774C8F0D60DB4C25081F2B278D2C11B21501A840E68E2DA02179FCF9E2A7
+F993DA9620880EE6960274954DAC790372C9D831C4604A07EBAB27C6EF5EE84A
+0C99613EC5021DF782CE12D96EC117B8997E1BF9E783A5737BEB7306FC4D9F08
+CB92A999C8B13CD6A2695190132BD04B94222C7B60597CBC1750F4B189B9F38D
+04AE51084F7DC95A39B008CBACA295AF18F7C1FD5174F5EC78D11E1154A900C0
+EED0392B0AB46BB3993EE89F05AF25041D71C0BB35B2FF71DE9D842B9FC98CB3
+1375B5F2853D18C64DB633675D37E0550BC73A47D8A35AAE5593FC1297B21F68
+52B6FC4BFC2A4C58A8B0DBE73587DDA9E35A1E20AEA29E3E1D46EC0B6660522F
+57236E7EDC9C1F91ED36871B6802686092E5E4F98A66379DC2ADA482DB15F522
+1272B394721A7ADC446E9A5F98D401BE1DC712F010DC17845DF75737D6C4794D
+51806744F84A4D7B30B198AE46C46D3DD71EED74A96CE8791AF292F45104A055
+B651BE40EA7FB93F54A8089FD5B624DD3B7F29663229A8ACC91BB7D07F71B017
+3530EA873B77C0298087D3AE901BD59A71EFF85A8E490FF120C6DBAED5B67F21
+B8957374F7FF0C14BE5459A40CCFA987ADDB03D8F4E507554FE3ADD1301F2DA8
+BB218724D4F966CEEC21A1E28C39F3901605BCAD62E311A4AA9C295A69D51D0A
+8801A26ADE83DBBDE01D65FE1F1C26255325238C119C6D6190B5979FD7337F12
+57E2695B74CBFC9291D7DDDFEF77879C8331BD21164D5773691931C4BC15620F
+CC55C7E3B130091D42F619069B056167074173B8C19575274CDB7D2D8C1CD4A1
+2CF2DD3D8B0072DE563541219857CD8D94068C375F33CB5B028FA233064E0DA7
+4DEFF8E9789A8EC86AB9E57B3CFCFCA9DAE4E27C3DD1EE9009215B726FAEF03F
+21CD4A7B32DC8889A8E68A0D509EA68101BD2077E3AAD72C003C66C80D566E7E
+2C1A022970C6CEE4185BF6299B9025162CFBD33E4DF7246382BA2449EA5A2A08
+DD4F10D8A8617F4033ECDD7FBF55E537B099BFDB6E6884D0835E9F58857EC91C
+432930F1307C5D7EB390D8652C4D981C496F1BC4D898BB66B9CF804F7BDC41B7
+4FEB527554D00EE0EF56862355CFE59A17596CE9FD737932496C67A339034286
+62D3FB833BFA261B632902AE3AD8D199DE5CAE4627EEED4CAF7C60FD50AE68E1
+0F85D679C10C52AB4F3B8848B5886D02EEE1ADA9E292F2E2EF40EA1DFE567733
+37FA902654A3770E2F108CCC08E32E3985AAFAB55B83D5BBCDBBE61DF5E378E8
+F64BA772901333C57B6DB0EA3418A923EA2D13ED7EC9550C71B2444EEDB0BE0F
+0CB182CA3D2EAB214840FBD18A3DE5DCA551B6D4E7BD9F8B3B2C7BF11F870B7E
+B8C594704BEC50165234B6D41161AF9B8570F4BA6EAE2C48652523E275738F8B
+89C66E1739C05471C19ED3B2D16434F22C25677356EF8D0B01A6A9F427598523
+4FEC98CB244F58953AD560113C038000F8F7650C0D56A0BB12E391762B3B4004
+E2516B29F80D719E8E85014C23E59B9CBB3A966B5E83B8B51FC02F32535D03DA
+EA4F801077C94CDD2F98D1E25547659B0F528971DCEE22A88D9A1F1E0F219771
+86E161A0608C3511EB0D969E8C956E8A55B1FB3E9278845E8BA26F6B6381CF74
+9CEF69192CB36B4502553A99D047EF5251194D7E269752CCD9778123295CCE8A
+CBC1B4DC2938D076967A07155138B3E91A4AA888A09095C3D2F442F98529EA24
+7C717439B62F7F1C5D140D9CAAA94B22A8D1355E7D3D85561D26A71C826CE30F
+D7157F63100097F04F39C6FAD40ABA2F9DA78CA6E2A7324FAFEFA1112BEA7856
+F8BC9E21D32F9EB9BB4DB631DA30EFFB05CE5BF7948980CE6E29A379E6420D9E
+B2E6A8F19EC8DE7371FFE985D0CA83E6B0C25465F11C299388865CE474EFC22C
+73ECFE21098FAB65C332BDE3CD631CB5CEF22279C8CE8AD38D97EEE9E4DCC1EB
+4E15F2B38341DE20E81E8DFD504A1CB456211F8C21E806FD62807D0A4C231FE0
+09052F95B3397FE4B1947A90C596E58E0D74441D1584C9DCD1BA47737553F54C
+A119099D8EB107A9185234A613D6B5279F9DB5C5FE4377B92DE77F8D0DA00A4A
+F438F080347C01D9C1DF7BD28FC1C30B1A9B337B0F77E968C6E9B9A7CC5049F5
+56862250770FCB1F086491ABE56ACA8EE9C14DA082C0D43230D383D41256788F
+AB2EE3CA273B90F822BA0D7F1A3B2D50C6381632FF34AFB322A6308CCC5EF3CE
+BC847CF050AFF76CA1C9B049C334AFFBFBBAD19A101FC4361E51455283CB9DDA
+2145417EADFE932B34C9800758D651CCF90BFD324D12FC8616B423B08BC449FD
+03D6469522B23A7E094AE8EDC2719034941091AF269725CA0E510806CEA18BE4
+F980B58EB05E9021B10643E7CEB0CE2A42B976324DE1CF105F1CBA07DF358D34
+B4366DA6DD135F36F32387026C45C4A94017312FDA49C4E6E0F5AF2F0A9126A8
+07602AA9C8576262931EEE464E0A2787011D33F9E7C6C9D7DC0C0C5D20B8A746
+4D139F5F2B1B6E0AE059747949EDB3FDE1FE2162086C4F01720AD408DECAA906
+7586D3E2DC51D8A63EF20E21F0A5725DC80D02453DFE9F75E6EF660D9A892F95
+411B7558D3676610042CEF99261185A8D7F69F15E2405D2E5C0E452E223D0924
+F20DB835C62466FBC0A8038F3F110036104E9DC649A5BACBD568B0B85A7B64CE
+7EEC067FCC7F7E6A51FDE5272FA30847E70D319F9D593CC2EE45C83E67FA6F5B
+C7412096BBDFE81666CA8B3EE1411DD487B4CC3C3EAD104A2C9BBDCAF9D0C847
+6D2C7DF762BC3BC874B4DD3BF2BD7D0F6227FC8AFE4D568D70BD9928051EC85D
+62D8B2FF07AD099B8F879677BFD4B90A08C585D71F2820551C2558CD14DF1555
+66416E2B9C87BB7B1A0C9D6E3D4F80C5F3F4F887B17A957025BCF65372D9D3A1
+77E2CA348A47DA5100CC3EA2EB7742654B955FB2BD3B5A6F84D2D5F5F0339D84
+D8AD3DA2A75FFB2328DDC5004778BFDB4B0C9916D306BDF393ABD5FDB45187ED
+95F01EB80FAF51B7B38FB22517655D532DF3C6A8BFFD339AB7E21C009D467AA8
+78AA46B04DCE4F5C17A5E1E1081E33CD14E2E7BDFD41DEE2CA9C042CB66C70C9
+9A07B488A14488AABEE67E51A4DF481CB30774279F049C9D56D80AA2B4EFBA6E
+94A881775CB7B1373B81A69B301711AE47ED07264BC98A84819746C192BA6F9D
+693A825F0210125BC4372391890975B78626DADE396B2470522A8AB9DC4837BF
+1467A13F281F125F0FA2E87C8A67946EBBFDB7ABDDC2F9AC10DC820DDA8208C0
+55252FE5C829AB859A983FF7545B6A6892CF73A5C9AC8D2D4B1D9D01A481FE21
+51BFDC258D0B8BF0743EE4A7DE9AF2630A9740FCC2838BC84CEE12404701C36E
+A9BFAC54A7AF6211B17F0AEFDA006CA74105BCA14A882463F233E831D8477CC5
+0E42E19D5E21A3D922F645EED56DC7BB7F371785B8565389D39EFCC4850550BE
+10CE6C78EEEBF8828F83F9E858FBF0640F27E925AE3C2539D609DDDB0964A513
+88238CD14F7B91CD651054CA37BD71F9E64DF562C5E2613CA29318D3B39035E3
+B538A5871E119CB3558E0D301B091568C807D63AAB36336AD239FF58C1131D5E
+FAA0F85AC68D33C154F97E42E73EB71437B0F2727BF9FDCAC75965C62B15564E
+9BF7154DE438CC9B04D343FBCE0FF6DDAB9E46A260C7BF76679B8483BBFA4DCF
+D652C0FC93610A6A4ADF53C3D9B7296E70CE1FA3EB6DA1B46749FDC0E2BFAC85
+F00FE4A1A164CCEBBC6CFAD03E3D2C987EC80ABA6D1DCA6B85689F4C6ECCAA29
+CA2852B2325AA1D5A895B2D8C582060673605C54ADA2F41A20B2E98CB38785A5
+3183C9562EE46D58E515DAB27B9A5A86917B05554FF899BA50E1D97EFD9E7EBA
+03C6AF103CE3570E592DEC96A8C634AD7067ED147E3399F0933F8E245B269AEB
+362DCFE8FA9B42ED031F5DE999962C9F53594A437AB2E629338F662ABDEBA947
+7AB265D05AE53AC692ACC2B30973ADC366921B48F8D53F668E08BF65A3031C10
+F4DF18B1D5536A7794576A2A836503B6F62CD601B1F7151B90E915A927287D99
+9941949683B99325AFD768D0BE6C27B14A073A4DEC837CF91D61A3392B13C2BA
+323FBE1B93090BC4603E35B5C1774BD7FC3F2B843A8F59B51B0E4DAE91C5DCD1
+8553B77BF8A5D3156C2B92F9E14B53344C72B1C9AE82F86352D70A7802B2A948
+3B7A89D4C4F402657B46C474E6AC77D75505B9EA6AFCC1359BDAF1D82BD67C43
+B61FB8430B9C0D6F8B5B7EC8FF87AB6A824FB39848140C8F35ECA135A9E25913
+1D8ECDB09AB9C418F0EDB189CF314BC15031EEAEDD76C062245700583CB82ACF
+8F5A6E8AFAFCA8AC150C0CB7A96AC61B1DE23498278F37BF6383608BFBEB4E92
+F74BFD5B630B601ACCDFB1795DF67DB3B87A79DB4BD17364EE8C6B74A04E0C4F
+B11DCDABC0169779ED890C0543452380AEFC40581A93424D9B626315CDAEA786
+39874F4A6468BACFEB626B63CDEE84F4F51E26E52D1487890601D4116FA68600
+8CA491E20ABF21D1B1A02CDB96A25ED403ABCAA32944AF30648D7C4A7A208968
+E2F6AFD610B8C8F7F3306B1BF263C2A47299F436D1C741B24DAE39174F30F88C
+7DE095E133643F0BC96D84413D373AFFC457DD7751C2B4AE16625D57D7F0385D
+0C5723E54D10C7AF66648D7DA4942CBFD4EFD530B8EAA843692ACE50B13389FB
+67924D2037EB81EA52D37976C2984BFBB05438DC8050BEE88125A7119C68118F
+39313CB6E36B04AF224354D6A3E08A2A45DC030B6DEEC6758CA726473D766D1E
+C6661DCE8FA0086D4FE42237C70771109FCB99B2C3BCEA066541D4B2A5CD1BAA
+C01A5E22A7885A2A4298EADA5D1735A00A851BC1640E62EA5C30D9B3085B7877
+3F2174394A5A8A75BEB15805CAF2CB0E6E5A7A3CF05575ACBB7A897E7E1239BC
+D4D3615DC0E77DEF51F7DD2B803AA1A321FB51E2AF854D672E1C14736869F49A
+E5ACDC57E3B3976537B8FCAE4748984E668FDC1DE630EDF826F57CBA3F2A030C
+155D3A2FAF649220AE2B1D1960B6B0483A37D24B32D263FEAB89E7D6C916BB37
+437245D788031CC042CFF7D712220112EC16A61F7ADCDDB09AA365980D0A687E
+01C6DA9D234326EE9B8755F7B8ED79E6B4E5ECA508CA102D27A3A226D02F4370
+7EE4061C0B8D75EC0D3FD681AC5FA83664B3D0CD55C3A95B5813FEAD19642EF1
+748D06ABB5AF95D258A8B433C4D8215625E8AF1F47924BB1F0530EFE633A333B
+9227C1ABAD32ADDB6910993C4A2176E1DF3D738B4E9E899DF859DF3F42EA4508
+B9A3312BEE27B4570260FC6261C8F03D72C056E7D824F143302157C869316E7A
+5B3BAA828F6C1FFF5EEFCE3A79F41F97C2EC11E6F8121282D823A3746E1D9C13
+39B02BE7059BABAE7E2274DE13F9C1158E821637CC124600B89390A15ECAB890
+AE0F2EFE53E7755FCC955879A1EB9E73E61D4572E292E72FED83B94715A3D4DD
+B682A712D578B9D2E6A34DC10506DBC9479EC3C2ED12B2C310AA9C34466D979D
+15275746E0FF396053909C6A73777380826D98B61D166E0085F2FA98A3267634
+3B806CA0A9ECDF557406239E72A470D51985D7F24A4CACFC71131694C40573DF
+70AA1BC7C29A94272FC53C0AC0BDAABCD7FE594B4BE530B432F3C089B52EA8F8
+7280F52EA3FCA6848DA826324A497C393772F156C709FA1C0976F7F8EE15EB46
+82F0C0E2BF11650E9A8D241255A5A999F1AA83270B655E354D177AAA05284912
+469113159F4E8134E48C194C158A012480869DA113
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMTT9
+%!PS-AdobeFont-1.0: CMTT9 003.002
+%%Title: CMTT9
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMTT9.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMTT9 known{/CMTT9 findfont dup/UniqueID known{dup
+/UniqueID get 5000831 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMTT9 def
+/FontBBox {-6 -233 542 698 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMTT9.) readonly def
+/FullName (CMTT9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 33 /exclam put
+dup 34 /quotedbl put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 54 /six put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 76 /L put
+dup 78 /N put
+dup 80 /P put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 89 /Y put
+dup 91 /bracketleft put
+dup 92 /backslash put
+dup 93 /bracketright put
+dup 95 /underscore put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /braceleft put
+dup 124 /bar put
+dup 125 /braceright put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E6BABDA4215500A0
+42D1A3D0D02C0C98BB1D6ED0B7791274C38B038FC7921FF1FB8FAE7258C09259
+4B8E1BD9EDCEDE9ADAD9BD9598EEA9691589649A9A21539161E374075BEE3457
+689F308A4A7AC9F2FE4B301A6C36B0442FB92E3B002623493DC087800B5A0521
+0DB96A23175AC584DE166F59142779F26FEE9783E28DE49FC3A8D6583EE63FBA
+610DA773CA18ACE6F64A4867A1A7817120ABF9DE4D17782866E6CB6B65A9F6D8
+3667C8D3E61E5356E35343FDD4C6436DF73934470916CB5F0ECEA6BFF092E735
+C7C355B56189D1DD5715EC97E50145FFC17BB1497315A9585D713A7A6DFC7933
+995468EFD0F59E3C15865B87925A3F2930E20D5A35970E2C44F1629FA16E00EE
+EE21EFC50D49F5BC02300D0A7BB85E649CB4E2E828C8B1C5469463013E71D723
+2CB11BCBAC191AC751A2AF7FC228395CE9472DC1809052012AEC2CD66695DAF0
+4CA04234F0187F4116C93F59A7F1F8123DE87F111853B785A20CA8B49B3B0CEC
+B11AD345E1A11578D2EFEB0536D125237086CC8CD9F34A5137AC5DDFD8746014
+D74AAE8239B81ACF65F379CF2153B06A238A2D767F294CAE0D79228F0B7D45CE
+510AC9657A1776202FEF42F96D476E7DF407786AEA12DEA0013D3B4C5D0640F5
+BC5BB72C34066270399CE595827175B23B25072723BD24E07F6BCD9EF0175DEF
+93714BAA53960F81103CFB731CED4A267B53727BCA3C97B0BA5004055D4EF0EC
+F725658E53AC86E4061B489AD4154915C3981B3B703E1E2A8D390CCECCA99385
+45EBE35441B062D7D12DAB2B31569387187D74A4043FD71F1C6D352EAE0F6757
+4345FBFB6DB15CAE47CAC4BAE47AECAE5FF5EC19057DCEFA1B23F47364ABDF47
+088A7C6A2AE26B10459B6D41CB69182FD1472F326CE3A15B59255D1DE3B616D8
+9D1F12561038839781E657C896B8C58A32DF5AEA23732A0966D96C68C988ED7A
+09B7E2C8F9F3D0D56879764781566299A4EDD3588BDF70E3D924D25074F30988
+E35BDD827AE4D0B4A06F55A9976BF0DB3C0B1D09CD08E8CB168B50617691638C
+0EC1A791C228177D4FFB021EC3DF5082CA3487AD2EFC8DE9466A690ADDB4C52A
+FE2A6DB4CC275CD33D9136E735279FBB2008D59E667905EBB04326EC33C98B2C
+94744B7F540D86E90DED64572ECF1EAD3A58EC101642B245A9C7232DC8FB8741
+03F97883BB32FB955C22F878FA0FD114451A3B3859B0B5537AFAB73AEC7DB2BF
+409E1FB41D473714F6BEA73CB085139879FA31710E01915C2938C37BAD6D7D71
+45B897E00857D3931A489EAC7B42BCE4E65F73F67FE027CE482DC47598ABCB95
+39E98DA8ECA3E23F0799D5963ABA6E2984DEACBE7B46B40ADC6213E0F4D08971
+58F68C946C748E4B4217CBA2391BE2086C9758F4E32C9B6413E48D84D33A6E85
+84747029C0A9C9B92841D217A902BA8EB333999D62FDA9F82BFC8ED11F67988A
+0CAE42182E414A9766AFFF4B046A09D476F8E3F15A8C7829BEE982D8350BDF5F
+F215F2BBBF68D4B567BAB798B9604C79306C475926E9FEC0F07A99F43473C6FD
+B15AC29C3D07FEBAD1BAFF75AAF2FBE94F104F1DBF838044FAD94B661B06AECD
+D9AEBD02B60CA4546DD6B5B5C1A3833ED07845671CEFCA8955CE0DE5DB8FC93B
+3306683CBFB8E5B79A863DE78D455DE9D592043C2686F88A43140F8B9F3B553B
+7047420E93E753829F8D47AC7621CFE3626F271E31F0019CC02D0B57F67BB47D
+8CFB63E902EA3231C00EC66EEC0D30FE8394558BD3535C888C4CEFC6EB72E737
+712ADC6300162D5D79BEE0CA1F6E4127A0BC90656C01692F6D82C85550AFC97E
+C2693E379160FDB9636FA41AE9C75B7F6643B05971C6D67CE30971D590FC07B3
+E0B36B4D1C7F25110B5DA2130D574FA292B47322975A2BADBDB39AAE69BDDBDA
+A880F9AAB580117708C79204DFFDC08BF4A48919B5C22228845CE8C3109E93AC
+2479E523B8A1C12A6E541118F121DC6B4EAED83491A03192D5C3A2A45D1A2467
+757E7B377C635CF5CAE11A7CB49D49F3A1BB2286090B5F0E4F89869D1771D50C
+54B5C5E091E3048A2C194F0ED00DD64FB95BAC6FA9D61ECD093ED416DA3A4981
+DB07CFF17C4F55C62DF628EBFF06FAC3F3D3F91C30EBB34052BE1A08F5EDA4B9
+08977197950A282B84E21D43C64BE3AE4BCE22C70E7D392DE09D89B7F23351AD
+6AD37225C12BA79EC9951F5DA1E505DB26200190ADE0E549305B7530CB86EFD2
+A896F13A97E51754F70B609CB4511CEFC38BA579C071E9510A49982389980DC5
+336D6C4A2DB100DFEC4055C7AA9C55880F94FBEA9EB280BEF66CB8E1E38A359D
+E5AFB12B540CD599085ADDA7FC2C72E7C873015773FFEECA2C596B75BC39A3EB
+3C43FA2E53C0D7993042F3D652BCC483E48B7F6C94C3FF6D38E276086A6AE67A
+E5A571B9C72E0D7824E0BC2ADF51A393B9E334649F786EC1923C854382B89627
+1B9E701AE5A6C42E672B2C6A33C8BBCA8F69B9061E787D6B92183F20CF4C3903
+FF5417427B84798C82BE28D2C81624E3920CA61EC9EADB364B5A6E50E49A1A72
+A9A090A1FCD84814B8B2708AD787D2B5015DA1305874F58C5EB62F843685FCB6
+465FCA80176CAB2B2FE65E0A270BCE1E3DB97564BEDFAE5CA44395A8DF4505C0
+3E103CC3B914359B2870DA6CD30382EAE8949131CFE31E9E75C3E47A3834BB32
+CF183D4A8B9001710D0A11390C9DAD116196568591D38C2AF4ADD852F31494EF
+573462759A35415900360882739789D6B89ACEFA251C5ED90ED704DD7C3C80CA
+9F6CDED69537D201D520C99E69EEAD5D3C0EB84C166660B3C190166D93EDFE6D
+15BCB6DC5CDCA825E48D33845CC2FB15291AAB823F25CF8BB0A1EAED8BEC524D
+D9CA016027141FAC9D35B64FB9C224552F29EF6B32497254E319090E698FD8A5
+15491CDFE1B988C79A0E3B9D01E12FF084E9FA86CCAE02A3EE6F2917B61A2CC1
+64B8CAF309D1AB48A34227A7729DFF99CB6EC282E3FAEDD2673779AA7E4C1789
+D93FDC37FE95F087C5F88F53D30A2DA9C913BF205FC6BDD060A40184F4AAEB3C
+D080D63B89CA3DEFF310D09EF0A83F3914BD5B7932980ECE139EF0313C20B4C8
+576EE0FE3F28FAF4D3CE7CD0890BC824A85B8EF4636BDF1EF1BB519F93D36540
+ED09FAF93FD71992CA2CE2E83F5355162ECEB32AD218092F45D5A61A44E67135
+EF0453589CECDC6962D0E8DA7E7567603BAF50B2C8F1CA65EA5320984E7D69AC
+9A7D3D7F92565D79E8C9DD2D92CCA7DE9CD058545E9F98AA47904D70E1897099
+3C4C852B3BA131DDD348433C336BDF5FBDFB62120DDEAEB3255E3207B0C84A0A
+1ECF9EC869DB9BFA3693B03FCB27C5A5D3CDD62630DEDE91B4DD5B9784BF0BDD
+FC6EEC3FA7ACA9E15FAE47CDD9B7FCD2BF0EFA10716F08C0AF25FF67CB6F9598
+C607D2FCA452417D2C69DC808A9441A66492394C3450BD30632AE739EAD654BA
+4343459CA36B6D5B2C12C39495952F2EF93D82C73E33236785A79609E260C4E0
+CF3A3C950DE71DDC3939D42DB1CB1CA917CEAD56979A70F8F3B207C805319FA7
+3C000AE2B21D711A6D78C7BFB901334DC06F59EAB6D94B507734C27971F8458D
+D00193645AB92FB8FE163D5C51AE4F40BDB4F2C51691E76EE0636F071F37AAA9
+BA78BD12459CA499210EB0CE2F8BD317387797C33F5933AE7A6264DA06B4A6A6
+1188326147A16B205D1F965872DED7D8EDB3294FAD2FCDF0D423329E9CCF879D
+4E0B966D509F45527F7609DD09694D286F6FF7535EF8971B7DFBAF608A19D442
+C133207EB1152ABBD11C455D0977F66A9B73E51381D1CA4B66E87C0C7175A63D
+80C699A052F00C41DAEF42E7A40E07B1B14107AB0787E24E17C1462960E3C54C
+AE73BE4924464FB177EC62F116B2822842541543EFF7ABDDEE197D6BD8F8D4E6
+59175D8C5957550B70BE775AD52FFF6E7C00DA7CDC16E1DF7446BB5D8FD82647
+3E9F87D5EA365C82A2D991321ECB14A9E3AEADC5A56665DF7072D6DAE402BCB6
+14D92B17F9E063E4E9D8D239C91F5C7C0BCD2FBD936C9D4A0B57659420343B59
+B395BBD1AB5B6003F653699D57E7581F9813CC98D4F072FB78899D6DECC42D34
+F2787EDEA64058B46C4BFAA2BB96E9BE5CACE8D91E4C080ADFC0FA0D4A29C6B8
+54FEA9E11DBCF53D9CA40A21AE5076451EDAB3593E56B6D453DC8EAB8C78B588
+34D4C4F36861B5649BC1E9F3091E704BDA7613ED45C911DFECA74EEA05165191
+825F95A947CAF382FBAF01F3B8B041ACCDF39718D7DC5BA6CA12BB20EEE96439
+BF2E2628AA3BD2C91998E6247A690FCB0CC95F286F427345CC4F1115BA3A6E54
+4743355F2CC991CBDFF5725902C1F5A6DEFDC8638A26EA456C33C27773D6214F
+66536CD2E44FD253531732D5A8C44B336B1BB47B0477350EB8CF74889B93402E
+2356A9CAAFCA562315D8E0B3F42F08932CB87BA2499A875AFA08D11DA73B38AF
+F46D03B7F639A8D7BF88CF07FFF4E91716DCCE6E2CCAB60A64D5E40EFD8B336A
+1BFCC4CB04F49DE1FBDE7AA5B2092A6EDBD913D161A3271AB6411622D0E14416
+37F81E0102F5B0F2F9A2B27819E4BACD7C50E29D6291AE5B0973C657761545A6
+741729620EF2BF1046B3913399C10982EE5F4142CF461EA31042E432CC79A1A1
+39C607D22E45A6DEC008CB4BF6007CDE9DD5802B49A62C8E02A6D448B64177CC
+887AD71D171B99E7ABE2085B37D90B3BD8513995D9A57F53184DA474F6DB5E49
+B73E04CC214EA5398DF7D7541F94E623E8687B511640457A48A68E9D9D6584CD
+15B57CC044D8091C771D175F2EEDD411099BC8F7B4317DC503BB5E405AEEB526
+5E6E1B1F2705275D274E012A98F66075CEB90AFC648B964DDC0E9C4AE7B24CE1
+80B051022E5781A533A21DCFB97893847D685137EAD85BA708A7E118C72FA839
+A9E460B5D17365A0AF1F53A98319FB64A5819B087F554BC056C4BE44113A5404
+BEF759F890C1CA5E7AE156F4F8106FDB4F8DFCCC640976983EADB30976344048
+2A86D7B2AF4A01CA736B98D52ACE392AD4BECE7E61C710B08B66F01857CA460B
+B8376E257113E10F6DEDF14CE2A4E6A99ECBCD302C36CADB713D849EAE9EB598
+F29DC98531D793B79F83091F9B136809E006F34E423D528CC4309AFFB3EEB47B
+9A9DE4D5B25CE953345C326BCBE2B4912641780637783084D3D12693F8135483
+CBB0AC4EE0B5610D7CEB7DF205830BDB9BB404DC1B28FB0824CC187B26C19A91
+DA0025EC739BF3993700101D042DED86D67F5FB87912CFC51AA7DF53F2162D62
+6314A2CE13810D0B8D81F45771391A236422CFA0F35F7A0CDF14ACB2724AA57B
+7C2C28D53029B1146558610E0CFBBF72A85AB9BA308F846228F299F13F68E8F7
+D963B2EE9EF7D4C21690632B640BDDAD0556EFA4EFBF035F13377ABB5CBC280B
+9E0C12AACB153C93351E5BA95A7D149010E204950A59C7FC6581D9703468C1E9
+EFAE37E7E6ACB892B3F8D1248D9A4A72F642FECC5E0B25C15EEB921EDDE84D12
+0E524FE6133C4921FF4921242392C12FBE69744D53739F7E849C1B96C4020AB2
+1FF10DEA608F111749E2FBD8DBCB17F353DCB3075B4F4B8186963EFE95A76A10
+85AA5BB6DB4095291974221829A8E436680F4860E01C3843BE5BB3101D0869C0
+EFCE08D187BC04F58C7A450A59093680A0F09E8E3F12DF5223E7EAFEFA01978F
+D8354753A68022CC92C71F2CA732DADAA8A466D4AAE5999B0DC077715671F518
+E6277741F44AE798EE50DF44CCF71FCF8BC71F76374005FEBC4883C6EDA854B0
+88C0C2B476709AA809ECE41AE786DB1A32B3FBBCC14921673578D3514C8CA842
+E1FF90BE33F7B93ADF6BFB8B1AFBBD080783BEF056A6BFAEF676F7BF9F2DFCC8
+01D255A9F0391951210D60D4D4DCA93AA858B38C0D7B8FD740D5FC6F277C2A68
+54CC2DE1F40B6347201FCA2A0A91822708D820CE645C3E4E5A09FE25721AB33A
+97871ED448F38FC5A349D81F402B34461D840D5768BFC6849439AB6115104F78
+B87115B1DAE12542EA898F86ACE247709817850B067F537E6137196101D46DD2
+D842EA03EF4501E34074E8458E638ACC4EB349A7430AB035BEF2DD4CE00554F9
+18F9FE32A55AC1E7E50D64AAFDA278D77A7149C59DC5B1E3064A4B281A54C9CE
+A5EA94ABEAE4C6D5674C208ABC72563976487136AF2E21F835BEFD232D7F0D13
+1D19932367F51D5379934DA7F1635AC51EE5CEBFA63D4D32F018DEF13624EE62
+31DAE68A08DBE3B4FDAAFC75291C8C6CC7A657E3C7453C7D1461A36E88E633D5
+408253B673AD87A9FB2D0F56DF1305916D14D5DD62051E27BCE09CEE9A1F14AF
+1D7164BA5FB6E6EC8D38750F7E28BE330909F303ECDEE692E347DE13C8C2F82E
+29C8BE6EFD76546F362A12A1C2DC12389EA95ACB4DCBE95620F0C193EAD91B33
+BAAC5801AE827B9AB3FCE5D11D1D7854F8FA8A31670119CC0CA98628F801838B
+AAC7EF90AC5466BE69CE3E3CD9951A5EB9AC08014285422F6DA6F6E221BB30F8
+0042A11F2E4B765BB0D142AD52F4D85785EA71B2E1CE20728B9E9306CE93268D
+99B822A5AB5232EC7E26EE1160850AD3905864A01357F22722B6A54D4EBE58CE
+480EAD9FBF068EE965AC4B5FD2FA8CCB91ECFC6E90B9C49268CA0B0FDAD23ADC
+D5A74B41149BB08454054C451AD0DA4CCF8B60F2EBD061AA03A011D548B6B481
+FAB00AF9225BB5463F27FD67333FB51F8664536267E95CFAA0BE3BC1B8F889CB
+587A3A4FA2B45864F07E11372C9507A625C0030EF7030A0B4D931BCC48F6DD51
+A4D1F63FDC4B59C1CB18E6242E9F4B4B8AD9755B870FE60D640181FB7EB8120C
+C56F51DC8C47FCC6318C2145EDCBEFA7BC4253315BA67FD2B3D4AF6A9F3F229C
+AB75B592EADE15B1FB5FDBA1C0F786BD21A51506B7A2E42C2D086BA6F84D1B3D
+AC7531545F0B01346831FF36A52CAC1E390F99AEDC265B44B0FC9C581BBA6BE4
+48B723811EBCAEA5FEFAEA7E5B987F2C7B3E9A65D2D14A7B74F099401C57E367
+385352D0776D2A908F7A5A2E4D4160946C5591397877025C8C387CA413EFED56
+8B142E8341E349DB4DBA422A4FEE56A573972A0C66590175158E48850A9F7F38
+4B95726787B8F969FDBC97491CC81CABC976CD00A27D1DFCA7CF467A956C1C6C
+839817AEF8794B6151FAE9261119DD5DB787DC9D3B420FD325ED6599FACADE0C
+320D54C2E0D296537E22C1783670A9D9BECAEC63853EC2F05A990260DC189D63
+7CCC0BDDF2CF7585071ABAC14630666737041194D0777EA4292AE60BD7F7100E
+DB568C90F0D899EA006CA423CFFD6EC70A5D3D8AC43C747DBAD3B02219E47D8D
+DE030631F4678C357A58ECC52782B31B50CFD44EC33F41585E51B27E3997D33F
+461BEF897220AEC80007F13C5A1EE3A0430CA899047DF944831F8B010A7DE74A
+BFD26001472DC00CDC9F17CC435F61ADAD4E9AE062ED477FC621FDDF9242C449
+1BB3F77FDD1519A251B663A693D84B42BF0962F537757F38CE5C5D56B98AB10A
+3B70C8AE8D52DCAFCEC22E7B09D3C4EFDA1841C74CA975E4F8294F7BDC796500
+0ABE197ED3737A65F7BAE601C91DB3983EAE11DA3EA18ABBBA3650DC361C2E77
+EF9F97618B0C337A906FF39926D2B0B7883ABBA650816C4C6B34EEA836994EEA
+AFEDDE56E0099D0E09EB88EB093544B9BF4871200746A0409C475FC4232A38D8
+F3105B0FF44E4F132378DD12D9E796412FD0F9478322215E9F59E69396C35AC4
+097C4995B2C3BAB2DD04B1A7097DE16DFDD76465E79ADEEBA90489ADD0914EBA
+53E11A43ECB11D072C68D2131BE1C7C43CB9DD5FBA0A67BA43D6851AD4CD3BC7
+39AE2E22CCC183A56CEB71D4F9F578518E376426E42B6390426A8434B5A83E78
+77A5B9963BAECD5FA5521C2A29418764E4EC1A72462B04957F823E2817A7F8D0
+1512919889500024B1C42EC107E8B8533C0B314EE4E23313A4C1BDB009A20114
+2248276B7E4F8924750C8361FDB1FA328B434499FE5DF14B96C1F5D03F1F2702
+C77057AF82D3982C5EF8EA40D0B923249FD9810464A9EF6D1A99402DDF08120F
+FE77568235A193F5DAF57231E5095D4EF505A0FCD8E538D53C5E23E226B487CC
+568F94438B050A4ACB53340A4054B02E8F4D8BB42E72FFD1124BFA91C22F3F76
+3F3015809D6EA1CDBF7827ECF8893F550132A618BCA2B9CEC7A329460CF59E2E
+3F0E70D05F42D3E37130429C984D24F49529F647CFCB675C7CB79749E35DBA8E
+E8A0B56EE8FD852899BA52B789CF2A5D4F1C948FD5F5C57DC8475E65C83FC690
+28EDD11C5A7149D68B924EF92D73A70D37AFBB433D1563A034361A4415C1722B
+7599BA7ABFB5D0189D99B2C48024088699820761A73762B4BEA323121D893572
+DB414C845757270E9F21A5B2BBDEABEC09C5D030ACDBF5FD8FB7F9D62F13A93E
+AB6060F37CA8DFCFEFDF62CF0222FC4298247FF97BEFB153EB48A5654F570E17
+1E1DFD669AD81A441A98F39A41352DD1447E6B923B88395230C74CF703375B82
+8200F0186280DD3701067721E2DA2947A499A0974C5ED5C7BF3A226319D5E60E
+FC29B2484C062A0FC798C291CD5DF9CCDE6D548E2FD14853CBF563792BB38EA2
+29E2FF53230B91825B5D239571581541B8BC60EB5CC943808DE2E587CD56AED3
+BEC3DAA382464FA0DF0DCFC029DAB0DD3E3180ACFD8C81AC0484F0C096DCBA59
+430CF139C30F8E45F15CCDCBBE3F96907ECC42F00DA70994C7E3DA894A5E4367
+9131033E06F1AF4FE22FBBC261B490641D914837EC2715CB72E5DE97FDCAB119
+77C8401699DE82B21695A2BBA34DE7E23FA3E4506CA817F20331D0710D2C9B08
+F03F2C3322E96BFB5064EC80EF4DFEBD8367BB7EDA4344562CCD23259F7ACB48
+04A9AD253332216DEF772A5438B95FCE3393CCBD5CFD3564B70A6B785E3FB2B5
+A90A86D161B6F70006DC30254CFE76B55FEE58F2DEDC34C6DDCBF1A75674F657
+2214FB982FDB68CFA80DE2485479759CE3DC6A7E73ED2BC4F1E12B16DA41A1C5
+7BFC746498B0388AB63258419384F06BB89531E3CE7A320CC929BBA524CE6B78
+7E9523EAEDAE6E724E6172A76C8B844B721C4CB17E831211FCB830B1ADDDAF2B
+F101C2E3F973E3EBF963B70A5B403CEF7E3D869AE8461BA22A21944F954F0784
+911D337209C32F1ED5585735149343A8DF86749E395907A4DF47E3DD955632F4
+2119F02BC4688C047960306B85C79FA5011A0A947B3D998078763E196AFC24C3
+F4C5B764B1A90C2FC34808D92BB87AAA5328D35AFC5F6036147C906B7D1A3499
+65C100A777CE69E53BB32D79075918510681B6932CDD71EA32D2B8D624249414
+E5490FA6B660AB817752C9A70ABAD21AB8B1227D4C87532ECC8B504902FD53BE
+5A130CFFCCE869C76BDE799CB07BE6E8A364CC42FCF642314329FA02D641D85A
+20F2B7E13DEA7FF35CD9BA932B1ADC1BC32DD07EB048F4E87C200FC186942E89
+9CA9E82EFC02119549CBA415130B0D98A471C970EB1EF7A3E8B7B8242F7E81C8
+EF86B46A99759F12C62138634EF26C0D0942BAF165A40347CCCA16FC278F875A
+B0CC1515417283D9D093ACA02D40284BDF8604CF49C1BC391A14BF2FA0D2CBF0
+FC6C63080242FB76CD082CD5F8B74D44AA03208458D4E76D5979CEED233CED2A
+111A6D222DA6023A10721B41C8E3AAF75B687A8BFC5719E21101D005BB811172
+4621B2493D36C2E4834F7187895F9AA31F67C06EF7F4C77B220D4FB889F8ED08
+B29E10164249A7D5B7E5F0984DE91C1C5B28439EBD117BD235B700F0A962F781
+5D085D110C2E73A70FBF1116A3089843598D04568166C344A1F41758470B6ED7
+9184178DF09FEE308F775400B5573AADA47232243060D683C4E7850B70E7D798
+802BCF2038A79D9C02702EF781BEDD831FAB3615DAE92498B0618859A00CF942
+50187C26853134D471D76842C893C6D041566BC2A51858E41FC0E3DB1672B373
+8F565BAE23909602161C8FA3B0A8CFA5B5A525EB95E477627C24707B7BCEDDB0
+C8321822C491A5A86355857CB3BA92D4C5DC550FBCBB42A024479E71BC219C3F
+DE97CDDB5FC69007024B01BA460B522CDCF5D300293F8375127DCB1ABD94DBB5
+A08B40555BA14BFC5E23F8165BA7B45154D3FF754428AEE97A1CFF07DFE06AE2
+9C4D711D48AFDE0BC3A50FA23D09516EC4CBD986F746CACB8C95BA69DD20B1F2
+08841D940741C960DB0E48623644599B17A04E7F500B64569516376156449033
+2A8943AC82EBFE91990FCC2C99AEE28247B3D4DA7C5BF4DEAFDFA2CDD3D08BEC
+E4EAE749EC0F9A6A28850F201E3B2C79E920FBEA1A7F3CBE19F3F3B2BBA2009A
+729D26431A31A7A3405F9BAB02A9F451A3591AA29334FCE6E7DAEB68DC34690F
+E189556BD67A31FE42BAFB929CCB0B6ACC4DC1649B03AE11042803B9A21C879E
+DA2E857A305DD86DDFDF10BDD0B7FE06FCE80BF6728A9BF434AA27A1FA11A164
+D1584D7829EE7053D34AC69CE905871C3166C96740EBF60FE64730C11A63CC23
+4EE4318CEEFB38885A3011812172A1C0ED6CAEDF62CDA8CFF9D0081F4B32FBED
+6890FAC82FD2128DC38266AF0DE70FD90489229153F5D172B496B937D2BB8D65
+2A86CDDB601218AD60E1B68CE245ED1D0E58CA1936908A114FC8C7A1EC53E3C4
+64FCE5D1D94C899EC235DDE3748392BD878EBB8005B92F092F6470F435DBD0F6
+59FF0448F92A1D6612BC766242754CECD05FDD77F837B411DD4DAF18DE438B44
+833E0228C3349A29BDCA5EB57C81832D9703293BFDA307F8B3084AB5E82CAEBF
+DC71070017586387A94E218DF6DADDA303D892AC7198249FC769E64EB4010725
+5704E6FD548FFBBEB2AF71FD922B8205FF782BFEDC44161AF9C6C366B837CC10
+D2DAE81100064589CF1FD53847A0FE243383CC02D9C77E08FCF101D3C2C1C5AB
+3177425910BB80B7626B8BE707271BF4A40B4143DBFAF11F30606698652A866C
+AC430FA8C48362C122C3D3E1A6CD487D49ED49B14270869E8D9AB138DFCE62A4
+94DE6402E94C6923D5C7AB32B6C1C595ACB6B6C6D4637C0C33E5D278803A29C5
+1970489E0DD6220824B012752FC60AF3D0CAFBE07E0D918E62A723A9E71F504D
+A5284AE855EA175D724B976D989CC7BBFA69019BB3958B7D61978959C2B12719
+788FC7AAB8029B8895621F618DD67578AA066BBCC56649293791A1F07307A232
+58EF97F617517F20843F0B317C6BC6F3EF64AD70DD35E6B25AEE4345CE0D3DEB
+8DF2284BD0EE20D326FD65F759826D48148C4057DA66FE14CC14ED33F79B2F17
+69AC90656F331371D13685AC5090A8653D3B256C5FCAE10A86011E25FF042BED
+D1346BC6046B0FD5BF7B8C2100A5CCE4DCBF9E882191AEF91C300FFB3EF52F03
+EECE89C7D8B46A2C8F993C0A47B3494099403E9042EDC07CB6862531B2024899
+A378960B55D3FE5998290457BA27337104887CE83A7CCB5E243097A7A86EBB37
+600E7AB7655D3003A6E37AB275BDC82FB30F8E7AA1072AE291BC692A7B8C913E
+0FE58AE6C100BEE929F86495D735CD59D277728A4C1D8CDB025785F09D14DCFF
+AC86E32A4A582CC053B4A60519EA32000AC3F372739D6973CE3C2DAB2794D923
+AE6379DE839B195DB3A1EF5A7D1C40EC956F4928CC9C9BA7ABE78135DE7E8FE0
+0A243119A8A652396BEE0C84C2B0FD19FC42B64CBF9D22CB75663FD43AC3EF1C
+555611B1BA1D45F85D27FA3DF97F57C321AFA39566D5796BD7DA9D776214C53E
+A8ADB3C7478A2E779597D1F66C6E3B027E29C02A32CD02A6C8957ACFED6390F1
+11DB06ABFFF7AE18923D4E4EF99EF4E0F58245357A9FF20283BD0A045446CE2B
+BDD97A4856CE8898CFD1A69BC87A1D8B155A9E3C337AB860D4B9C518580AC24D
+C89557495A65113EEE53502254B60A6457C73EDE878025E25760D1BF4050755F
+7E73C95A73D7D83BCFC1EE63FFBED31D55149F98BBE60CB0075878C088C1C932
+B3EBAA3FA7A98E01BBB900BC12C83E90E2E51BBD8F2C1FAA5DCCDAD3E89368C0
+2441328E2963044B19A6014289D088C0434921CDAE975E9A547E41089F4B24A5
+93435B3698FBBD0D4765CAD1DB922F95AD9452C483B53BAF5091EB7C5627BA57
+0B89514654C04DF4552809C7C1EB967137FEA20FA1D92D261632AA66AC66C2BD
+4E6584871E1CC55B702F05A97389C51BDA4FB131E9BAAC3345792E0657089179
+909CB2EB0529A23BE5FD4AA804492AD5466AAC0B6534A63ABA1DA4EFEE1FC003
+160F7EBA31A4BC54C4E327E40DCC1112B17D53D4BC3887FAD8189B8AAC3658A5
+B44B1F10ADB62190E9A097637951B18DB403C20D93A65F602EF033D3EBAE895D
+02CC3E72176D6BFC26B7AE9024945BC787B07310628D702580C0622EE5B624CE
+45F40BD8C49CE83F7F807D586193961D3F2E802A57C299070B2D0F760BAC8879
+7D619D7356596434A7822983D64F157ADADEEA2DAC8DDC362504FE79EB29F3D3
+84354E9709F5968B0891E10C66EF859EA472E26F0DA704617370757C40FF2A61
+6005169BAF7B3F6AC6AD6F4CA4E92B666C5942946303D7E8F284619CFB0C23B3
+B2CE3368C46FA4EE95B893B3987FE902D0A553962D230730F00960E5EB7A4095
+8DB86FC8FC5E1B519A63A10EB05B239BD980614EBE9F47A630A3E9960D1B1B30
+ACF15F2B9BA83899455CB66EDE2804E4FCD5390BC6184AA466B65AF9C273C6CC
+4CC9EFDD9DA23C2B6EE6D41897D75622D13639B48A934B71D8B5727FD3716690
+9DB0B5CB21D990281E88930682FAC6C5F4E2F6B6275648A15CD4976BD7A2C3C9
+3088AFB5C74CC7B013013FC07C1B0F3855B346153B65C1DBDCCE354C46997443
+F0D88F3A566016F9DE8CC72E2533AB3D608C3879CA50A44987521E4AA87C7535
+70D52212A6E9B20188A29AC8EC5BBDC36E5905AE8A98D98BEDB04CBCB86803E3
+9C11481DC384480BA84D6739749755EEA5D13825E2A73CE60C4D9E895213DA3F
+D17614DE23A4F5BBB77CED37BC0EDD509FC982B6A384D354404888BF640EEE32
+011B752126CDC123D644359A67CA221B943FC9F9AD3C21C6A6C200E1116C4EA3
+6342DEB13641F27465E8BA07492CE3478456F4AD33F11396C683B645A9265A8F
+BFEA4B15045B6D086722C4DDCF6636F10B0C7AEF67DF5263BB3C3B0205BBBA6A
+3CBB91361E9D6DCA886DA4811976AEEBDF9F693EF2B9C92AEFF1150396924FA5
+6773EDDB28EDD632A6AB358D8D9481B681A4132718ADF8114A886D485BFE3B3D
+5E4D38E5993452235ACE90DE18F05D3D8BA1BADA1C91E115FB44D97F3950404F
+BF60DE067BEA3DE4107DD9C602A1F79DB07FE8B9578253DE009329954D4FDFAC
+03538C871E0E861A27010FA65520E2D64538E16207EB2E7480E120E7E951E687
+53B3A675C2B7A33C87F74C712C6A3F7AECAE4B93B854BBD64B290AD73F418E24
+ECC55323BC26742A57ADD9A875D54845CC152A0387796B2D4240D8FD233B7ADC
+24320EF503F00864E616875A4A78E5C6812E4C080E1A9ED6FA5BAD10CA19F60E
+75E9555D3DD97FA9D4FFFDD0A7F1976A5E6162C9274BCF9B54E70045C2DBCD45
+DB89D6132634D5A247EE4D86CAF91169A3828801D6C809BA93731FDB1DAA57FE
+32943D7D3777547C5667A36711BBD59519106F08EEA586F6AC76000B4B11F0ED
+AE10745950A200C4854DB95E19793DA183C0D65EA822A6E4B74D958C3C04C3BF
+535B18FAB3A2ED655122C1936B010C5C386C4B7B9F0BE1D3540898DADCEDC7EE
+15BD873F84D16075241F458C0CB77190A9AFDBCC06B8F9EF0826EB30ACAD19E7
+E6F677680A43F868621D5F159E7D4FA6D02298013A38D07B95215341D825E7D2
+6645DC4548F7638FA0E7C6623DB99DD3E5AFF3E98CE808EB2269D04F2974180C
+5C6835B702BCB803ECED3E509E11F549D99E104D0072FD0AE0E3368B8BAAE93F
+D7FE42F04D18D1334487A4E264FE55637FB75AEDC315E26FA1B786EB7DD8B92D
+FFD25EC6CC2987C62DFFA29E8AD556D63CB52C5AC6892B6E1FF5634AA04381BC
+1511469606DF08C618CF6458060F97F504AC0EA6313834D1A7CBF35EFFF4ED85
+5E0778A7C485E61DAE41A5962822016DB270FCBAA00F6AEAFA29A4EBAD761C68
+209ED228DF25730626741D50E19D1766BB895830397C8C1A72DB3BBA55F7DA7D
+4148C1D90B37EF217AC492993BA2CEF9F2842004547AE32AD8A8999B3077AFEF
+7672A0D505B382E6A41E9FA2D11C617A44D5AAC2042184266017C39B29540FC6
+08B70ADDC1BDC711390DCF933A70D9DAD03EDAF54F8C38C9EFFD8EAD1FF65D45
+11AD1CA1BE49E98BEF8BA210FDC8F146CA563F9A51AF0B1178502382A7482EDC
+EF1E313E3AD947109B58112FC644CF77308D2A8B377F5FB494E28B64E96B3F2D
+7DC3A2D3F8E95EADBE7C11F92CC922FE78E07900D69898F357910436C69B63DA
+2ECFCFC37CAE957B83C5B9E232E308B5090BB2A99C1A19ECA4763FFE3C9BB3F7
+E7A8A66023438A6D0A2320F3CABF171C0B1910141987305A01E08FCB9D07BACB
+54F5E23C26E05F97B2D8D4C29C3442EC472FC39C278AD0BE6DC19D91433BB8F2
+0745D9639D35B97D9FEFEFDB3AECA7C3765A5E88B59B40E00A0088440F1D6E0E
+01792EEBBECDE832E58A843D333DF394AE900C45C42C756D27DCC4B6CF6390C3
+8450BC057D44E6E83D6CC28F81E99363615CDB0AAA8DD56BD454491A6E9F6B77
+455CA95CF08A14C6326E78AA6FA39CA2053D332E1218056A952D1123C1C73A9F
+6021124CAB7F23CC38A67F3FF7AD39041A290926E85E75D9ECBD7C78C05D8E5E
+F004D7B65CA97608F35E17C91A8C3ABBF76237B4B171AC566A0B9C34F578D551
+1FB4317A794CE695A872463510543E212A8E61CBC6D762730E1FCBA388369494
+9AB9DAB46D412CD198968F40A60335DFE34F255581923EE62B5A8984E50B34F8
+AFF6606331FEECE433749E039AA1B74D4C6A27AA1F6730A86A7EBD67BD70C0C0
+0D3999DE78836667371883ACEBFD70A6CD51D417ABEC5B2324D863D8DFBA6918
+8ADBB879EE3823AF3DBD47E280814FA603F4B13AA966A7F7114BB0130E518715
+C442CB4AE0D51C1F8811B902D25E8B2515DD537E9292429711D725F5613182A3
+4AC989EE031908DD115C98349B9695F13969A43395604C2E19CA305FD1D60226
+9CDC9C26724DE6F6B4819262B8E8A1114F633933B8E18AF2ED71BBAF27277935
+41590F61F257066BC3F5A53A41E4AAC48C871C4CD6AD9FF3781B6038AE360DD7
+955A4818950DA028D308779858C29E6D010F28451A3676A3EBF13F4F82A25D3F
+C470BC73BCA4C342967F3F77A0B971E5AF9AC80D5595FCDE497B774902B89B80
+A58E83E55E40AE05E9BBC2C8BF914FAA83EE695EB109B713DB0A3FC67E102096
+A7719209AD328C46C3F913A6CB7C78A290749BDE09D0C5C7947C715F1359C493
+26A276EB34D9E0D1CCE459296FEC388078992BB794AEA66BB7C80743716FD0E9
+E1D47B891D95ABA42352651B832AF5D8777AD257FC26E614C9B1807EB829951A
+0153E30FF02B63ED75A314E206532D5A6F02F7D31EF1A4FDAF1DDB327DD36287
+EC0226F0823954EB663F735073878B115EF2B0B069543626DD0292BA4C59974A
+3710A723D9C00EEB118E98DA3A8934845C44C3F988B4553497248C3342122E2D
+A76A1FA97E5D1061D824999E0A67025E4BF678088B6B57B444C290DEE9D7C3AB
+B6848C14EF2FC6776A47BEE20CBFE61F667E9132E00EB96A581B154B437C8E2E
+9E16A414F99AB459D532768C7905A37AC6F0DFE133B7D43F58AA2D43C0B63486
+E769429461C0C574376291A00DC3E084CA171F9F546AD307098FE9E3AAD1DD61
+DADD7AAB91DD6C00DABF4E6BDDD8BDD51D687F2E1B7162301F2B80BFCDDFC3DD
+EC3AF5030F284E2B869C89A196762FE21725A7F614C16144E0891EC814DF7CF0
+5D4D3F66D56EEBAB3F8539D890B7D7C869648B58E6A51793C213A5D5D335E27E
+3C6B2105D07E8751915662AA0B8F51FBA97169A66CF2195E09125F056735520E
+6FC8AE0C5EBC2BF6380C1C6176B8C51F51772FB260C83C7CD256573AD0F36304
+710A857C900B2BE113C5316A1825771F94321863F2E703AE4412E73001758478
+94610FA250C774178992AE169A24F246F58632CFC2704CC92439AADC4ECDBE42
+A35B595E632698D4AB4A56A8AA56BA77F732643753E34F6A6372BADB7DC4B872
+3C336F6A425707F3A484CB46707D39C785419AA3B53A3346E1B51878AF2C93D6
+5F81B5D88FD4AD6B0250E16394EF95AECF15B3F00D4247DB499B13FE31B73010
+D2494176F67B8437C97401626DF51355C93C404461C4ABB7D92FFFC765E0BE89
+84A227B1FEA694D32FCFF15D3EACBF9D33C5AD275B6AB76D2B79A3E0D0F7EE94
+2046ACA982FD57F2415B6914733CA58DA9AD53B5169D973C3686FB1EE4CFB94B
+8099312D9758B884768E82043A6345CFC2D05AD742B2B50A932D310200EA0207
+FA6F0F78DF0F234C27C9A7D15491E6729C7665AF2BC732116EA2A2BD75A83596
+6E4381DDD537450C431BFDDF20A784EF02B1FB68D64EA9B4DD4EDBC17AC6C60C
+38D99AF68F29D5AE73FCEE7A36E77A46137953E9846F5B8F1E89A5A184AC3B66
+9906B2715E3CA27FBD9A51220FC6B0CB3D7A2A1617D3C6B1ED4C98CEF3941EB2
+508605E64D3ADA65B6260F0EDF3B483A7FD014F88E32BAAB33541FB16DE5FC99
+D77018CE78471A24DC42A3E0CA3979527D049887023D024A3002B37EAEC9AC04
+2D5F14E26213FE6047D0F4DDFB27972AF90D39BBD19417C0E7D682DE0F82900F
+C24B570F2EE7F2191FEF466CEB9846B1F387324D5B12B9795A13D8D454FF23DE
+9D9221B1DE88CF14649B6C9F1FEB572D2BB11470C5D4AAF80CDC4E07E72E4FE2
+658D8835158AD7B8AD06687BE521A647752838BBEFC0C9356A0CF1B73542B6CD
+1DD5606CB6A9F6263B799230463616775209C2B2B8EC69C0FB00BFF103053EEF
+D164BE0ADD2D7234F5B93D9C79DBACF53630479948CB151A4BA659D490BD6B1B
+FE49EBEB01949EA4EFD789DC7F584D2D0FF4C2307BD49844C0A09B1152699CFD
+00451F12C8041BC3569CDC068613BF42A3505E1E1EF7C15DCE095D4837A3B075
+A1B8E329A5A264BD10C3C78FEBF4FD5963C0443E1B36B718ABC713CD4980DA0C
+7E7B786EB989FF2DFD627A6132E360712F222988A4E6459225F4438F7464B01A
+9B7F2C6EE557F6BF291DDBCF5BB3381F8C5AFD3DCB67CB8D885C38CB5CE49EB3
+DA040612837DCE5DB1A56ACC3819EAE607D852BF64EC9BC75371A948541AF8EB
+DC5BC4583E013D578715034B7753D0BC6F55AB54C87B7FC771B1D0140341736E
+F99D7610E03ED6EECDD1046ADA13B865E118FB4322880C19BF933549CA1E31BB
+DE2DB4F370E015CF1DCBC99D792297189D7BDBE5EEDE7E30EE6650F33161D319
+6F6BD222E804A6507BA2ACA37284B25E455B0537185DAF8773008BD6EBD113BC
+7B27B47AB8E9CC8B6A21BD6FB58E3FA32C81CC3EFE9135234AAE897E191A2600
+A6AE60220207E885422BB1B48B2AF4D4CD98554CA3BD3BB720FDA9E8540A1FD0
+4B15777D2A23C60AE4E9A80B1A9A6273FEFEBB7AA57DD4931D88934A91490B06
+F5AEF60987734D8435BCB113E56FE6F3FB2D3A0C057DF82611163D91E032B44F
+3257510434B96168D0A1C91C12F669FAB09961CAA5759CB880F7CC8581FEB999
+8D73181255DCDE6852FBF100DB92B70EA8C7E2B82C5C2D1B069E0B126FB09845
+1F828A67AA70CD628BDEF776931920AA91A1861662B30367A8B75F7DB9585601
+F3BC666F1E422E884A49156FB8DEE987F064788373A9C98B9A01C5E8526B6120
+177D3BA99D17A99CFF561B8EA85AA74FB443F02AF95BADB1496CE49FAB52B3AB
+6284DDC0B6F8E286FF527B0653FC3BCE3A791536C6662EEF3F21023DCF65B05D
+3506D713EB4CAD909E57C9672D911DB320ACFCC0724F25E49DB713B979A9FE44
+329918977D00E41BDCB4A8BBC984FD743BAFA0AF1845BE4AE1D47428D124909D
+BE639284E91D71CF630078EA2FB7408731A88E28A9768961C52E2E3FA37F3FD1
+E34F85E189D822C9ECB971D9CD819CA028A138D741DFE1FE8373E3A7C3373270
+82AA6B286D19C1DD7D16D61326009A75E2F23A68A5ACBCD453E5516D9198C125
+3E3C172A730443463B36110E4B1CE6776077CF23700A36A4A434C641331626E4
+4591E792928383A7463F3264DA88C9A22140B0752EB0EFF7BE8B684131FF4F4C
+19377AE97D4EF96532FD72DBA9570CF8F52457CA48FB99ED65B8AE6E8AC2F982
+03B338CFD36CB681279E9094CA6F110BBD4D633629CFB0C5DA424D2003CBF6DF
+1965ADE0281C20C9C872A1B987BE11FF533F03EB9173739D68EA0E2FDE0C5BB2
+9428A037DAF9AC7560A3551FAD938B6BA40D5F8F12BE6960325EE234F255DFCB
+FD86DBAF8B027C2A34C8AA4F0D0EAA3CB020591A784B25BEF370C99AE34E2202
+6395AE62B5B71DD4A551BDFCBBFE8F7FA64CFF587EE5B03A8445BF66BF7DF203
+6ED5104402FB9B5560FDF3AD85617DFFB4C8D0FB27931073F3CA6C55E6E54E02
+82CB95E852170FAEC9D6E26B3B49152C3DBCD5BB22F5B212999D21D23CF371A6
+02E8AADD793585C7B8BED25D7E6FC8509848EF83DA8B0CEBACFA64D22BFB0772
+D5C50A431235520DE11BE4F280049613E70B53629E6D79305EC6333BC8485378
+25630D8BD49F12963C1EDA7FEECE66B6989C18598F9F1D0E1DF584F83303AF24
+29A47FA93BEB04D73913C112AF4F17BEC47D7A7658FC08346AFE4B2A7146BD61
+5DC0395C52A0920393DBCBFB31CAE13E8B0C1AD9BE8AFC3CA81066890BB79CAC
+C8B083ED7853EB74795371A2C72983CD9F35C771C0707D9140C22F7E9D148D8B
+D8FD578E160ADA08568B9ADB7075F426097A0C3BD72C557D7B8D808A1D24BA33
+06E970953C6A952AB7B9FA9DBD3AF93F39D953992396CB4A8CA699916FC666C1
+BF279C4ADF1615EE65BF22C3DC916B0F9F7B2CC54EBEBFC9E6F47290896130AE
+DE1B1B599CCC39208D4142D529A8BF191B99B1C49E60F969647EF6FF5304103C
+235F10E72AA15473AD31B7DFDCEBFEA40B73D98528B9BA34115E2D428AF84702
+BD9B3296285CABADD2038A505F67CBC6226A942561D5076803C8E57012BDC5D0
+143BA3A2F5C501AF422AEFB95116C5C40BFFACF1BF7F663D35551F8B270ADFA1
+7C29847D1FC9C91188A3E30D35A357033C213FD9C4AAFFDFCEE8E56D0F494570
+377825DB4DC78A2E4910321F7A99CA19D8F63B6AC5DB9DD3D25A6B7BD9B59A0E
+DB5F0A25DEC3BBC96B3D26FAB85CE144D7834A1CE02AC05898F11B8415A3CF25
+AC20EA39612951A5AA6246DD379656C8E42007491461F6C237C6A21A4633ABC7
+9096E45DCEFBFE5750F7D223C6D00DF0974B98FD99190E48E04D6AF706F3C9C2
+4CC83AC842856F85563B0D48DF0B04B2FD6F3FFDD891F608782ED50A2C3BE1B9
+2CBAA891ADDB4D65F2651F1DAD6C4A0A77B25F3B6867EAF356D30ADE19D406B6
+B96E61E18FA814F25A4EC9A7DB9A97E7062DCA91768C2C57FB065B001D966263
+21276E0CBB1ADB60360598561888946F39E0AAB25881B90D6B08698243086340
+5EEA694B7CCCC012165C4E32F2272314252B5C937BB54329C078C37E8BBEBD96
+82813CF7DFFDAB3F2DE684630B10BCD386D19E8E653E220F4403C5831EE96069
+94F23EAD50696129006B8CC3160DE8086C978E92886169CADEDDC53C6D0EB174
+DE2D95EE0AF5754A954E7806D202964D8E679CD7F93B8E5BBE02AB2417524888
+1AC98AE1FA2D369C70C0179F086FD3B2A759D6219B6BC48252F970893C5C1DE9
+5CCEA71B1A0F10BBECD9A63D30F6469E0AC94EFF99322190057B2FD5A1507AA3
+D242FF2C3DA7CA93452BD6C658831FEFA2A2D0282EF662C3B0B8220176860CB9
+4E2BA62E6E57048875EAF30B0093B782764422692D0067375843F96647735D41
+8C19C1ABC9D8B0BDF3D97F21C5900BA2D9E45A0979B21FE7CA2FD50319EBE343
+8A16E6DF19AE467FB3C19FDCBA1017211E259A3D8EC4714E38C8405C5B008626
+175E959124BDE96372905BB9555798DF405DE23830F3F26BAE7058034A0FA2FC
+0BE9640C22D88A8547FA1938DE72515AC0847A820BB6116C81FDC85DBCBB4BC7
+D81815E0260D9FA0E759375A9E4721CC2204F4CE00D0CA74E51871FA34875C68
+0B1E05DE1DCDDD21BF3AEF51482BBC19DC6E1AF3C2E3C915102FCA956BA86CFB
+9FA5F50BA977A472DDDB35E477ED5AEA56C005157C7AC7627E529F60BDDB7422
+BF4C061D7029C0F85DE7D266263FD23FA9EEEBE58ADA311BB0D36FF1FF0802B1
+299762D3930C34D69EE4CE17AAA7326835A4D553BB045C4A216A4AEA82AF36FD
+73944CB69AE75F9E79369F833EDF5930646C3BE057F457B21BC52206693E19F9
+A390AB95E0FCBE021308220B9DCFA3A2C43627F105464F41CA9ACBF51DD01816
+87595BFA78440BDE4C69A41DAC308F5D19720E1F01C2B3829160738FB498B2F9
+C52ED576618B3998576443454A07B7784FA0CCC0831461954C05C364D9B0B09F
+467043627E67D7FD66D583E92183A52C3EF8C0179E05661D41DF119605ED3202
+3B3E1C232040B475CDEA8E0AB92B881720A079F93014937C4BB2450C8A7A6182
+820CF7BFD92B71B2924972DF468BD9E120C8C3C96A3D38059DC95E2497BDF251
+639DF3BA5D34B763AB8E8716FD5A9B8E1AA0E1C445B5417B16B3A2DE03C1564B
+32A17598D24AEB4C51DCDD7D28BD0ECC39BCA860E5FA32FB8DA4FC960E488E52
+EC7A3B42A9701DA7CE09FE0DC6844E26960C6B6F1D6EB3C07C903866117B3FE9
+D51AD8C654048C70A94434B5A2C6FEA57D5071679FD41EBE6E6EB7C94FA9E49F
+13534142F2FFFC56632873F5EDD88190A727A57EAFA05E07EECFB8E901A978FF
+66B1B6026D59E36EE4D11B667161B01021B1697EAA4DAE1789C85E90276D6E80
+3AE9EF553659116F60CA3790D10BB50E21DFF508E8C13AE909A031F320ED684A
+4757DE36C67EF5A61A9382DDE8026F044EE45D9299BE637CE9F3FF1DF2612E94
+F1AA8C6C9CF3E7A7DD54EA60DAC781FDFC79FA23A549F9D045B7D33815AD1862
+B2443B02B7017DC77784967E9535452F3466796A1A79AFAEF033087852EEED3B
+F73B887659C3B5FCEFD0B3C6CBE54FDC4997B52331FD58FAB9A3636DA029B88A
+85B74A691D803AA3A9C24032582F11E3EE8369B5F3B5E9D121896A29F2E6C65E
+48692E4DAD0296BE653A632609DF2C7536DBCDCEBA1F3EA21D6E4848780E53C3
+C850611024B2F2CE430F725091F4D94262A1963B6434A3B7F7DD2D48725A9530
+D1588A863EF323BBB5A628472E87FDAC1F10EEEDF42334AD39F659AB1D3C174D
+E9CF07772CC74C112916CCE5E02EA1F813DD7BA5A2B8F5EE63529C4509900B2F
+410B7B16E6119ADF83659EC1A742688C1A1699682B90C518B3DE85479C890E29
+A99E798A4BB845A982169F7301CF3C4BBF583E6D79AD2E49CEAEC0E7D2311FA7
+5756E69122F4CD6AF69057EB6D76BFF0C19343048B230A20361E33297D683AE1
+45D1687D84ABD5C8BB836048B9B5E650ABBE68E66EF27C89AE01DE9BF0E1A0EF
+C5DAD166222EAA95986D0A31AD4FFB210D8DB5582D92AB2085FB6207313E3BD0
+0B8D05218DCD8124F8E9AEE538C455AC0F3A121C53A27B963680D625AF421DFF
+718D0682B8FC8994D10F80EE7CFEF3C7A22A2622E8B685132DB7AD8B8EB74891
+A10B4DCEAE8EE380EDAA8F13931F9D3DCE875161CF52277757980ABFE42A15A2
+9427A355A1D0E43D51E5259C1236925DC69CC205D8C4286E7579F990A29F6A98
+C0148F081FEE5FEBA4CE1267AE67C854987B9B70A41F730768967A58046D80F4
+9FC01AC85AF924C87CF6A97D017E382E2C888BB1C80138263B8E0DA15F82E169
+7D23A24302AAB8CADEECA545700D979261D1F7F1142F2C0CC2F3390F58123B88
+77DCF0DAC085BAF095BD3E158572FDD033E44E067F0D0447071AA62B1B4FF680
+B841E0C19E5443970C937F80966046D7A00A5DD1AF38C18D95AE7732AB983511
+30622485D8DFE310AA3613DB5F351C9D1DBA6FCD686E38148967004A5EBCAA78
+9B6B31B3244FAA863022D2762D43BDED9A8CFE51DC9A8F545441E3A478F0933E
+B187A85A04E4857AC883BAC5F42A890C93D38C495F783CAF9780B6D2BF160363
+2EC4DAEB9039526E575A4183F9C02B56785C6AD690B48110030507634EA65649
+EBC356154C92197E63103FBB8E22D39003AE100B70A920CCF051D95BFA98A5FD
+912B94289DDCB7C05C6ED85A75E27FD5F74F86486E23D2988B6DB358F41471AE
+FAE134BF06EA5B5D1831D9D68FA9791B72D3A2E54D1DE5C2C6A8DA1DBF18C280
+C6073F817125B132928E2EFBA35BCFBE39C1B88FFD602D2D216EF0473CAE549D
+C6D0A2E6E82E68404259516F3591FD433517D9C9FCEFBC9A5CF7B5B27F5AB430
+AB18435EC8BB9AC2843258FB72004AF4CF43228AAA717CFCE311ED7A785D1D19
+41A7D56339F7D5A6DCBD8C2473738D9EE6F0AED82C56E7CC01CC7812ECE57061
+43A65CF7C781FE0994ABAD729D54FF48C029DE1F8473FE2A77EEA482C87C0D31
+E3D8B7C0B58C7B93A535B401725657E2B81F602C0EC9D5E38C1AF15718346664
+0E95B89D0987153BEF53185D351D2AB2EBB8F88B44580A7C8D9114A1CB01D29A
+788656E462955BEB11A3CC309E5349B033F33B0213C10166D67A24C877199DA0
+76F0D03ECDB6EED7C23062FAD575FB03D34ECAA6CE3F3EF5A4A4F44B94955424
+60598749E3D93B9FF2260A1EED71D6FE5D321F658DB5155130BC84C8AF3CE339
+8F16E09681886C2A8456B547144B3E52571AC2E8E30E6CE628C48BE2D08E67C6
+D2A79325EF9C6C4B9FBC621FDDCD1A9D62A618E924345ACF81154B583589DB80
+6F572ED120A7067A893DFFFD64DBC2D7859B9329E417C0713A5FB0C19B10DE49
+864629DAB75E73C3E82198B00E9F40AA40E51D8D64AB90C14E94F51298C8F20E
+FAEE0DB31426337836E77546A68D0C3BE4AE7E54A693E6645F4C86F0199BDF70
+C9960A3CF831EF539CECE72B563E7DAA9423BC14BCB069F045D906DE885D7425
+726DA4C547B99590E71B83335247A025A7D3DF1F6C37A9B330A62E8E09462C89
+EBAC587566817177EFC52550D10043D933196549C0FE765F2581E74ACC018898
+27561470E34FBE6D2A2685E6520A4414D7EE1E8A038E082CD20FDB77811766FA
+D06186B6AF02B84B0FE903B99ABF0C8C595D951458
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMSL10
+%!PS-AdobeFont-1.0: CMSL10 003.002
+%%Title: CMSL10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSL10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMSL10 known{/CMSL10 findfont dup/UniqueID known{dup
+/UniqueID get 5000798 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMSL10 def
+/FontBBox {-62 -250 1123 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSL10.) readonly def
+/FullName (CMSL10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 11 /ff put
+dup 12 /fi put
+dup 42 /asterisk put
+dup 44 /comma put
+dup 49 /one put
+dup 50 /two put
+dup 65 /A put
+dup 69 /E put
+dup 72 /H put
+dup 73 /I put
+dup 78 /N put
+dup 79 /O put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 89 /Y put
+dup 91 /bracketleft put
+dup 93 /bracketright put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7
+5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99
+8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716
+EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C
+02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D
+46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A
+4B60D020D325E4C2450F3BCF59223103D20DB6943DE1BA6FC8D4362C3CE32E0D
+DCE118A7394CB72B56624142B74A3863C1D054C7CB14F89CBAFF08A4162FC384
+7FEDA760DD8E09028C461D7C8C765390E13667DD233EA2E20063634941F668C0
+C14657504A30C0C298F341B0EC9D1247E084CC760B7D4F27874744CDC5D76814
+25E2367955EA15B0B5CD2C4A0B21F3653FCC70D32D6AC6E28FB470EB246D6ED5
+7872201EF784EE43930DC4801FC99043C93D789F5ED9A09946EC104C430B5581
+299CB76590919D5538B16837F966CF6B213D6E40238F55B4E0F715DBD2A8B8B8
+80A4B633D128EB01BB783569E827F83AF61665C0510C7EA8E6FC89A30B0BC0EB
+5A53E5E67EF62D8855F6606E421BD351916549C569C7368AAFB714E22A023584
+8B1D6B52FC6F635E44058690002C6BA02CEC21C54CC8875B408A8BB84F445894
+5D6B3E4841CA20AF852A660FE9C832F773691DC6F7197FF3DEAEE97418A5ED2F
+F2AE65300416227CD3BB03C29003C770CD7D2A7A2E4C1DCA193651C2CDDBF93B
+966938788694BFB562AB0010268955FC3555E5984CCAB0A9B7590C77C9BC713E
+A29E5BD7193A4E971D1752DDD0F0AA4648E7E87BBCE66A1E836C715C408B07A5
+9EB56BEFD4596706CF839BA4CFA90CAD4038C1E006B51913279A2C31FBEE5BD4
+A7D74F9103CE6124F5B439CB860987DF44FE17EF88EF1BF62C67060D25696BCD
+94ADF08F04E349CEBDF9D3389D870D94CC05E393B3F4362A13A6A672EE5E8F5A
+DFE7046AFE3EBAEA58FFEBA4A47BF61F92E2003756DA643CCF2C9DFCCAB62669
+E3C2A18D690B64D907F50BCA155A85E47C3A6954C6FF7ACA36D8DFCE777B7929
+5F5D5F787B9C247ABF13D6D7B4A8F06BA25CCB342F8A5071325CDA86AD71BA23
+8A9695C7D1D50D0AAC267AB7CDBA7AAF46A264B7B081B7E79AD937FEE4969FD5
+155A99E652461EFFB4BD010E5885631E2B2497D6B8C43CE77D7D47FE201DD46E
+4482FFDCE150A1183C22C004A0AF0E1F42AA6804E038E1DFC8B0A3CE26B52038
+44D2E7F759DA5C252489E5525963D68BC27C82247BEB18818C7D4CF0BC5CC97D
+8C701034B8DF798DD4CE36C3F8B1FD40B2DA14EA75583852875031AF8C909EE0
+04495FDCD04B05A5EFEBA56A8CAC1F57F1B8AB91FB25C81CD51EE69D6E0F52CC
+A0E12CF7E3187D67DF71A599FFD895FAA7BF80E2E6B96592BE77AE96905BAF0F
+F547355A36C443797DDA7C414AA606CF9153E03450B77D1BA4088D739DF55F07
+111B9E11AF37F45B6EDE6D7AC126E05886A57C83886DA87761BE600DEECD1344
+8A82BD652BE7ABFE6A0F50ED7C6F4EE12CDFD80CA7A5518692F267C51C3FE76C
+567BB8DDBE09A2AF901F79AD02B435287CB8057B3D5EE6655071F67B00438728
+C4C3EBD648BAF650993AFE5E2B29074A99ED0FB725D9B8CE8B0292B08A280214
+C3AF252BEEAD30C88F72E322FAC3E9D78A1038F5DFC41F7BF1AE3744A0677094
+51B77C2D630B67853FE5E975A395C06A4D4DA744040B272C2B88D8B7ED3A2C01
+66F503C9DFD3C7DDAC865900D2A4F2CDF517F449851DB1963468D0266D7A3E58
+9F6B2A1843E6444274F16A9930302DACD8D2BC4588765099A86BCCD8A31DF0E6
+2853114DFF2D19F812F19AE6C2E419D7AC1BC024D1195074FD0C6717BFB389A4
+4D5428E7BB2E4F9E9FDEDED7BDCBDD3460805AEA0B5F6460C2FDF19273CE5BA7
+5D3AAE0DB94C6AFA8339646191C23B0149E7CBF136FC4C844E025A38935DF256
+0A0A6466A45EE8B9B23B6A055856FB084F87C73BA28F1883E3B184CD813C72F9
+233B78CA4E125ABD26F29B92CD9DF39D6FDC2A217E2B6B45D9B0A4D536790A5D
+BC0903069565A442FA7466414D948AC432C6B75D8D0E1DBB217CA3DC38A52DEF
+62E9D5AE9E753956C13819D93148C7683BE4F71B80BC066D8C19FC807FB1C086
+B49215DCF56A91A42089F0D063B9981925691F7DDE3237403AC714F5CC3ACA88
+DB2F1DD205578C00472FD70C8BA4F752E3923ACF3164D442A6B639902ED060D0
+C5777BC20F9A3BDA60FA3BC986C38136FBD2E8F910E32EF36377C9CC187F4AFA
+CCEC423DB925B378522B748BDF12D523804CABA83CB5A7ED69FAB9AAB75EE8FC
+38D9866E3754C4E2F2B9AEFA804044D878DED0E114EA0E9682FCF38F6628E63D
+FE1C1B5615E54FAE8684566EDC4B616F76EEFD6207E0386F06D3BFFA26425F24
+303CC7C8A8D7021E7D09B202616988287838C3DBCE3179B4FB5C726E603A47F2
+8248CB508F327D1291CF3F08F7C88298DC2D0F778D24304EFCF6E074182BF5B1
+8E6551811FD6991971692108E289B61053D6DCBA2925B3903E8916EBD09D97A2
+C6D08E89DE4C0CDF7185E1E00DF456B249F0BFC686E04FDAAD2772DC2C39DD53
+9C23A41471267F53A87E5C2B8CBCDB66CE0B9844BC506428E6150B48D2FA6363
+4FDB2CEDFBAE0B7DBCE4D83E29B2955F8966272CB865EDB360C8A8C19EC62A29
+03066483E4083524A1E8D80FE3867BC1AA91753C26ACBE8489AB0E3330206212
+93E07ED473DBF457EB8489E66FB4B8ED8A9EA8911CF9308CFE3E6D6F36810EE8
+91CCB11BD548617B2C683C354452B9229E7C9E68828BBEC324420DF7C188CCE0
+FBB514547553A7E9B38AC265783891F42DA472388569C8E7594F7E8810895A27
+06E456902A8D9F65CA808F1FD475D011C4572F8A654BA01D67942226A663D179
+95149FFF41A9F55AE84EEB9A6A39C017D7E4FD6EFEEE7FF3CE847CDB064A4954
+9DCD273B810E0F259501BA4003A3EC1ABA6E13D24C0B57FF82D6DF077833B6A2
+7EA54801BA81DB961C261689C0887FAD83771E55D3D137AFBB21779397E11972
+6C6CA922F45AFA5C0526863A5AD8B9C0775CCBA17FFD37A44CED4710884DBC31
+5C9D3F5441595B86CF7CA2EEE42AE87896E9E60EBF5F35C2B7FDBF9A9CDAE262
+3F48396F0F741E9DDF1D4FEF75E68AFB020D06CC29B3A7B2ED819D1AABC12B91
+CA2A65F1AFDDA2F3FB322E0268DBBA024663E49EFF076455338FE31A16B04EC1
+797EAB0B49AFFB906A0690A1E8E2F5314773E1CCFFF43E6FB3875AC907F0C5D0
+DCB9BCC127014D472463560CA0CB1C2CE614D94177C7A52A5B089316689C8112
+CA57E35D716D956DBF9013B1E5B9626456B1433C8C15FA906458F957133B9E19
+8D46DC3AC015F7602538C2AE3927C6DDBACF38E59220C2F5AF36B68DE9117C51
+04CF7DF32B1AF55B87D1D8A5F4BCFEC66F63B32B6548DEDA3AAB06C5310E4757
+78AFF947DA22809B360FE535506A554DDDE5A6F2411246653710ECE5CD3185BE
+730520A766C47E1ED01890059882BE1432586864E1A86A7F586438C8DD35C00F
+021A741ED47E0F16DB6070ED0C50038632CA4AC2975578A8372A080CC0447C79
+CEABDF2BCD5E78564247B0F0025F556DA8FB62125227849EACFB724A4AE3EF57
+90C07A5B27D2E59425F56BF8AD84C5F5310FEB1BC73D536339FC2E6A5BE2DAFD
+97FC835E0D52F680F80ACA37DB498AACF152B9B44626CD89E3302C3EE1623EE0
+F998FA78305960AAB9F483F731F5F67A8C963C23DB8E48FB804EF8B86FAFE7F9
+4C09641915FA7E3930AC922682313408BC1607C76751CEEAFD660206A39CF394
+40ABE2A313AB7D5FD6444E219DC5C26734D322BA268D330AC17959A390D6C8E7
+3A155095BDD66516DAD5D65519A7FB871ECDA77061EFB21F359158B4470EF79B
+362C35C06B85C9A9505C8361939C6AC013F2CFE8EEF46FD8CB4452AAB3EF1FA7
+DC066557BADC2ADDDF7DDC2A0E1DD4A357E27A2073427EACF9B9035DA5272136
+7DF37E26D96ED4B2ACD60596E039BCB15E259C72FEB3344E3EEE3D4F17DF4233
+04C1416BCADE80BD483DD8C9AF979E1C7D50C4CF015870703F88B92C4FE46AB8
+DE6717B55C460C805B391B84333097E116F4A51F631FAFAB34CFC925BEE8B72B
+C9FD5F5A79D8F2295FBFAE649DC6AB47794AC7D73431FFE5BE992F2B5AC67049
+B5208251C0E442385A9FACF25E3A98D7F5D4C2A1ABDC600AABE84769CA83350F
+9B87F71CEAD3600E02FF9AC03C1B5C21C84F911511A0CF0111BAC7605EE31229
+3C526A79D943D92E1CC3C38ABE82D560CFD4172F318030852A5FCC0534B8B3FE
+D7365987C8B48A072907B26CDC2108130A33233E8E0BB5FDF14FB55098A10EA2
+B51AD9EFB119F82B08D256D396D3263FBD9DBF172D43A90ACD1A31F3E89E8571
+74BE98B9560E2CD661A2F93C69FEA3FF26B00772AE2C2C24B98D3D122EA2AA8A
+44652CCDF4EF4F01CA7D62A976E23E8A86291F43BFAF38FD9C325E70F9C36CB5
+A181DAD30156E98339E6A0498D3420B7BB3B4E651A9090D4A17604AE386273A8
+3D4AE8CC18345E6E19DF06BA848F203F74B161D6A8882991CBA7385F308696A1
+BEEB0130D938A764B98A2001A38489B1334025EA848CA44A116D64926D460D64
+01159E77EA7ED9ECE7BA77635BE564A4ED89315BDFF54ACE6AA1A26591D13CD4
+6D6425CA7933769B842192858D10998509396829263290A3A7CFEBBDA3EE6CDD
+DF1E492AECDFF7941B53573F01F623CA0A5ECC9D05A3D0954F7AE8CE94AC3B2A
+CD4E27519B2E16F033EB732AA024BBAF74626DB55DC74B1FDDB07FAE98B4AC5C
+683CFD8744F361838D343B657EBF52DEEE7AEA7565C5BEEFE455DDDBC4DCCA7D
+87D6D769C5ECCF14118A14A85A86865777C8E28F953160D5E82844AE54D541DF
+550D5F1519E183E0C42BE88F0458CE8087F2CD4B1B49A8E9E3D127C4A4CB74A6
+2E73BF4CC317781D03FF04BC36AC0E4AF99E2ACAD20F6F8029DE8A035DAB40DB
+17D237850BCDD05931FF4B0FE2D0B79EC5A88FE0236271CCB075BD194AA25AFB
+3FB93A5206F61A14602E4EB6F1C31C654527CE0C02D04314DF9AFD710D0EBB9E
+F8721B97F5FB18E27507E1F800B5509A58A1A8296C72B7B73F99B6CFE42E9C2F
+B63B3555475E562672645CD374BCDE937A9B05A157FB3E74C8297507253E957B
+1A9DC421946734CEFA3D5EE357DAC7E9DE17A5BDDEF6B2D2A740BC58128FC514
+61154664412BA1C05209EC992A77B7CA45AB7C0EEBF590A5B5652866008CDEF7
+124A3003AE6A7CF9DF3C72750CBD281358CD2FF25B162B78CBB971DB3477F8D2
+ECA3EE9CBC90323B2C236E375337EA0848CD7CB5781A2B0A42DE7E4D99DB2746
+0B26796CEE129D23C76794B7CE21C13C7D4A998B752C8CF43A4821B736EBE246
+D2A2BD7BA3351FBCD1B0A501EC1EAABE60D06DA2FE39BE1F0AD629769FDDC933
+F9D02F9686EC8C2D7455C26AF4DD3F6860B2289E3A30E1C254AD17D731CB73B2
+BF4DFE90CAEECE3ED0CD3FB4C8F4C7BE1C056AB4E9B95781A8968E3CC1010003
+75DFBC4AB9F6B27C5A9AD88D94441A8ADF09EB275E5F0E5E6F3BFEA0FA8C308A
+8593ABA0645ECA8FDC3F0E264B35D4B0DDB86B93CD8A047FC409E18196B501C3
+B003622999C47BAC04FD1ABD8AD359C977766E9643EF3BD6385306B08EE3E13E
+7DA5A06AE33D17A3D574C6390DB6E9429754B210F0C349C359559C7EAA2350BD
+F61D4D8A92B1AF697BC620FA0351E67E0D9F41A95A47EE0BF210C2C48691901F
+F905F65693DCB85BE412F097480F6A7266AE0A928729DA0F691CBFFF3B276EA7
+322BCD2206D96E3DAFDFB992CA8F2955F0E8B882729DFF840569D12E4DA1775E
+523AA734552AAB6F2F16B89B39F1A3FF0E07EA08D13E612F201716C67F327017
+6C041760DA30374434808273062C1FFA2C47B3FB578807BC26537F542040FF77
+66C995EF3E8B08B09FCD3EE89C30F157158A739606D2CEAA26694A4F1CEA6633
+B54933141CB85C60AB262E2D4E824A3B85C2BEF810DD774F296AB37D0BAE7182
+5648CD18556ACB124246A75474B232D712C2358908B5D9A76F82C626BFDE01A1
+093B8FA6AA0B32F2CDEF737B28BC0448FF816DDB5812131DA0DD5979D77C3838
+B978CC3F6778A4BFCE9A7087EFB19749285AE4C92B99A6649DA349A2E0889D72
+6D4FC664522F06C8C4D86D30BA43ED4E42211217D01636A4E17E2A132D26F394
+EC34EA12D84594AED9C6CDBBC0908860F39B240FA7D7B3003DB10322498691CF
+A294C0FC7ACC0BAD1EED3E9D60AAE3F7429695892D1A21CEBF062C6129B33966
+8B2EF6E932F9891DE6028B81C5E9B23278D35B7F0D83989BCBA25E20E9D503DE
+144DC485F09A4EFA1268AC5E4B551C5B2F1D51E9B9B9C0FEE585204F869D0BE0
+7287D7570A12940A47C1F51AC6134F03B415C30E147C49F89228855D093EE55F
+172711F37776E97A99CC4B36E2F10713E36FB279FD3FA5A0EB9F3938F42E2BB9
+254EB8F0C0F30391735019E02BFDA21D9813C6A22279B898EAF01AA892B14DC6
+5912B9275167AB46EBC420836CC1A5F38A4EB47C039A7BCA62BC3FCE4199FC71
+011DD6E5FFA0F3D7F04AC02AF91B9249B9F993AE346572329DA852115BEF8460
+B94690E790003586F473F37EAB5AC2922F5F663EE2C3C0C336A8DB71650631AC
+0A923A389AC911CB215EC2EC7D50CF8AEFD59EBFFA53A9F1FFB7E6215F17093E
+3975F186FE23BB5FA5474C11408FABD223E1E6F62035B5A5C1AEFD8899F00FFB
+E729C2D5FD551E80716CEA4E8281660286A802AAE8D5834F37F2EAC46297E57E
+993B09251DD7789D3467417E393B7DEABD06676B96241B0E43ED1A1A9FC3B12E
+0D34B2B0792B79AA648FE9450C3B209FB6D7D91F50C52A5DAB0BC81A8B698BD9
+18946EFF691912D7348D48FE68CD876FC6F71F81165D0C3272DA1A992308D9E0
+ED6D0A4DAD679AF495F62B78D462B463BD4A40931172290C615B3B3B6B47E45F
+CEBB85E0A6AB6832067CA6D403C239530D07F199788AA4DD52553836851C5228
+1072406F6D7323A334E7A7FCA588897C4FBA6D4F7DEB65525EFB74E539C988C3
+A685A98752F7198E77E456A545F0D23A1BEF81EF58B02D289CF980A3F17BEC8A
+6F83DD90C4A917EB0E5E2B444A608E2E9D2FF80620E16AC1D7775C0A10C1299B
+BEE0E1AB24C50647E5CA1DA65CFF3B2C295F0644CA7826E1DC6FADEA93D66A20
+DE852F20AD224D28DB900519EB1569837139C833F24B799F7EBE3FDC14235323
+1D0BCD4991C861F38DF413A5A5588B73AEC3BBFDB885CE17BB3E97B4E6A79761
+93EC8418C2BC4725CD61B5E30C07352F647C3FD50083878C13CFAC241DDCB082
+E53703D182068727F9EB6FACEC25F6D901D7309ED7370867E34E267519E22D62
+4FC7093448BD0D6B1C43D318A3E14C92032325C132AE0FF7ED707E1FA4A955FB
+F5224BE0045CB14ECC321D0F333FE24EEFCC504F7C756451D7693C3E6CA87526
+4912E1B6DB935BDE76FBFAFCA4ED473F1D2618812CFF25A6859C626A216603C1
+361BE3E071FCFEC2D4BF2FEBDE07DBD56A1BFF8303901168FA06488BA6B76F36
+95B0A90D7724E9ADB567C2ADC65CF3482CF47FD1D16F70AA19A97D0F9EFC611C
+AEA5E1ACCDA7FB2DF05E9480936281484BC329F0B771775E73F7FD72FE3F45F0
+50ADBD03932B38F37A8F0A66B2F739EA3AC8811C8F514E68C5643E4AFF485C81
+88475A523D7FCCA5C8809BD49846C77795A38DC6406082000236A4D2628B5932
+AB7916D44EC2210CB941B83BC0F1C097792CFFE7112D039CF77EAE73CB4E02BF
+60F5C3F629F7BC5A27C207D70DE63FBE0E023452097D5B7AA5B2CAC668D4D075
+1A0F70683E96AE35A6BA0B59619C215A7012568991AFC0C35789DD0ECE45C649
+F44580845F0FA422868CFCC8029513235C0286B76196E350498845EA934DF289
+1D0C954B079BD2977384B96D8460B4F50EE635A4C8F7A3B6866F93CA641F3F2C
+C93ECCD6BBCD792189A12FC9366BA7134EFD67A22B4FD62465250E0BA6B7C627
+73E8F50E379328B7FABA341B0D50F9A2CFB055E01DDF6BBCF6FE4114BC36C10B
+E581D76A84EA12995506C33DAE9035683FBD5F54AA1545992B94B8ED946E5866
+2F2CF263C8B27100503264301A710BAFDABE2BC79B07CFA2FF4628FB593B0C62
+24651DBA0CB2302B18664065F9C6D06EDF4CE96CAB664B99C0B710586D3E3D73
+2357B60C1EC5EC0A5FFFAEBD1FDC2E8607886FD2E971CB2BDE3F3831ACA3C77C
+09331BA12ECD9C58934C3C61023C70149AD63B43B158C677FD43830A89DC89D8
+8DBF8D0F98DDA8D06C9D59B5B4255EE05C2FB4C677FAEF12B325F8363F4A9C00
+0FA3A548FF16017CECCD6A1560E11ED9EEFE1BC796D2BD8984FD88F5DD6153BD
+3172D56277366465F8AE0AE10E72F38DB57D30F9DC28A4C2AD1063ED7F4BF8A8
+B4D7732E938AC8487739D26FC08BA2DD3927747652FF43107A1F8EC3F11F8E38
+1D7A79B86C69CC188F2FBD0627C7F4C624121B2C3B0DE133930F9D480BB2F6D8
+254B97BF6159DDBD297E8F0DBEF47689E090BAC0209D53234F3A97DFABADE965
+30DA301AFFFEB9BBF566F732FD3BC741A4FD6C6E923C0279DDE108FAB57DFB2E
+ACE75598F49515F54CD038003920FFC3F00ADB18020C7E2E008598623A8A11B8
+8CA1EFE31D894F2B86179C7041C0BE2DC7029117D29FF00F8EBF7CADD2246280
+2CEC39A29D82D70413FB6CEFD9B5999414655E1E6FAA31488C3ED458E880A344
+5D6119FD88B3AE9AA81DA4E675F78B570679A50EE64EFF2809E2BA0185EE5B94
+FF3A70DE7E0462E09651C2F4F216479C29D8B753F0936AEAD3EFCC0BA64A72F0
+58770CC3DADFE22FED4BDAF76B9F6D6008A85415D01479746BD03DE32A7D488D
+9B1C8F8B6F10A5A8419B8DE651B2B9CF6ACF892BFFDEEB08B780AEB0818539C3
+7DAA805D8F621BD6B3B75123DE511D88604C5EF071514E58962BDDCA03BE02F4
+48A689D7E434347E81077F835F9801B1262494A8A831D803AD6323DD703ED2E5
+A92BDE25BAA62E955AC85FFA599F38A94A4558F83CB6D601D3DFD0EF37610A34
+F3B68AB6ED3BC07AE74331556F2ADECCCBDE091A2571B5AC458415284E0CAC03
+7733EEA500102E39526E921714290B6EF33987E8FDC5D5E2E6304405B32E6F19
+0D34C9995F41248D56A698B7EEB6CF86722751A0D680389F4F7F0D7B0FA89BAC
+645836C890A9F3EFCE85CC21699950A00DAC35DE915E2AB54D09ABDF4E9A0A44
+75BC29128EA22CD98ADBB8A5011C734367095FE0B43E205E1E579438ED3CC098
+668D1D533E0686E9F6527AB4EDDDE7BD654793F67BC090DA7083619328B2F6A0
+76F82D5AF56DBD8A80F757748FF98C2A6D5BECFC35464BC557123FFCC5D1447F
+D0E47454CBF0564E3449DBD404831D268447DB88DDA42F1239E291FA5B0C2A7F
+0D1BC8606E79E388ABC7F2C4E2F9A37BF075D69C59592D2E4B1749969E4BC3F6
+8DB0A31ED1BB0EAF337DE171630F93F08FBA4BD889DDC7069F06711E40565ABA
+80EFEA764D8D52A10182F141110ACD55089ED2A1686B0A2966929A690BEB4E1E
+F896346DB64B1BD93D2ABA1271303C2051D2065E818FC6F7076D8FFD473FFF7D
+5972990679D3A477AEE532EEA8B4ED029FC6CF5E049FDA19BA86B756A8575E2A
+1A403D14F491FA424733646614F62E16410A30AEDB48F88182CF81F775869F02
+0F8D8B4130CF6A8C4379475C0E5FE333956A7BEB826146670329ED1E267A1418
+AD742E72E26FF3F53DF9BD0973EC25108298BEC5BC4C8A334AB9E9F179494BC8
+BEF0E05DCF987436DB4417EB49CA8BE14460325ACA66945084953FFAEF84F37E
+9881EA4C778636D2EE3E512CE45A4CC31EB52E7BDE60C68F21E90946632A91BA
+402C1F82A5E4E7FC60825785331A9DAC906C9574777749A34326B25259E0F31C
+EA7C970E5344483055900BD864A29F58085BEB1CB67AFFFBAD6294B69F9F8F2A
+36A4B5FC710642A3443674A4D13A89EE56224DB9E402B17A645466E74A293FD9
+A6083DE85E837D034B347A86E6277E4B4DAA3B7D8C15A9BFBC19CB1D0F13595E
+D330FC272F0F4E944FD5C61F26C8734051853FBF27BA228AA98352C4127BDEBC
+A6DC86850E0F1760472C7E182EC921E446583EE115E544E71D326B3A483AA55F
+2624FC99D29A19C03D3420D4B845DA59FAA739F206881580FD36F16514BC3C5A
+66C8B6CCC715035C4A355221321D53D0A05A8FF9E4E7E2DE61126AEEC58965BC
+464448D3A3DB5CF9CE341520B2D8360AC6D0CD8086E53D5FE0A4E9BC992F1DF9
+7056113D28F191921A49F34271FE816F6A4A3016252279DE9A17A3153617F0DB
+B4F5D360243C157FA120CC89F7FE8C2BED8248D1587D2D4DC4F5C90D7D6AC2A1
+329C5536E85BB5ACD3DF5520C4F620782D52F896186453F3206D740B57AB0451
+EE735047AAB4AEF258FB1DD705DAD49F695D5FFE98CC9F73AA59B034D7A6689E
+AC3FC0144A791FB04DD0C2718B676B0405BA04CAF72C57DF2EAB282CB9A81A47
+FFA4890EA672F3DC041210C9F9C86F238FED85DA9710C7C6C0364552CAEF927C
+D52D5A603D205C1494E39F6A66BD012080A4BD18DEBD96DDCF50CA118A569035
+040AD7B9E925F33391D130C3F274077C475BCAE215C7F3C457AB339647191729
+05F89D2FE3FBDB1DDD7606214B50C3860625F0E34FBB3037668338D70032FD4A
+F7602CEF0B62E0D06B5E27F3106894CDC7B249734195A62A5C1BA0CC8F03E3B3
+EFBA46FA153FD44EB55ADE26D38C5B5C1D8C19623208987839093126ED883168
+D4A1D9A5F9C94C71E16FB6BB3504D9E772140F505438A00EAAE79D05C5722442
+EF1244BE875098251BFD488A2E84C2D3F8F70EA07C9805AD823980561A074FAC
+523D3143EF274AC1F1872D8C1272495F07DF9B062ECAB0530DF8FA962D33C377
+2449FEC027B79CFC109821620FF67F02AF25F265E9D241F761B1C21DE9AE21BD
+A0A7BE667E34578A62259E35CD3503A49015D169BA5131BD1230CC16DDDC9BDA
+81FBD19765355B5501FFFCD65438449C36F66ABFA4C6DC52D44706C6E95FA7C5
+E5D69839225C8141E81F67339D6A3F510F1A87980A7FA2CFCF919F83D2758981
+885EF470DC2ECA30F843CC677A3E6083A9639E040DA5FE2AB4173581DA251557
+B631AB6ABB4746A81929310854DC087427DCAA78BE0A14D52CAD85EC12CB5D81
+21F8F7D8ED34E2EF764391DEEA35D03B34F5EEE7E0845939B73683C9A726D269
+6EF42C322E69844F503AB771E7BC722DE5D39ABC79723BA77B0ADA9A27C7E6FD
+8F0523F450EE4FF8D985E36CAEBDF1DD6707B61478675CE0ADAD4E67FF4D34A8
+597F98978F414323791B64E84FBBE9D67764C113C6822C20C57BA3425C1B7645
+9AECC2E00CBB6C8CA670A2A5A7AAD80A1E737E77CFF242BE49B872FFB60FB3A7
+FDAB635914C9947859FB5EA665F7432BF5E507C5C95B5BCC14A841A2BBBAB185
+D1576730BDEFA8A5897E476D51EB1BAEAFF9FB6C457E0B7C9CCAA1684DE2C1AC
+5E893046D4E6D704528669F08063EF86F99D8ACBFA5027686834E8461792E35A
+0CE30ABC123D8C3E22873D65364CE0E5FF75B89D80D6BBF420E5FC5E31CE10EC
+073C4064C47A38800034AB2BCE4966C18B1187E5CB1870B30FFFF6B967A54E38
+2A38EE09854E20AFB47C7E2ABB35DA449FDE353FA5A6FE4D7B550018230154EE
+E635670AA0FBC05DB432E65F3457ABBAF7FD175D5AB5B386E0CED8D7193BD547
+86ED900579DDCACD269C1F4994F845804AEB40D68457BC8DF062A7F3953A2F07
+E3A24311F563B23859C69C790D218B0AE1B4A3945F46A5FD63BE4029957390B5
+54EA289752B826B24BDB883EDDF6659F26212AFC7CC8ECDFF1E7123A911B0F98
+FD9533D672C0A00C73E0F01719100918F605CFE56D0DAA18F421320FC18B3FBC
+78AF72B4093E2D305FB3D8EBE1EA2207D05F5A121BEF677F3DE94ED9F0A7672C
+11ADB780122787F68CFC8F59D4F4DDC33E13A13CBE7B3C5D8782F8C9162190C9
+0F49DB134292B4B488315B11A4C3250977E43F0FCC585709C47B96A2FC381035
+61674AC6B51052D77130C37A49CE264C0973D3D75B1AE625A66B56AD41EC0931
+C9765F8DFA5D1587D06A28DA530498CC3BF68C0B0F24F80BE5C1E76F528A1887
+E8A415FEA0519FF3261FD62F2D1E009F97455D5FD3C75B7775FB5104DB7A20B6
+CCC697D5A821F89F69ACF1017C5462D5B828907191B41C0918A8FF44547B7CEB
+0F49B625F790A2147B94EAE381164BBE644A3E70DAE8E1F6C97A75E8425CF6AB
+6C8073D8E3116D9B5D06C1992CE93024618A5105E7AF32C6BF525C7B5D4AB280
+5D4103479D66C948EC9D153B2737FFD64F95D300B0CB491D97AEE905F3C62E3D
+439936E4C70508DEF021EB918AFBCB4A56E8758E13C9490D86A5B732CCD77373
+4EFF0B8CE6819A7AA5BCC01CA85CFC95719A03098F9CA7AAC88DE8B0C09F015C
+46901E5D0A49613F544290560871A1D4FE48D7F6214F5AE1362E5D1EA1508FD0
+E57DD35C0993EC0CC5E7BE4CB79256FFA4B5687CDD69750377E48CD6DC808922
+BC1BC7F14A5C664B36259FF9161669AAF0525FC70C6F856CC22A7A938BCBC318
+D01E132682BCA208FE3B0989D714E5BC01BEA2E3E1AD01FB56F4477172766938
+7023741747CA79AEE51D233B0C82103426121821648D4F96C22F040F40A068C6
+DD24A417D17F46999C9BC648C5AFEDBE3C4157E2EAC85D9997DF585D8F686C2B
+3365696E492DB619498ED80DBD495BF52AACA15AFA2C7AF60B5697E3E471B80C
+D313AFB321295FC989E819E1970F383C94511737E60C92B92D1720A7AAC6F774
+14C51AA35192A28DD4B2D46736A65DC54B2B25B0996CD01D7B388311B37E6318
+C29731128DF495967AD5E6EB6F1D469B5541A41D4280AE5DA85FF96EB4AF1789
+D7C1DC31D52C087DCE9405062806A0B4E68A075CA2C6CFF60F8720E77AB94BB1
+CF15D4AB943E7150B286C5CF6966B1C3C304F96864958030A625C742158EE151
+49451D17894D4390AFBBB830C7739D4DCDDCEF731712034ED0CAE738647D49C4
+D73584E907CBB7D64E5CCE1A42267689F160E43D8771535D9BDA7702D1981687
+107C015208124B4D759DD00397A0B54C83878FEF897F3BEF278BEEA272CF0C82
+88F57EC3DF160D26746D785AD19F9FF3CAA86BE390898C6B797B3ADF01B0989A
+95B0FC905F034C14C5F32AA0C97B7120601C7440EB99D5855A61A7039320DCB3
+CA9E49E5FAE282460118757D841DAD5CF14D34E5D108524170B6C8F2F209C4EF
+071D1C930A071D0AFEECA65EAD8826E0E54A349F60B54265C62CC70EAD8AE3DB
+B113BE98479072046FFE73BACE222033E2C47C7C749D97E7BC932EF60FAE13D4
+0A208321C365A5104F6638D21176ADB80A3B415C20757104D051D967471F687D
+E3E7E344F9CCA96E6C235B52138879D72D33CE3EF4183ADC3173AFF0AFF779C7
+78190DD5AEEBEF54DB6F50226B652A496F6899978747E151E6347834F8177F18
+0F14381A7BDF9FF785DBF90498806CF5350C82B89E4BBBD5A4F3B050E10E121C
+E71FC9FC055831EEAB6DDEC8F26D102A9250064EDCAE106D53245BF15EBFF4BF
+EBD2DA1099A1F0A1F4B6941DACE2BBBF2A38F6D25C1565B6C95CC94DE6C17E2E
+AA539FC845F16712A2CDFD39854C63F6B7E7A89F335CA2DC57ED30B92A0E0A34
+A15B59674766AC84417A9042E9C388A906FEEDD189714A087ECADAA080DD178A
+70C9D8A1C1B0C9884D02B692483730FD313C4E64190E6684DA24324CF88A8C16
+C04E949E9ACA502B5D5ABA91803992091869C0697422CDB5203057BD85471518
+B86DEE52FAFEA174D86E3DBA6EF3440E3DA943480C88F0886412F4411D0FE7CD
+C2794552597E9CD1107AC4AD756C4CC1BAB6EAD6D38559A233852C3C6735A7F5
+EC6D6D99FD510AA4428918E0AED80E0DAD0BE22EE3EA20A309BC7267899D1396
+79458C5DF3CD1C0848B555D2AA48DDDAABB87EFC2B584C48CA8BC0A91867D9BB
+25994B16DD7512B4836A691B03BF5767EA105D68B62D3D81F2440EE269750E58
+8091F08CEE3C62D4131C18D575147A112AE01C93773124DA4E2B74D4EEAEB1F2
+C8B0D863EE815D994070ED9DCBEBBB673B2182F190608AE7D97C309028E7C992
+B14BEE67E749D1A875E79934D23E4BD9A3768497518620388D55C076EC42F6A6
+2EA61F2DDAEAD939E921AAAE37D58CE72AFE3B74A8A02F4A1804551117D2922B
+80A2750F0A3D9375361BC7AD2E302267A15C675DC20FD858DE9793A080624F29
+8D9106D26F7F5747FB7944BCFEADEEA4C7605DD473432B4EA58ACD471AE3A4E1
+64E4E35DB9D97E2A374DE22A6A9F8B6D7E2D32A0C603BE0A044283621B3D1F0F
+1154CA2149ED42E08F08FD85D2CA5DD02DF68E535A25487BDD98964A6C2064B7
+A057D4186F0169777C3BCBB4E397C22F4196E3F5025EF5D59501FEBAC3C44768
+6DBDF3342857931DDC23BA77C22A318CB13C653086032E880E191BDCAA77124D
+7238361A68F663A638D0722BB7DC3A37226FE9C5B1C15E0A32B900A335F93AD0
+98D0F22C9092134E37B336750C48B5C30AC8BE183A154ABE2F304915F8FE256B
+0221EB3064620A3F87AECF76FA16A7A1BFC67EFB0D27910977DF3C8B1B93F7EC
+5C47C8648197E784C084F332FB505DB3A3FBFE6367534AC18D37CFC9D96814B5
+0B568AA24B823D93D58C38FEC655183AAC309FD07CE32353820B5471E345FC29
+51FA9581A7CFEE964B4219E3837A158FD43C9FA8502A566E64DDCAC0ECA874FA
+CFC71A0D442E128423D92340E53A76C9CFB6882BCF76A2AC1EB66DF300F6AEB8
+C9A2A9808EA83ACD248A68DB3F78D6CDD9A507785799714214DA4B60EC547FA8
+2967939DBF9A29B73D319810FADF8C44792E1667596261B6E52339736E7F857D
+EFC6C4997298BC8ECA834F8BFA5E3786AE80790C50FB1669230ED454DC81CCA7
+7DF4E5AFC2071127D70476AE9B225166EE9C65842EA63B4B309A907A275000E5
+94E0994A08FC58EF0138B557AE8D96842EB50AEAD3F1FF98F454E011CBF4C2E4
+DD531883C44989669A50AD00BAF10A062BEB4B6DC3F790CAAAD0E68686FF3A50
+1009236F70FC80905D8EA2BDA8D2442A006E2B77D9C40A01A106D8BAFE585D2E
+CE2FD94F9A628634CD1F829657939751174E8F43F318C47CB894EADAE6C8ACB7
+2AD554E3085ADB6F3443489F3BD33A56CB4AC8CE9E11FA0C83DE9E133C97F69F
+4812256B60954CFFCF3E7F439D126F7DACEF1626D83608DB70079F0B2BFA5DB4
+9E2EABE7D23BBA421A88374E77DC5B6E2648AC9B7B1C3569C826A33AA21F71BF
+8A5B0B825DB9E00CFEF59403990D57BE4C48953786B76D55D8B665A15AD69709
+A360AA9D8BFCA8E00DBF9AE1D0A40F0B02A652B2B330C689E61C3C5A7EE81172
+E847414CD43E2277F37BDC832104B29C998785022A693389A9FE86EAEC5CCC4D
+09A7B9348C80AD3BDE70E7752E44D30113EFA182DD5E47CB21EEA64D9101C657
+2106899AF37365A796ED255FA7F4EE501D8681FE11F92E64149EF8CE9D23F334
+6E2B1E1A67CE7CFDC535319EB61E5089201708A0F4F449F89534FC7BC340948C
+6788F3115AE6B80CB6C1956474D2D292B830DC9F8F67E1FF381CD81D788AE222
+1AF6B548B5C7C496BA711F1F8AC21947D2604ACDAAF0C5A68E587FA2109B11BF
+24807B7DB0EE845C13E8F693DF8A4969715443E1FA0090C4BF359F4827067C0C
+823676958AF915D6D75C767F01C7ACBF06CDF9E9A27B57FD5C2F133DDB091CAC
+2B31E9DB522783B69951F2965AFEFE6F454E9A859664A65AF8D087B203924BCF
+E4C45AC959352FFFECE860648C6200DF02D650237BDE22AB1ED127EC09B4F3D1
+234BB3F32ED111B8BD481729F4293135EB333723B7990F8B70A211A3ADD67AB2
+8B5A7D6AA9E9B0EBA08F9F2959D13611FB8F29B749686739380BB59E0A93E99A
+0B97B297ED8362D421F3AA230DBAC86D200DB0AD6D5F320D1B23F0A570357646
+94DC98B2973F2EADFC8D2AB5DF1038740AA520B7AF4AFB812575C18EBAAB76B6
+EBDF757E1B8264C87A7180C627070C3B95EA0FA431E8360F0DA8A722F0861C9C
+BB7DABF781FCDEC603326ADFD0FA3F788A7C695E50F23848CF85CE410DADD5F1
+D7CEDBB484D009FA9BC4E06108CB63056129815A616BBE98C38E6DA6E587C23E
+D0F6496CF0FE5F51ECE5FB21779A44163115D2F05541531EEB124695FC34E359
+8E0BE91219FCDDA56C4FE3BCBF6E8F45505ACF974C6F9EF55DDB391BF5606A61
+725BC73D5FAF324A7DFCFAC9C9C2728CD4370A9CC71F645316ECCD8AAD062EBE
+9F0763A7F77ACEC296597E0374545BBFBC538525889D39E9153D8FA7C5945F8B
+955BC41CF03F7400E4AE3359818A4C1FA2AE66AF9B77F6AEE16FAF82A469F6B7
+46E679B38AC3897D1AF3CB2E0289802E8B449A1FBB084EC5938185AB229211F3
+6D8A9C36134ADAA0498417E2FACE92E753325E0B23BC6330DF323C6DC3C4C41F
+25B077754E4724164566626638525F6F49BBDDBB3E8EAEA9ED1C3AB5F8DE8BEB
+9432578C9E334AFB9B3B05E4E11D0C17C4A084BC7903ACB1FCB213622CA5A95B
+D6EED267C225E42D372F5AB6D45B23DA02D5141E310A4AF395531CF047673DD5
+69FC7C683F52CDFD0BD9598587E1D66BDEAAA467C512AE2BF24ED472527661E2
+CFE5723B43C46C210CF6E76D0A4FD426258688C5A797F1F6ADCBF6174A61C332
+2009A4AC1E90E598359039CD693DBE122E18F574B96FC97BBBCF0C7020EC446E
+FA902325670BD42463490952BC7CAFBEF1074FC1A36271F6C6E29DA363A6335F
+6223F16AF2A3ED714A8BAA0EC08998F41BC8DFDC7B0007F04642CC489BEB0139
+0A78094BA9D580810CAC4D4FEACE3B67D1F957B180A481BC62BD7836A708A336
+CCCC06B85F07F7CD13104E30FB110F749A966554CF8E507D10572B4BFC0E24AB
+AD69A17D1468C4F4EA8E96ACF86192EF402E4F59EF145E0C8B187709E9C64EA9
+C52F7CF2E7CD9F43170430CF6A76CD422648542920F90917C1698803282D5AB5
+5C39F06597D76D52CEB7AFEDBE9C91C90274EE106BC54DEFF89B7E870ABF946B
+0C87A133D0CEE117C00ACD3BBD72474D14F14D2A6AAC857254CB409EACDEB6D0
+F22AF9B820FCE6A5DE6DE866CE8BFCB17C1E3C452CA7912BF25D07020E447AE8
+9565BADB3EB531A704AECE4A80024BEC8920543773349987E9F6240514EED4B4
+8D78A234318102A2AF9D6C45D9BFB27AAE43D5ED91483CD1284A6712DF124855
+B64C5E3FF7DDB5DA6735A0C765AE823BA1F14749B6022624EC3170435DD20CBC
+018936484A3F93D5BF136281E07A5352F9F1D5772DB0DCEFB57EDFF0DFF1A92E
+22D3B7C7DF81B7F9BD970CAEAFE9C01771C4E2DCFF8B97FBF80788DE47C77707
+5F2D211034B5150F0343DD875E6ABAAB8E68999B59738A3999C440EFB67BD76D
+90085D1D4254E63EF500D66E4177A18EB2C74B1BC53EBAA89892F680F33F3EC1
+AF438446E2E38CC40F3BD253BE7E37F00F4F6132A5AD13F09A9A19C801694078
+0189410E617ED04990AC4B4AB626BD9A10599193E3B7C7A3BE9AB3DA5F9466A4
+1BC68B6DC033EA0123D1D1DBDD8CD5C86B4C0539E1D79DCF67653DC84C3A8C89
+D250A78AAE935811AFE6F3FBE2E5E452E430E16A20DC563CA577C898E68F2A84
+ABF46FDDA19186DD43A1DFA24C92FC62ABEA7CD85BD68D64CFD1A0C29DBF88B4
+D25D8C0F2A6FBC7A33C4DBFD91D97918748A9E41637820C7CB4FD427825B7FB3
+44DC759B24D98AD1565AC930B89E81D23128723BAB5BE792A6C9112787225241
+575015D00D0691CFC7E29EF61F931599B88E165E8EE75DBEFF5B1A8D4740496E
+9F85ED6820722C274DA65F73AED95051BD9FE38AFDE4FBF425FEB6ED07C8A976
+F32A9BC9850E0C7069AF74BFBD5A78765AAB81037075B4CC6F09A95013F4B75E
+A86D41C755425B4B00776EAD7F5872622D8BA5F5A2C5187DC8F36F03DF03B168
+6AA1AEBEA0702437D8E546888A00D42EC5D6085945E31BB14AD594BD9BCF97D0
+4B99A50C128B77C75D87CE0BE0C73FF37F2DAD7A5B5A361697627255E6E5797C
+FE1E38C38E4359B97D594EBC15E0E10F17F20156E7DC9E33DD8BF8EB016CC9D5
+F496FBDE6E16F0FC9E5EDCF67A39EEF57345C3E6A4E04DFB7EE6AE6E54EBFCEB
+1C53ACE652AAFE3425ECBB3E42EBBD51097E06D1C2ACAF97ABF4D875865429B2
+2D9A1E61267AF7E31018C46EAD1839A45032BD9746DA458A2893613BC41D0BEF
+F6338BEF85A69A8683E5B3C3D83DC5F651011934745C042E3DDA4DFB7B393C4B
+9002B5721DFED701278E9CDEEC9F7B4EF1D326CCEC149E68FEA5D7468F7A091C
+00A3FF3AD5446B14FB635771A5138FF8C2B02FE98180C19595BFEFD29B8F1A0E
+51CB37E46E06413ACA5D70EA7F4F0039A0F9A4A20BCBE335C82317F6B1CE4E8C
+7B06513CBA59EC62CB7563CB4B29ED6BC20BEC14F6D4C192E0261C8A2CFD0968
+BCC64408B19F39F69CBAD5D6E117BFD8470DE959BAA369613057DB1BA3441E27
+EEC436544FCD8B6C50D24548886892C86EA61CD573FCA53F0CFA97D799C25418
+3EBC2302D0B43DC80E08F68C01934958A810C76DB2E23B13FC0BC6CBE37AE842
+8F2452EFE0AD6E97620A070BD93CB99F13E8EA78DA56728314E62FEDABC6A6EA
+491EC96A8256AF6C7E8FFA6A04DD6CAF1DB9A45AEF196342D690863F54B3196A
+11CB3BD65F022BBB8DD1356F768AD0FBEB817DBA77D2BA4FADD43C8C7682DAFD
+EB331954CA9668AACCAAB539AF7BB1F94B6C9C430021D1DF43432F03DAC805B5
+EDD2279D4BB979130BB5B44FC22191C59A849D0DFBA2847D76DEA80E88AC203E
+84A8657C760AFCE2E070E16E3AC53B9D2F0AE040AAF7435051B0B36795BA0ABD
+AC192D83908FFB421CB493A64F1C3FE99DB9F0B41B5AADAC1D6E0482D6579670
+F5154DCFA00E4E45991B6CB9FBCE7F6A470807193224CE848C379F508C5BF898
+4CA713E40BF4EF1D3EBDE3D1118D838516CC5FA9B3BB84D22408404692E04873
+C7482267713954828DE7C91EA03BACDBD2E53780E260601FD03CB08201C62BBB
+B95B268EE00F702907B2F210776046900F80857CF5AB73029584954452E1CFD8
+6AA384D3238AF280DBCC617B8144DE8DF0DB36C18C54CDFB81800ED65DD9EC4B
+4ABF20562FE068BEAC88A21059084A3189328AD5CF5AC9015555C896D0D2D096
+B734CE37CAF2ABFCA0504F24869D0004F6976C73D8369DADF0077457A374E601
+7D8120F6918B57F5A3ED0E142835A8FC95CE31A30073D5AF29AECD010D2C80BD
+737FFEA417B9CA710CC39B759BFC9129B11544D222C31B165027AA9A981944D8
+E429D11D540538AD0E26B7D6D714A770F8FBB42B969BA55953DE4DC7393051CB
+17F74547E2599B43AB9CC178BF0560BD5EF585A67342146D32FBA4B477B6F403
+C97C8CC1DC04B16A21E0CCFEAD2845E4A7943C34378B80201C6033CC8CCFEAF1
+8026EB0AA7F77FC2165E6A2F99BCC0D7D65C4566BFC56B9A1D35B964D6DFCB6F
+A2E9FE35915C8AD53861F593589ACB337CAD96DAB5A00F0BF52B7940FCDD915D
+03A57E81EAA243C525F5A99B2C9325A65B63937ACE78801D22979306C3927400
+30B3682657443F972DAE9702D1D1709B71622ABEEDEC3EFF4FC3A82B9EC94C5E
+6FCD4086A02F8B4A58E00B4B28F054E203734082BD4A7E039CF0403836E439AE
+652962FF9907AFBA6C7AC441CD769AC304E243AEE7DBC219C5406320F6D20E6B
+B1FFAC7CA30E77A419AD834DDB087C33422C2B1E689794D09CE6FC29204A14F4
+6047A79CBFC04AFD3D68F96C0B8C3A202A304D697FE178F0EDCB34F9B0FE3BB9
+61C2B07A7EE35E8F18071D61F6A98BE7CC573D0135FF9A53560159BBE16F26EB
+B171D725905D4A0671FB8BEEBA009B47CA9633362FC0C4553509AAAB43F137C5
+852DCEB47074F71DD6345634065E358CE4EBE88111970F1190CE776EE7709729
+548AF51C38735F6F63BB83E9D91D5A5D2E1F89C7BC8785711452AAC43E77498F
+A74D91A1EAA3F29114E49EEABB681B56C5456541F4342D607C477983380FE29B
+9A08A61D371950992F17F20D40F8169E3CFB99AE231C40EA020C6C253FAC30C2
+04AAAF5D992E9458877380510AFB91851B289DC03AFA363EC338E21ED01D2186
+C706EAD057ACB2D47CDA1FBDEF9AAF93841C5BAD0668C10541D7B41EB3CB214F
+4F214D7ECDD4606A4035795AE25C58C9692845F535762AC3403E2A0CDFE79D27
+B58887D2688C7694D4D271EBE925801E7C1B27C18C8E0BBA3E6F999484033991
+B0F021F1A60419F06CA0758F7C3321D20754888062DB453FC09F3033DAC6BF0D
+341BA60AF9A8608E7BDA2DEAE73F83A5DD9FC35BADBEBC2E0C6AB18CBB05FC06
+7B967D6263051E960498B63BEA972BDEEB89650EFA809C88644E8E00ED119DAC
+5AD530C519658A82AE9E17EEDE4B91FA83AA1A925F6C7E65119F8A397F11F50B
+681E3A69AF664B9B6076E4A9033C3F391BC110289DB31DF9F326826F480B9F4A
+D0147924421F1B5528F463E5D97FD84B06C9CC9A35EC2DAFEB9FE70C86C9B843
+6C60F79CA7F7A61B2E58B7C15752AFA82BF0F19F4EB7276D17109D975206FAD3
+A02CB0FE17FAB4AA9F8A649C84F1EE19E2F5026D2CB3847533D7ACA488D5A531
+3C95BC346E9C249E34A4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMSS10
+%!PS-AdobeFont-1.0: CMSS10 003.002
+%%Title: CMSS10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSS10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMSS10 known{/CMSS10 findfont dup/UniqueID known{dup
+/UniqueID get 5000803 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMSS10 def
+/FontBBox {-61 -250 999 759 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSS10.) readonly def
+/FullName (CMSS10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 40 /parenleft put
+dup 41 /parenright put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0
+7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81
+DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91
+511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6
+1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD
+028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86
+1319147A4A219ECB92D0D9F6228B51A97C295470093CA270C4488BB4EB864B48
+63941B9739638D2E6F3CC778582B46AEB4E466D89D1C211225274356A4BC90F3
+274C6AA56E200249B7D0949A3FD4185DCB3E5286910EFD7CA72D5D8E8052C96F
+388D12094B87D3705CE64459558CF024667C0FE96CBB32B0BC9E51037D7BD62B
+E4B05FF99384E71D78441A79B0B1DBA1CAE02434A9FAE46596FB86B873B1670D
+AE0BAF516445A0DDC127F8FF3ADA0B10EC30A9CC1F7E9248828B5E8AB46C3FE4
+154B80A54128A08777F5F9B8C519C7E3B632B3476F007FA156E9F39FBE57638B
+4214CD2BA79BA9DDA0F4C073AED814ABCCC2F7906C57A872C00E67FF03AC1200
+29DAB92376422FA21C67CA98BCEB8C431CA2D3EDDC16972F84BF6DB2F705BAB5
+CAB39C82D139FB1304B9E7BF1F6FF447596081D5690B1519E468D6BE49C329C5
+C9C809023EDEB9DCE4A6D52A8049E0CC134E8B41BFC6558CFCAD3D9D2773EA16
+131567AE6231B3235869767A1E7C1FA6C8D6FC1B276CBB1CAD14D376188C9682
+302836A9290E587D4225EB8BB1DBA2C4580A81FACFDA197174FE948CE757C575
+F23070FD84DE121955D7D9307BF986C5E739FFFB6CB76822C341FBD9FC2E3378
+AC9332B40C07D5B8745D74E30F1D719EAFAEDBF5FBC40D0546F69A66072D8A49
+28D2CC2E76B9B1EFD191E0BC7510C2C8761BD92EFCFDAC263342A01398A56D18
+121A591FF5CD4AD8B25699A7897E60BA940336BC17B9EC9F97C2464D031F958A
+A3548D0C97C50C580B6EEFD0FE8330EE2BB0D2E7FD1DAE33448953544A4B1C5D
+8EB57798D0ED4B22909FEA78ECDBC4D8A124DA05B9999242D68681017285A0C7
+69041C1F79442279FBE328733EA0A6694D68BA89739FDB9297BE0CF1808C07F7
+BBF6F1538DFE084EC8C0EC24D883F6CC08A51DFEA23EE920F44BA55FFF58E960
+C7BEE551FCD2D5814DE7E3F835608073C2CB80EC57100CFD484C837881674E92
+B217F4D11165427DACCC29C129005874C05CDE5FBB2D912368EA2B98C45AEDD8
+8A0D2493F60EF36809C8C6EBBC7856F6656E8D398BCB29DAACD4F7D4300A0B01
+161CEF51195D2C58DDFBCAFC1C03F49304ADF02789889826F1E20BCC14827565
+F2A45CA57DCC61B52E33638A0C6C5A59B145E82B82571DF1806EC40FC0E8634E
+A34A791B1325571E19F3AC2EF6FE68A14B0ABEF7EBE0EDA3942E85E5AE967A14
+0C5AEBFF2A36DCA8866700CB7082D2ABE470864C44AEE1F6D180D511304C8674
+D02FAB12A7079ABF96E1CA3CDF9D75532123E87663B1D524265AEF63EB5C2169
+B67A651A101E1C7EDB008D3DB06DB1FC1A81B41B291D6C4A58FB57989FFCA434
+DA84B3914D1D80B17AA3A55A70BBC06C49DD5F7DDD03FEB0055088558FA192A5
+261477899857CF598DB740E82D035E84CF17B33048CFED2DCBEBC2B75CCAEBEA
+B6C5AA1C6978FBB36ED98D9047028360ED430A0AA69AC85A8F83825EA649E1B2
+64B260197B06A24A1DD969CEEEE136FB046D713D0630B246BD41CA285F076038
+F7F8431913BB9A3E70311844D4C22AA446E3CA217A9DFD75A898997130269B29
+AD4AB7D9662856E677FB2DAED7078639CF31C6E6637C74DE2B5D0ACB88BD61F3
+CE3C5D56D3D4B3EC1ACB33EACBE05E53A133EBFE93CE6A0CBC8F24BDC5B31BBF
+5B3E55D6B40B1CED389076014667E28BBBD60145A06BDECEE8011A2C6F06D091
+73767A8045CEF2A110B614149FEE783A2351FB2938A9F73CA406538EAD82ACC5
+A3DFD3DE00221E1B4EA977AF8C89661357FF7D2F1FCEAD6CFC9D6AD81F95100D
+EA1F328249AD84AE849220E6593D45015B4D7C9527F3063E9F6DB6E572092A1F
+1F460696227D5F0FA5A5484B1F0D8B4A35066451663BE448D924DBBFD388B6D6
+D7CFC87C9E75B7CF79A4C9207E29E0BAAAD7FDF529B860F7731EA978E335334C
+13CB2F0A4250F5957B44CAA0674AE8356F586A24FD137103973B9A1FC31090C7
+C84DC5D380404BCDF3FE20C6F74FFDD8BD1DE845E99DC6FE09931F003834ECC8
+08C5D962070B6C44F901A787CCEF048A2C584A2285506B4D4E82B1BF130E2220
+B6C8B3240A4CBBCE16AD3676B23A50B75F82CD88D1B8F21D30A12716426112B3
+23DFDE5A348DC9DCCCE5BB5DB5433A5AC125DE1229FFAAE0D8319B2929986EEA
+56A93BA1FBDBE617F30852A3DC8C712DF674169C6D656F75E252187A085B2788
+2467CC4DB08D48EE6A98C61BC55E6EFB1938FAA718802B7587B94C8F1477E9BB
+DCF6E02B5E67FE3AD9D87C321CD9BC0CCD36B9C4BC601E6BD552EAB8E1C940CE
+3A22F3C2501C3C939CB4F17CE97566F0A04602D2A22A05CECDF4A49CAFD6332D
+5870E1F31AAA5F86867F71610CDB83E473B9D20BA00D8986D7148E0EED03865D
+9622864B52B09D12E0C5FCDD023D29D5AB1CACFA92B6FC14FC84E95F407861D5
+2BEE3301AF399FD7ED04DFDE6679A345A282E7FC08D47E3FC8969D3B00ACD7B7
+F8769647D6D4F4106340EF739583374D023C2702C48FAC1B643B5897D2D7DBCB
+73257712A0FDEEEB98A021D218CDDEBBA34687E23C4828D7F96D1ADDFAED7EA5
+B279322E6D55FB486AD8F3A8E7B2C67915564FE56F0C9277A06B29C47FB7D007
+11AFDDB3FC1B173B4E449CC6B198041CCA0624D81B4840FE5B63BE72157AC6E7
+03E5E95D2E2CE2E40BCE8044A8F2AA45F855484A891B9F0F8F70188AC66A8DEE
+F4D656CBE216E6D9AC33BA8DD0685D480833E1226784469A221D9FA3CA600AC7
+5574B5226649A9C48CCB43339942FC9010F86BAA2D181AEB487A92A96BF2EDF1
+60F3B93FDFF4137A25A8AEC5ADF8613019CDB103DC4367EF3D8AEB4FED0E6BF7
+622AE0CD3CAA0321D26CA4280CFB60D08D9560AB8AA5698231171B881BE9A27F
+BDCF3162134126212C523738D221AA05E31CEE73D9D40F73C450B6AE2C1E70D5
+C37162BDF55943069923A290A6C720042566E55A21CD81C460818883AB016C16
+8FCCD1255A66977DC1C110261D7642199D466DD3D2493A2D47694F842241C474
+1752B00DA03E69CD16A8A14BEB8A431A315D19A39BA978E46EB1189089FEF647
+F9DBB58AAE6B3FBD475E4DCAD241A051DD100ABE81D40ADF18A4C50F53BF749F
+D6F7C8E02A5665B4AD18DDAE79096DD447F8BD32C68F9F97F05E0071D9E9AFEE
+257B96D48ABD9920418E17C8F027E9E975E4A08DFB1988E7104CBBC1CAF356EA
+7750AA7110BE116AF1BA69A94776E4356573B38472A8A1292C63701543B0F315
+611A0E0595B30424A1137478BA6F990AC7C3AB4DB69E75C222B617F373C521D4
+246E954E9857AF59D1E6C36412B643733CF5E1C90389EF0E5E0DA55D3AD12E97
+E7630C315F72A03CAF22E0ACE3AAAFC1D496CF4E5ABC49C2DD5E264BE7EB2698
+AFF36089B5DD2C53DB1C1FCFBE1E89D41A95DDD278CEB29DC85FD1DB8B83CAB1
+EB37C531E9BB8466ED6B8B60258D3C355626CDA43A32834DC89DFB11E5FC6D68
+0F78CFA871113DB81A1690250A6F842ADA15734CB6DF7C6ACED6D8D586BC4E1A
+94EF3052FB0F8B9454390B882CBB6E135AF1F9C777AC362C2A758C3A98117120
+73C6E2FAFB580716D4B2889A4331CC658AAE996245685B973D9C184541385680
+AEC2956107DAB00230FB39BE98D3CA898D917E5F2088F26CBA4F8B5B115B6443
+8753331233B10852702FC26D9DD4C990C13CE4D0DCEA23D62A826A4B4FD16070
+5F3638C0A50A3373A33FCAA6F3644975AFD0560EE5F2D1CDF08820373468E4FE
+6679A229D6955CFDF7ACAA92A87E6D8571AD18CF59F84F88A674B2946FF20A28
+B9798EAA22442415EB46B9498DDC0F4BA6ADD347AB43E9293CAABEAE80127378
+129D5DC69F6DFFBDAFA5D65580239E8EDF6833D0DE6DF75F0FD090A83CE0974B
+AC947BABBD1B1C7194DDAEA37B0CAB477ABF9433FCE0243C8D308409427D1DCB
+8EE4FC36C7E5CEE104904B520B3F6E677A5B92F694BDBC2C799991667E0EC14C
+B95EAE7DE1854BF4542F05B4AF401CF67FC3E46EA5A0DC362F3CF177B1796DA6
+753AA803E724D1721DDD1BCB0C12CE0859E172D2A370C3697286F80D9E138AFD
+A0EE016805F847BD30D11D8B891E54C77AB51A7CABF76BB14B06153C7F811FE4
+93FC4B7CF161051A458EDF767DF94F487DB939A2740B4242BFEE234F75084DDE
+207E84533004B933D43C712F0C71DA4A00FFD6D721EBC93AFDC4200E3B8DE433
+3ED3E1DB799BAA27548ADC853AFF5D9D6BD92D644E3CF394789C99D9DC054A26
+7770AF5DC5BD6563929AE11BE341F036584DD573D3F43D9D975201EF77BEEF80
+D1EEDD1D4AD5D4D4DAF6D5B9D4C1736CB111D6FC74C236779C0ADA430323A825
+09EA8D0CB1772220AF28B93098BDB36913159208D1B2D7ED45808BF7B686419C
+5C0E3DAB5BC9830FDF3B494D624EE8068BF6F5212BD69EF466B9A213047BD105
+B848F056DC544A8CE66C546B1A4DCB4BA29CF0EB4DCD9C2452F22172AFF33B29
+E97E12D8F0D312B03BD9E5377BF0C81D884F1E79DB66E8144F106DFD2579AD26
+C693C5B68F3AC46BF0D6281032D4D4BAEB2243151AB1AC0BDA2ACDDD4D590C90
+F29B335DF8F57DC593DCC081FB56924028E3161AC4865B49D1B0F63F5EE866D9
+7A71171C09B09A44B0E32F03494D9EA63F3C89F5E772BE25A6557F119299E989
+99BA041694ED805AA4F3BBDF00D88171C9D43A9085A287A36A1F0F9386F2A98A
+96815CA51F06E1CDF20B757983C5FDF4003F5438232159F325C6335B734FD982
+1423BA77D0EFD044381AFBD0704E3DE95D23A70E2428E9AA355A9A8A25C6C74B
+48488C14DEC93A766E112D74C83576ED355F17A809E8D3F9C65C4E3E14EF484F
+4658DFB57597E2A4461D8044E95844391C1275D63F282B37888C842A5151937A
+45007547263D70195ACC018A373D498B88C5A028BC66ED96A343EEE74D61EEB3
+D9472B6A549CEB8699F4B35154A0E2ED22867E4F9E4A76311EB2C9F9078FBA81
+838EA49C2966BA64C165434DA3093206B70186BE80600B891D9979F730FDC794
+5DD6D8B2090CC67A634B719F441092A10C447A86ADB78DAE45823ECED5FCEADA
+ECA52E363D913D9EFC0ED98A5A1F823DDA3350EE27F09C14E4C7298CC0FB6200
+DEBC640C68C82D70AFB7A7BA668F1D7948686206884736CD03D9F6E6CF9702BF
+E3C932CEF3CE07FBBFCEC0476EA6E8D5D4C5C6450C8FB236B89BB82D51886240
+5BA7462F50A88F69228DCBDF26B7250E90B3DF8E94ACA1CADD9EFB5C73EF9DD5
+46052314D445CC92512BA231F79A09A2F0D91976B160B8C9BA055DA4AAC1300D
+491193EC66A6DE12BE01EEEDBC3A2291DA1F27AB76596A236B75E19FC5F1FB6A
+DA1AD835CA08B6CD03B97B4CA1BFCBDD2500BB09F1A1B0438E4A759370EFA318
+F062BA9F3D352572CE232E6FBADDAA5363807D0DC5320B807FE5485C8CB09B6B
+0BED9F5B1300FF370252DEBAC9DB25CE2EC494E8EEA45FC6604B3C104E81B287
+EDD49F3D7430EC9176A16B4FCEC5DF68DCC11ADF90BD5337E2E4B59BEFAC8298
+E5ED2C7FC5928635420FB1955251932713236DCE28012C86F63D12AF1DB634D0
+0B8CB8992B8723548177BD6822A808FF221A9E38B0DCCBC1F3430A9BAEDA89CD
+ACEBBDD8CCA5E17F1CC37E35A01E058BAAAB6BE7124314DA19962BADB74EE73D
+8FB13FF6AFB6FFF97926CA045B62B98BAA753AB0FC78B881D3FAFF9EE2FE918C
+8EDBEF87637F1530E3E13AC090FF81F4136E08D5F3734327E643CDF621278741
+A17AEBC56E21217888A6C8B5ED4269731910E7E25693CFBDD4EB4A32698F2447
+4C45D73E810B627D8719E4E34D8FF378F9B68BFB149AC67B3B1E55F20D097FC1
+AF74D46F5A3923C63DFEBFCA210F6B257F5FF3F2AC34CE41C15C9977634E473C
+2235295C05C3DF6B3009C7854BF11CC87471CBE085793AF9C5D05C5479B9E780
+14A5A6F3F6DDE5A18243DA15732CCF26ADE40C566DBC3C62B71D46DE87A12C6A
+647CAC923254E2E74AF882DBD5C9E108A9160393C5CD12566AF7C824EFEAC56E
+6F05B92C73A76824C5ED1735BCBAC61B98D509250C854CF1500C212F574D18D6
+4426B8510FE9785B814A70E75C9234D42483E736D0689D3561E8EE5650F33A36
+D50127589401D267BA6442E8616E2CDB1F6691D3FC4A2A377E5E154972E890DD
+60CB463E9EA9A6EA61087DF452FA5646F69BE879337EAA0F5DA4438FF0365627
+4E3B16851C2F08E976FDA27AF451CCEFED00376FC3D6E0C160F0BC19544DE289
+BECEEF9A067FD71D54DA3A4F73F06E2F522BA07551296214DDA47B1BBB1212E0
+1100ACB5F65FD30C655A3402C83058F8ECFE48FA60B6A3DC86C4996414130194
+6676EC7F37454023AB53E9D9EE60249ABF6953E76DCE3123DD268BBD492412BE
+65D7C3E5A5E483C381182A8F19B506F0AF6DCD55532B89852D1D96021B22E9DF
+D9D072BD7DD4450577E658B433A84F92752B260AFA2EC4A118747CBFE36AB7D7
+6D5DD96A119AA1BDD0FDCBC3AFDAE5FF72713EB46759A06CD09B5CFABCDAB0E9
+85599506AC07AA525978AB157496163AAB387F079EC9FA1F9E91B9C2FBCDC9EC
+7027D77016760539AC03F1C1DB242D28D6EE946C42DD2262D82ED48C3A839853
+BA977046F0EF373AFF884AC3112D2FB319421C3165DFA5710BFB9AB9595A10F4
+9D05704B9E22137CF27F4B2DA9CEF6D8801D5F792969B2E58FB539B8038DF440
+6DE20C0313A7BCD16F279290AD6859B0E657CC3041C7928CAE35B9D3A681F2A3
+2D40F8EDAF1127E754276556C95E1282514B6EB6E43FF4F0FAFF28C715E3F39A
+374415B62C1F5F8E31E006D6ABC736057910A3729AC60360CEE1B2C8D9F77336
+39CAC45329A372205FD551B9E9EA5082411207473D9D90E76136AA70180172E6
+AF6EF3EF6B38B1906B904BE9BD5251EF067738840C28877659B649C6C4CA328F
+1BEF8A9CEC2CB062702F58CC0B8D2D097FBC278F9FD894E10ACE1DEC4530CBF8
+E4E467B6DB9C596DF0C3D43E6AD70F30B733EEE692C2EBD68756D0C16E1F00B6
+AD011B5DA073A769B53C2DA2E7C9B7ADC6F551BF4DF4C39C66443692C3DC62CD
+B1E094013F364D04BE2FBFCD1C7B2836180E9022E0434421FFA4317A50096684
+CF0B8740EF680F27F4A84AAF2AA92C64883BAF57BDC60C6467A8D4E09E6316FF
+9BE73053045E5F3586DA3BD1298DC15D751913FB1E72EF80047F6B33591B97D3
+DFAD34EB224D64EF60F5B4ACC6EB42E1BE0CB2812FF2F3C264AD2E44F5EBA441
+670CA0A60E73176ACDC4E42E74F8F489C73481EB5D46A61FDA1C0FF9F8844DBD
+99CECAFE2A72833E4522981FA13713AAFAF8F121E60FAA6F379B2C8874CFF23B
+8FECE70654E5855E525A403700A96CF7F8111BF2B58386E29640D82F1DD86900
+E0E203F3ED554209CBDA2A61A5641D4B39D98C5C43D4575648D06BB82B6C4D4A
+F043EC61B17C208CE8B4F43A7BCBBE588A3D13A183D79A47404223037FCFA4F1
+DD237344E589F161BB9BBF3FAD2E28749350DB9A74C09E894BBCA85B82E704E2
+99788B24642A7D0F0FD96601CF1AE4819EBECAB89824A0DC1C03BA4B546ED36E
+DABC8D49CFAA53D2A9A5DD6B3431E364C99ED0323513476CDCEE49BC413E50BF
+51EB93563DC03B62F84C5F96ED713F288D109C79179AEC41424822772032035A
+40E84014F5BF40948F05E8562C9CA9DDD71F89021BE238E74781A92D64E5F9E5
+AD6C0D954C6686C714BF189E78EE47F1530CDB8376E52631A1A26E3021FAB977
+DBF01167266AD68A779C0180E034A90CB77B86747395BE885E484BE4028B4093
+8BE191D58D0BF85308C72E6384292A2E1CD06130A091F8AF9DC6C3E12B1E4BA2
+BB2C37AB4AAFC0CCC7964C06B9EC1C7E3BDCB6BA265288D9C8625EBA35BD2A49
+BC50472D7AE262237FF1EA8D9DEA3C0DBCF7C3B2DF5AFB1F31E46B48E096517A
+0CEDD60F43DDB684BC6E4C3F6F3D70BD58AAB5052936EC4ED7140EDE795223D0
+4E3B95161D16B0402EB45FE97ADAFA0433FCAF55E22BD7E4AD2030D9DC86F55A
+8D7EA00901EB1351EE8A0F1BFE75CE46DA4165D78043F8F0741D4D9DE0CCA00E
+5F7D89A849AD0F0CEBBCB948613028CFC39617FE9184753372C375A9896F5F1C
+7E24255FD49D2109CFF9ADD9A118CA47CF58975A9CD3A960A8A08A078B98A50E
+4DE619C8B2D3E15938C879D785539445AC468AABD6A6576AF0E8ED368A9350EC
+717B7D3BB55AF58941B47FF639CA2946028CDDFDB84FF0060D330DCDEDF13BE1
+FB1F743317C15C7A9F34408F5FF7CD9745217D9B809DACDDF7DAF9D821C06B37
+25738F0D20F4A86A079EDF71583A9640173B3EC529B98899601F0EBDFE45BEF0
+
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMTT10
+%!PS-AdobeFont-1.0: CMTT10 003.002
+%%Title: CMTT10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMTT10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMTT10 known{/CMTT10 findfont dup/UniqueID known{dup
+/UniqueID get 5000832 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMTT10 def
+/FontBBox {-4 -233 537 696 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMTT10.) readonly def
+/FullName (CMTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 33 /exclam put
+dup 34 /quotedbl put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 63 /question put
+dup 65 /A put
+dup 66 /B put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 76 /L put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 89 /Y put
+dup 91 /bracketleft put
+dup 92 /backslash put
+dup 93 /bracketright put
+dup 94 /asciicircum put
+dup 95 /underscore put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /braceleft put
+dup 124 /bar put
+dup 125 /braceright put
+dup 126 /asciitilde put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E5ECEBA191DB82B3
+7A69521B0C4D40495B5D9CE7A3AF33D17EE69979B82B715BAD8A5904C5DE0260
+6C15950CCF6E188A0CDF841EB68E5A2F88253E382140F87C87E55C9EA93B8C89
+14A36CDF630D6BE7CD36DBDCE22B21778E8648B97B7EC6742EB5114BDF0454B0
+0EA7B1FE236C84C0E5308C871F67B973892890557AA12E00B2C20C71F516C397
+3F3BBD14A1D0149CA064391056E45E9470FC7F6F556ABC82653B3C8049AB5CF4
+BA83C8F2158C236B2FFD4208846013BAF4165E8BB8D334C8FF2E8D74AF5DAB2F
+D44788869B08399421AAA900ECC6A2D594641C121660D4B5F512938994C18DD0
+FCD9B008F68F0351D21ED735B2740CB1E0C1CCD25EB548C35B844601D98828DB
+556F71D07E081A593FF12DAF83676492A0FFE16E95717A07082B43A966C1EE8F
+8A59E1255E1705C43A23CF29A5E4A6547C93F1680A870EE7BAD8CF74D838CD5E
+F806911D8FE4262ED8E7F5BC58B92C9C6D74F8AD45FBB021EC7E97393018B9DB
+B1B84E7B243ADB05ADD3F1DB3692ADC5D47FEC7DF93080669E63281F1576B673
+125EDF08016664BE73364F65389F7C3B66623AD1754ECBEF9E5CE6948D933787
+A5674279ACB2EBECD3B4E6361419AB32028A27670C9F3E18B746A10B00AF6D77
+4EC00E3BE521C02A99AE5BAA98F793EB1228952BE67934B91472E01AF7B816BC
+56D7F19F631A1927846D800C107B1E9CBFF9D2DD513B4A8CE2E0DFD77B1ED178
+E43FA7052765E9FAF89989D490D8FEF6C536EC0D4AE27A74F474B98DA9E6B92F
+15E063DB260571979A5DE2423920CE1F59F56EB11E00E3BB9D466A8263E1E385
+2014BEFDA8D1EA3EDA04BE32AEE6CD15C5C010A1DF7F705A2C0C18E87C8DCCE9
+05D9163181CBA56C0FAC8C06A2990554C8E759D076B01BBEADE3B5FB8B551390
+6C8E4A2A1C6E7D9C708614626F3770C0AB7DD2027469C77975C27576065862AD
+04E5E50CEBE907E3E991FA0C627302C0E207B4D5992BEBAB5853AD1C0D271728
+C76F40A79392ACCA7358F948AC65DC823CFDA59E1FF69CEBB6B7EC3CF21669E4
+70D999508F9C49E2D9F8818CA53C977D93E15FBBBAF75B1E84F0BA62BCC4BAFA
+4EEC82D804C8A8C0210F3E5E258BB1F6921AF02BA9861BAD5C3D5FC8CEFABA8A
+A607E547B802096F7AEB09FBA99C83C9A494B94408DD607CA6561A6E6660C473
+62CF8D35F31D052F6C6C8138A8E1430CBA7EA6973D6D510C1A06B3FBD79D9364
+240C1A00272DA44B89A9FE8D5BF36DC1B5EBB4A78ADBE9C5EDB485F093D9517D
+69E1AC9A8E6C9D7C324E3797CFEAD9A18E82E03F69B2CED7D5DDCD1A218BF2E2
+ED2293AE999FE2A4B5213A10083EE0407BCF8007670B8C737EAB30311C868D84
+121149ACB4A27F3ED6C0C181C98AAAF51B105F264B5672D7F745131ABAB5BEA4
+0C9B43C0DD9116D6DC61F90BE72018F290D26D5E9D341055CAF09C9F45333CDB
+D45B7954271767F638EEC499F7B53C2CC5774EA7A7F024C4CABFB93D9CB1856A
+0C671A4ECA7C62EA5242648A84E7F3AFB9547A0AFC29593CFCE6D8B873A78157
+D337CABD291431C0A2CE1F37E0CD7340567AC206FF98E4B5A6410F70F750451C
+550EFB54AA259A1B236CA9CB730D2CEF125EC65D959441F7CC9768F777B44844
+CC9842A307C72B740680ACBBF6AA35FA7A94825069BF7696ED81A371A9E5475A
+9D997F2DFAD339AADF797F7E03E654234455AC3D17702A420EE0A597BA31BDE4
+FEB8DBA7C61D311CC90441A620164DC22DC2D373973EF84CC553453AB1B3337F
+7B39983B8DFFB3A9425F119B45C1CD37A76F905777B3154CA6200792F1759D06
+E017890F4041A385F2238E3C48B6C8EE6F5258463FDBFF7AC762F6C4363926D6
+50F004D473B7B7F73CA686B559C2885F1AA761653C727A77D73431E9D110E76A
+2E55C68CD50F43997C9B2FC4710F8C8540909829E215678E63BB8363C4B8AF05
+9986102BB36580D9CA95CD216B7C321822CB41B2E0422CD077F3B55E0246FDB2
+44D5976F67296B5B0BE4B06F6E43535C21164E6C5089C3E9BA2D6B30888C57DE
+49DC8D9D46C0D5EDC47ACF2C03B72DE3B69512508539019B759280BABEA12BC9
+385308A0395C4CD33182A10A5A229743379C2075D82D8BFCE4A66E1AA087A091
+8F5372684FA5037D1B92D50CD9CB4F50AD4F8EE7D51F1C9E63C721CB5B9BD011
+6F0A8DD4FDCD2B008F223A1036D90F0F3B252487DE7898F9AFBB3A9D9CD49E0C
+EF4ADAD5155A98D2125ED5A3D3907F67301649519419F33CD942E8DDEAC1BDA0
+E90C431B198F646766A8FA9F8D1561B57E126EF604838C0C1966655CF31FB7EB
+C8CCC434FC1C96046D38203E1791EC824A3D7AED85C029288D4608CA7668A2BE
+484C99639F121845B22EEFCE0A3B808261921AA042AE19E641769E91277BEC29
+4594082CCB3058F90FAC4A700A8A827ACA00FCF574ABC8EB7DBCECD97F2B22C0
+0AA19E8739B81AF8C6F621D69B8E6F29BAE233FBA655A0AF5BDFD7F5C6B9167C
+6BC7AB693D45EF2AD999F5DA3CEFA39BA48A17EE6D9F2C4DAB91AE3F0044DC3F
+5D5506CE4675AA928B0092D6F173644F91295216D8BBB14CDDE0AD524A4D545C
+1B5E284A3BF0396664081CFB4F186A84A0D24D61E82F4767C1E55A0642720CF3
+909FA1AB8EAB78030B59BEA067DEDBD2F1D0340E790AB2777DB18248521934A8
+BB38A58B7F633DEA4291B0D5D13E9A882C974697CC6D3B49E030C94EA29B5506
+CC29C44D01B4751B453A46A9F6BF3BF135AE87A4CE232AF57B66578310DE41E0
+2A6AC422117F1963C4D7CC306BD25A6E724E51921779F22F029733122E23E2F0
+CB340008813ABB104380C80A492B3FC6D0BB07CB8D8409E9576891EF6E5C9D08
+EB8320DFA31BAFFBD336D0C2BBC3D3B2D30368B9860768FC080D30569C7F7811
+0EBEDA2962476113625EEB555490B8CE4C5F99D74ED10F738C61854CFF8B41C6
+9402E56BE8856144A1A05D0B05F4CB7EF728B2F4F5A439F18C3B68CEFA41E59A
+D8308ADC92EC1289DC84CF48D2CDEFF509A145BF945E1E00D552D329EBD2A7C4
+21D58082CC8FA790E981F4AC8EAB99950678FD3A7DA3DF13778681B208DD71A0
+7C3CBD0664B37C9EDC6B601D79A2C51FB54DAEE849F93209793849104E722D3F
+52DFAF7047EEEDDFE744787A5801E4AC2C3D58EC5DDC15FCEE03990C53B0C57A
+FC54F125A04C8E4A0ADAA725808C587E7DAFB9F784FA2875689979D316DC22BD
+AA36B306A1ABCF907B63C6476737B746099973CAEA8C1E2C5C41F27E0F7DE8D7
+F0D942E34E92F43FE902653D4D2EBB6F3B9F7928B1550A82AF234D45D028F429
+067652BD3D391BF423AE72B9CB1E8D91E898161BE3A7849D456A861A2046711E
+E934DC59442AE7D81661CE8EF727D8D7DDC0270E937E40F896AEAE6171661431
+C1025C53172F9D366834BA0054FBFD84503FBAE328B6FDEA180F8EA35B1DA937
+5CC3B8F00C206908C2FFFFA6A7AC6915D15EA44BDCF29E2BFCFD4A849535F19B
+0D307C696BE8205C7D84B9C77F02EF27D911056EDBB4080E4D3ED72788666CAD
+CD91B0ECE27A177DB23320A7FA9C31408B4D02D2A4B1CC6DDE1A6CAC3D8EC1EC
+2226EC98E51046D1EC26FA20EE62D24747D83CF4941DCE5CCEEC0DBE387149CD
+E05B19FFCAFC0D117F9A3E60DCD4C815228D98EF95EB559AD0ACC0D50FFDF714
+56C3C812EA5ADBB013BBD956A7C4CC0ED7D3E25D5C9AF5E626F18297F75D4957
+F5B0B33379114B903FE98BCF35C3FF76FEE1D9AEB711F2962276531F7380EE3F
+E368720E0292A170A15C5539B1FC7BB954EE2624B504CB8C805B8D31AC38307F
+0513606F09211AE64DAC447693B2A0AD15E9A64C34F5A911ECD0ABCA90E9791D
+67C6BD202B0858EF96E7722305B8AC02B01AB1706CC6AE875A8DDD15EE349046
+EAA65005E7866B506EDFB7A5A2AFD5C9E9DCC821A79EE9C1EA2C7BBA32A40BC7
+CEC26DB1AC473C8C3960ACEC581B37D6569E8C8C42950BAB7930B65E1570E3F8
+9A7FA719F1DCFDA45A3BF2AAB32C9A93BA3552608A61C623DE59BCB346E87EF5
+9CF025A87803161221C5C1C6F6B3403712C76E9D755C7BD68D7F2DC03C14CDF0
+C1BBED1D648B905B4B17037B7263C1EA7A7F06FAAC4E09E08483A8D714C19861
+327CD9C32DDF850302DD6DDE24912D00C22ECDF3CDFB18FA831A41A7488EC203
+F564CFE30D506F0829A96D35A7E09C3DCD107D589B627A15B55C5D6649126BEC
+60B88C55ECCBB4E680265D9EAB4CE22965D3B1AF759B01ACB0D0E6C92B6B4EFD
+A81E6A648708979487FC591CF09631310D46891423F4EC159A73E30D8DD147A4
+B0EACF6D45D18CD16CEB8176F03ABCB41F2234747B9733C8FAF34AE5D43D3BA5
+0CE0FACFC9B087F84FB6C68678BC6E76022B1526D6E5B3A48EC1A110BD75F45F
+1C4DC6D39F254976453F57DF873B7D635C80C42026DE020E5BAFE0DA0D54D1E1
+DC634D2621BA184347E5252F645A6A1DB7657C48124186F0E4C644077457C24D
+55753C651A9A7B6349867641464B515B821349C795A645420508673B93750D0C
+7A3B33EB1F09782033742AE8F3A23FC02284E6C03818FADD1731361542E3FA3E
+75B8D52B668C3E18A4AE967D0FC3157083D952AFB8144D549E69EAAC51C279C5
+E5D88A0D9D53013DFFB4352A1598FF84DCDE6FA32FC377306B9B92C0F96EE149
+8CD55E7B2445B86CCA7A547FA732D52D59025129FD8C6333AC0DF4F0CFF6287E
+F2036D5DBBB3B91B92F12FEBE0B61A313A4DB5A9CF0BB3DDB781A56FEBFFACCB
+8CB9D1D3DBDBC4CB6AAE6769E470582403CB920630221B68BCB625CD4605FA8F
+D3D5B7A1A28D15E44B38E92E906C138E72C15B86F64C38E23BF0440052A8C914
+54397F49DBED99D0AF7CEA3B0A05FF37C2D7EAE1412567E6776333237C31E3C0
+49949EC8BFD6E0F6446CE2D4DCD2C1524A288818CC5D159BF8463A847AE4A2B9
+CC8C58F822804B81B13BF4F2DEB6229C4F51F093075581791D02C36A13B855A0
+34900AA7CD4F1A797652656FE3A8425A38F421C4CC0ACA1CDD44FA6B31219276
+1CDE1CD63D6A58CE705CB56CCA1260F9B86E989019071563A9B4C274A87558CA
+6EF1660D574EDA276801F0057740E2C3B80D253D697736484D892CE1AB128B8A
+DECD69712F5E70E895FBAA927E8194D792A04AB6CE205E04E38A433BBB793FB4
+E8BBC4279D58A223C6673D909D6AFECD246E66A52F4CB35E5931D24C828489BD
+4ECAF621A220D8ECF702BEB01C4FC7510197D3F6D15321EC87175ADBA6434ECD
+2B5A306E91375CAD22CD94301763E4A8B981472890422C5488FCD523C9CB17DC
+ED22FBF12D5F7525D0D6BCFE8CE85B0DFB1D6F989C267FFBA0A996D309E4A934
+3DB54A9D29C88B9D55D7300DA3D46419256C5A07A2A529A8DE8BD1727281F5FE
+97033D861E0531B14E811378EC1AF1CC7EE9BA2B07D935843D3053F673979F8C
+FAFD59D555B56CE338F606747238B22BD62C42BB7238FEA335678D474A643570
+A9E7B4970E8C541CE9DBC7BF70ED7BA33639D6744A18379455029E934C95E2EF
+639C4848CE9A0879B51649FAB023A71782444B451F92A34CB8A124270CCF86D4
+D18EEF5C1D2B2A29012613851C49F50702D63BACF95EE2AB4D72B375E0A62615
+E0991E130A67ECBA9E05329B740708F1CB148724C3A6E5E3AEC1F88EBCA398D2
+1CA8827C977D72734310233176D1AE26C55CF2CEACA62223315C28FCF6305C7E
+A22414D4739A059F552F1F9372CCCA5FED4F9AC987942848EB498900269511F3
+F408CBEA0659B954F5F1B18AE4FB270213646F9B28AE4439D2BA2D3E0AAAA780
+5E530E4EFC8A060EB979E12191044509DA0C14397AFF949E12DC970658D5EAF5
+4EA963F5BC1407A32F3837CA6A24B7F3D60EB8E6222B702E25ED903F9D21AE50
+664A095009BDEAF4B78DAF94E5A55D48366CABF07791A1684B2F54EA69070844
+4F031AF8DF416C2D3679F8BA038B0DC9DD0400CA6B34667BCBBC07E62C1668A8
+35A8C57C9048A7227E672E89681B54D662079A189A9E96A3CA96D8DD10189B04
+1DA49BA2729F1CA585B1BD5C467295285D52E47CA904235A1A3E48EFAE9EB6F6
+01374125CE89D53C276858668CF45D2F092DDCAA52418E0BB94C2B8266B4D88A
+5D911507BB1DDA3D8F6E7C14A91CA11AE799EC42E993098E18CADA70BD2A1D82
+2C39326C6E3F9E84CD9758B9AE43D79BF99E6A0CD713E95B3D9B7DB90D127DE0
+DAFEBF850CAAACBD860B5DEF2082F1ADA64B44B193C4A1417BE221FDCA36456C
+BE5934C8CE3ED55AE3A11697C2D682B7D0F72D48976451D205783BE25DBD2507
+39C14FFB4BB828DFD187104F38A7F11D5F0698C11E8C1D4F107CACE573FDC4B1
+C56FDAE47024D6FD16A2FEABB434CA320300FC4B6C1B6CA08F76C60B7C08A665
+99F404DBA8A2A1EB18EF6750E4EC186E31561A3F080BA6562967546715859481
+7BA782940F5C5D06626D6F6A412CA7C13820EC7C1DF23E15E5829F698CF617BE
+D940523E4EE4ADECEC48C24297DBAD528BA1DCE7AC335A1D15D55415B108EFC8
+6D45030D27B3EA63B2B4CD771DBE66AE0218ABB1153D4B7482289D1313CEF184
+5C960B1E3C3C953912CC6F4521D1E15636C1545EEE457EFB87B88C9E43CC2F38
+6BC4BC96969F4FF28ABB06F4454C01CEF1B6DC538F1E832FC1666D977E5A881B
+F72F1B4C7DD4BE167A5535F1163A0706F9A0B26400178DF8A128FB5EBE6A7B81
+E478AD183EC06622B591337B9F1872AAEA356F4FC67EE767B34CB5A4D90702D9
+39FB846947F4096FB3DCF16EC81455164783BA0B5D723060DAFF411B68307E81
+7BEA1D9A47A5AA3D648E618C83C60F060029E6EC4D46B045FA7415BAB2AD0AA5
+ED9C729C24136F6AF61E6409C0B5CA760B16225641E268A68CFB8260BBEAFC77
+6626EBD97195E77CAB425CFB0096D805D9EE699E41680D095AE9FA10122A7882
+2F00F495C9EB2102DF0D3E61833BC0A2E468C5CF7AB430FDB7C0BE3DF2C0D230
+1580BAA25D65F599378D873165482A1FBB224AEA89C6BCCFBDBA42AE1C5DCF41
+06969F585CD3B737D1388D6359F5468D88FCD2279BDB270F6A858FB7D2ABDEFE
+5EE8FB79FA437F8F50237B92C307B73B0DCB808D07A9C3255CB9B3B17039CE5A
+288103D05D132863FB522A02CEE3839EF9AF7F07D99732F0B8B384745369FB3E
+7901166478F4A16076A1504C5E98D17408494E270BBF4470ED12B4332422679F
+759F1D93984D7E506D16950DB6C2682FE1379EFFA6F6C95DD71F6E55BE3EF6AF
+E0CB25388EEB436E6527806FC75484133F6E561DEB979D5C1FFEFDAF2A6D964E
+03BAE0BD593C2992AD84569C81050F7A793C5263E50C2F50B98C4CC703EAE17A
+6AEDAACE312DAFAF5278D125B6EFC5587484F61DAFF46B87B7C9B1EEDECA4859
+314A9A9E2248467DE1E54D90DD671660B9040B3E0DD982260822177EFD757266
+74A16C83A7FB168016A320D3DF3BD7726F1F4EC90EE5DFE810C96B099FD4368D
+906AE4699049EFD37E8EF058D4B97BF71106445AADD4FC6E90615A0066823A36
+673B8DE32322BBE861AE251226B4385AB28702831270DBD25D666FBB0AD7B96E
+A44E891EA1EAF0F87013AFC982E33D67A28E96E0C9CB99B9E4192536830D9901
+931A8CAFA41289633B20BA3BD7AA3414B6DA8D57CCF2FBE39920CC06361F075B
+CC40335DB9A0071CFF77F6B7BB47F3100DBDC9C4A58C2B81EC99E8E966AF3390
+E3FBCC28BA1D79961C8A1584266454DF772FBA99664D74D4A89FC82FFEDFCFE1
+4C9E4A04291E803D142E37E7ACA66AB279378F2F192FFB2B5BBAD18B95F03136
+2CB594A3D6D3F8576B90A6C4DAD6D6C8EE07AF682F925F01D0B26CBA347C03BE
+F3B0585CF4539FDC66915E22117078CC94D621F31DCB3E021998A5D6EE94CA4B
+E214D07517283D56973D8E4367392BF6C1150DEBF459D141AE0941C1C8C5CFBE
+E735D796E365A1B0F60BB4CF2801EAFE4889EE5F338D3C4885368281B3C95CCE
+251C28A90D318A8A0384439B38D63B94757252062EA44E88509FDD2E75FAAB71
+7329622828B2785C1A8B26351BC74237A6BF99216652ACBD4CCF54CFC8AC72A6
+46342F1E32D4318E7E27C7B2DAC943B3E72C472FC6F1DDA8684AA922516A672C
+E969C047E318B5E3B1270C1BEB1C4071A15BC81B29B268C679B41FC5E381BE33
+DD95F0D68118CBB60C521E5CB2BA46A10E50E9238163713290DF6DD8A27D3813
+F871C07E725D4518013D9A84CEC96782541E5580E33C2EBCDB18F08EB4655A46
+507A8526DB26C854928B81FD502B0CCE4A68943C12078F57C10F4E85FBEE1025
+46D925B8B3B447D4920410FEEB9844FABE985F9228FDD9F26BDA3B469D678F01
+BBD601F46245B0AEF9E844A38F0A186733A8523992CBBF6DFDED8BDE4E6DDEE1
+AA0EE78B943B79CBA4AE311FF4612252D9EEC7DDF88BA8080801F9BC7611DCF9
+D6AA4A8651177CB85010D420CDFB43CD103ED7A1B9C2E885C88F882E29F4C301
+4750C3EFA20150F9AF0A5BCC8DD9C7DD53434855ACC1FF84087D95BE7A2FC2AA
+446A89DCD272268178C02DB29FED2749139BF0A51A5A9E0B6B8322558086D62E
+BF48C20DCB99FD2BAE6853877991059EA432234EA3DBBEAA7A63B0279661F69F
+181917D92AA634ED55BF9736395C609B315ACC4F49566EDF37EE388BB8B5D9A7
+E227219DE137AA06BBBB2F2530EB0082E730BA30DF67E83E8E3E6D47CC0D6183
+D68AFDFDB89A8F7F6B8C3381BF4903576CC2D058CF656F221C153D7EC7C6CFDE
+3487F61D3712FACEC12BBDA5C084F01CD52E27B685B7ADDB34D477C47BDA3D6A
+F5F94FEEE22ED1CF93F2A4576F53D5E9AB73CAB5CFBE85DD6F4364A8CE71574F
+2D6AC3F8AD690AEC0AAC2AAF8CFDEE51FE47B56661DF84FCD8AC27A0C591A39E
+769DF23C1D077B7C905CE9FB31C7594CB1E63CD82E119CE68AB58F6B8E3E370C
+11D91D32ABD0DFEDAAD93A07401045F38198465E1D503704FDAB902347ABC936
+1F1DEB3601A993B6641E4442154962DDE3812AA8D948B112C9C8C51A5BBDCE0F
+31E244844D0C77BD0F206C7399B4687F352DBA807E1D9C5439A9944E0B3949BA
+B173C40D43F4A0B97AA73A07B3F016580D2C2DF39EA392F678313B1FA589C0DD
+6CAEB67B5E78334A41156A070819698E8D576F5177868FA05D4E66AC6F313967
+C251958A426B160B5645120A7F2E33986B79CD3ABDE16A8320A355A7F18C2FF3
+60AC078C70EE8123060EB9672A7D112A7C1F916DCBBEFBCA48B59B4B497B2992
+CC43893291BD454ACC071A68E6D7664916857E6EA7C34345C13693EC4D94B08F
+0EC526563979CAD433B998DC5A0D835C862CBD360AF49D068D07AB1709E1A3FA
+4C1F8EEE38FE96A5EE6334C12E55B24E5CA3AD0E78C5B3939A3C69553212C069
+67548E8039596E5C73650E32147ECE269066DD3A4E4CA042DBC2011D60A378DC
+45C605A5D6704780155DE769AC843B3C717D41D9E319BE62523BA58583CEBA3F
+8AD278952CEC5236F3CDD374766075BA04259A2C9F2539DDAE7F0D4356AD67DE
+0786B29ACA9DD362B55E72BF69173DB426EBC75F6E5BA686EB82952C20838199
+8E5BC15A79E2F0F5F998DA7269560B6F65BE4FFEC8131FC9EFA692B60FDA916C
+DAA9CEA8793D1AD57558D4B424E591024738132535D310D2121838FF3ADC091B
+4D1BA849B4054206AF41262CA2110DC795D988AFBD1B9725D673444D9B5D9A3F
+C0F865201B6D797A0575DFAB5C51E5FFC0F52735EE1B21B355C10CEBB2B62D72
+96AE789D63C6413BA44FCBB2C384624038186B76DBFE94A9E85540BAE8B3FD40
+09BAC6A615BC1B497804F55065E3C18BE77DB8563B1730D5CEF7428A9BE8C118
+DE8B1B9EDBF53BA3288B4985B1EF68F2EAA7AF9A2543CC66D3CD11925EB08E2F
+2E9293A5AC0245FB4B4704B5C61C49276F5E1F4560A4C0615D26FB097A5D0746
+42239DE3560B0787A347FA3516D012A2C205A3CA4074893F360FD2D6A980E6E4
+F77B93A92506F3F852DB888567C1C1717D06FAE23DC20555C129B998666F0D47
+6985495B8E94E4F3A3A788FC6EA5EA0BCDAC1F5D36B3E0459DF6D683EAA9F7ED
+484EB781E72A5B67823F69FA949C74BD03A6AC015ED3C872108B6D2771414119
+6AF2774FCABCE014D681EE6F599F2B675210E8A89132B5FC9701B1802919C192
+242F75BA14EACE61BCE6EC7A980DB15B33EE760A8C80ABA4CB4ACD62856BB083
+987F29347547523481D58DD157C1E71878254F83129FEDC651186F696FA4E015
+554C5EFF61208812DE8473E0CCD8D108670FC49664B666C9A97C07185286A45A
+6FAA91966BB3F3EBA629F4DC645A522C763F276B6BC34425FBB4187C77274565
+235CC4B9C902DE9C5B6A9ED253598464AB766CAF4BA3905F431CE64801711723
+7F22BC03056EDE0F03E7154B9227AB5D9DB43729C14FE45044F0368523794A37
+E93EDAEDE1A49769F27E57439B281DD121430D11E87AA64F4F7EEF90C8207CF0
+FBFA73F68F7C2023C63FEF39B8BA4BF429D61DB22B86AE5DA40DB7533CD9C0D7
+8DC6819DF76A5B569C55A9D821A658006E6AD50AA4F9FA0C29AB8B417E2D6012
+59D09EDCD7D968AA2EB4989492ECA5E6FDB6827637A807B3F1910E6F91122095
+30A35F48C0429D7C7F793D432FE423B89CD21D5A9CC3891A934D8A85021512FA
+923157FB455E127E007404C2FC5E1B5A43B944C4EB884AFCCD3B642C0A13B0CF
+6F4FD1642B917B64E296280261D6AB904738E35E10BA91A1580BE1E4214DEC4F
+041E1BC61C5F65DC263FF9FEA39D7FE05F31B85799B786A3D5D0C5AC21C21EB9
+69AC3FCBD19085438FC1E3081B7EE187C0CF717EDE9958FB4ECA83FC2A97AC06
+C42B92571D1CB295A4E739B10738E0854557A1695C9623AF2796A960156A3395
+B63759BFE8E5B14A2C49192BB6103184CF756E1D585B84736D090B827C199BC1
+DCB1EA3B8DA7CBC73B2E26E96B6F0556D49923D63173C465D725223C0D8159F0
+E70ED77B0B380397112BFD024DC0F03CAE4AD3853735B3FB12DDB249A3929B87
+4F77103703EC7D4B4C8D41D0CE65F05CC6ADE30BAD9EF7D41D7DD1DB2BF35B87
+A929238B57DDF01AB94A1E31C10B759315E3E4D58D37142CB1DD6F27D321F6F9
+20FA0E6C2EA968494217E7F75A34F6B050B27F7BE3394CE69FFA957C678F1A5C
+A0B3D8CE8ADF168CE01BA90F039DB20A8AC6B76D5036A2DE654CEB00A853B3A0
+7625675AE757C92E06C7E24827E47A09D620E62DEAF04F1FF407AA23C63A895F
+E66E14E4A7CAA511423D5DCD020D1385376C3CFBB6FEE585256923F98A702217
+B1096DB80ED911924499572284BCCF297DD8B7CDC1186F6E12E6461039A353E7
+62786A8AC2072569AD069AC5BDE24540A069D26A73705E58D7FF12806610D709
+D3B58073669A255D65AFB23575EA5402380FF69CD6F61E6556B794441F7725AB
+C82E82E284CB201B36DC5E37FE3E45D1595F9C5DD72EEB58959B3026F45C1E91
+7ED8E500C5CD1E1AE673CBC5222CF60D25643C9AB66833DBDAE1845B16F9E550
+8AEFA7F0FC8D2EF3EE39EDB8512BDE5077AC9A032CD4B29347B84E1BD602C4BE
+83766227DC6B32191DF6743953790BD8AF842A4B5E4EA6409CEA963D8AC3F471
+FBA7C08F4E4C6CD6012B82F79BB6DD247F93BE9D898A7884C9B224ECBD25F85A
+33758D69172C1FAC421944E482B7716E839D32027851FAF6F4E0C4D78F680552
+C11461E5E45EC9FC958D7C2D640C3D4FBC85D8D23428B5AB71F6B8827446E5E1
+CC0C38C1B7974F649E6BBA748DD76E1DA9747D7DA222A0FF08B5DBF0E8303664
+8F791FFEE6DBAF4084F1558BAE2FA8E48C807F1C6403D4A91B78ECB1BBE082C1
+A8C0CDDDB7AEADF5E525C03402B8AFB1BAE627D91C479EB198BA6B466A029C89
+BCEE9CFAA8BC88F344091D76EFAB92F5512D1BCA61498405823B231E0A587907
+543A798BD9664259ACE2C4965A15B653B7808B70CC050EE225ECABC1476EE957
+FDDDBCEB75E704EC7E33301443F5A467FA6DE504A055D611C2FA6B07BBE03C76
+9C430F6A3FE1198093A834D90029CAF806FD6A75C999B5E8EFFCAF676DF17CC4
+B256C6FC93F4AE44947B1381B6C475F282667A65708598CA4A4CD006B02F3004
+BE93081B80DAB1467214A6A947EE0E8451E74B5953B2D57E83CDF905D1B86677
+D811628F1D49F1CF5678E8AEE3C57BE4072535B6245E19BC918B29EC7989B698
+01ABA09A7CC82AEC3C0E3F64CB0EE69C71A127CBFF6002C561F3DBC94CAE7C2D
+872CA1BE31370821D70098A7A5541DF5E6B6E3D1F9056759DC0AE1DE6F3581B2
+C7BF466AB8C841E0CEB14F965D1C31AEFEC4724F120E58C1706E009B738F1D67
+0B2074B3FAA0F98302A3DF8E093BEC432FF011FBB3C73EC4906D00C846B30501
+4199B83754E9B1A2F80B523B1D9DF5ACCDA9AFAED5F5B2643C5046A0E2A7D873
+ADA9DB69793D60F09D408297302124C10B6915147EAD703FA5AB9DCA1838C590
+7E66B21981FAB8BAB54BB00FB1CE6E36EDC67838F762B7F91B76DD8683EEF42F
+1D0537608BAD4BF1191CAC12DBD7C17D0AFBFFDCE31580F7B6465CA5E2D5FD6C
+55A8ACBDC91530FA9033413057308627025D4431D175ECE3167D99B1E1B0A2D3
+633FBE69CF0A4E23CCCEAE95F6661EDE0DD6DE0D1F6713901CA13DCEDD01A7CF
+737EFCAE29EA421F3CB7887261161D5A33C685E28E11008DF6D366042DA16E0A
+475E762E506D59625FB9B6A384A9A3F6B118F6254FF8D4C95CF84030A7A6D914
+6136C77BE7F7D01938226A0ADDD08CFA63B68CB6C0CF532FDBFB0AAA6CC3FF54
+AB5435949968AFC9BB14B7889CAF0C5B1C80F749FD9E966D7FF38D64476076E8
+9C4DAAA24CA211C0D4C0DB27D7A8DE66817F002A76310BBEEC5ED2444F9C0974
+A3DAA9AD65FCAEB77FFAEA91882CA8648A0F27443680EF7D2511ABF85DBD456B
+2D72E529851B255CB48E86B537A0CC0127B8EB3F53FB67EEE069ED8BE30301B7
+02458C82CBCD2CF2396F4AB5B781FC69D583FFE8C7B62BCC05B746B5C495009A
+BF675F38E811B3292DF31864A1848DDE036DAF7ABBBF17B9E5E655CAD4DB38D5
+5E40EF78371FD46BF1190BDDF34C476FD09DD23CBB54EEB938A538589A03B28B
+03A3CCCBC550D90EB73564D4E56354846030B0D8ABA795AF99DD48DAE65EC594
+FC4CCA5CFD39860A6F23AA22D0E7C25A5CC06AE9A1C35EBA87DE6B5029F4BB4B
+B308BE301E6C1CA24980D5A72F14A65C6552F8205282BAA07AB56FFBEB77BDAD
+2A9B398216116A09A7FDBD0B01A33DE66E4A149E2CBF60715E8FC76A910021F0
+F26859FE2908C529F263D97481F07F784CFEF19369F023C98AEC7AF9A018AE6C
+727DD9581662FD83F76FF3A445465D8113D7EE8B5420446804C67624B22883EE
+4C31E69D1ACEA21DF7136529E6AAA2CF4FCA394142B3239010BE265F24405452
+8987FB64D9CDED947AC0F2FCA0636046872B6B742921CEDB4AEA45FE61F33A04
+120C7771D3541631B56332AED1B57A404362FDE040780A8A3509BFFD95FAEB93
+F3A2359122F3E9F709242E919AA0A52CED7C69623CE32ACB260FA787268E8312
+511A535827F5AA08C34CDBB689C9D47F31390B89104A698EC20F7B217807ABF4
+CEE3C2FF7D349E766E83510D204F0067D1A4144CACE3E9362FEACF05B95EC18D
+BC587E4455B9632CE28D02842C100510B81B1D598AAD6EE21634F6A13A30821E
+641D5D7DB3F7B784BD6DF4DAC840AAE74324CC00B515597CB7E4CF77A2DBEB15
+E655781F8D4A7ABF0CCB9A0D09720CF3A1671B256C81BC7C64BCE000DAF280F4
+6E5D749649B582C0639FF0CE11F6D0C36705A67A51404F22C0415A2135922FF8
+D11F8DCB25ED1CCC58E77CE7BD74FBE143B55DBC4AB525D4C4A8B7C392C4CB8D
+631540238AAB4B3D9E1892B747B0C273917453C1E2AA7585A77E9427925FD5BE
+1377961EE7C6AC55460A134AF811A327FC939A321DA059FB7DDDE88701922C02
+56727A98AAFF0D0FCA54EF784A1633B7EE514317D253780A1A62C7BD98FC4D67
+B49B930D55117F3DE5C5A634376FFDB177EFFFC6FB607B0D4F11591049D63890
+9E8C296F85483FE343D5B1EC41CEA8A3C66A890EC7812640016891AEDF8A64BD
+FD923BC5176DCEF2A5BC67948BD55AC844FC1BCE542F8D8F8E1B30A61EC9C422
+AF66942C540E02A9F1449ACDE6F2987734A06088DB9BAB4B9D57C67C4D22E912
+ECE827DA938FB7FA5609A96FE16FD2E74F4E8349FFF9ECC814325EE5D506F6B9
+8B6058716768FA9DE7F172E4E1CAFA98ED651ADE9E6A8D89FC9FDF1EE6F031D3
+F87DD7101EC90192B8314025C118CFDF399C7B9BA72344D5FF3C97867DC3A6CA
+76ACA42B4DBFC497B7FFF022B9F43A1876BC60172831DA3BFA9A74B85B195BAE
+0AF002039C49DCABF89F2A5619F09107349975D8D8AE6A716A3ED406FBE136B3
+90D46B10EAB91C83A0C06FD4045E1C16DDF3E0A4F0C24805FA130C4FEADAC556
+C7FD67CD11CFE397F006C783462F823C4B66307B1ED99713A1D63004C44AEAE9
+2C7D929F2DE483CDD8D0CD5BC1512352867F5C78AD991EAE5E3D5D50B899B272
+8C7B34FFB491E3DEEE35213C73A0D0D2D3EBC7FAC5EFDEE670C41EA2B6E60EBF
+11189DE0BBA33145D5FAC9BD4A62BEED88C4BFAA296A2D0A68DE5163C64014FE
+915B8A5E88C97617EDCDB20723F55C5603E0CE7A2DEA778F4CF09F2B521E5954
+1B53966CA35892761B022172B25D45B4796B75A2290A88C39C73FDA467FF0566
+9B35FA83FDA4C902F11878244E47E63CBC35359B3482CE71DC061808FFC130DB
+27879AF2A32A1C713256C84BA060722570C770CC0BD59A43EC3A7ECEA2295A06
+A134E2AC9A3559522691DD29E76B25567EA1DCAF787690872D62E780F5166C3C
+4590181B36C40444BAF5C381DEBA692FD3B1AAE99C4306C72B11481502653A71
+55A83360304F1C01121CA574AED7EBD9662BC2CC161B4A7BC19143731026E78E
+33575784EE8CDBC0BC219542E36A693642E155F57101EBB5AF4A867729ECFE9D
+8261F66FED38E6E182213028BBAFDFCBC71F0969AE553240A89BFC72203E07EF
+A6BA414540B10990770C6BB36F7F55CEE5676F5FEC5AD00C3530974B80BDC135
+EF6E8A10F2140AA7823B11D4AC4761D336BF634A24D8E89EE29D52C086FE79CD
+C870AC65A40713C8C08596FD1AD2AF44C078606A4086F6D41D28C4E5217A27BA
+11B172FCC9BD8A160F282A289993707C761CBB9DFA4DD9145CA114D9C0FA2426
+9EC80CA0FA4A86CA30E9021BEA3D463E8F058765191CE2539783A420E3B10472
+8EB4C904F9CC15E089BC5EAE794B9CBA565E3CC35C56B5A3BD20A54A5E430E43
+1029F7BFF82A730956C1D68C8EFB0508CBFAF48631348E8DCFE6479368D3392E
+FEDF6E69450013499757AEA2E79E9B4BEF03C17160F84A2339E3A80DE8F036C2
+68C163A24E6FD8FF75DE695FC17BBF155972D54FA4EF7DBD6EEF74252A02EE6A
+6F5DD566CD2ACB6B7474139D8443258BB8EEDE8C2CD08888874F872259CBF660
+47A254910600EC40C506243F0492400D897DD57FB4CC256A3408792140FA8138
+1A0293EA225BE55F392562FB47E7E243F27B665EABC0025A2E54EAED4D994837
+8834E6A97B8DBEAF7A937B593CFAC8EF9A40056DC38F59834E3C2502DDDDF1CB
+438D4B1FFA2FACA0F3D09D178C7370258C959AC2E8DA574305825F67739926D0
+8AD8949E93B2CFF05C85F56EDEBA1C490DD684F0A9E7C66C20D5B9048C6DBEB1
+C75DE78D6AEAB591C550A1ACCB1435DC126DF38D4FD8B168423D4434D126FE13
+7A1D5ED73746170D164C250CC197EA25265464844A2A1F49483D3ECCB0EE0D9E
+3C578291F27369212C3A659E752458AD0E4D5AC667FB6E762036CE103BFFF9FE
+E0CC48B5FFA43B59201A7EED5A4EB31749AB153FB776A13D73A39D109E6F8C2E
+B8F0E5BA5FDC23AADA736E50C291F78ABD0494B0AD6D376590CA339B091F6289
+7D2096E68D5858AF2F9BB0B162D752786FE1AE23E542121A74C17681095538BB
+9EC57F9E89F3B0CA32649C98597DDCDE2138B61450183A798D31FD3462102078
+62C7835F500E7A1FCBC58C37E8DAC9793F584A7F851565C871BDF1042234D3B1
+071F30D573FF2398D3438F49588662686A4AAEA60D8E1D961A48AC069431A9EC
+1ED3ECDD0DE5BEEB5D6FE035AFFB6BC509833D32508ED2D495472722D68E0A3F
+6B4066BE315FF5E7048300D439ACE70463F4BD72547E26225161B1A9B2F15ED4
+77673AFD583DADB09FE1AC2AB97537B7AF30051030792B08C4BD0C442FCC215E
+0257A366DE8CD6D7F601EAB3DCB0B86436B39364A44624C780A99F9CEB12F8AB
+7B2ECE4D34176EACCEAC54BFC3E5C35299E26CD8414BB2BC0ADCD9263447BDDB
+3858265428E134820D621E0762237F46C2681C296F36F774E705CED8388E2626
+B527ECF6B952B5FB9D151CDE83FEEA36F8C87F0B602975D918BAAB17752C83A2
+D8205FE2A2912282FAFEEBC0818B086464C2AD81EE097A492DBF5C1468AA8802
+88C454ACDA1E44169335FB0AB2BB0D44B2A4A4386AAAA4CEA2E48DB27BD47700
+3FAC7847668891E99EBCA8C5D813378EE7772212101488B4110E92D269A121A9
+18901A8EFF7C57F155C827A558A4F1610807A50EDE9C3630C2FB77969863FC6E
+A3AE9E28F27B301963D3DBE231CDA9BB03B6A29B0AF4042F62FA71E1C8A374DF
+B34CD305BF9410167948FFB3E8F262BB94AC891068DDB8F66680F5CA9B86000A
+D4B408C3F9DFE80A21DFFEF20D7C09EA830FF915509943799880B028FECC64D6
+6D4F17728A750801197EFB3EF5A697F63C2057D54AD79EDD99D7098B71107141
+3BF98DA68572C2EC5407C590CE8A7406239E728DB23304ACB07E1F27E9BC0C10
+B249EB1B76F1527459B8F05E5325F2362CE119A155E352459FC1552FFF069D88
+82D06CF9DA1676AE53DFA9DB50336CAC9A07083212FC04426842F6D08B89801B
+E098A9F6318577FCD3DE372FFAB3BB63938F46FDE00158ACB3F536EA91854E5C
+2E4B519A78BA54BE9B8E652756D615FB1BBB9F8CC4116A5337D0C82599E76F38
+7577664F70E05A2A0A402771A0BC71400E0F27D4C40D40908EFB641C75AA17E4
+34E02C02812B86CB7C1843BA074F5D7D21D90D93BB6BAB5ECA4AB1C6F2B2B80E
+1D3A8F2160DAD92307E5D3C763B0F63B7FB9135C76FCD7BF8AF9637F178ECDF1
+C761F0DDA7281C248711D123FE2FE5BA6408851F72D5061CFE0AF10E1D1EBE11
+1B0E4AEDD4946B6528FEA67D448BF9A06114A202E3136A2B7AB1B6ACC256F287
+EBF97D532A8FBD15064DC3B9D643402F67EEFF350B0EA3C3BDAFFE07C7CB1557
+5910F24C9101BC72440F4A9B8C2B7F48653C13FAE5FC28EB6A6589FDF0DA849C
+6569C761BE135F4E10151117FDBC32B94A0E534745B81E424F82EA384389D2A5
+795D3EA358DA26944D1F1ED1A48C11F4C444D7E91A6F23F950DD40BC0EB7FC53
+3C00D2DFF98EA6BBD13A904782CDC66BE179873E44254FFDC031B68AFFF574AC
+702EC8D9C462CA4257120B27AD65400EBBECBA4D32723E0E52AE178ECE376B79
+24C7DD2CC62787FC69AD166EC11E4E43D1E3A76175AE4B0282FE62B8EC0D46E7
+37C781B65ACD9E98108FFED418C6EB3F3ECE5093D4C4369FAF179A92B289D582
+811EFD634111CFACBE83975D9BC28875F2AD667F3DF8C7A3A3F5CC6B3E98F73C
+2D7A12214A4E6CB03C2C052885742E7FC5693F854EBFEB4A1711D1CEA7911254
+98C51BE323266A08650D51E50967DCC8DA329EAF374F422BE64EC35ABD1D5594
+00AFCEC6A82A4DD47271702552458B24C8B6EC0AA1DED3F6EE8D1A65E0AC0123
+5E81473A2376F47C06E0CDA141B2A3C056885AA41A10FBC37C374988FF497C81
+EE6797CA2C9296A496E6B6C9F56377C3A3C402CA3636372A7910BF35AE2AF3D6
+589DF95AF23E4490914ADAF4E4C605BEA4623231C5F1D4579A51F307F9700F39
+5402CC9B93E13679B2BE641F229A1E1D83BE1CCFB978FE1E8954FF1CC6007034
+B1A2BEAFD7347D8BD97ADCB649F6279E0A0E705C82F27778F7882372B58E00D3
+B94AA2A0582BEC08BF9F240FACD2D12B99F46AD52495B2BE5EFFD0B1AC93E726
+DD72DF4CA1264F21457672BB2802B7AE9B075795BF8AA9C27F743BD89C3BAE7E
+C614BCEF16F4A2AEFDF4B72D5CC5DCD7ED751382AB652ED86BEAE2653C384869
+D40CF8BD6FCE59F51CEACD343A92CF833754CBC5C0B80E9363899CB158EB3F54
+745BCEEBEF2659C69E95CC3820F12C6E51D868AF2FA979BFD0241E39A771747F
+FD651E157983751D084B16322264BE52D065A3608DBF78E98B416DEE27BD9F2E
+8F610100D3C227AFC725139971053273A53E18A6E0D894C932DDF3F432AABDED
+39666CAC0E86306384428A81F44006990C25B8144394AE04CF8A1217DE12D046
+A160109658102F279C90E0338541FD04AF587B1F88168463D471EF229009DB3D
+ACA474AFF7CC89492A300BF9574AEA8C5F9A9BA76EF789885EDF37C97B8E2C30
+D429111045A9C1490C6F4693B178548CD90BD54D75B6485B8A8186CEE5A86C8B
+519DA9B1C577FDC3B317151B3D3D725EB5835860654587A993C717FFA8C7E57E
+75D6E0E3E5BC10D241D0763B462F0B4FFA7F2881B92DD101BEDDD83373ACC0A0
+CBCF366F10DDA1FB8EB75224CCB6531AEC9E358EA5F0021F7CA6AF2510904AA6
+2259E75D10E1E492B6047B116FE904E4C9B832A23E3020485A26CD026F7C89F2
+75B8D46C4557C1798DD4BBBD26C814411A7D59D5AEBF6D6B7638F199AFCDD030
+2B2985C6E762A002381732BEB2B958B3D6CA4DC93ABFDA5837B89A5B8BD1FC7D
+322C540912F0A93B54117EC76B2E623A08673CF8882658241BAD84D1C7EB1148
+CE183E32DFB96BE256957E9F730CED521E392E56926CB63B681F5A930F32A9B2
+77477908C708D13559F50653DB862F07DCC8F7EE0EA755E728A9FC4A17115418
+835009651989B113A8D2DD613764F19C6F152A8DD23B37822465E483F4E746BA
+CA01DDD1135EBAEAF8792EAF022637287A544923CA6701333DFD39B92FCCBEBF
+D0ADB4B19A95CC2AFE8CAF3614EEC904602147A72A30DC5D582D147843317226
+8FDECF83A19691D5AE6B590E66120D22508CB30713BD2AB286E58A9E2F435C52
+D15E12C3E1C939E850135A6E2A897BDAD9F54179F2DBC80CB322E85B28A3C345
+3924F7A676B7587BE5CEA130E211B10C9B5C28A616CCB55B206203D05B032084
+123EAB7EFF139D5C1EF2FB00E3B328ADE7AE451471BB9E5F75ABDC03948B0664
+C4552C99DBE4668C7686485E27041D48C5BD4E4A7424E682FF75CF9DFB3D593C
+DDB1078AE7B070B1C6BDF8FF5D303B76E8B3B8B41D5958C6CAAC1790A6E40382
+89DA5B36509198E0AC7541112BA0ED7875085BFDB5169E01B75AA2EB2F8E0AA4
+46D7AACFCABD8F86D6753572872C647FF3A83214A44768B74B523D14C1FB8DCC
+764D865C31CC427AC247E7D6A233A7F043585B5B5737FE7837940F70AD3C1D00
+E6AB131600166A98DA57FB5A60D6B061971F09B780EE5ECD5F74B93621C54992
+A15D96BA8873D230B98CE56FFF6BC59A043D5AFF06A260B8C6DD848614EC3341
+21490989AFF9DF6BEA57CC93DE2417D171DAEEBCCA1EFC9164AF4C2E02B34E11
+34B7FF1DA19D626114DFA220623A2E667BDB2B79A6C97B8B4AD1793D179C0153
+150F91EA174C102B3EA389DEEEADF3672F0B2AF9B3DCD0D2B5B91A0F180C78E6
+1E0C7787F029A053686DEFA38CCF0730E7B8DAD8D4670BDCF6F5930C8802C60B
+E8082320DCE1E5BBE6CDEC6FA39CC6B18F76B56689B4AB685FDD986086BB414F
+6F0F2C4B113B6B31536B2C1980D34B4550C57B7EAA9161DD574CACCC82AF26BC
+56EECAB8FFD5F50DA8138FAED811DF021FA2C2F4991EB28310CE94BAC3CE70AE
+D7C36867C52843FE1AB41CA2D6B8EB9ABAB0DA435637C26E4CA60EDBD8BFD748
+CA958C5B79C6ED35393A2D4602B478524DF5BADCD692E02DFECABF4B99BB8393
+B8D8A2CE41CBB04A3BB9806C9E41A58AEF6E2BF7E7F24778D3042F42DB0FE7DD
+522486179BE8D2EB96CABF1EEA0CE577AF846E3CFCDF53CAA22EC3CA04B5D126
+CD68AE6F6E40075E559218857EE7FD5B91C426A7982C132B2A23B77D10E627C1
+891BBC5F4342982819507770FDC22FC96DC1DDB3069D0E3ABCD309D1BEE3F273
+F113EC79AF6FD2A332787E2DF3D9316DEC84DAB94AB9A8B25859BF2553156043
+6A5A084CD002662F0A1B1360941CA96B2EDDD12041EF8D49A5C03ED62FA1D50D
+4B4E94B30FF78C7E87DBBBDCF100CDD0D1CCEB4546A81129329B961E477E2EBB
+3D500F0DA9F684AFA07FDD0930555E1E828B0656854AC9AB8118A4BAD7111B39
+5BDE6AC93CC061FE73067D807B454654E3AB7A02A38661862B6811FD9857BBB5
+D88AF8BE8EE553D51C871ADD6377FEF4E4AAB4BF0962C377E6526DD3A43C99D3
+1200330943334A86A18E00A9C62CFB783688A489ABC093927E742AC44E6C5D68
+E381CB0577E36D42324075C70D0210146A46769E4EF4E7212A02BCEF21D39866
+45FEA59ACC9D0210DBAAD2D64D2B9C75AC9332DA6ECD127868A2ECA846BDC961
+370CDB39A22B63C3E73E1DA43D127232FFD654A37DE3B77E8691DF2000A95E02
+755A7DC7CE2D3FFD1D4E7A5A630991A727B889B6E80869FEA450B89D07717463
+BE8E7F9F7E7B5E8CDD9EBFBB0B01BF4631C35423EA9A53340BBA9FC493C144D7
+AC4EC43D61AEC9B6813803E59AB2F48B6B167C19E5BB64FD46B494ADDE9BE881
+DC7F1B9B7351196C77B07E7ADF73BCE7A085EAE92457E0031126878D6F2BB471
+FD9B2CB336526BE180479A29D96E5DEFFA21C9368A06964F5D3AF0E14E9137EA
+D8A102D1D42E096B89C04E6B44C22E38E2880EA9624C7084DFE92C7CEBB1CA87
+ED4A6269DFE0BFFC2491A2FCCAB7591D868D12FD15C2FB48077B4425BF9C2FB0
+C9CE1C5296278F8A49175A30161ACEEF4411234610C4FE6BFBD2D3AF3B924837
+6490F561BE719424B849D0CCA2D4DA51A1F34097BC6C4B81F65E094610363CD5
+26FD206621ACB77A02A1FFD70E364E32095A7C0173DAF45388E4F8CF02359389
+44180C058889100D5B340919A9EABB32A070AE29D81342D49617F20CB170C67D
+3B4A671979ABC06F853D599899A7117571971EFB792229D4D6B051EA3AA66DCC
+8D78F3A3FF7B97732E3277314344D32ABFBEB8AC47C4D4DF7F24CF5CCB870672
+C106D2CF44ACA8967586FC51354182B066B6EFAE8FFD916257EC30AF1E67B156
+89C13F96EDFBCD745965B3DCBF0C70496F81DE237779A24683971CBC5346D8A3
+E6BCBB52CDB58E2E2B3C175B7F049357C667D7E5DF9112F6D7787A47679DCCBC
+9AD6B4167C0A622AFC2871583D3DFD80A684B10A13D8362F08A39EB211672E8A
+8027F3CFA9E5725AFD833DAE86772E528FE5F89CDCED0EF2E2D7B84210BAF4EC
+F5FC2DA12451A19FB91E72A710AB9C80D9D964E05D4B7DC69DC229C6D4F2027E
+98F114ACFB99DF2487C53734D6C245F844F97640A29706BA79C324B2A499A8BA
+33D63244A320E9D2BCB43F59FC073BB6CE91F32F449DE3DAE4CE284E0E40EC9A
+299F71E1FF08A2783E1B452345F4CFFC1B17E878E6982198C14AF78F429DDA89
+99D504B49BD397D45DB265DC4242E51EBC3A4FA1078F62FF96A9956B900B7CAA
+64DFF8624A85017B0EA6DD905974F9B1A98A81C8A31E8B7F39C667DB89F88A2C
+F3E69A662D14C1523CFD64AE198784ADAE2F6524AC51F1DFA7C28653C70BCC7D
+974677D88282EB0EA8EF2993DC93EED927A088F00B3F6D45509418105E4EF439
+803DA2E82481019BA263C499696C3A8247773BF93CE18CB941F57E1512A918D3
+4100E497E31BA32A00B38B9F76B837987C7269CBA3FBA9E8487CCA4E0BF2A154
+494B2802E785E80E426C1E9E20A3BCBE1B88D1DF218F8A612237826FCD724236
+60CFB08F417238AE9DB5142D00852E4806BD491A18FC7056BBFAE5A97433FC88
+36E6B85A46DE24E8416891CF551BF8309FED66F4931B07E90DF9CC062ABC734D
+77D69ED92278A16BE66D1A5A1A7A6310BB852682FABA134AF0D55FFB09721DAD
+6ECC9D6446A54B158F034DD346793F1121B491C3793279520DC18F6EA12F0D30
+9C225BFC2C16B7F7133A282B79C12EC832145F366E800BE79F5E0824AFB0A87D
+626DEEFCFF653356F1DC7A02A2ADCC2860E3CC4125BF24ED9270A0EBD9055740
+B40D69633885753F33A58F679A7BB37A88311B4B4F1675780F87F88094FC26FA
+09BD993760E7C138D219382E7869FD81279DD4C3203990FA0A1E5A76FD2EE408
+81021AD0A9A3BDB29136F417A647A4BF701A5DBFA3618E0C5455A95B0CDF969E
+56B1D4D1EE29CD494FCA5785B10EC35E64D9D7F81E6DB72555AA1782232681E9
+909251570732F104D769D752B09C4ED44D9B00B929CF7C3899A1E4003277000A
+50D136D222A38476B166500304AF25D2A691104FEE150C14D6BA805415502752
+7959ED64C77B1F493FD142F635DFF5F9C6C96FAA68C418E1FE57C59ED52DF91D
+219E20FEDBBF7CFC56ABBE64B41616B74B6A76CD973CD4556F8141E863650CB5
+1FF734CEC3107FC337F9338EB688500177095021341B9D9F89BB7BDF5BD20255
+DAF041D751FAE3C3265F169800CA76182C63468B2767A0D7AD66A3F4CAC6D230
+E4F125E79DAD4FE6BA2DDD4F2246D3E5516DBF4A85CD3C96E17C8CB90DEE6590
+FF446FEEFB01EBEBB06578FD85687C27FB1F7E114C59523A7621CB251E73F6E3
+9C3B145D3022C716C476E24A4FB28E8D04AAF74372763B244EDA4244B632EA49
+F7D3388E1024CFCAAF76FE2E8C024EF779DAE6C93E4D078D8C28925E29F9A454
+75A2B6C84EFC80B82870C863ED7F8FBB606DC050C9B48B09B5743A2A459E4137
+BAA99EFFE878248247B575E0F51EBEDF5E13FF525F627D917E10192FA3EFA98B
+E24F413BB8603D044C5D225E0DA3E60DCD153520F317AA0212DAB75E6CCDD402
+9BD3C4F14443C20DCE7D75C3DAAC6200B07A86DBAD8150429A28EF82C5E1AA37
+DD57E54230D789BF166A074E0745D4A22CC22A2C1B64B2E866B0288ECC3BBA9F
+0865C26D28AC2323BEE23A3F8D1F9D2624D8C5CF775DA3D64052C1A6A50BD579
+1122C5FB8881CFE27430951C7BBC506AAA1E17F9CBBDF791FDA2A324B5F20C67
+1E26175E2DAA58D7B0351250AD53C423B5F6A46D106E6980F7AF95A6819964DC
+3939E2C92E76AFA64FCF2CD8AA811EFC9DC06C4BA38BF10A10513F02A8A8F855
+B3A04F814708F7D60A0525C3BB1B2DF82047AEFFF231D6B18E51DD38618F3102
+23EDF0C61EE36F887D0CF61AC775E044DAD59CDC9C8894EA4D6208A5F63F37DD
+1945592CAE3065D50DC35AC0ABF70F22072D046B624EC124BD023C508EE8B805
+CA44BF658B8CB36E4CCDB2276AC89912D4203425E64294461A0836BAE2E6039E
+5D041CB1CAA1F6D1B2638EE7F296AC96E49BAB1C0160FF773A9DE83D696B0C2E
+DC034B20387C96D8E5D0D75D3E8BFE12FD2DE65572C01070FE07D96B344638C8
+2DEE5D10642FE4329F83542B90F3CCA58EFD89FFCA8D16DAECFF28CAAE5B6CEB
+2B2A3C2AFD87F802AC36C3DF24CF6CAF2E8A822F286DFD647E195D3295466C41
+6AB850823C2891E8C6B94C9378F6EC868EE1BEC466879AF8425652BBA9F8FADB
+782B878D4EE3E9908C8BFBD343E077878499AF806A031B211CF9E43F470A5A8D
+8BF646AC3CD251393E3F94FD17151ACDC810D3B21C257A721159A6463DD0C954
+D7DBA0CCB7102E4DB5BDB81648520C5D600ADDF06EB808CDEC948AAF188CC6A0
+3327074AB44AAA9752283E94DA061191D10968BD8357D35EE2B7CA6BDBBDB595
+4F831469187CE69E061147F7C7FCED28824D4141783DD8F99B73F4A52A4A7BF0
+E5F7FC1F93B379D7416C816598DE7E660FE2A218653B32A4AE0BE9B5E1CBBE0B
+44D40E2CF2BCAC37F7DB2A196BE1B80D22534F8553958874C7BD4E8FE2CBAB87
+00101C71123255385BA182E63913F8AAAE986FB763FDAB631265061A17340890
+789C1E80E82002A6310AB650589809CF3467C6E12E312EB7BE3084750EF5AB0C
+6DE37BE767EA9E5EB4635529BCD8740B0B6E2C842EE6EA02D726CEEA20A23BFD
+E5DC590FA32502ED1F79941A897F59C3F2FF75324595F0C5753C5E3B65FF95C8
+FDCD5B411F86F8840386528CA77518A2765AB3F428937258A0A1210C86FFAC5E
+94D5BCF380417DA59075C4351944DE6934DC45B43C6FADC76D12FCB66B4CE9CB
+4C1E8FB398D66B5528E5B207A7B8AE34EC403F92729B2737EBD585028926E76D
+B3CF37CFCEF267B77CA5AA619BD3DF563C8C6AC730CA6486B135E817809B8D30
+97028BC290464B283C1AD1D41C59F97A69F06D9D72A0A9B95A45E4972AC4B84D
+E97C507869E4030BA5AAF4B710DE81A3502A4D7D736D61C668F63FA6D4669D23
+FE3F0B09A7F4906E6B31FF161ADD8E1E45EB98099B5BE95B5FDFE3F633447974
+CD3A02BE03C555B07CA3BA33F56AD586910707556DD51660D5ED2933858A71F4
+4900E8E51019FDF950E594C3FCC854085B0E165CAFA7E902E1C842E17AB654A1
+CE63493B07E060AD31814318CCC5B3783FEA5BC65DA2BBD27286F743F48D8246
+5E73C07BE09CB22176C40D8F0A55650B2EF6703E5D1325A273417E0CE2E1CF85
+6086CDC94AD6FE36C7A52925C91A3769F6771C6F58367C2B2B2456C5A1CDD38D
+09CFF9E577D6877563AD4E1EE5975E609DBFEF85225FEEABC2B49900F716D121
+D49C56F4EC12E412290BCC89B8862EC78AA095855D4B9DAC33CFFB50E9CFA788
+FF7514936A0A284CFC5E790DCB6BB15A49562CE367D96B03C058D63961FD8BDD
+F4402A58E1171A94B6B94CDC5E60106540E0012542F563CC79DA1055CBE47EDD
+98F049E90177DD9DF0E0D038C610568D13A6F8D59CBFBC5ED9D5733A55F21B74
+F06DC30D353B69FFA47ABAD4C55A874811DE60C6A2B3673C76105E16A466FA19
+20A5780F2E949328E05990573CC3D38CA7A37AD60641DE173893FFFA551AD971
+697DA8ED155818AC16E3DEE6968891225D5E0DD0363A941D20B76CFC6A4531D0
+2110290578D4D1183475AC1644257BFA84AF546324F3AEA5043D7171D4C251CC
+8CFF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMBX12
+%!PS-AdobeFont-1.0: CMBX12 003.002
+%%Title: CMBX12
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMBX12.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMBX12 known{/CMBX12 findfont dup/UniqueID known{dup
+/UniqueID get 5000769 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMBX12 def
+/FontBBox {-53 -251 1139 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMBX12.) readonly def
+/FullName (CMBX12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 12 /fi put
+dup 44 /comma put
+dup 46 /period put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 58 /colon put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 80 /P put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794D2D43A151FEE81296FBE
+0CF37DF6A338C826464BA5198991445EC4BE80971DB687336AE8F74B516E333D
+2D8AB74D362C559AAE6ACFAE49AEEF4F52E28C869222C1301D041E7A0BC1B608
+1BF728EF9E98F3A12EB2714E7F16B14E055FE1FA0EEFB058860ACADEDA9D0E4C
+42E3C6F1E4869471BFAA3760175F3FBD842755A9D7847EBF605F18293B42F557
+FBE2715002669091BB033E1AAD657532F34F7C66E4F04D63ABB07E6CB9D9AEAE
+78EDE8B79DD9BC87A1FF445EAA05B5572BB880E69F4DE1F82D7F0E9980AB0C18
+22C448B0B1722D3CC33C56FF287CECB80658B3AF5E7675BE82CEFF3DAD5942EE
+A03C955FF979E41E54BCFB5316A9AB8945C403A73180D0961416EC9C92F49811
+4B91BC4C788392994587517718521E416D469F69952149FF7F9224377EBA1065
+4A727BF806A112A7B45B0A1BA1D5A23683960575368D9EAC8C04753BF7465AF7
+95F25C258C63E4FDFFD0B412FD381946AA38C0B961652BCEC30322C47BF4755D
+9F91880688AF066E32FFB22E1A52DE741307AD3ED830D6BAA1D1F562919666DC
+5E8FD9862AC8600B0AE0BC7FC779252AAC57248744ACC8A8AAFA836BCF09B0DF
+9253DFBB1CB77EA8A59D42D1B18FF25E9AED72FA62FEC3F126F030F5D7DED9C3
+CF60FE890BA4A48E39E687BFFAEAB96AE542A6387F6624486037C8924002A511
+BEE5FBFD780AC1D4BEC3FBC47A930BAD0280D444259528B6C565DE11DE36BB65
+9BADC55C1EDA1A80458E98896D782DFB5C137897419602809F9BF8CA39F00C68
+EFB9E076FB324C2963F23CBFED28B9EF70EAA4E4B903225D1F199A7162AB239A
+D92D71C18B1B682D04C6A48926275BCB16D413B2A0E953E1257E0B12D8B717CE
+2EC84CFBC046A4338A69F454A469B12118E562B4F56C5FFB3CA5D357513E6FFE
+947A564B229C7FD873057D5C7CDF03E958294A1003B37D8DF565A70A00A3734B
+0138AE5277D383D10C2BD853EF806D3CCDC47739F0E374A3DF3B63638B949ED6
+4EC25869DC1C0B1F4DBDFFCC97382841D8F10F3635C792139A1EC462FDBA379C
+BE0990CA2E70FE73137AFBBF30CA54954D7E7377CC50BDD780DDD4C7FDC77AD2
+F3EB1169F14A0041F18160F43C24FAF556DB5D621709FBC544CE55424F7446D4
+6AC07A51C8CD5161AB0AD5084A96FB35D77F1CA155147DEF8D7A590EA6939514
+D4A226588295CE0007BA8A550895511C8D80BBE5CDFB8A50D249C3BDCA974415
+F5557914A9B805782F399E4078DDB6264F1A49A9A5BA45E284A5196E9828EBA8
+481D357B8D9E6ECA631A6204439FDFACE7D7E6A2392726107CB7D2517CD19A24
+FBE592C119626DB221BBB635B6EB84845C16A9585282E34958B961F4A543AF9D
+419B6A9105BF185FC767712D923437BE08A9C0EB92AB6792DBDC671029B6FCA6
+7F717FCE379C0F3B51C6CF042A762ED04898FBB4B0105C3C4ADDDC18C51BAA3B
+70A93666669547081D9246732CFF74C83EE90DA17F5B4F8BAF47FE4D81590988
+2858C9B96071341FA0A0D23BDD4947FC9BC2297913CFBD4FD6CA4303AB3179AE
+0203F1BD502065F90CE9BEA3B52DAFE4A29446082EA0E6B1D7AF1F31D0AD02CC
+9A7FACE2CA86E5FE0F6A425B28A5940ECA306891CECDB3CFC7A5BBC76B5D9E8A
+C754379ADE80B4D72CE493010317BF21A0CF4A0A55C1246218839DCA3F4D626D
+1F4161D38F54AD5142C1CEE95C61D8BB10FAD4B772F4955777AFDE8AE5A837C2
+A2BBB11D0BF5DA2E63D0B75ED421DBA9C789B281B01846B65DC572BA69591969
+21265DB722AE86BD8CAA3D887C975A617ACEDDFB7AAB341F47532AC0F354A530
+7662C089DA3939588774FFA16FC4A52555DED6D6F51DE718BF5F345C23C90198
+17B77CB8B5D53A5CE7A79F3E286B6A59F3F6178AC8BF15C0A15C1A8A95D03B60
+30EBE53DE328CE085CD9A1D49C69AA299C5B58B24334A546F6E274C1B534DC8F
+3289553F560C2F81E413ADB92FA0E7DD1C2F39D5FD268EBA97AB7335ECF28257
+96B4EADB7D0778706CB41C7E9C882760E7670936774A1088FFB2011115FDADB3
+B69EBD5108760762521C25C968C3E282DC3400001AC8FB1EA27FF643E3025950
+1D617BB8BB321281708E496277E11DD3AE0023DA9F25AD06B39C7CF527FED27B
+57397E88D3DF70EE4FCCEFC8A0927D6B05517E571B3E70ECC99F3CBA32CCD4DE
+B8BF22626B6C94FE65598A88AB90D238461EBD9A098DADEA4091AF1CDD7560EC
+8E1B9BC2321686E1759E6B8A270C8CB4A254F7368039602EAEAB86ED21CDED91
+8F2DB9889F46981C494C7EAF5E819B91C129F0740B8002B510014985E5791F59
+B16879CC6521D8E9F1C4C1890AC85A78022BE614BEFF318AB2616F0C3F02405E
+BB425D1555472A2642BA7686E431DC3FB8A1688B76660D9957C3FDE8D58109AC
+21B1234C9DDF3F0FAF93BCF7B2F88A001F23162E1A13E5E9118D51B485B70A91
+D0CBC39CF44413FD8686D9030782DAB58064F5B987E0402AF5B264B17BD31BD4
+FDF63951BECD73ACA6138854EF35B062D01F33073850D9C09A818828C581241F
+A625AB3638081DD0F00F946BE5450D38489CECEA4E66B4D85CC8AE0157E2AEE4
+A22A9313829F24D573101D84CC1784D1CED7DFAD5DD966601370C6CCBB723082
+A86BBAF0A5D867D0D2E3CA16E14E5109A29EF02649C47E12E88B3B397D65CACA
+DEB9940B92100744D686066F8250FF30E5F13D81428EE238A2E4E07ACE0F5C38
+7D79D4A336D0D26AF9C2B84088ED8ECDF94A1E3FADB45AFDAB46CAD6FF950B0F
+07AA2CDF82374DA76C56D29C80138841EB13F0D02ADD32F88B23E282ECC845F9
+BB9AAECE9CDC644AC2D49577A92307A83A99434F6493156DF25DBF0FCF2EC21E
+8C50A312C3D19E0609C0038554CF4FEF3ACEB7A833FD54B06EF0D617C2971C89
+E4C06075B09B84A4F78A82152B9A9C540B1D881313C2C74F20ED064A9606EC2C
+B56D7BB4797F1EEF4A9B13579CCF311FA4A4DFA62D80FDB7F535CC6526D1AAE5
+45C008EAF024B48C377522F74D939A475970533E645B1BFA81997549AFF26F67
+2AAE6C2EFA357DB3B525276EF330905688777057F4E4CBF584520A534A8587E5
+5A8360891E75A15205E8ADAC4A4E5A6E27D0C4A7D492216E4BC023AB027F37AF
+A8DC7579BA50204D5F45A51460C5BD8A5A7F87668CA6451137F2F59E117BBE28
+5C40820882A5546FA76F0CF49F8A6EC445F0647CC3227C400F56E7E9B84A6975
+E85E243CC1666DBAFF4E07EEAF3AF71BDACB30DAEA792F2B8504CAB071544F01
+5D66243D529C479D276FE22F7E275D9E7FA9C6EECA18716B2F213916E32C1D94
+6E32397B41AC6779543218E506569E3544803BBF9B404A983EBA62A494187B30
+8D3DFA4E1237A2E5E08224A60492C09ADAD8775B7CDB830520829BA164209ACB
+BCDEB2D574CEBFB7AE4BE72DF4EB1945FEF2458761AD8DCC0D378AEB7DA002C6
+9C14A665DAAA532B0ABA98D7BFB5A6151FF6703385AF7AE8FD315A492FCCDBCB
+B825707F9566B3B4943A3C61C3DEFDC31A843A2D67AB06891F3E110DD8C73D3B
+B5E4151B51D9F13905D7D94DB9ABBFCAF35F43B6EEE256B1A80ED6D1739D8D5E
+8C767F6F0E8704C5345D028A2A6DAFD9BB7AA048B8B895FE9423A7ACE858BADD
+595CB074A128DAFE08FDFFD6BDAC0114159A702FDCBF8013804B0CAEAD7AF38E
+FAF086A3248AD4FCA1401A85AE2F72E3E6956DC0996FE8ADB18F89B14A208A15
+13F81AF73D0DB72F78C4DA634ADE3C73756CAE6AF2E149C26316DFD93370BE1A
+FB4A79F77A67C07CB0A53C78367F21661D4AFE9E27328E077B522B50FD9AE2E3
+DA087BE481515B5DD7BF894A96A84A6C78874100505B7DDE1D22EFCE8D58B3AB
+313AB5495F72E2CA4E6AE22C0CB854302B9990372F1661D9F0A517F90686F248
+C5643008B3D29F7296E5C8FD4049886662EFDD4106E17C879F5D41CE84F87E89
+F6A3117C968B95A35940CC29C43E1E0DEF51C1E46B676301F40D59615C3F73DD
+DE37B72FF7105DB84227DA5241583272AB1C3CD97AE11C1EE98FFDB5E5F44844
+8FC41BEA5C54B26341AFF6830D9D0A5A2901B0653D8BD0746838194D240FF753
+E99750D3383373F453723D86BE97B571B8B84D8696089B5CFDD53E6C562A2197
+A8C4FB0CC690C27761A816B441029D3D306245052E0C41B53025D8CB7267CFE3
+C17FDFE348E765326F91AEB700CC49162DF748171214252CBC821493DD01AA20
+417D66DF47EBEFFF3E9BB2B0A2BE7D9B8C68BD570FC2EB0FA54CECC318F04C43
+19598BDE93F2F13DC7847354C99059AB20593EE51E94F9D4E9241869D605AAF4
+9D9B5FD88C3798A039A67993C5EC68B6326B132E647F67EACCA7F7AE7F718D85
+12666E90D7C73EF210E344964A38228B236679A2B18F5E081234CAA2458F8D83
+3F0CA308D19663CB12EB904076EF88E556407C33C9380A6A3D68A9EFE65387C1
+A1BCD2D26DFD2AC0881EC30E81C0A4E76C244A2BD822EE88C4A60B480D107E68
+90E419A1F512E865BA922A7830909BC2611A80931CB2E9344529586726614D94
+3AC5200FB9FF68AD9686506C5EFA8788C0AD0251AFE7F95E84683380CDB421C5
+B1A783B6D5F3A6BD1BC1C14B363DB01C87C0796DCDD5BECF41A1A9F43183CF6B
+82C2AE49F0BFDC5DEF7729F2E638EE6EA9E4D059EB9BB1B992AD8C82D501A550
+1BF73CBBFE740179B54E193E84A55DCD61B343C1852780FFB44248FC9426AC94
+AA2B3FE20FBA30F6C4D1E0FF3EDCDD8C0F57CCB50CDB0EFE2E04A8927E239C1D
+9B026C7929BB48461D4D695FFC766C8A0E545B1BCC2AA068D1865333108E7985
+2D93F9B00EA0A90939D0D3840D59B6CC0CE2C147B2E1A9A4F14270FE3ACF51D5
+99F7349106165AD627CBBB0ABA01ECC6D3A14C1DC1ED23A9DB9865BB4396C51A
+31ECD001EAC94B33C34E29C5611148EF3E55DD61813470B8F3CE32564C749414
+3C93C77EA5A3538A0B5AE3FC4DA32813B06772E0E48E25BB39F3F6FDCC077E86
+F86FA50E18FD19EB2F37311CE87F18F3BC85CE7FD71CA92D5C3264E34E04A2E5
+70C79D99F54D6C6D9D527AE45EBB48411221134587D2253E7C8ED7658EDCA34E
+5E768DD14E0200470F73C44D006CE8CB35DE1CA3EC10ADC668B0662A7774C891
+84EC95A31DD872F0728D9F65CA80940080E04630BE4DEC77A2C49E3913C39978
+BF145F8832AF2C4385EBCDB15F9D32C22CBA0CF950877717D6F1591D7C0B8047
+8C9BFCB16AF7124ED83137695F3D69228DB633053208C29E0ABA1B06A7FB3EE7
+5625CB44927E2DA6E038A6E62DEBDA2D96A03177982D8FA33BAAF4426E05F4B7
+9C1748B3FF7691F9888E7FF864A10B9DF761A41E6B5CFAD2BDD7E1C4924AC97B
+F4B352705316DD1A58637CC12D71C18A5CA691AB2AA8F171590EC24582B1123E
+94D4DC587D8F99E18A711776BF4013C96446BFECFEE4C809EA94B169088024DE
+0CBD20199A915AA406F0BD5F3D63D1467C49B4691AEBBB35ED6624F2D7BB74BC
+E80FD92B9FD04DD9C2BE9B6FD29EC7EC07FAB447511C61DD299C783BC09AE2A4
+7B3CBCA6A20C6631D06D0B2E2482A50612BB7C29B7E7D0A205EB0E8436702581
+596BC996ABD58CD8D5BAAE4B1478195CAFF98FE0141287296C4EFB8D2E7A8442
+F0A3AA9F9264329982532295A176BA1867EF732BBAC49AF485D9D0F7130F617E
+7F7DEEF935874D55A22240F8EDE4F247D5F73481373A392D40A8076BD91079E1
+1CE5998BA13D48D56B49A92B4A18430E316405D2E2E391B496A1934671FF1785
+AF42BA3B2D14B8E04014437FD194455C50289DFBA61B5C377BCBDADA48E82DEE
+4E70EF5E9DC03064907BCB8BE4D59DE069FB0C0CB140DA54708E630767313F9F
+744594AD8A499CFEF733E640A11FD74E46A749F9C7D18D49251BF85C6EB4668D
+67598C31A8F90922FEAEAD4B83B6E7184567DC798E4BA1C4C9B3461A478D63CA
+054F13B502DACB674EB49D6BB935E5EC82BF99FDA7D47C581AD7F940DF4FC6FA
+6C6D25D647033AC69505F0CAC58DE99087F365531A6283CB89CB644688963C3B
+8B2203A94294E58739EF23C7803630A1F9121D62BE1977DE2F41687C8CAF87FE
+CBD7AD3B98E0D95C8C6E1A7CCB0E09465AA874DC90A0F5DB2C5E7C130297FD39
+EFE63B0350B5139D09E6864D22C3F1150B29196E40EEF9723E71158B7ECFB8E4
+C426FEDCD439420B7F1C251FADA347C9A2C49738B5A17922E1EA93CA7B125B76
+57449EAA9C1D591CAD327D0E98EF2D44D614EE9ED49DD31ACAC0B956620B6BA5
+5BF6D08CA7541059D5ED2EF00AE2EE95488F5645BF6837D9241C0D3959B7580F
+C9ECB2BCF3E65C07D52EC9CFB21C11CD4C883E44C173214C900C44D2E1E43DD1
+CE8DFE3DA93C38B548BC4EC46FF91F30CFB97525E1FD4E77686433B20BABF8D2
+848C1CDF1BCF185CFD7A81D2D4BB826E837E2AF35CFC4F419F698DB0C43E9F9C
+B0FB628AC9A3CBE9B1FF4A067016E70333E78B32AB2D89C483834B31F5808FDB
+77492E099F1504DABCA5722C7860CDCEDB2DDEB512FFCC7D287F4945FD711F28
+87BC3D36173566B81FC2C1290C717A09697DAC6072408E20926D39270121CE58
+3EF97CE12EDD7F87F2C8CFE36C3C0400869C0D813B71C425343EE0CDF717BDD8
+409D5297D0F8F7FDEB0257C0A391F5635E0DB1116058942FF3E7C94D5F2873A7
+A3B0ADAFC3835AF2BE474E6741319BC6695FB37F59AEE388F81F6E66F910000B
+72E6BA7531B4378CEFEEDC79CCF4947BA1703823B5AB4F4AD73D9615C66C489D
+99D68E49C9BF765B7FC547BAB9640D51D5A7A2396507AB5A4DFF3D14F52422CD
+8FCFEAA06A56C6C7FFCD29C9A7A59DDD2A909A9363FE5F1E9629616D25ED38CB
+E754C059E4379318CC491C3B1A90128693AC53F80F8210FAEA7EE638902A7D3C
+82B95B3F5AE340EC1B648DBB9FB679D6E80B7F426D8671FE7136D97F51E2D2F3
+C9CE9183E4061CA40091A2A70DBB9ECBB19CE3F65ADD0FB346B54BAB182E2CD0
+EAF4C0F402C25573FB344EA771B297BEB615FCD0595172E84ED2A62FF8962634
+23C19076C2A9ECEED5135994EB397303A9619C76DC55E032DA83FBA441BD484A
+59F70A5110A8927F6239A14D4E223E189A5462E4A92EAEFFA4B961A2A32B320F
+C2B4E8C1821FA67A655B5042C15E4DE1FB3652B55078DB123573C4E986B19DB0
+1C5131F3DFAB271C30A5476B4A19D8FC922E31879C34BAED94C07A4841B8209C
+403369FB8E842610D1EB4662B6171A4465FD0E819964F62EC5B0ADC92F08CF90
+1DE0B410FFBAD16F6D355E8AD72CCF67961EDB6CDA82398021007C2D0462E893
+75EB0710AE4A6CDD15077C9DEFC5774EF4A657734D703CE42174259B58E5277E
+0DF26BF59AF8D1A3E7DC12E3C12AA4B67CF35B19962F6950C2020B698D971B35
+82FF84E72F72FBB0C54A112BADBAE6C4CAA358BDE6A705AB59332C3850CA3D25
+C7564499BC1319121CE0D93218210C68080AFF33420E3CB3A48BF9EB66BC07C8
+A79D8CD8E78C200FF7CFA3DAED0B9E87E6141C88B436D8FCBA50AC195FCBB9BC
+9512B95FE3A37FFAAB39850FCEBD4D50A243EA416E73F53B4B00F3B6EAE0CA06
+0693AFFEF215D00BFCAD02E45496D7C8F5E99EB9096FC4300D038C1AFD31EC4C
+5ACA6B72C1BE7204E37A4CBBCB1EC26AB87F2FF82DE20601025169A5FBD2D060
+62B5B2DBC288C79C33B596832AA18D730AD572C6EDFABCBD36DEA87C0F323C3D
+6E537AD3B43C6F3A905597570A8C6B0B4A5E08C08EAFF9731E745F2BA8ED0C0E
+1ADF7821CFCD4E38F3F4C243CAD31D9F8FC68B9043740852B4CCBDD37BF728E5
+648215961FA82A0C847ADCC5187331D0863A4573BE520C02CAE14AED4F06B3F1
+FB4A318AB54CD86DEC824707B29F858FD726A167F2333855C0575EAF4EBEA0B6
+754B1775F967140641FC06F82B191244186FF347A351FBD8FA62E8C978B21F6A
+E124929876488AFA97FAD1A68A0C3496BCA768F4AF8016D7A65BBA3AAFD7F5FE
+E75FE714FFF3D54D09C9747ACA01CEFD260985C6E87477C9C7843343C7E9E3F4
+0537D461EF019E046DB8B5BA258462B2FAEA1826B3410BA3333480CFE0DECE61
+CE2731FDDF7FCF2AEF7CC2B1EE7095F480B3B27932ADC486BD9CC130D94BBD05
+43872FEBA04FB8866ABCB4D379696E73B84BBE98FBC4A16CFF22F8A7AF754624
+2912C228030FF7EF23D51DD61BEB5171AD31E2B630475E16B6E0F3C78D44AC30
+712D165DB658FDA800798803C3CD32B841E159AF0F748400314FAF5038EAD574
+57D57A34CABDBE4B8D145E439A11585A0CEDB410973892F52DF26E116198F86D
+FD876B8299BCA27AEFEB72F9E8B4B7DA1110B52A0F96DE59A839E144184B72B6
+E45614991F03299BF5D1365EF2E0D68B86CF619AED2B9D37876A796997CBFEB6
+451B67B5EAE9120D0F8F9229332F23B6A10837AACB18CE42CA76F50FECE8A7D3
+3213106308756303E821161BBA3576A83820B337E6A7E804D8CA26E226068104
+0EB7484C4D980D7ABAF644B8B2A1BEC7E6506D965BA155349750E79A0C8A1AA6
+5AFC6F9D9C691B47F45AE17E66D1B273AA58D2CBDAC9820F011DD77CB2F40495
+540AE5327597D571CA7E202E2870297213BA4673BEA78368EBA8086EB422A59B
+C1B4B85378F2864B176AE297116D4771A393DA50F6905204CA54E10C929D3478
+36DE51581F3D79B158CACE7B22DB5BF4F6B34803DB65FF139F2FE9E789E79035
+47E746283E8BAB12A3592CF7AABD8836313D79BE940D246A1FC83026FD63925A
+64D9A8E4A799A0706AE085365144A5DB7D4005EB07A1D1EFB18B8AD517FF5500
+1597D3CB30D83856E4B83456C246AA8418D2BB350547F627611531515CDDB191
+EDD72DBD79FBA622A1F06B48C412E37464B3B5BFD1614F54253D9DA82328E448
+11C6A02E6323738819FEF776149B48D52C83CA39036DED2CC3D8C1E36320F674
+C9B5D10D2DCA8320A2BAE92C9800FEABB7AFC0ACB2710F61DBAD38E8174FDA0C
+E8AAFBBE0F602AEA14D675DFB04790905077BB0FEEE4B7DB0A9717D37A627E6E
+CCDF58565FF1DFA6408CD17F71BA6BAEA2D4D99FF7628166BA93A5CBBEF1A839
+2332FB0A14671F510DFAE662325952ACDA24EE9D79EE9402679F5B7FB73372BF
+641E2C30C24A861F669FC28A2C1447EBD321E3BA9F29737CD880CE07D2295E72
+9D2AB0C24E9A643A1BEB7F32D20A58E6E620C8F1768D3212FFC5ED912CF7C3D8
+D507217D20A988699BBDC9D3FE095C8DAF9939B198F0A21DB77CD4C59FB771FA
+9DE3286BB0DCEE0DA3782661356BB2691D830C00688D0B29651BBCC437532DAE
+815AB03DE8F44AEC6112971E7231B30CC80D04970EC6C1E42A6AA0642BADC0C2
+EAD884A4C33B25469B5FF3230ADF4EF607499F1EC3401FF7C6F844B93D95B202
+1F661579C30C3E1DA2533836ED3445E59CA532AB1E8613EB4C78536ED00E1EF0
+615359AD748D66F7C8A13B807650C963A962B831C55D25B0CF3EE4300F941C5B
+61973842957CF64A65255CFCD3666728FD0CDF7B59DC9C2E3959735BA89C9AD4
+98E0AB04FF7B07A138E77B97991379C4262C03F36DC55420A1DA7983AC156209
+AE245CE6C064071323FEFF68797AD21DAB54A1B8CEF96A787DC9E90CE2DA1C27
+08BE7D84C8491B98151D170434B4880F1550D55632ACE592BBC07466FEE6B7BA
+3632C750DAB27A2A33C5BFB2C06B5DCB9A6243CBBA1A31C3D7DE7FF6B41F6E82
+6A44428053C6C606E951A312495B47A6BBC2FAB44A62FC0D4A50E74D77E0BDD0
+206BBE6BC9B1DC7A0FA3CC495CDF1CC5216428CA94D6F6715B920DC818B8463C
+9E4120C397B8C9007E04347D305D021D5220E3E98FBC7A30211E6C4B1199488A
+EFCC8F2DDA888D213228C360FDD2D27A7B8D3578B3F16D9F73AB6D7DF413A84C
+B0B5FB73A7FEE60E68B98FDD312DFFF653D98FF04DFB4AFED129B33E6148FE7E
+EFE32787D41E567C0970FD535BBF95FF4C14832FD5181C6AFE9295665C6AFD2B
+07DE351D3A9858ACCDA547DA19D30BED27B3A77C01CDDB62EA0C541E26B241AA
+EB6BB5D533A091A7C5AE32923E931A98B1A378CEDE4394E7615AEAE807C14E8C
+818BBCE624387076111D1EDF5C61EA8809948D4906B2C05C01463C4DF4EA3A7D
+6A4DFB643EB5AB2E09DCCC51CC16F68CAE87CDFB82F7A39129119C290A21DD0D
+3A46F182963E7267C31F20B98914BACC48CCB4E0611C67BC595D00B633E7FFCE
+17E311A7F4588FB6AE658377C08A215B79424635331DB4068BE99D308D6BC1FB
+2DF73D26E0C6303F06946636B23742D57FB9D9A3BD099093A1C7BB31C02D5423
+C7FA77892B3E560A5D115FDD512CB4CE82FE58A7AA72A233B02D6B48B90CF72B
+6C9D1E25CE02FD2D8BD99802C12AE644185A5D70D63442C3514746A7222DCDA2
+1DBBF4CBCC0B2342CB51BC7FC6423F7E95BC3EB407F0285FD449D8B636642BE6
+131E0AE8A0B810C0D8253B249A103DF83004276605A33119A16BED4A7F2F295C
+67757411FEBC5AE386358251D1A57A77C11951BB0533EE75223739B27D2C0EDE
+F12FCC8CEFA983BB6FF34301849D59A0282DB77AEACC51E2350636AB56FEEEEC
+FDFECCBEFB135A6005DC8D8E21B1484E5345FD64E26B296864D7E8884955679E
+35F720AE6E52A89CDA315714FCAE93AAC470D2692650EA28CADDE043534014D5
+17507253E7333EB8B44A5486828BCE2850FD95CAD5ACF132DFAA39E0007FFF26
+497425189ADDD944FA5423B9305239BB25B4430D6AD6D698F9562B10FD9D75E2
+4C7AB5047BE64C912105CD4A4DA988BD5ED3B612FA3D28C805E2A360F464178A
+94CF4BA6A9FC5C18E56D8C0890CDEB4D14ED75F494F5D917A57F571760D02147
+1D344B0D80E7064DE9D0A5992C3BBE55A7258C3DB693677765B514782170B8FB
+6E0F5AFCBAEF7E3D161717D01090EA2316E0633DA73CF10C77C68BBF8123FB74
+1945F0EDA652BB4F3693FE0F4FB0F5D5F57A6A1793C0F39ECEDA9079A5C497CF
+1519DEDFE0FCF60994038D7A9F5374FAE1F132BECB1DC80EE2D09164C674C6FA
+D0881743FE49F5727756F05AC1709328C25EE1C4B8AD429CB90EE6023A226709
+33C619C97D92A505C9B82B75241F7CA2604B8C65202E5546E9BD5C15394BC9C6
+2A848D7141F8F57FC25DD20879EF0E968CE16C31FC537B74C429720B0D83A510
+DF7E9C057609E3F35C2DA4EC56CC1C4BE0BD04A4B23AA52FFB3AAF096D6CFC3D
+5CAEAF5B4577FAFDBCF41D81148C0226DD29E6D57B8C05E1C141B6D309D7273C
+2832AF0AFE91CB8CC9FD1980605C5FE4D8DA726580676FCEB1021121DB2CAFB3
+516426D78EE62D95A84B1ED786324569E604FF8D2E9EE071600B4820EF0CDDF2
+51EBA811EC9A6A8F7E8533090E7D5FAE3592A6F7BE3C7DBEE4729DF5598EFC57
+614441E5AE48AA6B3EF26C78C298B5F0EB05D67213915CBD611298A3492ECC50
+3ACFFC5589E5625DC0BA66F06B15F35F73993CD514F8F952B9AB8550BD573B20
+699B9CC30851C45EFF549F82433198FC6C217E2C6484DB1B349BE6AA81A32716
+DADF7565299A4CCCB83121FD1CDF9E1DF7656273E59B60080928E8CE59184D32
+9868A652C2AE09BF15F3DC3AE6AB5436D0CCF0EAB2AEE3A385A6A8A2F2BBFD4B
+B8EFF2818AF015263AA0A5C8215CEA00C62DF4B00540B091CAA144D6F94C093A
+77375E33DF12B1928C9D17E6E3D658B8D26B5F9ECAF863FA7A93A53CB1BA6B9A
+CB4118471BF92D9DF22C820506CD74492F42CD49903EC50AAB51E9E6115EED20
+08D8CEF153409DDBCF0EA91EF2BEDE757361403A94FD680F74E1B96BB88965E9
+58F7A517FE9E1C781C3CBE6498E6623042E58762A2407A5FB8D24D89B93BACE2
+7D92D50EA78D5BE442D4C49C56F57592C04ED3518C44A4F36B9819C27E93BA1F
+2FA7C560668C355AAFB9A9F5BE6388B3E08E2FF8FB820BE492A1B0A067515A1B
+5DF479992F4E62D27F713C7EF4B715FB341F35D8C9C4F62834E950C86561591B
+8947FADE95A2BED5D595E81B1AAEFA2EC949A6E4610D372C8FFB23E28FC64153
+E6A9F95E8C77FA57ACB91B1C7D6EB78EA40357C88754711D61977F8D1D8836C9
+1D20A3DD14CDB6B7936233E524A990148D8B797ED4CC4D5BA8EC668DCA7C9C67
+413662E9B57DA3233D0DEF0EFBE62B253E56F9FCD5E64B9AD2967BAA036EFD4E
+990F9BCFB3113884F87FB79E7BF293FF3A920575795A964C662494B91E934107
+D2E02B221294A4776CC9ECBD69A362E6CF668CC22C9F8DCFA29CE30CB8DE13C2
+79167C1D4BF0751D491109BA8EE1ACD06DA832F48042BA3700CA0EA193D41AB1
+72E1F02AFB3EE2E52A32CF8921A3DE2701541B66325142F9AE079F3A6C21DF90
+EBE1EECB900ECF7FB6F001CFE6C0FA8E6413D39B70F8B4D68A5105F509E384B3
+842F5753A6D78654BD508FAB1CD7E81FE0CE3527E7163EC56EC8BF3E242FAD38
+A600E254EFA5BBD99C48AE102AB2DE4330EE93CE6CA6F61D99406DAD5AFDA2AF
+2377B3E1CA0BBB1442DA68C316B0817DECBE32E2A4B7608D3007C740F78905CA
+EA5EC147472821B886FB1A678756DD584EFEE26C81F3A9545FDA4EFD44E545F1
+8F936E4FECA8F5E7D3E68D71D3B8C122ABE07476B492685496588BDD8C639500
+DD91F576C77C8C3D4F8E8AC2E6AC308F923BD2F231438AD39AB7FD5FEF428D61
+DBBC7803F12DC84A81EA8CD982D6CA26A63C7776ADAC6A5F300656883AE97BBE
+217CC1F3220B498527A826C557669132D2F97E20029BCF14A9A896012837CA40
+EDBA10810F4E7A0BCB0F7EEB88842AA6C8360FE21247FB0C3BAA86A413DDD20E
+F5C3E5349A96BC9C7D54AE493AA18763F407040C89464F1F9474CF00DA0A6B49
+02604EDA77354E75B67CBAF2051BC92EEFB603D712A8A6DBA63A0A89F37451FA
+E3E99B5039EC4478106FDE29E4D7BE88537C97A2E03372C07EC4D6EC3E159618
+6479EAD51CE224EA90C9C951CBD81E02D30D9DAE9277FAB7533CDB40AF16A1DD
+35D5FA847311A5868596C49549BC2CB7FB11334A5DC0235BC107EEDB05B92A85
+B198C70DCDE3B70BCF42FBDA810A3DEF5802821B55B42C4653C61DEABDFEB3E0
+9A595EB54994A4B866A99F23CC95697F90B0A4B460994016D12B85D2CC92B572
+F62B9A1AABF2D9CBDB887D1F58A824E080562A3E4A7C6AA02EAAA47907EE67E5
+46169E42148793FEAB87D15B626EAEB86BDEC8CFFA2B84F52BD34A2056765E09
+63E0BC58FC24B297D68D8A1D3332792C4DD29EE1728FAB873198F893E21C8AFA
+D2DEDFB86AA5343984A6E366F837AF76EE986ECC5BDC880F087B6F71CBDBF917
+8B38EA2EFFD281B1A8E46666A74F11D849709F871C45DA532D12541BD8F74899
+95F4B59B9DFE7F6F5FD49789865298C244D95881D2DB1889D0A41FC7A34777D6
+9E6947A3DDE605111352262F0990A9E558274D66601BF2B67D55159C7514F1E1
+1A7E5C074DE75B9A612A762C3153B326C6BDDD276C2066F50899A6EC8D4E1DDC
+6FE4C7056EC63A2E1F6872D0C74FBA9700C6C4E3689F8ABA302F49A7E3EA2B4B
+BCFB7FBD3420D588F61AFA044EB78DF7C3881017C753DB1DA3F35933B19656CC
+3CED882CE92EC2AD79698EF383D113D85C6F3DCC4B0787F3CA994A0830EE3703
+0BA4F77439094180813BD2E230F2010ABD7868EB171307253CE61F9B228C6687
+F849FD6EE7BFDCA93B097A1F1DCFA09E351F1713E4E297F10C1CA62A8F461B5D
+A696C14A1917F2C92B885193465E63F94C151DFF3E463DC3767771BA45DACCFE
+9A7C1A408A0BA54170D70A72A936CE4C0D4DC4C185040D5530F02A9443615826
+7BF99C96AC1F027CD229A9ED6BEBEFB54752EAD461E112597F63247C83ACDC2D
+2F02720E242C0FE40F92ACD4526E93679B6D801A9C6461491A070850CC24B3A8
+78D8E1A70440B37FBB23FE8B3F562191F410C6E68E7286BC35423C1821F06304
+4F4DF0FD723BC06365B3EB2D0C5C83D219F92688D798FE1555BFC2E3AA8E18F0
+58DBDC9827E06520AA3937E0D01E0966FB90C3E32965018AE2B5F2CA42794CE1
+2A22A211CE8D96A5FF98BBBC1DDA78BD9EF66F34D74F9D28F7CD1B4891FF2355
+D05F8609E03969EE85696CD194287A1A1909C091835BBB4C4FDE8AF355B1EA02
+7C3BAF3782E46F2FE41CCA69C346C4F88B640A25C51B85D1535CB65A10316C65
+8AA3914E00671E0DDC0C41D560C66E677BE305B1C9A167496E9BC55E3E61FBF0
+454ED084CA7B8542D09C19A0414782A2EC87700A7DBCABB76F32D20479CAAF1A
+B9FE677A9BC68A04FC04211F65CF6B7AE4BCD58D8EDD334101BB4AA9F426404B
+73C5E96532F99284B408438EB48650A90FD34A2120977F5F7DD6301E993FD1EF
+675A7E6176BF57276D3FAE1380D9B1E4B2CF158046EEA40E87928CE9B19A249C
+E2C45BBFE7EC8302D794893656C086031AF9578BFAF49E6A866F98D1CC1DE410
+C2667F4A82EB71BF6436DF43BE28138EEA6A33A04B0B414450950C40708E2058
+2CB26EC69D1645BE59C79BE73F9767C75667463546B650502FC81F21B5C4D406
+DBA42CE9F1CF16561266E05874C91490DB83C01EE0339E7A8DCC5AFF63D3FA4B
+552926E42DE881BBB4B0D0BB380E0ED76B72A756B4CAEB91722F993A6B4F49AE
+A404FBBCAF83B786A3D5D0C5AC21D499C743D5A9375DDB1697D28E13F47FA43A
+FE64426660F078609C14EC6383561C2ED52C3B0F22D404776673B382CC17BBE6
+ADCF4A7F3F7D167DE46D8DEBAE03648685FDBB2367F40B6FDC44090F32AF4802
+BD5EBADD37B82B429A0E22E9278F2E1C6BCC2D8649A949FA59A8E1CBEBD883A5
+430CD0968816244C9D05C948102A9B9D9CF0023B7AB5E3481A1C2EADCB42B6A1
+D5891F3115E42F0A18E30735F156160E24E38D358D4376E0BB35EA62F73DADC5
+0EAF316D1FEFFCBCC1808EF642F285D3B67E279BB617E29B10E46C92496A7568
+900465D114CAFFA796FB47AD526011D42B486078629D6196F9485B66966D0D47
+9C6DC7350979D07D8925A1CD3934495B034456D8BA32203DDDC3C545E1FEEB3C
+85A12370148A0ED20D56DA8A34409226A4D38D350433B0590B93DBF4EE792A6C
+28F5D36D91A0CC9374BFB366B81EE8FC4A29E287B597A845B45C7486E3F76BD1
+13418C33B8FCBB118BA3419B55D291BE1D200023002FC6DF412DB7FA559C2CEB
+2A4E359CCEEEC0B7709C8D41BF93B42448582C8E8A3E8160BD43186A96C66BBE
+591DDE7BAD8CD956DE262047E7CF1F174F462FA6DFDD274772F331F95D6B3557
+BB8E02973A3AB6F3B8C0D8BA680777510A0FC83689E15220D618FE48AA0BF540
+11AECC854D11EDBAA8B7A8C95D9F4385407F5E8324A2B249A3E50F983445FFBB
+3DC77A4A6D7CA7ABA7341501988E6A446B85484641B0ECD10492D6804F0FE1A3
+7FD639D14146B5AA2899CB7BBD4537A37B3890CD1C2A3B3147F71A5B974E4750
+A0444C4E14BFD00A9A5E7F4E30948CE9FA820D15250A2A1D87E7F1686972D0FE
+80DCACE154D3E7AE9D7BB1CF4D2E893B5F010D8B1268116147F6D7328F260BE8
+BAC184DFCC2745560910ED3901D4AA5BC1AF68CB14A3BA66E235299024C2BA29
+65CBE67B56A6A5FD4B4AB404DDD02E520E2084082A6ABBC6F62F3BD146388B26
+A107DB3FFA2DDE3AD94A267D1403E8F0D018948F91349C870AA70AAFBD2CB866
+58D40D1439AD4BEFFCDE627E56AB5E78CE0213C214001FBE22809BE3FDA6D380
+31EDE1E121168BAF879532F11B02A0EDC08A53AE7B0B27605C4D726816E08CD5
+47550ED2014B1062C1F35F3F3A3290018E2B459CEBC43BDFC8AA6B0653A838A1
+D832CAA078C802C0E0F4125911CA9118AB0EF5C38EE0EF4E5A898D4E8E81182A
+B2754E36F9846CA5A95D72AECF41F7E2DAAC726AACA518E585261014859EF503
+B0A00369FB384E5321F2EF712053C34B81F235FFB9E95638688FC56360681C19
+5E70974D7C64FA3B885D0C435335C62344F3FB675546CF255B3E350095154EDE
+7227589C6D73A140E577645D0A6B45ECDF28A5F7FC3E0AC6A893662E66756A22
+485E8EED9448335A643E67C2EEF06998083C39DB6024884182436DBBD4FF630F
+38CA84DEB883C104C6BA4757A8816160F21AC23067BD91DCF8173361372F1E53
+1ACF0FFCEABA31C4E2FD3E5A6E28FF3D480E6062FB210CCBD995BEEC93989852
+FF223550E7100E2CDEBD81C548DD3F0B4FB9C694BF14D7C1D842DA4B50647318
+45452B2E61CCC0992B66DACBD66664AF8E14BD784C309DAAE8336321C2A40625
+94ACC155EAB00D6B5EE04A4A31416B4D1EDD27FF915F43B77DBD567F201F8C12
+DF9B272813D89C9F960A9BB37BEE79CE8701E418B03AEF4604C273DFCD380F54
+350608AEA632A54BED07DC0690448576C5449AD9465CF06B5611ACEE28C94631
+B5CD0E1EE997E23966E494EAC2E397A604AF67D0E55F48B46ACF92DE6E13B8A3
+39C0FBF7B87218D04C6614FE336FEA49E26B7045370DB4847F80A86B3A97933F
+4F5BDC84B75E7A01B36D1C2D5A0F4F2C873AE44D804732847525C15F900EB9C4
+65B90F90F343E0420392AA43A4F9F836ECF2CB9FCF4A7AC4E564F71506C04423
+C42CC07FA4F4B4EF5BF5464D4E76976DC5164A0E134329D962EF72E36C2374EC
+339DDFEF01B8D43459AFA427B44EA035C41936DB61E512EB99B1B98C94E56775
+442484DE5A25E67F347BB5A4F1DC5E3C50901187F6081C2547A71E13B3657243
+EBADB0BB43F920C15CE4D4ED45E481A40E6A5EBB944B2D44D7E1CF2D130A7B2C
+25AB9A8D48CBD56637B3888CD66135BEB00915550CC2EA18229B068E5091B2BB
+0EE55CFEDE2695316911B60C66FAE3A47AF8C778399F1E029C8AC3898602E89A
+2E83824A18D289A571B9F14D5113543F14D4C085ECBC20CA010503A068530D54
+5966DD29C1E04FC8CC14E684F1D523FF8D5C16E776499A9BCC5546C3019A7363
+8AA39908E2AB0F4236C6B453B2BE8046F6D512929283718F8C0EAE110A7E7F3A
+E649D9C76F21F3C98D274E40D1E7F7E9211F6ADE82BD73353095A862EBF943E2
+744D66C11EDD6AB4CA6DFBE231750132A1419F961B75F654957CD33B4D21C038
+D88322B91EA35235D83618A10F040FF284674D7AFC91D58B50BD591B870D9B79
+F79F5E9BFDDEBB9AE3CA2A17A439082898598ADF8DD54A42F82046299153096E
+FABA8F1A4FAC50ED0CF9CEA7208B5F39514BD52F4B93BBD32BA4E19A8C02D1BD
+764F7CC39729AE94D83620269E1EE32C5E7CB173ED2947580C39F1AF782B1465
+F8A4CAD36261FEB051A0677217FCF3017FFD173DB260DC6C66F907C252CAF4D6
+1DC423516B3487E74E6108DD038E4CCF7E008C3286A9BE150F46DF0D24AED27A
+D0AE2B1F60899E9E1872832673EB28E2E465BF0734AC459829D42D7E31EAFDDD
+DD5F63364872EF24C99EC5A346F60DED135EAAE1CBF8F9D051CA39DAA3F592AB
+34193B2AADFAF020FE42293BEC723633B38A2C8C65FAB0CF772209FA8E1E7A82
+15316ECD908F1A8355BD409B11EBAB00D80AD389BEBE357D107827D49CE9A014
+5A7536AB85AE8206F5F43AC6409F59FFBDACE58AF87D3C4C6EBEACCD801FA923
+AA04E542D23E389415F423065111046BE1AABF234AA8156C0F0E05BE139F82F9
+489A8766716287088F451179E180572C60478099C6A507D2B8A9D2E330872A83
+9A56ABDD97A467F5ADB9E08A9ECD62AB1F600E7A6F4C8905497E7965873448EC
+C2529C56986FE1E3C48652DD02495A53089569183CF75C89FAF88E38192987BA
+C061B029A1475CFBD00157F1256365A741144EA2EF4FA2039A2555CCB89734CD
+A6B4DA0482B2906ADFF83F749C52A1474DF2832A4659B60CE2F203A9B14A8D9A
+088B48B32D3D1E13EC4A1587CB18EF1E15933762E7DCEFF2E8671311A092B2C5
+9AC2102CF157EE42B88050AF6B9600745BBC7583999F3CA0962F073FBF7279BA
+D3F16ECF48D5973D3610B8CD7F9FCBB48E5D6F8D8FC4BA703F7C92454DFB2BF9
+DE7812C8370F30424E4EEC4C3EA5B1F3137B16E3418A4C73A9EAE3A06E5560E3
+494E71B8159D7CB23FC90FD651AEB07867C8A2E656FA36B193AA9261C98D0C45
+0735570192FC3EA22DA0A8874ADED40D3AE130C051D266ABB4F65DD7E9A68BFB
+097E2A5EFF411D26B9581F0D61753440F91C325699E7CEA90107F55F9BD478D6
+F17042E710C9387F975A3BD7654DC113F17182497A4289F3C81A37A48BA8D66D
+3DF02BCCAA5C32D71B6E4C7316C9CAFFD1173A352831D6110ACAAADB21C4751D
+4F2C35A8490999013485F6AB5E4497880CCBE78CE8ED5BC623BD2F4E230F0DB8
+6522E203445073A11C4663E7D0C1724992072519DB39389662F75CAC57FF20CA
+B4AD604ACDD7D40560125B9A77613FF1C51BBB91C75653A2800C40545D446F56
+9663AD7CE3B3E9CC3BA7D907561FF498C1519BE0C9984F7A3A33573F262D9E75
+F547366E8EFC46F1F984E2C6841FF9ACEF44D8804A2A567E0A75F842BB57DB2A
+7F4DD6738CEF16A4007A3E8FAABBBD19853CBD70AC8CF599C651E27AF4AC2E4D
+4A87A9616732B81947B13AE0223BC0DA77C206072C7538574608C8DFB40E407C
+AF01507296F1FED01FE9DAEC841864D857FAC306EF001053DDA9854EEEF09ADD
+0C3221E3F45DAA2C747C468D471DE4DB8C091C9CF7A22043B9D9AF23AD2EE11A
+154BF601D6DAB725C5CBD7D23B955ACDCC8DA70D53396C0B0D3CF5D7B110E9FF
+17DD2D73BBB99594C2262231BBB56FE443015D813C3323929349D06B51275B40
+84A7BD1875411E68FD8FBB062023CB0EC186FF8027AEAC6F35B00EF9669047EB
+B0E87B06EB40A9968052CEC8E4BC2354A963CB5956CB300624BF3AB78A3D1A63
+CA4A40270DBFFFAC07F8EE8019DD1003A07CFCA1635ED2A51428362DD52D7826
+DED05A0778ED5024012CC2ECBF1A9914D8F81A02DA5328B2E32BA78FC15CE60C
+622021E0CFDE12AF3B284CFCF047867D399A8DD70844D12A34AE7EA5DCAF6CF6
+16C62406927FE0CD3A76A5DDCB6035E2A45A0A1EC85CD2AF59E7275322CAF01A
+D54F3C49382A065D5D4932562F964CBF2174D0FA07A6FC3B0BE43EA1CFDA4B88
+BF507F964DD52B6EF9C2844F880271F7639B4C571922A6154AA02FF5D042FEBB
+506976CAA4B8DEB70BA2B063E07B874AF5F198D7C45E229AD80D394D7EF7375A
+A70B62D2719C6598C6124DDC0B562FE0659BCFD22CB3B1AB5D7E2726CDFCF88F
+B13DE122F2A3DEFDC2E99C902C5761E43C7A1A43F677931AB005746566FE3C2E
+962BD9163E099B57E0DAB0DEB69497F6E9B851264EE594FD90A67843AD7E05EE
+90119F7D88483955AC3FDB0D32B7B1F1E31B7E572AD62CEDA14028F3EAD01434
+9106CD651516E13997EAFA17A8B5026B9506C66151CA9EDAFA128B13C99FF662
+CBC821CBD3768C3D4A7C3DFD2A6C27F643D905181E7E088C7B619D118F4B58E7
+E1A27289F377B188D374682A266BE157CB0B478484016BF6984013572FB3DCE4
+00776B23D3F2DC8DBBAADC2E618AB399061C94FFF2A9A47835AF1E2C92ED0610
+5176407975A0345D5371843EEF46D445082B9780ED5D326AD2AA7591AA726BF6
+9FA17265E93F600D76FEE14C9106A94DA0DEA690A073ED19888E38BE279F22B0
+3651B85A662314C10DF7C74D89848148486C33372D688167F95A956280BD5A83
+8C06D67C02A6AA3C55CF799DB8557FF823F062D9150341F98BC2B2BFB84DD14D
+FCAF2CE7042F7FBA8754A59B1BF1476468EDA717B266D35EEA7C4107D4954757
+F762245CCD997C8451E5E9E845A6583D8DCCDD7ACD65136C2F382EF8DFEF4738
+3C8CCEA8F8A5DE43BC6E5968E2DCB22E237FB65357383412A9083B7A9BA06B60
+669A320D295D41B9CC65A05F1C3CF4C860324E424B74B50E68F67F84C176D7E7
+22E2E0E85FA0BEA08476CE11F8930000B6096A512044D54F3FCB7F7BCC719723
+7394DCC3B33C292ADAB50AE17C454333D4F93D938F934E0F1AEFC5F2BC488883
+44CC90AA3FD17CA3B2117E6E2DC1FED5EDE855A4169F238181C77CE4ACEDE8F5
+E77B4A07D17D173C82F0B62D33AAE40213E5BA93C2930DFCFFEB9DAE024BF85A
+90BFCCFE3FC5F99D39B2E8D2686AE1417AC1E5BB58D105024703F38AE3D90F30
+EE950E8C86ED718598CA966D841BD379C8FCF356CA568F995846CD2F4B0DBA7B
+46FBA479EA98E3B92EE5C76B63AFD766CCDF0560148F30A29BE6EFC725EE60F2
+F5F7EC808795BB8C59B568CB6B927A2E3F8206180A735B57FAE842082ABCBB2B
+A65E38BC4E9253D728DA0F8BEA769428F5E8328F4AF412CA14B056B2A8AEA438
+B4AE59E74AE6F3432AB8C729045C302EB3EFABD4D14DD542AB22E67A1D4DDA44
+8D528DC404FF90FC92B736DDE0C2D4E1D8AAD0C4C285AD83E9E16A2BF5D3643E
+5334AC1AC57C48A8B0875E379F4A7EDE97DBD65920EE20C60F16128324B23BFB
+369A4F92832E679FC855451BC789F97D1997A73A4DBBDAF68D14C7713A4F1B56
+F55CA97A5E120E013FB41A469668B02B3027617FCC9EEA2BC6FBDED8948CB4F6
+C76ED2C725B016741936BB7AD5000E89CDFCD7B51A18037B6CB661E95F3E00F2
+99FAC8D75C1B8AC2F3BD84DE2417C0D7AA6526DF55DB0560BF4BE43EEFB23ABB
+9282709C58B1200CD1C967F06CB311BC3BFC8B651CB0F6B34F6E96ECF5C51649
+BD4C142EDF0BCF97AAA83ED6231483539AA4776C92C4A968FEECE297435AD0C1
+F27C45798F0671AE7D36862A7C4AAD5523F96698D1BC679103435FDA131ADC34
+326BBAA7F7BB7C47A232629435AA4C9DCB6A2E1A0DBA73DC6859FAE5FA6F15DB
+C38A6DD13B45C55D6EAF468E22A24FE97C854FD8B42B63A456FB62F4B6004A6F
+2F81104D3A740690B7896D7140FC5DEE2A803AB13AFF0B26BFD0578B0F2407E4
+A5D5FB3128D0BFD6BB49FB727452F84EA5A2AD6792E91D4E6F55462701F85ECD
+8611A2FF2F2EA8DC783774F860D01C616E4B37AC8074EE264D5F5448DC91EA2A
+E7E261C7827787D9F4442B969353A49C948B6BDF7E868C8B9AD10AB31E8C2746
+E9AB0ECD16F0AF5BF7DF3570A7663B0E200E26F7745D6CBC1B0E77028A66C6FB
+076A779124F2C19E77200F7D74F30CCC8C7574CAC587D7BBB7802AC878AAEA83
+C81BC3880512B7612605EA397468A5C43D666D7D9A6E3384500B516E86F14C81
+6643E5833A2B0D57AC3A39CDFED704DE32519B62532E6CCB85A37FE6B58D8348
+7CA452751F2E75D5287E4DF94C8512014A74977CD682E08D3C884653A495A254
+4ADA8E700D0D39D3A122E720EA9CE938C4711D117B5A27C8FA799E402C4B40CF
+91AA834656B4064D8B40F620ECFB315EE9C555CCCF8AF57CB5968A37ECF13DB0
+EFC479FE9716E6B79C9FDB4E22106802EF1D248D664528F37E2E4446F6B10BD2
+A4D5D4179101EAEF55D57898C3784111BF27D744C382058C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMCSC10
+%!PS-AdobeFont-1.0: CMCSC10 003.002
+%%Title: CMCSC10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMCSC10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMCSC10 known{/CMCSC10 findfont dup/UniqueID known{dup
+/UniqueID get 5087402 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMCSC10 def
+/FontBBox {14 -250 1077 750 }readonly def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMCSC10.) readonly def
+/FullName (CMCSC10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+/ascent 750 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 97 /a put
+dup 99 /c put
+dup 103 /g put
+dup 105 /i put
+dup 110 /n put
+dup 115 /s put
+dup 117 /u put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5
+45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4
+7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7
+72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E
+BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89
+974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674
+11453BC81C443407AF41AF8A831A85A700CFC65E2181BB89566A9BDEC70EB4F2
+048A6EB631F05C014D372103E37FC3FA317EBC9973565A638403DA02E48B7D31
+CFF6C241DC5CDB470561002FF46437C06EF93BC99352DF04393C661FFFBF4BA2
+0723ABD9B3E9CA9E63BA57EFDBAE684655CBBDBA15ADAE43E1A2C98A3CF060A3
+D16AF8FE3A49B50A24C20EEED716E49AF6013D4D38CD9CC41A91C17E4D04D79D
+567E1EF49110AA9C34464E95D81A730ECEB2C9AF38FBA6B45E253288438B4CB3
+DC75B3A906D4357293BA41E59C35223A6C9CBD6FF5FC90C2D07CBB376C7320FF
+435A6251822BFCBB612CE630EDF826C37E95F541C21B93FCE127591D5E38165E
+2B58A34AAE37712BC58B63FFD70AB80F4F24612CFD2F1466BAAF3CA2BCB45148
+D0DEA0E9B8FBA4C4FF5B8B3CB02E461355051842BD1C94F41066B9B909DB83B1
+DCDCBEF7CD00A43E4C0B8191A29600CA197F0BA227FB8309BB539D2A620BAC70
+8A1AB2DFA51ADC9873B8E5582DCD3ED154E5D727D1665F99BD89883D69E6CC2F
+DB3A57AEB612171A88E22F038461DE03FC357F771675E34E90D4D19B4B36891C
+9D2333960400E97494F4FC4DBCE6A73C34A0409E433BBDC0AAAEBA7D3555066E
+1CFBB4515C8B573C9B9DD12ED5B6ECEBE35AD0DDEA9DB004FC6CB540B5117B49
+59CABE5FD74C6F5B6482B42C20B5FF0467D1DBD7CED2CC651CA57852B6FBB402
+A6764DB342889132C911CAA713A7F2FDD8A5E849345D6C81025E02F5B8B682BA
+90CC9B467FBC37362436EA6BF8EB62D784B01D5430147945BC09D1F49EE89F2E
+3E2B8E6D439248A56F82F2E03EA5C7A922F2813BE6538A3A423BEBC55B345AFB
+3B3C125306749E137C647D78028AE1FBF3E1A82C260132832A9668F454D39C41
+736717DED0A99F6B11F005F0E1D07FE84713AAB4C042FDC166AA146D7B5E9198
+E4F485BE5B135EA281FF1C1E616B5AAF02771F58C5840CB5A427FF9794F93E94
+17FD799C78AED1DC4810BCEF4C6C51D3C1504EA2C6F2B29805B7ECF97B5F637D
+FE92E168CB9029E90404CB54FB312FC7AA8A9F2F524C03E61F03B1E31D4F061E
+1677B39D5D30C9FD4673E1723F4AE3CCF38593AD6D7F61E9DF3C010E51F25085
+35D51105E1464BA146A78D7297D4D310AD91342A0BB942034A3EC0696B467367
+3E39D202D637E6B14D0EBCA6AD3CF22B07D4CA69C0FCBB6C93782B2F0DFC5AC1
+5D8A16CB5EDB671A0C1BA9D10F63CEAFCD0E06E42C730C8EF769CCFD57937245
+658F486036D37E8BDDE5670A212FB488A8753322A5B170C9662750AA958C0BBD
+8E97D8239D2A08B30416504DEEC4E506013E037C91785C674F8A6A44E23FEE6F
+CCC00CC5E4D355B0871FDB8ECD64F70EE32449BB5D6F84F8C8AA2D5B1A489BA9
+D7FF2DBAA8D0B84054E93D64D3E77850A3724824914A0F821EEC3D605DD851A7
+606936B8B9E24D6E932E16C448140FE94DD96C75AECB73850035ED9C04A1D93C
+64B21E7D4657E030483EC5C3554AEF8BE4D0FE5B9743B875340B09E01273DAE8
+F256C50A1A8F2E0417440A8BB0173F59E11523E1CEF2593A4AC5AF2167627B00
+C5EA97D125EB8A4BD4C372877ABF10F5B7B149D73787E0834BFB3084E9508DF7
+072DD71637019599252059738D4D6BC57A9358E4B14F6AF9C4B31DB8E25C29B3
+7A15F9953BD73ACDE5F0445A5DC406BB4635FAE51C1D8202AE31730E6F355317
+1DC197DB0B6177307C60E5D38F4487363EE051B2E609A52BC4D45B14B6558B6B
+5E1618748794B8340752CDBE7756C068975B559615D4CD5A97CE30BAA7B2B1A3
+2FEF2E055232B24FD8A21BECDE1B6A479A28EC80AE2CD16DB50B30B4A6CFCF06
+491C7CD5AC29FB964D4846415233947522676DEABDA0D9535F8507D33693930C
+B4E4240A02B0CE7EA288516B8A6EF908D7F8BAF9012D052C6AC96D9F8F6ADB07
+8984F3559C5E7E3022A957982155FC9CD599C74E18328D3AB46F9DD15D1C4C3F
+9B93ADB4489BA02CFCF57DE6270F3AD2F8597BE71786510EF08142F430EE5568
+4F9DDB792B7C46B6135E341DBBF062FBC50FABA80CD4A384157BAE57CBEA9781
+AA4416323265168AC097DE7E30A0D4750143A4FCE70A863A31876A8FA5327C3E
+36E89589E363AA2B1A6E8B09F5AEB8FFFD0396067173465B6503383DE517A6EA
+88C0FC08578398C2A721E5AEB29F4AC9BC990A50CD87BD35A11F9E81F68E7B85
+5E5B95A4F9A5D30379EF90D78E1E466DEF867BAEFC4F5ED2C762BFF099C1C2B3
+5E0DA1C2FB33BE1379413CDDB1EE6BB3A495331F72F2FAEB8152E8AD5FD334A8
+AAB0082A71D5574B618EA8D487B8FAF1B445F3395B1E21224F5492A0E06F5152
+7726835C900E2E52BE3B7B654183AEDEC68053DD0AF19EF6DBC10B6FC08EC7D0
+CC0E2C8FAF8C9A4C21FB7C34E074BBA4EE64226BEC8C928A784C1BEE35B72EC8
+E9295240B29DDC2539CD118BAC38DB3917D14CD33AB45FE47E827F2A2B193AFF
+53C5396C52CEA4F43F06AC2D08C74CC85D608CBA267175EC31311EE25AB48DD9
+FE811B411AE426C9FC0B6044D1EBF130231623F1566CEA4D1C06D8032FD9808A
+94479C842BC41B675CF6B90113BD681F8D43F51D5016D80EDC11D7640FB950D4
+E709A46184406ED90D0892A4CD9062938A8205697A200DBE1F38EB166EFEA0EC
+4FCB45CDAF82EA103DD6FDD03D146F3E42EDA6496064DB3F4FC1C5280C9E604B
+D5EBCA08BF2AAC90156C11EF68137DC76502EBF216F3AF3EE30DD2676D218428
+F41C655093F8B530FCA378B5769F262A6FDB4B66B83F18F050E77227E28D71F4
+5F4425CB8D51B3DAE872CD86D7804F870BC564A6DA1CA13EDB00D131CE4F6460
+7021661B99612629DCC20C85CF155EDC5111E015A77B0B82A8FC1EBB374B7EF2
+361419BA93B857D5C9944BB5B4AEDD86ABCC261542077FE09701C96370168579
+5F89D5AAA08D700E2643E88C2FB8D1D56D37AAA9744872E7C050B4CE046B47A7
+83F224FA9FD311C955EFBF173042C8FC66524135F579B1397828870D5C9DC71F
+8615FADE2A1CFAEA90F732B6C266E2F3048FC43EDA7A6B6D98E9DB793CF457B3
+F5877E7A055C92B0246FEA8C72B3B3456F93BF36E2651D32CD614C3AECC0B4BC
+F824C8363E593A6458D37408FC5B09883B280005DD24123E2D4B1B85F4113327
+EEDD9186A4AF2CD6439B46C5C168C125CA80F9EE9E68906620EE126CFBF26E15
+B269838A54224EDCFE2A373EB750D4829BFA410DE5F1541E428BB1E024AF496D
+F5F1C151F5A645C8622F2EF9088D57A2811868A8A8BFCDBFCE3ACB8463AC35B4
+8B6F44E1C1232805842F56FA468F81FF37D5D55B81CA56058558544C142EB3BE
+07CFB1F75DECB1E48C14D6AFDD455989AA6FFE8B8DC54F462B3C20E31D270BCE
+8E68E2B43A6625AC7E9792704FAAD6CE8BBE0B341DA7189EBB3E9D5375B27FD4
+12506D5BCA50AEDC6955E6C3C7BAA84BACAF7ABDF3A270C7734EC3C6EC22793B
+E67B0E288F99699D38DA8B79F2D21DD97945FBDDD132A8F0BF947950D3C0B4AA
+EB7B2C435AFE54489E1930610311D718AC610C21A644F34CB2D1959B3066F39B
+EADEAB5CFC6AF4D191D86B02402B00D1C5262707861C5308730579795EB53207
+A291A27A8B5C4DAE0A87A0C6A260026CA3CB620E1002E066A515D7990F3DEA29
+0FAC962E0B82B7A6C86B1EDC54007822BAECED673FAAEF88C8109777EB79A53F
+AF3C58546974F2F56E70E9B5CB59ACB5C27CB01895557B2D82134D7F02029B24
+3331621F38E68717F5CB68A8892D0B9C0A8ED4F8BB56E80505170D44C6856128
+2DED0254ADA4875CF56B4D97372AAE730D4C77A2940DC8C178274DF88A9EE037
+215C6FE7B9D481EE4DE809B124C0270782411ACCCF89906A8B143D0BA8B2CEDE
+E9B90465C3E57A4FD9AD2702323450256ABD09A1F8C26F08480317C08B75B720
+70A161C99715A35A94DD5C9647ED0F8A5337B774C8E54F9653AC859485A1FED5
+37B725A7E4BA58711CBCDA6054E34CBD8E9F9460179DA7DBD243D81A1531FDDE
+BF2BD425BD9DBE75EAA333B1F5793669A215549A774597E6ADA16D323FE5601A
+EDA41092730009A99BF5B5AAE281844A6BF3292D4D4EDE36B4FD8BCAEB6EB72F
+AC5D3CD53D0D621CA9EA8D254FDCB2B5161EE9E80B266563F669805A3A15271A
+0753983004A1ECC7FBADF62AFEA4DAB49A178C231759857DB910668BDB07CB3F
+7E8EC24901863088B3231EE3FA563924032C91CA9D68DB398F9BD9AC0C651EC8
+9051C9F709CD784F3FF5951DECD7E869ACC34B83AECDB011E6594347855EE7F5
+28811F744A4BD70D4E9077EA7EC19FFCF612689F12B34332857AE41F13E6D16A
+962DB9B6AAAC167B9FBDF0068EA13412F318384134B29F3F0C399F1973A3564E
+F9C3C39B5BDD4C98D81A6CB476E565860B50704BD65ABD630A5F1372F2D826F3
+3AD47C08B8AD3176A170C369EF3CEEB190134006D6135C5B8CCDBE1C11FFF1EC
+3F6D8C46E15C4F5EB9ED9F31A129594D542D40DC3815CD075A0DBB648D868AF5
+15A05C4BDB28BF23653A3AD96CF6AFC065DCCCB23D5D9A945F8CBB539DD3BFA8
+DB8F1FBF9B6F25B41EB4309995CA3D5D6ABD70CBB4A2F0C6364E5439AD1045FF
+72F6B45A30BD3A548CFAADDCC6C15D46F6D783D3E520215751DC98335A4ED512
+D7D19235CDF911CC69F3CF4365B678EBF3E87C456A4E77339C74930083445588
+462529C22A96A28C5CE87AFA0C981F26CAED5A1C8DBCDDA612624DBE0373F026
+465185A4D8C73CCD8D71EE97116F8F7D341B87FD78F9CCB9FBDA2A7799711607
+6BBA855AE9D5C505870DC85FDFAAA130A351D56AADBFBD6A7D52055E3200F8B7
+8AE9A00092B55DEA8BDE224B4BA7FD4A191CB1FFC4CB995FEE1AC2883AB69E1A
+AFFC09AB5B9AE311A030A5BA05E2213F9BBF016C8FA80689C069314D91274B20
+53FCC65C7D7B3A7504887525BFFA060304931672A078BCD7F269595686310E34
+E1ECA868899BC402D17EC36CE40D5041D7CEDA77F7764C9D98793F5334F574DF
+E93CB10A5E8ADAE95CE63D2339557091B4B4911A4987CF21B7F1DBADBC2DD605
+8EB72473C1F2EABCC44E0D0339EECB55DA74085606C3F89D57ACFBF5755A5395
+CA8D4BD47E4EE8D8B882D3AB31A1F0C62E74654C7E041E4FF2693A38A9796064
+46526B0A37E6B5BF8E48E80EDEF81E34DA8F6CC9025936A4D0E6D709D61B7B5C
+AB550397117F3F9D2F5A542A64DEA8E1178F7337124D6B56BA92F659AAD694D7
+391028731E01284BFEA635314A8DA8DF7A34EA3B6B2F8803BE6DCB423A9E8015
+55EBD90EBAE8A00298B3B6B1C02BA516AF528122C1F2B07EF69F5466C2C36643
+0D665D6561705509B7582D8301AF3C32E2F3B9433E3E04D62117C7E8A368BDE1
+0D4DAA1C415B2A6573116D2A169AFEF700A83F55D88813585E89C94C07802BA8
+3AE8F9BC3CDBFD9C2E35D062B1FD6E79E1EF104FC70B0AB09D12CA027F33F85A
+22F0ECBB4AD55FE8C616B82C46CE69A600E4F767BD7A9C5F9B37A3196B038384
+5DEF76A8884425FE598A63AEB19FA698C2AF7CAA4983CEC789268E22BA051EE0
+20A40633D22D8F707626ED30E8273EAAD1C065F0B2E1718B5AC853ABE09330C3
+B0082A71D557169BC1559B6D285A3499D41C4CCF1F74884EC3917EB9C574371E
+AFE8578DDCA459B8D22C0188A8D150437B05FB92022C95EB6FBCC954216B5FED
+CBC7C90B9A1F061376A9840FB64390A6BA99CFC8279A86A730C6DBFD14C53C4B
+7277D676BD42203677E9ABEEC8C97E13DAA626474513B06F8734DD784F2FBBB9
+B3B448B8E8221E380AB4A86D3A683B86A54129519D50DD4FE63B30954D805CED
+A9A5D9A39C58B65B08E1C19555E927C6DBF7FD07252B2B57F62B905D6B488201
+213D106A41033B26FFBAC2E616DA6ADA6D560BADF10E68872806CFD6F6E19D7B
+57CF1F7A030A7BAD374F16A977E0ECB8742D034ADAF9C247DA19C8AEA74EF6CE
+DAFD6B1DC562FD3B77E4D008BDE4D8C7FCA9895DA1AC9EAA01C32A0DA712B082
+9438E77230D38FC4153E1711417B918BA6CC03203A5FF082AF880F48518D8271
+C1121E4F1386B30A7F1BC6F10EA98443F8A65C867A109336B808BC9A8E2A75AC
+F950835AA84B56F59DA4C8A18859C3B68F6B6DE09A6675F639EA9107BDB67B0F
+54EBC564BC2D781B61C14363A54956BA78A2BB89C9F966C94EEFC29EE9F4E23E
+C0BF750144DC289F0DEE1F8A25BB52E54F656FAFEE4BD2DA57E1306BBE648051
+1D0CFD6A23A3DF082E3CF13197BF1B7FB22B2CD427BB78F455C9634DF989DC90
+7BB2AE247B1C99AB2062855B2948341B0F857ACD750B59E370A6698C6A1F5287
+72A4A9628A592E313956C242DF8277EDD2F1FDFB07CDC104275FFBF796D7518A
+DF49FF3CDEC3BDFF1D290C382F244DF18005ECDABF0C5C2C64EEC4383E2E07DC
+5C82587C071E59B46B7BEF31D268F39D9B12D534344FBA515E9DE8F166FAD1E2
+7D1558967AAAD3829D3F7EC6938D20E5379F414532976ABA844D97A5E9078901
+EAE4D0ED1F4C7EE7A2D80D891A5013D6409A38ACFA497F5A169EB7F9F4890DC4
+62FA6A89EA48267331F086992B9CA9305E16611E6AEE67DCDD588A25D37F45B1
+0DE75C802EE021E574B64B3969DE2E5061ED9364B646C38D4BBA86802CA6338A
+94E135D2256920EBFB1AA22D9E90C7D16853F0DF9F2D942748EE540E4FCE63C6
+5380D7AB4ADD6CB00FE8F7867E4862D8DB432F28331428CC350CDF7F447A65ED
+D7683ECA35A22ADD06E9FE6BAF060913AEEE7B2B8EE4798E437698CC9EB2428E
+74CE73F84D0D2292DE709D71FFF8901C3505370E6F1D4E28E6B7372492C65A88
+159371B1D60D77CEC93B272B6C5394EE1D2EF9969DB2838B8E128553879A1BA5
+2884B0A596E8FC3D1E648B7E26A4AC57DF09B9CE09B2F91D8CA618CA52AB3DBD
+D005A56A420366069B73146A6F58E88BA49671A1AB7C2070C3D42AA770285143
+40AE7D7868C0E1993506B07C086AD7D4F28CE2D15853FC5FBCBF9425D8012B9E
+DB6E1E5002517659C8DA69DCEACA94F368537668843D281FC11782F1C5F71977
+CA215349EE6F20565DE3D8D8212A40E1227A4B22965FA64A0B02C62BFDE97E6F
+C3C54FED4057EF9D258C42D7440C78C5E0CC58A40DD74ECED4152F70A93CE71A
+1B3A57C46F74A6D27BF98C97CCD31A8EA487260F224A3E40F52C65490AB4098A
+7B9EEB54A5A415C8C88568F7D9EFE74BBB785FA18AA27D9201F28BBC477A20A5
+D1307AA78EB8C7CAD409AB64B29E4115E45F5FADDCC80CA74B296C4265A40614
+37F2ACD8386AC0202D6FDB6711E8CB06442F209D781E940ADDD6D881D4F8E874
+357C533115923B90138FFE31D3577C6AAE60D768970FAAB682CD0DCA3E9A9A68
+6393E4B772691C1013ADFFC90C508D51B02D2518ADCC7E79F7DE5DF9D18B8435
+6129064DD1A3995E5A6F45D78287CC10A0EAFBF47223494C5EA934B1BC2F7C53
+686C5880303F9E3ADC8B100D441D944686E1FD811C646C6DD0224F6CF55FA87F
+D132EF50450879A25242A18683BD6D0266F8F333F3768D1952B0F32AA75106D8
+EC0AB703F287E847CB91FFB88CD9DA174B49171822BDE34621CF41EA772230A6
+3088F8D19CF2364A329162D39E166AC728B267758341630B00398D64538FCC4D
+E3E6CF103794C29AEF7F7E56970F6B1ABA87DC8D23E280EDC77556593D02DFF3
+154883CFE4EF04E07E7539A4750FA1CF1A994E99B656E728D140C83AE1F196AD
+9F049188A4184C84556C0476BE46DDA8ED86888DDA3065C5091D99EEEAC43092
+40B97AE327215024ACC0134CBE91FD761C26A48EDFF9028DA28222985FAED7B6
+A1CC891D07185666E34BEFBBF77C6C32B88FF3F1046E4EB2CD942E70746DDCDE
+002E74BA03A2B15E0529E61DCAC207A71F61C89D81B3C53C5B458EAC70ADFC54
+810310CB04E1A21FFBC5DE2429EC0989A3F2B6AE4290A005FBE736750956765D
+637B7CABF7F9A593D9FF6C322895835C0007A78771D1404671122F9CF898AB24
+1A5648EF8C40B27FD537612C4CBC6E584FBD058DBD4F0A00C63A79077826D3F1
+859589B221F7F82DBE392601B0A89142648EB40BCD943E382FC7758A10F978FF
+6DD9C3C1D284C5642C812DBF29A75A50BF63F788CBEA5883DC1544ABB49289EE
+2C99CB03C1BA72C7320904C7EC94736825A793D5629EABFCEFAB8D28B6F23858
+89A6967942A943FAB5E5B26B8567CC9606DE60329C6D890843F700FC1F60656A
+38164ED7976AD47A8E54940B9E340D61353AAD260C9273D45772AEC8E9F4F045
+9CC576D152757AF3B74DFB9B6962001EA9FF7F62C2E36F71D9B76BB99DA7631F
+774795B8CD1E08480153496DE5E08A1F4BEA681D0C1D6336A49A222B0537ABD9
+75A3A9D27D0B71B8913E9355F8E56C5FB3E14B9D5ACC4F87339FF9D9039ADEEC
+660B5CEF75E7C1772D4A3A4D0C8976A165766D9DBD0CA8132D17E5149AE716A9
+2E255277FB5294A96194C462C74AAB251A36941768EDB3EC6DC2C481393ABA6C
+8BC2F3AB0BF5A6E5619BE16DF43BB090930493E00607B9F8C32D24F07482266E
+09ACF6B41349E00C8B421ED5C40D3C40923D21F107185B5A135B36FBADE488C1
+8F0C2DEF08A6B185F2D25B8FD8DE7EBC71DD9C15C9F590FCD7B4B8E9690079F5
+39D809ABDDD79A632C99FBDFEDE0A89341919C6B397AD1C8FB7F3BF8C52C1B46
+7BFA51A4DA496B810689769986D6A625AEA159AB2F6C7EDA6E04F0B2631E5E0F
+942624C194230D8A6EF32B3E1B4A5C37C6092246B328CFC926D17AE3B559ECD6
+2FA448C0FA94956EFED3BD7920EF42BB3F25907F097FA990FBEB88E78FDC74AF
+D3D7BC983DE0F33C53780C9A8E98A40C2EFEE93067232133F83C4EB0B2AF0EFE
+D1B3417DE2966B2BA85FB7A32A1B6B57D0EC8645FE35571746F760EF7ED4B9FC
+53857A279CF19C0625D3FA9733C918A74E592DDA7FC1B088A8E323C9845306B2
+9C474BF8FC5F285E76B64020C2A377AA104483039805B8963116E882A0ED9417
+F56A2B0CC9B0857AB0D1B0FB080AC608952DE7DE07F81AF14AB81F90A76F288F
+3B1095F9BD7BF8FAE8294990F0EFA45CDDCE3E24BE64C706C5031856E795A079
+C062F5C28B2429CAE52817C005CB1CB8F97FC6DB2E731FF72D8CD75FE7314C11
+3C83F93A5D1F5A4D928A8D9CBF8F66980FA36717E2BD4D7B52C7F7931CB91E80
+396D5593E022810BA1D5952138AA44DA13E001BE8F854D1AC6773C10F5E8C5E5
+FAC9C1C00D691A1D84FA88AB7A972CB521449280428B3B6B62AA1D7586C5016C
+FD2F558F09577665CB2CA7998B1F54661994EDF2B82229F55A9C657B1E0206FF
+4F8D30F309A2C988FE06D7E6A77AE5A44765FB88A4CED66F8DC8FD7469C483E1
+9849B7A365121843AA23E554102363A21342EEF1C13688E9FA27ACBC3E479F5B
+E64E99C1DB82AC245BE81B1898EAF293D9CE70F1E5B2F5052CF248028DE1944F
+E1416FF897BB9855119C4F5D237A38CAAC27F5E4A9696EDAAA485305A3691ECC
+C283663B80248DF419E3F267BD10B935E88850FD369A91F34A6F3AA6A11A6254
+63FA3BB611268DCD43DAF1F273CFF5AA40177709DD3B5029D6135A47D7E4A76F
+03EDD4DBFAD427D55EDB1D318749E5F3D7F3CFF981214960E8AAD77C0B9BBD24
+29089C360B059722B67B148CA77CC7BD0A3AD65539A373359FDAEAEAF0FB3455
+3D781BB5D8ABE9FCA148C0D612FCB9E33BAD7492CBE37F4ACD720B61B638C141
+CF3F06378534263DF7A7016BC0F159120F2B211FC57203652189D3D1F1EB2FBA
+73248CEB7DCEF5DCACF8250B1582BDA94E3C2E4565EE0D7450761F0EE8A8B0B9
+F62F5D5048E22205C8F61EE206359DFA6318C8F9F67FEA6C0A13A9A4E2F195CF
+2E83FD136DF96EAD2F930FEC1461C89B7755EB308D92A51834C0D0868CF34731
+4FEBCE3AC5B80C92BC4E3364C61F68C34A146D2901A2E4E2EDD9AAE00D964486
+2DD43FAA44163CBDCDD514EC0C9276900A047CB0FB70E21E618AC4B18495D9E2
+2D227915E49156E06E3753326CBCFADAE75F6505CB19D1E803BC2A83D5F3B200
+E4E8D4BD1CA4A3695FBCD4965AAE58587DC18B677E85E05F80FF870EC8B383C9
+21AEF9EF540EB0D7F7F73A56ED422C876FF091DBDCB4B2B7E3A4A25816EB6F8F
+719CDE34FA58AA1738EAF33A81CB0F8B4A35804D62EFF869B14C4E275E4899C4
+9CF66CAE18DD7E93D4DE571177E8B1E3ADA0C216D2C984B9F2E23E8CEB48228E
+D76C7CCD00
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMSY10
+%!PS-AdobeFont-1.0: CMSY10 003.002
+%%Title: CMSY10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSY10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup
+/UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMSY10 def
+/FontBBox {-29 -960 1116 775 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSY10.) readonly def
+/FullName (CMSY10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 13 /circlecopyrt put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0
+7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81
+DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91
+511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6
+1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD
+028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86
+1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A581BE543D73F1FED4
+3D08C53693138003C01E1D216B185179E1856E2A05AA6C66AABB68B7E4409021
+91AA9D8E4C5FBBDA55F1BB6BC679EABA06BE9795DB920A6343CE934B04D75DF2
+E0C30B8FD2E475FE0D66D4AA65821864C7DD6AC9939A04094EEA832EAD33DB7A
+11EE8D595FB0E543D0E80D31D584B97879B3C7B4A85CC6358A41342D70AD0B97
+C14123421FE8A7D131FB0D03900B392FDA0ABAFC25E946D2251F150EC595E857
+D17AE424DB76B431366086F377B2A0EEFD3909E3FA35E51886FC318989C1EF20
+B6F5990F1D39C22127F0A47BC8461F3AFDF87D9BDA4B6C1D1CFD7513F1E3C3D3
+93BEF764AA832316343F9FE869A720E4AA87AE76FA87A833BBC5892DE05B867F
+10FA225E233BCFA9BB51F46A6DF22ADCEACC01C3CD1F54C9AEFA25E92EFAC00D
+7E2BA427C25483BA42A199F4D2E43DFCE79A7156F7417ACF78E41FCA91E6C9EF
+B933450D851B73A6AB6AEA7EE4C710CB5C14270D1674FA334686653793FCB31B
+491E870D3C2BC654D2C1DE463EC9BA29D7371AA1078800EF93D3F66263A2EBBB
+F5723697BF7448BD0D2E301544BECF497FD475B85DFEF52AF4F8F8BE445CABE6
+019318806D10C5952157FF8F8286C1EE701545C8F60EFA854EAE66835A2046A6
+915D395F1E0366EFE0C0391583FE001FF16D82A2E2DA5F57754A2C6F69306E36
+356ECF8EFC3F1188AD6FCD2427E0580C97A5B69B4E0E09B85EEDE142F5ADD2F0
+5DE51D6DB72B127412A0D57106C19CA493048A4F815129ABE767D51715B1515D
+9C21067CB5BC88741B7298C83EAE36A866DFA87D8981F179B1C31292F56BBB64
+3C430779468AAF07C8A8B4934E1E775FE3F35186BD1FA6EE3689C1C750678AF1
+FBF9B23195A124C5C991FE670AC0C86FD39D2B07B9A319E74EFD498B45820252
+720ECDF7294F7B0B137CEB86D33BFCEB8606985A3260FD669E461C8BE94216C5
+D434FD8854F44EE66E5A289A9F9E32BC36AF645D53F96652602BAED418C8D726
+BD04A1B4617551FE4DEF54083D414F7DCE004E6BB2DC9C2EF7CE232B254BA2C5
+7DCBD36C2072ED46FF711F121A701E2284BF1B718B3164382B8F453D68FA0377
+DFE106503B8401D4DB87F5402A3AC9A442FA060B0610A9524D530C7157C26B56
+AC970FCC1D5655FFFFA39246E6420CF97D08ADFB7B05822679BD40C638DDF0E7
+A97BFE8918B611A145AC965C203F1428812F9D340AF499B3A915B22BE798594E
+0F520109FC81E452180AE45B170FF999C5FC2761C6CECD8742A5A6FC97F16743
+AD4EFCC6572A6D3F3E4E330C5CB2FF6FEA48A5B64DD3DBE943BD9918D4A18E18
+CBCF598AEFBB6AB3CD2CBC9BFD6099272F6543F3E532E0E21E614BD2880B1023
+0AC234CB705827BF016DB84E00E8C255FDEFA0101A842929540B7B4AA8A089BD
+5EFF05B72356B6BC3727817823B5CDBB1B963103000D7F2A4E2A1472FC3E614B
+5CBCB6D6D784023173DEFEBFA8F9ED87EC1A0A9EE98CA59CFC964CF943DC683F
+E9E00DA718C4425A705A69D99988EC6F152525C790912C2E46A2381A569424AB
+54DF4798BC2D7E7A361E7991641D4B756CE2A7FF4A2848927092C59C2C4B8809
+E13AB84FB6B111E680D7FB9F2FFC2C5C66B0B501E4447C2E46C10E2F6124476F
+A140C404CFE2DC9E0199BF61E035CEB481D438139A9630934E541D261FFD2906
+4CAD99E20655FA746AFB81EDBB5601F5FD6B1D6832A01D585E2C55053F6A7378
+4DAACCAC7608DBDADAAE732D66B3E7F87E79756337C1A961E53A4651BE7C77F4
+038B89C87F650C54A2A90EB7F1D525BB353F33318551EE8D84A6A83C718EA5A4
+B2AC0F7306B1E095819B87015A90CA3ED739B09061782C28CDB36BA4BD5E5308
+5CBB70414E4112193DAC4A1FA30996327230D1E021F3CD8115E12D239D93FFDC
+B645910EB29E40D830E7BAF2DB255FD7C4E776557BB38157917D993EAC245837
+A3B515147043574157B8342D829C7228CCEA843ABC89D1785A9672A5923FC4CD
+2F3FF27E6FCACF84E2D3136CA2C0FD3EF1EE7354CD04C38B5FB874553646ED2D
+CEDF7E362EADD04B18051F20A8FB0DE18E152385B9D05F98A3A7EF177824E246
+455ABE69E2F700EB78185CCFC07E3B4C6FA301112528D977367D30D0D5D59EDE
+FAEB706DDC970A9E296236C725B2B55B09B9C336B8E23CBA5FB8692D56F33B03
+16294E5FC7FAA42E96395A57CE51CA8DDD77442F142E2E576B778373FB31C81C
+16840BB422CA827E30A81829648BDF1CA36700EA32AD888D097C1FE0A05B2D9F
+483AEE40269DF09AF0D1AD3DF80C45DDC59C2A03FBB661C79B87853737C6D352
+67626B657321B16198DBD6DB98A092F17878AE4698121E1006E53D6F9B0A3BE2
+3FB68828EF854A0CDBAA68B37ABCA6AD4A3D809AAF0BAB1697A81FE59C98C472
+1E33CD70A75A22C249DD11D76C2575ED3370A25892A16D2FD569CDA70C130770
+93F493C7D47D6F9A5424A7A542BAD726BFC3AB225DCEBBE6AC4BE006F8C7C0EA
+051424B08305BF2D951AB2986AAFEA04E078CA79B399585BFF0F1ADCED02E15B
+8765EB6BF6A8E4D0901EFF2C3AA104924EAD9637A35D877E0C51A3C37DA78CD4
+8643C8CE6DCDDE3F116A6C2390F948E5371BEB5AD2E87B41C5F01FB5C196C436
+6E256A88D082E3F46E4EFFBF605B2EFF1E9D9AD5EE4DDC323A137CD9451EDEE0
+06F7D82898D71FAF2362C0FCF1F726F97F820305B7CE20728CA08C63575083A7
+84BA28B7DE2B916432475510E274C12FFD1660A717F51DACFDF0A102D85224E0
+D6DB607BB72569ABB8A7BC6A10354CBBC01732EFE35B72062DF269CB25EA3DE6
+DC603B04C90C5912D2C38D7A5ACDCDD3F6F116D884F0D8C528F69D5D47BA20DB
+0A9E585C7D8CC3C324FE8A1DF150279F7E8FB43BDB720E624E5E9918032C02CD
+8020636AE5C38DA2484B7F4B34163E0D0A561B43B80E97746DC05C871AB620EC
+C5D47101ECED4A7E25F291184BEF8B80024AA7BB456C1B83A907652B331DEA34
+754226C39C6889EBEEFDAD081E01EF8FE47751987667836FDE4C8BB8A3FD4406
+1E643B4EA37BD370734D1A2DB17C2F4B74B4ED75098B433601F75A88C9A37A05
+CCB157EF6E32023BFA33973F3E655A4D58289136996FCFA61EEABD70791B6523
+1FF5DE71AB8A17038923118A5EED8D59C4C58D246FFA9BB26472346B40C8741F
+153D19CAFF20DD2A86C6DB89154A630FB1761929FC3F0448EE2F089C1C953E02
+905BA8DE75D101A982A611056C4B237596C10951DD98BAB838B742D3CF7DE718
+617DB72E5268583223E37E029D1C8FD3F1D21690151F76B76C52C725CA135CA2
+8666553E863CE188BFC9B99AF56AC2DB5BFEBEB12FB563D00244EB89E478657A
+98AF2E1223C1ABC25A4500E8119B86EB3C26B8A2F3505A3E5610F89B7C34E278
+53FA0A54A7F46D84A35EFEC36AE660A9E3C37EE3864106702DE5AF6C45ABF64B
+888A4A51323138CE77DB935576FE6B4824B6942DF80625098CE1B5B32B234F1D
+052A9D6039697118A9D793793775D8729D8574A2E74D7109C7B7E23BC5E2E87A
+CA8E019203952A4892544E1AD3D4EDD22971611358AB230E9A2ABDF00A288501
+A01B67C42B33F6B78C39562DB50F4663B922D9BE0D8A150311AE44B83C1F129F
+07337323E9A23211EE58E16043E127C6F9574019179F5635648A011266677B56
+B5D0201A4E1470B952A1579B57AB2329CD4C615395023C653F784D36B5EE3672
+10D191F29EA508CE84763CA4CE7C2C5229E38E241255A5CABCD6C7CBAED901A2
+CA53B5E24111921CDDF83578D33D463D70EDACA0E470D8F592303FB6BFD68B4D
+3F3BE2D7C5EC8BBF10C90111A33E205F2649B56E8443F6FAA6C721C66575AE12
+D4C40F1F46CF9E9DA675AB5D5840D938780CD9E4AD6736ECBEB6A4397613586F
+849B51048AC5F9405E03E14540A5E5582F61CDCDB57EDDF95A8C6705F433EE16
+648F098C03DED8A2AD94AE3DE202D629B9422ABB031318D48F2C85F9DBFA17BE
+84708AA3B6C9F81F4508F7A5CB7B6646AB8722ECF817877B77D473F577556DAA
+2BA0ABACFCF5DEA7498C47328E873019A956FBB250FD9D8885D21D368FA70CBD
+2709D2DA44EE7A9869963EAB48789541906DE49FAE785ECE1F18A22C7E7ED204
+9768896B78E9EB7A2BD6EEC1B26083940656ECD689D92942CC8AF05CBF82AED0
+B45A7DF4DD7AA6526FB597322560B9ED3087A65B5EEF1371C328A021411BFE3B
+D9B5088B2F1AAE381FFED52D2D1E02CD0DA78683E3B06171CBE94BE9760005D7
+135893D7CC2DB097F6AC664D9594CF1C650F84DA80D2EDE04802DBA33CE3DAFE
+EB7A37E8AEFA4FDA6252FF21E8673DD98E67124D5DBC7BACF361E57077B71939
+C1D1FB923E4E35C075CD1BCBE0E80DAEA1320D55B43EAB45D9B26C366B278782
+7519FDC482D98839BF0DF2E7C3A56A1C1A3FC0E57A75CA414F6536C1FE8EB7A0
+4ADFEE3BEDA0F53BE8CF5F64230784A797133E8CD46BCCB3BF38BCE38A73CCE2
+9E073ADE792F7128231DDD1F63E6156ADB2609C200837C2E8A2D93D2A7BC9171
+050C709A71E44E32B1B03C92EB5CF1D3BAB1C38E027DC4ED9AED633D98CD7486
+3F773ACF8AE332631CF2ABE6D606607593FE862ADE31803964E3F4DC3CE3A271
+C76BDD95C87CDB3B87BC26FC7A16D567EEC62E6FF0D471B4853DB8A94D4CACF8
+843824F818083F10E88D52FC4253E8203292CB40F1414AE7E51DD7347007C342
+CD70E8E9F2D2A13D71213B841DDEAAB208AD9EA644591C15DEB084165F9DF24B
+B91D3BBEEC2E34E38EF16A0C3F00700A7BDCBBFED2EC0D09601AD6538288DB50
+3478B051B5E16B604A0341FE621A58718D960D699D3FAD284310DCF54EB13175
+19A75A539EE98E804AEA24689D3540F0F12951A3C01FACCE9A7BAF4D0DAFA946
+FF65A4D2A4C39969607272C6886F44E90ABE27CA3A1F12A29D9B32E60E8E34F0
+17C5FE43D0E69A99A922D98909B2BBCD145E59A5E7F5426B3988F73B09A525F6
+8BD4915663C1301323180E760BE81CB874B020FDA3AE63340E4261E4F3E4949B
+CC0966BDC4426190BE9F5D77F76A72AD925662E5FE1CEF9CCAB68F0BD33DA003
+F11EB91AC4502FBD6AE48DA0F9D07C35B96B103E379B8A83A05FE728F1716194
+1F650F75BEBADB2E3810388F3E2DC7B19F1BA9E32925F2FD9F19F4E8701F3E4E
+4069125D7C401144740691E7A460021A47B1E27997FC1DDABEC5BD0EE0B20194
+2D579C7D6727AA124083242BDA46D8E116E2751C5F298851A62B60AEBE82A929
+9B9F2492BA35690D1EFD16215B8EF14E7A3803B93C28FA41D971B05B6AF3B593
+E74AD1E68A5FCE12A86E63B78BFEA87D3949FD164F12277A4688BE96356791CB
+8671C49365608F3EDECC109321AF92B4C29CAF073DA3A7D73E913D0D83FAC5EB
+BD884D4C686056404DAAAD6F82F94F803FA1FB0DD8908D1DF08FB87A8BB83027
+04DE0CBB1C6FEB6B517FBD7CF065120079E608CE41893C2BC96A347826CCDFD5
+C69E161217F2127A59F1A6F22037641613F191F22D5B4CDCBCC2EE5615623404
+ABA7BE6C5FE475481615B2AC1A2412E54688DD21E44CC9AF5F16E634AFCA389C
+4D740B7B51BB141BFAD1080E7C726C1606A28ED492E6BDE9F800EFACD1513909
+84E98CEB6A0B7A2A6F3E1D1DCC3B2552795E0932673E59ECC56DDD37A1D52BA6
+C3F0E905978AB568941A163F4CE3AAB5C5B16F86016EC47BA6F3F7AAAA77C3B6
+09C8C3ABDB6D514A76ECD37C37AA88B5860630B3406B494F7725975596F84777
+D9CF48686EC9C5DBCC1D78513F591C7C10AB9D153B3D41426B7BF668B0D04503
+56BCB686258462C1DC61095724B9F3312316262FD7C1AEC6E54DE7E5A7BD8EFF
+035299B8FD8A4A7B0F51404F4A760F4D8B4C0FB7A32FA4B2383AB6E9C78FDEDB
+FE6A5788D38A6701B123630C2A6D820A684166FBBC83DB17069494FBD411B333
+CB37E2491C5BD035A33867A6D3A3D420CC31ACF43AA07182CAAE67E40EC63663
+B678F71D4C6E0EC3A0AAF904CD3AA66E0DE5E3CDE049E94249B39A1C06E3CE9A
+F974B2484BB2CDA14282B9511E505B3C89F9C802218AE40D1A7541335C5736DD
+CD565D4B9F4CC78F3A393737EDB4FBD0DA299E21CCFEBA5478EEF013F0552A8B
+0BB11FF46CCDB784E8BDCF730A16363E66572049E42C695886EAB42A9AD9094C
+B635DF4B5B9BD9B9AE8455DFA3EEFC77653190F9A8B1E93B7281C2A21EA7DDA9
+33484745BDF7E3DD63C7AC66C286C9A5A698A5E4D7A91710B7FF943FB23609B6
+4B442F83CB795788FAB5E9CF3F75D5487DA26170E4561C7941C910B088C3B86D
+F844B0F340CF82786A3FCF347048463EBD2006281A816627065DDA6CD4D3AC5E
+2024BC96C7D896381BBB567951E7A1F29D4E95351298B000D29E5F3D0448CB5A
+CFDAE1BADE9403B90371C3A07D208948AFA022A69C519434B6813086ADF518D5
+88E0B92072A44BA1B3EBB630A13B7AB90992E85B6D67361C8D96F3E0D826FF37
+17B67E4B1EB7BADFD98D7F4FD17BECE740ADF13C141EBF0A91CB105DABB32FE0
+55086D56A0D358841D15FD349E6B95512E4EDF4C430216FF85C2ABE995E4B40A
+A6044CC8820AD885C07E052B3F91C2E9A1D163BFFD210F7BE95B923E2500DB50
+2075106DB541C267BD450B25B670CE80BCD068D4DBFF2D82634175B61FBD3BC3
+406131F44C7D6F18D375D1F2270829DDF29DC14DBB58A30AC193245D18DE91F8
+AB88AB548D8138605BB5A50073295534E314366E26665AE70482B890E4101D6B
+60E4F3B37ABCA1346DAAE8FDB8DD9C832EFF3E73BA470E2BACE7B8515CB43388
+C27AF99FF9322175CF8D4947E6B3846AFF5163E972156847F58A66660EC8A3A6
+5FB47C9F637B4CBB4C73B6A080B0CF6FD1E9665E92032540570FFCC747C67C50
+822811AADC404BC7ECD1673E8AA6C3A2F1D82F39430B58C29145E2F1B679C46E
+94EDC711883F1E4EA84117A54757E8895A40401A26E1437B39A2F65CAADD6E02
+D71FA8AF7453668DC613F326A3344F74AD7AC67569AF399385500ABDA5EDD3BA
+343CC5EDD4B558467626850E752B9959FEF1454E53E7A3DCBC2255AD8F6AB4FE
+894455118A61C58840CB68A925ACCAD75CEACE863D806916228F0614191A1CD5
+DC9BAE256018615AA3725834519449B0A88B4F396654E74099C007930ADB1327
+DD119BF799FE3B0B223E1EDA04FE2DA7A1C879143E1C33B6C6344F4BA033AD6F
+8E88C33DEF1977796B454BAB2494C930F492A518E8198C708A75FFEF8C49C324
+A718AB59B889DED521229E741FFE53F98EBE88B0405AD523254FD3FA4BBE96DA
+DA1C27C1C979A0DD4E61C3B1F4C4DE01E42F1C4435EECFC02D97994BC8AF5270
+E7CB1458D76ED0229C5FFB4A23B8716018F9050970895D51722CDE8F2EA3D947
+DFF374D84915D5C5D16463A6FFCD079D1ED416C4347BF831FF0C4ADFB61295DC
+4D5785BB0852BF472CFC97EC174491CAF961AB90629F055E75DAA6D9898E8653
+5BCF379816CAE46FEA62E7BE8E9B953466E51828172C4DBD0E1BBAD1CE28B5B1
+02B3E36403BE80B49A47446A6677FCED438F01D60EB10F478C89528FA337D0D8
+88D3FC123C076507ACDAF783A9A6E24ED73BF24B6E0F11C13E532DE5F70EB02A
+60651FC2E263002D3986B7B20CC2AA08330B9FC2E26765CD52266969A86EE30E
+71E0B41B6C1C6DA423D3A7E1553D2FAF26EF40DC183099322D362E4965695C52
+9FC3E5BD7ABD743CDCB717DB10372A722A39CE53FABB454EADE2179C4CBFC016
+A8E893C28EF549CA1692C8D8ADFC471DCCDE266FB4E97A1F3035801F3F034D44
+AE6ADA0192657E8078A1D27420093FEBA111333314658021B90DA4E7A8D4B829
+F1795501020D5FF0AD25584C1D47BE08ED6CE96278050BA67680A3B973613647
+A93FAEC756FC253B3693FA2D6491B276EF45751EFB306961788E7C15297A5822
+AFC5A2DABD0DBBFF0BE135267EA6B9D1B4E4760ED14895FFE1F8C3F564830001
+EFA901B8442BD2D98561BAB9A0FD939E0F856E4D2EB04A9A4496704109B8A84C
+EA06AB0999427B3B1BE776004AE906D0F22159C051D88CF573A0255D99B56781
+CF326CD11919AA40B096769CD6D0ADF3ACEC7957621084ACF21AF1F265416628
+86B67FCBDE9370D4F5C6F5CC67EBB0A2727E074090DBCA459AFA1A4778AED4C9
+AE5400775223E684BFCB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+TeXDict begin 40258431 52099146 1000 600 600 (history.dvi)
+@start /Fa 197[21 58[{}1 74.7198 /CMMI9 rf /Fb 134[41
+41 1[41 1[30 30 30 1[43 38 43 4[21 43 38 1[34 43 34 1[38
+13[43 10[58 14[38 1[38 5[38 38 48[{}22 74.7198 /CMR9
+rf /Fc 134[39 3[39 39 39 39 2[39 39 39 39 2[39 39 2[39
+3[39 97[{}13 74.7198 /CMSLTT10 rf /Fd 167[62 3[60 46
+2[57 1[62 76 52 1[43 1[62 65 54 1[63 60 67[{}13 83.022
+/CMR10 rf /Fe 130[39 39 39 39 39 39 39 39 39 39 39 39
+39 39 39 39 39 39 39 1[39 39 39 39 39 39 39 39 39 39
+39 1[39 39 39 1[39 2[39 39 39 39 39 1[39 1[39 1[39 2[39
+39 39 39 39 39 39 39 39 2[39 39 39 39 39 3[39 1[39 39
+39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+33[{}77 74.7198 /CMTT9 rf /Ff 134[53 53 72 53 55 39 39
+39 53 55 50 55 83 28 2[28 55 50 30 44 55 44 1[50 7[75
+4[72 55 73 2[77 75 4[36 75 2[68 3[75 20[28 1[50 29[55
+58 11[{}36 99.6264 /CMSL10 rf /Fg 214[35 35 40[{}2 90.9091
+/CMSS10 rf /Fh 133[52 52 52 52 52 52 52 52 52 52 52 52
+52 52 52 52 1[52 52 52 52 52 52 52 52 52 1[52 5[52 4[52
+52 52 2[52 52 4[52 52 2[52 3[52 22[52 42[{}37 99.6264
+/CMTT10 rf /Fi 134[48 48 48 1[48 48 48 48 2[48 48 1[48
+2[48 1[48 48 48 48 49[48 48 49[{}17 90.9091 /CMSLTT10
+rf /Fj 133[55 65 65 1[65 68 48 48 50 1[68 61 68 102 34
+2[34 68 61 37 56 68 55 68 60 9[127 3[68 5[116 74 2[46
+96 1[77 81 94 2[93 9[61 61 61 61 61 61 61 2[34 33[68
+12[{}41 109.091 /CMBX12 rf /Fk 134[48 48 66 48 51 35
+36 36 48 51 45 51 76 25 2[25 51 45 28 40 51 40 51 45
+3[25 1[25 40[45 45 6[45 29[51 53 11[{}30 90.9091 /CMSL10
+rf /Fl 138[56 1[42 4[56 4[27 1[58 3[54 1[56 97[{}7 90.9091
+/CMCSC10 rf /Fm 134[85 85 117 85 90 63 64 66 1[90 81
+90 134 45 2[45 90 81 49 74 90 72 90 78 10[122 124 112
+3[110 1[126 1[97 2[60 126 127 101 1[124 117 115 122 14[81
+81 49[{}38 143.462 /CMBX12 rf /Fn 242[91 13[{}1 90.9091
+/CMSY10 rf /Fo 134[71 71 97 71 75 52 53 55 1[75 67 75
+112 37 2[37 75 67 41 61 75 60 75 65 9[139 102 103 1[75
+100 1[92 1[105 128 81 2[50 105 1[85 88 103 97 96 102
+6[37 4[67 67 67 67 67 2[37 1[37 44[{}47 119.552 /CMBX12
+rf /Fp 129[48 48 48 48 48 48 48 48 48 48 48 48 48 1[48
+48 48 48 48 48 1[48 48 48 48 48 48 48 48 48 1[48 48 48
+48 48 1[48 3[48 48 48 48 1[48 48 48 1[48 2[48 48 48 48
+48 48 1[48 48 1[48 48 48 48 48 48 7[48 48 48 48 48 48
+1[48 48 48 48 48 48 48 48 48 48 48 33[{}73 90.9091 /CMTT10
+rf /Fq 131[91 45 40 48 48 66 48 51 35 36 36 48 51 45
+51 76 25 48 28 25 51 45 28 40 51 40 51 45 25 2[25 45
+25 56 68 68 93 68 68 66 51 67 71 62 71 68 83 57 71 47
+33 68 71 59 62 69 66 64 68 1[43 3[25 25 45 45 45 45 45
+45 45 45 45 45 45 25 30 25 2[35 35 25 4[45 25 18[76 51
+51 53 11[{}84 90.9091 /CMR10 rf /Fr 134[102 4[75 76 79
+2[97 5[54 6[108 94 11[149 6[151 1[116 3[151 152 71[{}13
+172.154 /CMBX12 rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%BeginPaperSize: Letter
+/setpagedevice where
+{ pop << /PageSize [612 792] >> setpagedevice }
+{ /letter where { pop letter } if }
+ifelse
+%%EndPaperSize
+ end
+%%EndSetup
+%%Page: 1 1
+TeXDict begin 1 0 bop 150 1318 a Fr(GNU)65 b(History)h(Library)p
+150 1418 3600 34 v 1920 1515 a Fq(Edition)31 b(8.2,)h(for)e
+Fp(History)e(Library)h Fq(V)-8 b(ersion)31 b(8.2.)3118
+1623 y(Septem)m(b)s(er)f(2022)150 4927 y Fo(Chet)45 b(Ramey)-11
+b(,)46 b(Case)g(W)-11 b(estern)46 b(Reserv)l(e)g(Univ)l(ersit)l(y)150
+5068 y(Brian)f(F)-11 b(o)l(x,)45 b(F)-11 b(ree)45 b(Soft)l(w)l(are)h(F)
+-11 b(oundation)p 150 5141 3600 17 v eop end
+%%Page: 2 2
+TeXDict begin 2 1 bop 150 4413 a Fq(This)43 b(do)s(cumen)m(t)g(describ)
+s(es)g(the)h(GNU)g(History)h(library)e(\(v)m(ersion)h(8.2,)49
+b(19)44 b(Septem)m(b)s(er)f(2022\),)50 b(a)150 4523 y(programming)32
+b(to)s(ol)h(that)f(pro)m(vides)g(a)h(consisten)m(t)g(user)e(in)m
+(terface)j(for)d(recalling)j(lines)e(of)g(previously)150
+4633 y(t)m(yp)s(ed)e(input.)150 4767 y(Cop)m(yrigh)m(t)602
+4764 y(c)577 4767 y Fn(\015)g Fq(1988{2022)35 b(F)-8
+b(ree)31 b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390
+4902 y(P)m(ermission)21 b(is)f(gran)m(ted)h(to)g(cop)m(y)-8
+b(,)24 b(distribute)c(and/or)h(mo)s(dify)e(this)i(do)s(cumen)m(t)f
+(under)f(the)390 5011 y(terms)25 b(of)h(the)f(GNU)h(F)-8
+b(ree)27 b(Do)s(cumen)m(tation)g(License,)g(V)-8 b(ersion)26
+b(1.3)g(or)f(an)m(y)h(later)g(v)m(ersion)390 5121 y(published)43
+b(b)m(y)h(the)h(F)-8 b(ree)46 b(Soft)m(w)m(are)g(F)-8
+b(oundation;)53 b(with)44 b(no)g(In)m(v)-5 b(arian)m(t)46
+b(Sections,)j(no)390 5230 y(F)-8 b(ron)m(t-Co)m(v)m(er)31
+b(T)-8 b(exts,)30 b(and)f(no)f(Bac)m(k-Co)m(v)m(er)k(T)-8
+b(exts.)41 b(A)29 b(cop)m(y)h(of)f(the)g(license)h(is)f(included)390
+5340 y(in)h(the)h(section)g(en)m(titled)h(\\GNU)f(F)-8
+b(ree)32 b(Do)s(cumen)m(tation)g(License".)p eop end
+%%Page: -1 3
+TeXDict begin -1 2 bop 3725 -116 a Fq(i)150 299 y Fm(T)-13
+b(able)53 b(of)h(Con)l(ten)l(ts)p eop end
+%%Page: 1 4
+TeXDict begin 1 3 bop 3705 -116 a Fq(1)150 299 y Fm(1)80
+b(Using)53 b(History)g(In)l(teractiv)l(ely)150 502 y
+Fq(This)42 b(c)m(hapter)h(describ)s(es)f(ho)m(w)g(to)h(use)g(the)f
+Fl(gnu)h Fq(History)g(Library)e(in)m(teractiv)m(ely)-8
+b(,)50 b(from)42 b(a)h(user's)150 612 y(standp)s(oin)m(t.)76
+b(It)42 b(should)f(b)s(e)h(considered)g(a)g(user's)g(guide.)76
+b(F)-8 b(or)43 b(information)f(on)g(using)g(the)g Fl(gnu)150
+721 y Fq(History)36 b(Library)e(in)h(y)m(our)f(o)m(wn)i(programs,)g
+(see)f(Chapter)g(2)g([Programming)g(with)g(GNU)h(History],)150
+831 y(page)31 b(4.)150 1059 y Fo(1.1)68 b(History)46
+b(Expansion)150 1219 y Fq(The)f(History)h(library)e(pro)m(vides)i(a)f
+(history)g(expansion)g(feature)h(that)g(is)f(similar)h(to)g(the)f
+(history)150 1328 y(expansion)g(pro)m(vided)f(b)m(y)h
+Fp(csh)p Fq(.)83 b(This)44 b(section)i(describ)s(es)e(the)h(syn)m(tax)h
+(used)e(to)i(manipulate)f(the)150 1438 y(history)30 b(information.)275
+1566 y(History)h(expansions)f(in)m(tro)s(duce)g(w)m(ords)g(from)g(the)h
+(history)f(list)h(in)m(to)g(the)g(input)f(stream,)h(making)150
+1676 y(it)g(easy)g(to)g(rep)s(eat)g(commands,)f(insert)g(the)h(argumen)
+m(ts)f(to)h(a)g(previous)f(command)g(in)m(to)i(the)e(curren)m(t)150
+1785 y(input)f(line,)i(or)g(\014x)f(errors)f(in)h(previous)g(commands)g
+(quic)m(kly)-8 b(.)275 1914 y(History)37 b(expansion)f(tak)m(es)i
+(place)g(in)e(t)m(w)m(o)i(parts.)59 b(The)36 b(\014rst)g(is)h(to)g
+(determine)g(whic)m(h)f(line)h(from)150 2023 y(the)42
+b(history)f(list)h(should)e(b)s(e)h(used)f(during)g(substitution.)74
+b(The)40 b(second)i(is)f(to)h(select)h(p)s(ortions)e(of)150
+2133 y(that)31 b(line)g(for)f(inclusion)h(in)m(to)g(the)g(curren)m(t)f
+(one.)42 b(The)30 b(line)h(selected)h(from)e(the)h(history)f(is)h
+(called)h(the)150 2242 y Fk(ev)m(en)m(t)p Fq(,)e(and)c(the)i(p)s
+(ortions)e(of)i(that)f(line)h(that)g(are)f(acted)i(up)s(on)c(are)j
+(called)g Fk(w)m(ords)p Fq(.)39 b(V)-8 b(arious)28 b
+Fk(mo)s(di\014ers)150 2352 y Fq(are)33 b(a)m(v)-5 b(ailable)36
+b(to)d(manipulate)h(the)f(selected)h(w)m(ords.)48 b(The)32
+b(line)i(is)f(brok)m(en)f(in)m(to)i(w)m(ords)f(in)f(the)i(same)150
+2461 y(fashion)23 b(that)g(Bash)g(do)s(es,)h(so)f(that)h(sev)m(eral)g
+(w)m(ords)e(surrounded)e(b)m(y)j(quotes)g(are)g(considered)g(one)g(w)m
+(ord.)150 2571 y(History)37 b(expansions)g(are)g(in)m(tro)s(duced)f(b)m
+(y)h(the)g(app)s(earance)g(of)g(the)g(history)f(expansion)h(c)m
+(haracter,)150 2681 y(whic)m(h)30 b(is)h(`)p Fp(!)p Fq(')f(b)m(y)g
+(default.)275 2809 y(History)c(expansion)g(implemen)m(ts)h(shell-lik)m
+(e)h(quoting)f(con)m(v)m(en)m(tions:)40 b(a)27 b(bac)m(kslash)g(can)f
+(b)s(e)g(used)f(to)150 2919 y(remo)m(v)m(e)h(the)e(sp)s(ecial)g
+(handling)g(for)g(the)g(next)g(c)m(haracter;)k(single)d(quotes)g
+(enclose)g(v)m(erbatim)g(sequences)150 3028 y(of)k(c)m(haracters,)i
+(and)e(can)g(b)s(e)g(used)f(to)i(inhibit)f(history)g(expansion;)g(and)g
+(c)m(haracters)i(enclosed)e(within)150 3138 y(double)h(quotes)i(ma)m(y)
+f(b)s(e)f(sub)5 b(ject)31 b(to)h(history)f(expansion,)g(since)g(bac)m
+(kslash)g(can)h(escap)s(e)f(the)g(history)150 3247 y(expansion)e(c)m
+(haracter,)j(but)d(single)h(quotes)g(ma)m(y)h(not,)f(since)g(they)g
+(are)g(not)f(treated)i(sp)s(ecially)f(within)150 3357
+y(double)g(quotes.)150 3544 y Fj(1.1.1)63 b(Ev)m(en)m(t)39
+b(Designators)150 3691 y Fq(An)32 b(ev)m(en)m(t)j(designator)e(is)g(a)g
+(reference)g(to)h(a)f(command)f(line)h(en)m(try)g(in)g(the)g(history)g
+(list.)48 b(Unless)33 b(the)150 3800 y(reference)e(is)f(absolute,)i(ev)
+m(en)m(ts)f(are)g(relativ)m(e)i(to)e(the)f(curren)m(t)g(p)s(osition)h
+(in)f(the)h(history)f(list.)150 3947 y Fp(!)432 b Fq(Start)34
+b(a)f(history)h(substitution,)g(except)g(when)f(follo)m(w)m(ed)i(b)m(y)
+e(a)h(space,)h(tab,)f(the)g(end)f(of)630 4057 y(the)e(line,)g(or)f(`)p
+Fp(=)p Fq('.)150 4204 y Fp(!)p Fi(n)384 b Fq(Refer)30
+b(to)i(command)e(line)g Fk(n)p Fq(.)150 4351 y Fp(!-)p
+Fi(n)336 b Fq(Refer)30 b(to)i(the)e(command)g Fk(n)g
+Fq(lines)h(bac)m(k.)150 4498 y Fp(!!)384 b Fq(Refer)30
+b(to)i(the)e(previous)g(command.)40 b(This)30 b(is)g(a)h(synon)m(ym)f
+(for)g(`)p Fp(!-1)p Fq('.)150 4645 y Fp(!)p Fi(string)144
+b Fq(Refer)25 b(to)h(the)f(most)h(recen)m(t)g(command)f(preceding)g
+(the)g(curren)m(t)g(p)s(osition)g(in)g(the)g(history)630
+4755 y(list)31 b(starting)g(with)f Fk(string)p Fq(.)150
+4902 y Fp(!?)p Fi(string)p Fp([?])630 5011 y Fq(Refer)25
+b(to)h(the)f(most)h(recen)m(t)g(command)f(preceding)g(the)g(curren)m(t)
+g(p)s(osition)g(in)g(the)g(history)630 5121 y(list)32
+b(con)m(taining)i Fk(string)p Fq(.)45 b(The)31 b(trailing)i(`)p
+Fp(?)p Fq(')f(ma)m(y)g(b)s(e)f(omitted)i(if)f(the)g Fk(string)39
+b Fq(is)32 b(follo)m(w)m(ed)630 5230 y(immediately)f(b)m(y)e(a)h
+(newline.)40 b(If)29 b Fk(string)38 b Fq(is)29 b(missing,)h(the)g
+(string)f(from)g(the)h(most)g(recen)m(t)630 5340 y(searc)m(h)h(is)f
+(used;)g(it)h(is)g(an)f(error)g(if)g(there)h(is)f(no)g(previous)g
+(searc)m(h)h(string.)p eop end
+%%Page: 2 5
+TeXDict begin 2 4 bop 150 -116 a Fq(Chapter)30 b(1:)41
+b(Using)30 b(History)h(In)m(teractiv)m(ely)2016 b(2)150
+299 y Fp(^)p Fi(string1)p Fp(^)p Fi(string2)p Fp(^)630
+408 y Fq(Quic)m(k)32 b(Substitution.)44 b(Rep)s(eat)32
+b(the)g(last)h(command,)f(replacing)g Fk(string1)40 b
+Fq(with)31 b Fk(string2)p Fq(.)630 518 y(Equiv)-5 b(alen)m(t)31
+b(to)g Fp(!!:s^)p Fi(string1)p Fp(^)p Fi(string2)p Fp(^)p
+Fq(.)150 673 y Fp(!#)384 b Fq(The)30 b(en)m(tire)h(command)f(line)h(t)m
+(yp)s(ed)f(so)h(far.)150 867 y Fj(1.1.2)63 b(W)-10 b(ord)41
+b(Designators)150 1014 y Fq(W)-8 b(ord)27 b(designators)h(are)g(used)e
+(to)i(select)h(desired)d(w)m(ords)h(from)f(the)i(ev)m(en)m(t.)41
+b(A)27 b(`)p Fp(:)p Fq(')g(separates)h(the)f(ev)m(en)m(t)150
+1124 y(sp)s(eci\014cation)38 b(from)e(the)h(w)m(ord)f(designator.)61
+b(It)37 b(ma)m(y)h(b)s(e)e(omitted)i(if)e(the)h(w)m(ord)g(designator)g
+(b)s(egins)150 1233 y(with)30 b(a)g(`)p Fp(^)p Fq(',)g(`)p
+Fp($)p Fq(',)g(`)p Fp(*)p Fq(',)h(`)p Fp(-)p Fq(',)f(or)g(`)p
+Fp(\045)p Fq('.)41 b(W)-8 b(ords)30 b(are)g(n)m(um)m(b)s(ered)e(from)i
+(the)g(b)s(eginning)f(of)h(the)g(line,)g(with)g(the)150
+1343 y(\014rst)f(w)m(ord)f(b)s(eing)h(denoted)h(b)m(y)f(0)h(\(zero\).)
+41 b(W)-8 b(ords)30 b(are)g(inserted)f(in)m(to)h(the)g(curren)m(t)f
+(line)g(separated)h(b)m(y)150 1452 y(single)h(spaces.)275
+1584 y(F)-8 b(or)31 b(example,)150 1739 y Fp(!!)384 b
+Fq(designates)37 b(the)f(preceding)g(command.)57 b(When)35
+b(y)m(ou)i(t)m(yp)s(e)f(this,)h(the)f(preceding)g(com-)630
+1849 y(mand)30 b(is)g(rep)s(eated)g(in)g(toto.)150 2003
+y Fp(!!:$)288 b Fq(designates)23 b(the)g(last)g(argumen)m(t)g(of)f(the)
+h(preceding)f(command.)38 b(This)22 b(ma)m(y)h(b)s(e)e(shortened)630
+2113 y(to)31 b Fp(!$)p Fq(.)150 2267 y Fp(!fi:2)240 b
+Fq(designates)30 b(the)g(second)f(argumen)m(t)h(of)f(the)h(most)f
+(recen)m(t)i(command)e(starting)h(with)f(the)630 2377
+y(letters)j Fp(fi)p Fq(.)275 2531 y(Here)e(are)h(the)g(w)m(ord)f
+(designators:)150 2686 y Fp(0)g(\(zero\))114 b Fq(The)30
+b Fp(0)p Fq(th)g(w)m(ord.)40 b(F)-8 b(or)31 b(man)m(y)g(applications,)h
+(this)e(is)g(the)h(command)f(w)m(ord.)150 2840 y Fi(n)432
+b Fq(The)30 b Fk(n)p Fq(th)g(w)m(ord.)150 2995 y Fp(^)432
+b Fq(The)30 b(\014rst)f(argumen)m(t;)j(that)f(is,)f(w)m(ord)g(1.)150
+3150 y Fp($)432 b Fq(The)30 b(last)h(argumen)m(t.)150
+3304 y Fp(\045)432 b Fq(The)40 b(\014rst)h(w)m(ord)f(matc)m(hed)i(b)m
+(y)f(the)g(most)g(recen)m(t)h(`)p Fp(?)p Fi(string)p
+Fp(?)p Fq(')d(searc)m(h,)44 b(if)d(the)g(searc)m(h)630
+3414 y(string)30 b(b)s(egins)g(with)g(a)h(c)m(haracter)h(that)f(is)f
+(part)h(of)f(a)h(w)m(ord.)150 3568 y Fi(x)p Fp(-)p Fi(y)336
+b Fq(A)30 b(range)h(of)g(w)m(ords;)f(`)p Fp(-)p Fi(y)p
+Fq(')g(abbreviates)h(`)p Fp(0-)p Fi(y)p Fq('.)150 3723
+y Fp(*)432 b Fq(All)28 b(of)g(the)g(w)m(ords,)g(except)h(the)e
+Fp(0)p Fq(th.)40 b(This)27 b(is)g(a)h(synon)m(ym)f(for)h(`)p
+Fp(1-$)p Fq('.)39 b(It)28 b(is)g(not)g(an)f(error)630
+3832 y(to)j(use)g(`)p Fp(*)p Fq(')f(if)h(there)g(is)g(just)f(one)h(w)m
+(ord)f(in)g(the)h(ev)m(en)m(t;)i(the)d(empt)m(y)i(string)e(is)h
+(returned)e(in)630 3942 y(that)j(case.)150 4097 y Fi(x)p
+Fp(*)384 b Fq(Abbreviates)31 b(`)p Fi(x)p Fp(-$)p Fq(')150
+4251 y Fi(x)p Fp(-)384 b Fq(Abbreviates)27 b(`)p Fi(x)p
+Fp(-$)p Fq(')g(lik)m(e)h(`)p Fi(x)p Fp(*)p Fq(',)g(but)e(omits)i(the)f
+(last)h(w)m(ord.)39 b(If)27 b(`)p Fp(x)p Fq(')g(is)g(missing,)g(it)h
+(defaults)630 4361 y(to)j(0.)275 4515 y(If)i(a)h(w)m(ord)g(designator)g
+(is)g(supplied)f(without)h(an)g(ev)m(en)m(t)h(sp)s(eci\014cation,)h
+(the)e(previous)f(command)150 4625 y(is)d(used)g(as)h(the)f(ev)m(en)m
+(t.)150 4819 y Fj(1.1.3)63 b(Mo)s(di\014ers)150 4966
+y Fq(After)29 b(the)g(optional)g(w)m(ord)g(designator,)g(y)m(ou)g(can)g
+(add)f(a)h(sequence)g(of)g(one)g(or)f(more)h(of)g(the)f(follo)m(wing)
+150 5076 y(mo)s(di\014ers,)33 b(eac)m(h)h(preceded)f(b)m(y)g(a)h(`)p
+Fp(:)p Fq('.)50 b(These)33 b(mo)s(dify)-8 b(,)33 b(or)h(edit,)g(the)g
+(w)m(ord)f(or)g(w)m(ords)g(selected)h(from)150 5185 y(the)d(history)f
+(ev)m(en)m(t.)150 5340 y Fp(h)432 b Fq(Remo)m(v)m(e)32
+b(a)f(trailing)g(pathname)g(comp)s(onen)m(t,)g(lea)m(ving)h(only)e(the)
+h(head.)p eop end
+%%Page: 3 6
+TeXDict begin 3 5 bop 150 -116 a Fq(Chapter)30 b(1:)41
+b(Using)30 b(History)h(In)m(teractiv)m(ely)2016 b(3)150
+299 y Fp(t)432 b Fq(Remo)m(v)m(e)32 b(all)f(leading)h(pathname)e(comp)s
+(onen)m(ts,)h(lea)m(ving)h(the)e(tail.)150 458 y Fp(r)432
+b Fq(Remo)m(v)m(e)32 b(a)f(trailing)g(su\016x)f(of)g(the)h(form)f(`)p
+Fp(.)p Fi(suffix)p Fq(',)f(lea)m(ving)j(the)f(basename.)150
+618 y Fp(e)432 b Fq(Remo)m(v)m(e)32 b(all)f(but)f(the)h(trailing)g
+(su\016x.)150 777 y Fp(p)432 b Fq(Prin)m(t)30 b(the)h(new)f(command)g
+(but)g(do)g(not)g(execute)i(it.)150 936 y Fp(s/)p Fi(old)p
+Fp(/)p Fi(new)p Fp(/)630 1046 y Fq(Substitute)f Fk(new)39
+b Fq(for)32 b(the)g(\014rst)f(o)s(ccurrence)h(of)f Fk(old)36
+b Fq(in)31 b(the)h(ev)m(en)m(t)h(line.)46 b(An)m(y)31
+b(c)m(haracter)630 1156 y(ma)m(y)k(b)s(e)e(used)h(as)g(the)h(delimiter)
+g(in)f(place)h(of)f(`)p Fp(/)p Fq('.)53 b(The)33 b(delimiter)i(ma)m(y)g
+(b)s(e)f(quoted)g(in)630 1265 y Fk(old)40 b Fq(and)c
+Fk(new)44 b Fq(with)36 b(a)h(single)g(bac)m(kslash.)60
+b(If)36 b(`)p Fp(&)p Fq(')h(app)s(ears)e(in)i Fk(new)p
+Fq(,)g(it)h(is)e(replaced)h(b)m(y)630 1375 y Fk(old)p
+Fq(.)k(A)31 b(single)g(bac)m(kslash)g(will)g(quote)g(the)g(`)p
+Fp(&)p Fq('.)41 b(If)31 b Fk(old)j Fq(is)c(n)m(ull,)h(it)g(is)g(set)g
+(to)g(the)g(last)g Fk(old)630 1484 y Fq(substituted,)j(or,)g(if)f(no)g
+(previous)g(history)g(substitutions)g(to)s(ok)h(place,)h(the)e(last)h
+Fk(string)630 1594 y Fq(in)d(a)g(!?)p Fk(string)8 b Fp([?])30
+b Fq(searc)m(h.)44 b(If)31 b Fk(new)38 b Fq(is)31 b(n)m(ull,)h(eac)m(h)
+g(matc)m(hing)g Fk(old)j Fq(is)c(deleted.)44 b(The)30
+b(\014nal)630 1704 y(delimiter)h(is)g(optional)g(if)f(it)h(is)g(the)f
+(last)h(c)m(haracter)h(on)f(the)f(input)g(line.)150 1863
+y Fp(&)432 b Fq(Rep)s(eat)31 b(the)f(previous)g(substitution.)150
+2022 y Fp(g)150 2132 y(a)432 b Fq(Cause)38 b(c)m(hanges)i(to)f(b)s(e)f
+(applied)h(o)m(v)m(er)h(the)f(en)m(tire)g(ev)m(en)m(t)h(line.)66
+b(Used)39 b(in)f(conjunction)630 2242 y(with)30 b(`)p
+Fp(s)p Fq(',)h(as)f(in)h Fp(gs/)p Fi(old)p Fp(/)p Fi(new)p
+Fp(/)p Fq(,)c(or)j(with)h(`)p Fp(&)p Fq('.)150 2401 y
+Fp(G)432 b Fq(Apply)30 b(the)g(follo)m(wing)i(`)p Fp(s)p
+Fq(')f(or)f(`)p Fp(&)p Fq(')h(mo)s(di\014er)e(once)i(to)g(eac)m(h)h(w)m
+(ord)e(in)g(the)g(ev)m(en)m(t.)p eop end
+%%Page: 4 7
+TeXDict begin 4 6 bop 3705 -116 a Fq(4)150 299 y Fm(2)80
+b(Programming)54 b(with)f(GNU)h(History)150 544 y Fq(This)41
+b(c)m(hapter)i(describ)s(es)e(ho)m(w)h(to)h(in)m(terface)g(programs)f
+(that)g(y)m(ou)h(write)f(with)f(the)i Fl(gnu)e Fq(History)150
+654 y(Library)-8 b(.)48 b(It)33 b(should)e(b)s(e)i(considered)f(a)h
+(tec)m(hnical)i(guide.)48 b(F)-8 b(or)34 b(information)f(on)g(the)g(in)
+m(teractiv)m(e)i(use)150 763 y(of)c Fl(gnu)f Fq(History)-8
+b(,)31 b(see)g(Chapter)f(1)h([Using)g(History)g(In)m(teractiv)m(ely],)i
+(page)e(1.)150 1010 y Fo(2.1)68 b(In)l(tro)t(duction)45
+b(to)g(History)150 1169 y Fq(Man)m(y)31 b(programs)f(read)g(input)g
+(from)f(the)i(user)f(a)g(line)h(at)g(a)g(time.)41 b(The)30
+b Fl(gnu)g Fq(History)h(library)f(is)g(able)150 1279
+y(to)f(k)m(eep)h(trac)m(k)g(of)f(those)g(lines,)h(asso)s(ciate)g
+(arbitrary)f(data)g(with)g(eac)m(h)h(line,)f(and)g(utilize)h
+(information)150 1388 y(from)g(previous)g(lines)g(in)g(comp)s(osing)h
+(new)f(ones.)275 1527 y(A)24 b(programmer)g(using)g(the)h(History)g
+(library)f(has)h(a)m(v)-5 b(ailable)27 b(functions)d(for)g(remem)m(b)s
+(ering)g(lines)h(on)150 1636 y(a)30 b(history)f(list,)h(asso)s(ciating)
+i(arbitrary)d(data)h(with)f(a)g(line,)i(remo)m(ving)f(lines)f(from)g
+(the)h(list,)g(searc)m(hing)150 1746 y(through)35 b(the)g(list)h(for)f
+(a)h(line)f(con)m(taining)i(an)e(arbitrary)g(text)h(string,)h(and)e
+(referencing)g(an)m(y)h(line)f(in)150 1855 y(the)c(list)g(directly)-8
+b(.)43 b(In)30 b(addition,)h(a)g(history)g Fk(expansion)g
+Fq(function)f(is)h(a)m(v)-5 b(ailable)33 b(whic)m(h)d(pro)m(vides)h
+(for)g(a)150 1965 y(consisten)m(t)h(user)d(in)m(terface)j(across)f
+(di\013eren)m(t)g(programs.)275 2103 y(The)c(user)g(using)g(programs)h
+(written)g(with)g(the)g(History)g(library)g(has)f(the)h(b)s(ene\014t)f
+(of)h(a)h(consisten)m(t)150 2213 y(user)38 b(in)m(terface)j(with)e(a)g
+(set)g(of)h(w)m(ell-kno)m(wn)f(commands)g(for)g(manipulating)g(the)g
+(text)h(of)f(previous)150 2323 y(lines)28 b(and)f(using)g(that)h(text)g
+(in)g(new)f(commands.)39 b(The)27 b(basic)h(history)g(manipulation)f
+(commands)h(are)150 2432 y(similar)j(to)g(the)f(history)h(substitution)
+f(pro)m(vided)g(b)m(y)g Fp(csh)p Fq(.)275 2570 y(The)f(programmer)h
+(can)h(also)g(use)g(the)f(Readline)h(library)-8 b(,)31
+b(whic)m(h)f(includes)g(some)h(history)f(manip-)150 2680
+y(ulation)h(b)m(y)f(default,)h(and)f(has)g(the)h(added)e(adv)-5
+b(an)m(tage)33 b(of)d(command)g(line)h(editing.)275 2818
+y(Before)39 b(declaring)f(an)m(y)h(functions)e(using)h(an)m(y)g
+(functionalit)m(y)i(the)e(History)h(library)e(pro)m(vides)h(in)150
+2928 y(other)29 b(co)s(de,)g(an)g(application)h(writer)f(should)e
+(include)i(the)g(\014le)f Fp(<readline/history.h>)23
+b Fq(in)29 b(an)m(y)g(\014le)150 3037 y(that)c(uses)e(the)h(History)h
+(library's)e(features.)39 b(It)24 b(supplies)f(extern)h(declarations)i
+(for)d(all)i(of)f(the)g(library's)150 3147 y(public)30
+b(functions)g(and)f(v)-5 b(ariables,)32 b(and)d(declares)j(all)f(of)f
+(the)h(public)f(data)h(structures.)150 3393 y Fo(2.2)68
+b(History)46 b(Storage)150 3553 y Fq(The)30 b(history)g(list)h(is)g(an)
+f(arra)m(y)h(of)f(history)h(en)m(tries.)41 b(A)31 b(history)f(en)m(try)
+h(is)f(declared)h(as)f(follo)m(ws:)390 3691 y Fp(typedef)46
+b(void)g(*histdata_t;)390 3910 y(typedef)g(struct)g(_hist_entry)f({)485
+4020 y(char)i(*line;)485 4129 y(char)g(*timestamp;)485
+4239 y(histdata_t)e(data;)390 4349 y(})i(HIST_ENTRY;)275
+4487 y Fq(The)29 b(history)i(list)g(itself)g(migh)m(t)g(therefore)g(b)s
+(e)f(declared)g(as)390 4625 y Fp(HIST_ENTRY)45 b(**the_history_list;)
+275 4763 y Fq(The)29 b(state)j(of)f(the)f(History)h(library)f(is)h
+(encapsulated)g(in)m(to)g(a)g(single)g(structure:)390
+4902 y Fp(/*)438 5011 y(*)47 b(A)h(structure)d(used)i(to)g(pass)f
+(around)g(the)h(current)f(state)h(of)g(the)g(history.)438
+5121 y(*/)390 5230 y(typedef)f(struct)g(_hist_state)f({)485
+5340 y(HIST_ENTRY)g(**entries;)g(/*)j(Pointer)d(to)j(the)f(entries)e
+(themselves.)g(*/)p eop end
+%%Page: 5 8
+TeXDict begin 5 7 bop 150 -116 a Fq(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(History)1780 b(5)485
+299 y Fp(int)47 b(offset;)523 b(/*)48 b(The)f(location)e(pointer)h
+(within)g(this)h(array.)f(*/)485 408 y(int)h(length;)523
+b(/*)48 b(Number)e(of)h(elements)e(within)i(this)f(array.)g(*/)485
+518 y(int)h(size;)619 b(/*)48 b(Number)e(of)h(slots)f(allocated)g(to)h
+(this)f(array.)g(*/)485 628 y(int)h(flags;)390 737 y(})g
+(HISTORY_STATE;)275 890 y Fq(If)29 b(the)i(\015ags)g(mem)m(b)s(er)e
+(includes)h Fp(HS_STIFLED)p Fq(,)e(the)j(history)f(has)g(b)s(een)g
+(sti\015ed.)150 1157 y Fo(2.3)68 b(History)46 b(F)-11
+b(unctions)150 1317 y Fq(This)33 b(section)j(describ)s(es)d(the)i
+(calling)g(sequence)g(for)f(the)g(v)-5 b(arious)34 b(functions)g(exp)s
+(orted)g(b)m(y)g(the)g Fl(gnu)150 1426 y Fq(History)d(library)-8
+b(.)150 1644 y Fj(2.3.1)63 b(Initializing)40 b(History)i(and)f(State)f
+(Managemen)m(t)150 1791 y Fq(This)21 b(section)i(describ)s(es)f
+(functions)f(used)g(to)i(initialize)h(and)e(manage)h(the)f(state)h(of)g
+(the)f(History)g(library)150 1900 y(when)29 b(y)m(ou)i(w)m(an)m(t)g(to)
+g(use)f(the)h(history)f(functions)g(in)g(y)m(our)h(program.)3350
+2120 y([F)-8 b(unction])-3599 b Fh(void)54 b(using_history)49
+b Fg(\()p Ff(v)m(oid)p Fg(\))390 2230 y Fq(Begin)41 b(a)f(session)g(in)
+g(whic)m(h)f(the)h(history)g(functions)f(migh)m(t)i(b)s(e)e(used.)69
+b(This)39 b(initializes)j(the)390 2339 y(in)m(teractiv)m(e)33
+b(v)-5 b(ariables.)3350 2560 y([F)d(unction])-3599 b
+Fh(HISTORY_STATE)56 b(*)d(history_get_history_st)q(ate)f
+Fg(\()p Ff(v)m(oid)p Fg(\))390 2669 y Fq(Return)30 b(a)g(structure)g
+(describing)g(the)h(curren)m(t)f(state)i(of)e(the)h(input)e(history)-8
+b(.)3350 2890 y([F)g(unction])-3599 b Fh(void)54 b
+(history_set_history_stat)q(e)e Fg(\()p Ff(HISTOR)-8
+b(Y)p 2262 2890 30 5 v 44 w(ST)g(A)g(TE)32 b(*state)p
+Fg(\))390 2999 y Fq(Set)f(the)f(state)i(of)e(the)h(history)f(list)h
+(according)h(to)f Fk(state)p Fq(.)150 3216 y Fj(2.3.2)63
+b(History)41 b(List)g(Managemen)m(t)150 3363 y Fq(These)32
+b(functions)f(manage)i(individual)f(en)m(tries)g(on)g(the)g(history)g
+(list,)h(or)f(set)h(parameters)f(managing)150 3473 y(the)f(list)g
+(itself.)3350 3693 y([F)-8 b(unction])-3599 b Fh(void)54
+b(add_history)48 b Fg(\()p Ff(const)34 b(c)m(har)g(*string)p
+Fg(\))390 3803 y Fq(Place)j Fk(string)44 b Fq(at)37 b(the)g(end)e(of)i
+(the)f(history)g(list.)59 b(The)36 b(asso)s(ciated)h(data)g(\014eld)f
+(\(if)g(an)m(y\))h(is)f(set)390 3912 y(to)44 b Fp(NULL)p
+Fq(.)79 b(If)44 b(the)f(maxim)m(um)h(n)m(um)m(b)s(er)e(of)i(history)f
+(en)m(tries)i(has)e(b)s(een)g(set)h(using)f Fp(stifle_)390
+4022 y(history\(\))p Fq(,)28 b(and)h(the)h(new)f(n)m(um)m(b)s(er)g(of)h
+(history)g(en)m(tries)h(w)m(ould)e(exceed)i(that)g(maxim)m(um,)f(the)
+390 4131 y(oldest)h(history)f(en)m(try)h(is)f(remo)m(v)m(ed.)3350
+4352 y([F)-8 b(unction])-3599 b Fh(void)54 b(add_history_time)c
+Fg(\()p Ff(const)34 b(c)m(har)g(*string)p Fg(\))390 4461
+y Fq(Change)c(the)h(time)g(stamp)f(asso)s(ciated)i(with)e(the)h(most)f
+(recen)m(t)i(history)e(en)m(try)h(to)g Fk(string)p Fq(.)3350
+4681 y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55 b(*)e(remove_history)d
+Fg(\()p Ff(in)m(t)33 b(whic)m(h)p Fg(\))390 4791 y Fq(Remo)m(v)m(e)47
+b(history)f(en)m(try)f(at)i(o\013set)f Fk(whic)m(h)f
+Fq(from)g(the)h(history)-8 b(.)86 b(The)45 b(remo)m(v)m(ed)i(elemen)m
+(t)g(is)390 4901 y(returned)29 b(so)i(y)m(ou)g(can)f(free)h(the)f
+(line,)h(data,)h(and)d(con)m(taining)j(structure.)3350
+5121 y([F)-8 b(unction])-3599 b Fh(histdata_t)55 b(free_history_entry)c
+Fg(\()p Ff(HIST)p 1992 5121 V 44 w(ENTR)-8 b(Y)33 b(*histen)m(t)p
+Fg(\))390 5230 y Fq(F)-8 b(ree)29 b(the)f(history)g(en)m(try)g
+Fk(histen)m(t)j Fq(and)c(an)m(y)i(history)e(library)h(priv)-5
+b(ate)28 b(data)h(asso)s(ciated)g(with)f(it.)390 5340
+y(Returns)h(the)i(application-sp)s(eci\014c)h(data)f(so)g(the)f(caller)
+i(can)e(disp)s(ose)g(of)h(it.)p eop end
+%%Page: 6 9
+TeXDict begin 6 8 bop 150 -116 a Fq(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(History)1780 b(6)3350
+299 y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55 b(*)e
+(replace_history_entry)f Fg(\()p Ff(in)m(t)33 b(whic)m(h,)h(const)g(c)m
+(har)g(*line,)565 408 y(histdata)p 927 408 30 5 v 44
+w(t)f(data)p Fg(\))390 518 y Fq(Mak)m(e)c(the)f(history)f(en)m(try)h
+(at)h(o\013set)f Fk(whic)m(h)g Fq(ha)m(v)m(e)g Fk(line)33
+b Fq(and)27 b Fk(data)p Fq(.)41 b(This)27 b(returns)f(the)i(old)g(en)m
+(try)390 628 y(so)37 b(the)h(caller)g(can)f(disp)s(ose)g(of)g(an)m(y)g
+(application-sp)s(eci\014c)i(data.)61 b(In)37 b(the)g(case)h(of)f(an)g
+(in)m(v)-5 b(alid)390 737 y Fk(whic)m(h)p Fq(,)30 b(a)h
+Fp(NULL)e Fq(p)s(oin)m(ter)i(is)f(returned.)3350 941
+y([F)-8 b(unction])-3599 b Fh(void)54 b(clear_history)49
+b Fg(\()p Ff(v)m(oid)p Fg(\))390 1051 y Fq(Clear)31 b(the)f(history)h
+(list)g(b)m(y)f(deleting)h(all)h(the)e(en)m(tries.)3350
+1254 y([F)-8 b(unction])-3599 b Fh(void)54 b(stifle_history)49
+b Fg(\()p Ff(in)m(t)34 b(max)p Fg(\))390 1364 y Fq(Sti\015e)j(the)f
+(history)h(list,)i(remem)m(b)s(ering)d(only)h(the)f(last)i
+Fk(max)43 b Fq(en)m(tries.)60 b(The)36 b(history)g(list)i(will)390
+1473 y(con)m(tain)32 b(only)e Fk(max)37 b Fq(en)m(tries)31
+b(at)g(a)g(time.)3350 1677 y([F)-8 b(unction])-3599 b
+Fh(int)53 b(unstifle_history)e Fg(\()p Ff(v)m(oid)p Fg(\))390
+1787 y Fq(Stop)27 b(sti\015ing)h(the)f(history)-8 b(.)40
+b(This)27 b(returns)f(the)h(previously-set)h(maxim)m(um)f(n)m(um)m(b)s
+(er)f(of)i(history)390 1896 y(en)m(tries)g(\(as)f(set)g(b)m(y)g
+Fp(stifle_history\(\))p Fq(\).)35 b(The)27 b(v)-5 b(alue)27
+b(is)g(p)s(ositiv)m(e)g(if)g(the)g(history)g(w)m(as)g(sti\015ed,)390
+2006 y(negativ)m(e)33 b(if)d(it)h(w)m(asn't.)3350 2210
+y([F)-8 b(unction])-3599 b Fh(int)53 b(history_is_stifled)e
+Fg(\()p Ff(v)m(oid)p Fg(\))390 2319 y Fq(Returns)29 b(non-zero)i(if)g
+(the)f(history)h(is)f(sti\015ed,)g(zero)i(if)e(it)h(is)f(not.)150
+2528 y Fj(2.3.3)63 b(Information)42 b(Ab)s(out)f(the)g(History)g(List)
+150 2675 y Fq(These)30 b(functions)g(return)f(information)i(ab)s(out)f
+(the)h(en)m(tire)g(history)f(list)h(or)g(individual)e(list)i(en)m
+(tries.)3350 2879 y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55
+b(**)e(history_list)c Fg(\()p Ff(v)m(oid)p Fg(\))390
+2989 y Fq(Return)30 b(a)h Fp(NULL)e Fq(terminated)i(arra)m(y)g(of)f
+Fp(HIST_ENTRY)e(*)i Fq(whic)m(h)g(is)h(the)g(curren)m(t)f(input)f
+(history)-8 b(.)390 3098 y(Elemen)m(t)31 b(0)g(of)g(this)f(list)h(is)f
+(the)h(b)s(eginning)f(of)g(time.)42 b(If)29 b(there)i(is)f(no)h
+(history)-8 b(,)31 b(return)e Fp(NULL)p Fq(.)3350 3302
+y([F)-8 b(unction])-3599 b Fh(int)53 b(where_history)d
+Fg(\()p Ff(v)m(oid)p Fg(\))390 3411 y Fq(Returns)29 b(the)i(o\013set)g
+(of)g(the)g(curren)m(t)f(history)g(elemen)m(t.)3350 3615
+y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55 b(*)e(current_history)d
+Fg(\()p Ff(v)m(oid)p Fg(\))390 3725 y Fq(Return)24 b(the)h(history)g
+(en)m(try)g(at)h(the)f(curren)m(t)f(p)s(osition,)j(as)e(determined)f(b)
+m(y)h Fp(where_history\(\))p Fq(.)390 3834 y(If)30 b(there)g(is)h(no)f
+(en)m(try)h(there,)g(return)e(a)i Fp(NULL)e Fq(p)s(oin)m(ter.)3350
+4038 y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55 b(*)e(history_get)c
+Fg(\()p Ff(in)m(t)33 b(o\013set)p Fg(\))390 4148 y Fq(Return)e(the)g
+(history)h(en)m(try)g(at)g(p)s(osition)g Fk(o\013set)p
+Fq(.)45 b(The)31 b(range)h(of)g(v)-5 b(alid)31 b(v)-5
+b(alues)32 b(of)g Fk(o\013set)j Fq(starts)390 4257 y(at)d
+Fp(history_base)c Fq(and)i(ends)h(at)g Fk(history)p 1885
+4257 28 4 v 40 w(length)h Fq(-)f(1)h(\(see)g(Section)g(2.4)g([History)g
+(V)-8 b(ariables],)390 4367 y(page)27 b(9\).)40 b(If)26
+b(there)g(is)g(no)g(en)m(try)h(there,)g(or)f(if)g Fk(o\013set)j
+Fq(is)e(outside)f(the)g(v)-5 b(alid)27 b(range,)g(return)f(a)g
+Fp(NULL)390 4476 y Fq(p)s(oin)m(ter.)3350 4680 y([F)-8
+b(unction])-3599 b Fh(time_t)54 b(history_get_time)c
+Fg(\()p Ff(HIST)p 1678 4680 30 5 v 45 w(ENTR)-8 b(Y)32
+b(*en)m(try)p Fg(\))390 4790 y Fq(Return)g(the)i(time)g(stamp)f(asso)s
+(ciated)h(with)f(the)g(history)g(en)m(try)h Fk(en)m(try)p
+Fq(.)49 b(If)33 b(the)g(timestamp)h(is)390 4899 y(missing)c(or)h(in)m
+(v)-5 b(alid,)31 b(return)e(0.)3350 5103 y([F)-8 b(unction])-3599
+b Fh(int)53 b(history_total_bytes)e Fg(\()p Ff(v)m(oid)p
+Fg(\))390 5213 y Fq(Return)27 b(the)h(n)m(um)m(b)s(er)e(of)i(b)m(ytes)g
+(that)g(the)g(primary)e(history)i(en)m(tries)g(are)g(using.)39
+b(This)27 b(function)390 5322 y(returns)i(the)i(sum)e(of)i(the)f
+(lengths)h(of)f(all)i(the)e(lines)h(in)f(the)g(history)-8
+b(.)p eop end
+%%Page: 7 10
+TeXDict begin 7 9 bop 150 -116 a Fq(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(History)1780 b(7)150
+299 y Fj(2.3.4)63 b(Mo)m(ving)41 b(Around)h(the)f(History)g(List)150
+446 y Fq(These)30 b(functions)g(allo)m(w)i(the)e(curren)m(t)h(index)f
+(in)m(to)h(the)f(history)h(list)g(to)g(b)s(e)f(set)h(or)f(c)m(hanged.)
+3350 624 y([F)-8 b(unction])-3599 b Fh(int)53 b(history_set_pos)d
+Fg(\()p Ff(in)m(t)34 b(p)s(os)p Fg(\))390 734 y Fq(Set)j(the)g(curren)m
+(t)f(history)g(o\013set)i(to)f Fk(p)s(os)p Fq(,)h(an)f(absolute)g
+(index)f(in)m(to)i(the)e(list.)60 b(Returns)36 b(1)h(on)390
+844 y(success,)31 b(0)g(if)f Fk(p)s(os)j Fq(is)e(less)f(than)h(zero)g
+(or)f(greater)i(than)e(the)g(n)m(um)m(b)s(er)f(of)i(history)f(en)m
+(tries.)3350 1022 y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55
+b(*)e(previous_history)d Fg(\()p Ff(v)m(oid)p Fg(\))390
+1132 y Fq(Bac)m(k)30 b(up)e(the)h(curren)m(t)g(history)f(o\013set)i(to)
+g(the)f(previous)f(history)h(en)m(try)-8 b(,)30 b(and)e(return)g(a)h(p)
+s(oin)m(ter)390 1241 y(to)i(that)g(en)m(try)-8 b(.)41
+b(If)30 b(there)h(is)f(no)h(previous)f(en)m(try)-8 b(,)31
+b(return)e(a)i Fp(NULL)e Fq(p)s(oin)m(ter.)3350 1420
+y([F)-8 b(unction])-3599 b Fh(HIST_ENTRY)55 b(*)e(next_history)c
+Fg(\()p Ff(v)m(oid)p Fg(\))390 1530 y Fq(If)20 b(the)h(curren)m(t)f
+(history)h(o\013set)g(refers)g(to)g(a)g(v)-5 b(alid)21
+b(history)f(en)m(try)-8 b(,)24 b(incremen)m(t)d(the)g(curren)m(t)f
+(history)390 1639 y(o\013set.)41 b(If)27 b(the)g(p)s(ossibly-incremen)m
+(ted)g(history)h(o\013set)g(refers)f(to)h(a)f(v)-5 b(alid)28
+b(history)f(en)m(try)-8 b(,)29 b(return)390 1749 y(a)i(p)s(oin)m(ter)f
+(to)h(that)g(en)m(try;)g(otherwise,)g(return)e(a)i Fp(BNULL)e
+Fq(p)s(oin)m(ter.)150 1944 y Fj(2.3.5)63 b(Searc)m(hing)40
+b(the)h(History)h(List)150 2091 y Fq(These)36 b(functions)g(allo)m(w)i
+(searc)m(hing)f(of)f(the)h(history)f(list)h(for)f(en)m(tries)h(con)m
+(taining)h(a)f(sp)s(eci\014c)f(string.)150 2201 y(Searc)m(hing)28
+b(ma)m(y)g(b)s(e)f(p)s(erformed)f(b)s(oth)h(forw)m(ard)f(and)h(bac)m
+(kw)m(ard)h(from)f(the)h(curren)m(t)f(history)h(p)s(osition.)150
+2310 y(The)j(searc)m(h)h(ma)m(y)g(b)s(e)e Fk(anc)m(hored)p
+Fq(,)i(meaning)g(that)g(the)f(string)h(m)m(ust)f(matc)m(h)h(at)g(the)g
+(b)s(eginning)e(of)i(the)150 2420 y(history)e(en)m(try)-8
+b(.)3350 2599 y([F)g(unction])-3599 b Fh(int)53 b(history_search)d
+Fg(\()p Ff(const)34 b(c)m(har)g(*string,)e(in)m(t)i(direction)p
+Fg(\))390 2708 y Fq(Searc)m(h)29 b(the)g(history)g(for)g
+Fk(string)p Fq(,)g(starting)h(at)f(the)g(curren)m(t)g(history)g
+(o\013set.)41 b(If)28 b Fk(direction)i Fq(is)f(less)390
+2818 y(than)40 b(0,)j(then)c(the)h(searc)m(h)h(is)f(through)f(previous)
+h(en)m(tries,)j(otherwise)d(through)g(subsequen)m(t)390
+2927 y(en)m(tries.)i(If)30 b Fk(string)38 b Fq(is)30
+b(found,)g(then)g(the)g(curren)m(t)h(history)f(index)g(is)g(set)h(to)h
+(that)f(history)f(en)m(try)-8 b(,)390 3037 y(and)33 b(the)g(v)-5
+b(alue)34 b(returned)e(is)i(the)g(o\013set)g(in)f(the)h(line)f(of)h
+(the)g(en)m(try)f(where)g Fk(string)41 b Fq(w)m(as)34
+b(found.)390 3147 y(Otherwise,)c(nothing)h(is)f(c)m(hanged,)h(and)f(a)h
+(-1)g(is)f(returned.)3350 3325 y([F)-8 b(unction])-3599
+b Fh(int)53 b(history_search_prefix)f Fg(\()p Ff(const)34
+b(c)m(har)g(*string,)f(in)m(t)g(direction)p Fg(\))390
+3435 y Fq(Searc)m(h)41 b(the)g(history)f(for)g Fk(string)p
+Fq(,)k(starting)d(at)g(the)g(curren)m(t)f(history)h(o\013set.)72
+b(The)40 b(searc)m(h)h(is)390 3544 y(anc)m(hored:)f(matc)m(hing)31
+b(lines)f(m)m(ust)f(b)s(egin)g(with)g Fk(string)p Fq(.)40
+b(If)29 b Fk(direction)h Fq(is)g(less)f(than)g(0,)i(then)e(the)390
+3654 y(searc)m(h)j(is)f(through)g(previous)g(en)m(tries,)h(otherwise)g
+(through)e(subsequen)m(t)h(en)m(tries.)44 b(If)31 b Fk(string)39
+b Fq(is)390 3764 y(found,)33 b(then)f(the)h(curren)m(t)g(history)g
+(index)g(is)g(set)g(to)h(that)g(en)m(try)-8 b(,)34 b(and)f(the)g
+(return)f(v)-5 b(alue)33 b(is)g(0.)390 3873 y(Otherwise,)d(nothing)h
+(is)f(c)m(hanged,)h(and)f(a)h(-1)g(is)f(returned.)3350
+4052 y([F)-8 b(unction])-3599 b Fh(int)53 b(history_search_pos)e
+Fg(\()p Ff(const)34 b(c)m(har)g(*string,)f(in)m(t)g(direction,)g(in)m
+(t)g(p)s(os)p Fg(\))390 4161 y Fq(Searc)m(h)h(for)g Fk(string)42
+b Fq(in)34 b(the)h(history)f(list,)i(starting)f(at)g
+Fk(p)s(os)p Fq(,)g(an)f(absolute)h(index)e(in)m(to)j(the)e(list.)390
+4271 y(If)i Fk(direction)g Fq(is)g(negativ)m(e,)k(the)c(searc)m(h)h
+(pro)s(ceeds)f(bac)m(kw)m(ard)g(from)g Fk(p)s(os)p Fq(,)h(otherwise)f
+(forw)m(ard.)390 4381 y(Returns)43 b(the)h(absolute)h(index)f(of)g(the)
+g(history)g(elemen)m(t)h(where)f Fk(string)52 b Fq(w)m(as)44
+b(found,)i(or)e(-1)390 4490 y(otherwise.)150 4686 y Fj(2.3.6)63
+b(Managing)41 b(the)g(History)h(File)150 4833 y Fq(The)26
+b(History)h(library)f(can)h(read)g(the)f(history)h(from)f(and)g(write)h
+(it)g(to)g(a)g(\014le.)40 b(This)26 b(section)h(do)s(cumen)m(ts)150
+4942 y(the)k(functions)e(for)i(managing)g(a)g(history)f(\014le.)3350
+5121 y([F)-8 b(unction])-3599 b Fh(int)53 b(read_history)c
+Fg(\()p Ff(const)34 b(c)m(har)g(*\014lename)p Fg(\))390
+5230 y Fq(Add)29 b(the)h(con)m(ten)m(ts)h(of)f Fk(\014lename)k
+Fq(to)d(the)f(history)f(list,)i(a)f(line)g(at)g(a)g(time.)41
+b(If)29 b Fk(\014lename)35 b Fq(is)30 b Fp(NULL)p Fq(,)390
+5340 y(then)g(read)g(from)g Fp(~/.history)p Fq(.)38 b(Returns)30
+b(0)g(if)h(successful,)f(or)g Fp(errno)f Fq(if)i(not.)p
+eop end
+%%Page: 8 11
+TeXDict begin 8 10 bop 150 -116 a Fq(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(History)1780 b(8)3350
+299 y([F)-8 b(unction])-3599 b Fh(int)53 b(read_history_range)e
+Fg(\()p Ff(const)34 b(c)m(har)g(*\014lename,)g(in)m(t)f(from,)g(in)m(t)
+g(to)p Fg(\))390 408 y Fq(Read)28 b(a)g(range)h(of)f(lines)g(from)f
+Fk(\014lename)p Fq(,)i(adding)e(them)h(to)h(the)f(history)g(list.)40
+b(Start)28 b(reading)g(at)390 518 y(line)f Fk(from)e
+Fq(and)h(end)f(at)i Fk(to)p Fq(.)41 b(If)25 b Fk(from)h
+Fq(is)g(zero,)i(start)f(at)g(the)f(b)s(eginning.)39 b(If)26
+b Fk(to)31 b Fq(is)c(less)f(than)g Fk(from)p Fq(,)390
+628 y(then)33 b(read)g(un)m(til)g(the)g(end)g(of)g(the)g(\014le.)49
+b(If)33 b Fk(\014lename)38 b Fq(is)33 b Fp(NULL)p Fq(,)g(then)g(read)g
+(from)f Fp(~/.history)p Fq(.)390 737 y(Returns)d(0)i(if)g(successful,)f
+(or)g Fp(errno)f Fq(if)i(not.)3350 898 y([F)-8 b(unction])-3599
+b Fh(int)53 b(write_history)d Fg(\()p Ff(const)34 b(c)m(har)g
+(*\014lename)p Fg(\))390 1007 y Fq(W)-8 b(rite)36 b(the)e(curren)m(t)h
+(history)f(to)h Fk(\014lename)p Fq(,)h(o)m(v)m(erwriting)g
+Fk(\014lename)k Fq(if)34 b(necessary)-8 b(.)54 b(If)34
+b Fk(\014lename)390 1117 y Fq(is)27 b Fp(NULL)p Fq(,)g(then)g(write)g
+(the)h(history)f(list)g(to)h Fp(~/.history)p Fq(.)37
+b(Returns)26 b(0)i(on)f(success,)h(or)f Fp(errno)f Fq(on)390
+1227 y(a)31 b(read)f(or)g(write)h(error.)3350 1387 y([F)-8
+b(unction])-3599 b Fh(int)53 b(append_history)d Fg(\()p
+Ff(in)m(t)33 b(nelemen)m(ts,)i(const)f(c)m(har)f(*\014lename)p
+Fg(\))390 1497 y Fq(App)s(end)g(the)i(last)g Fk(nelemen)m(ts)k
+Fq(of)c(the)g(history)f(list)i(to)f Fk(\014lename)p Fq(.)54
+b(If)34 b Fk(\014lename)40 b Fq(is)34 b Fp(NULL)p Fq(,)h(then)390
+1606 y(app)s(end)29 b(to)i Fp(~/.history)p Fq(.)38 b(Returns)29
+b(0)i(on)f(success,)h(or)f Fp(errno)f Fq(on)i(a)f(read)h(or)f(write)h
+(error.)3350 1767 y([F)-8 b(unction])-3599 b Fh(int)53
+b(history_truncate_file)f Fg(\()p Ff(const)34 b(c)m(har)g(*\014lename,)
+f(in)m(t)h(nlines)p Fg(\))390 1876 y Fq(T)-8 b(runcate)39
+b(the)f(history)h(\014le)f Fk(\014lename)p Fq(,)j(lea)m(ving)f(only)f
+(the)g(last)g Fk(nlines)j Fq(lines.)65 b(If)38 b Fk(\014lename)44
+b Fq(is)390 1986 y Fp(NULL)p Fq(,)29 b(then)i Fp(~/.history)c
+Fq(is)k(truncated.)40 b(Returns)30 b(0)g(on)h(success,)g(or)f
+Fp(errno)f Fq(on)h(failure.)150 2169 y Fj(2.3.7)63 b(History)41
+b(Expansion)150 2316 y Fq(These)30 b(functions)g(implemen)m(t)h
+(history)f(expansion.)3350 2477 y([F)-8 b(unction])-3599
+b Fh(int)53 b(history_expand)d Fg(\()p Ff(c)m(har)34
+b(*string,)f(c)m(har)h(**output)p Fg(\))390 2586 y Fq(Expand)f
+Fk(string)p Fq(,)j(placing)f(the)f(result)h(in)m(to)g
+Fk(output)p Fq(,)g(a)g(p)s(oin)m(ter)f(to)h(a)g(string)f(\(see)i
+(Section)f(1.1)390 2696 y([History)c(In)m(teraction],)i(page)e(1\).)41
+b(Returns:)390 2839 y Fp(0)432 b Fq(If)37 b(no)g(expansions)g(to)s(ok)i
+(place)f(\(or,)i(if)d(the)h(only)f(c)m(hange)i(in)e(the)g(text)i(w)m
+(as)f(the)870 2949 y(remo)m(v)-5 b(al)31 b(of)g(escap)s(e)f(c)m
+(haracters)i(preceding)e(the)g(history)g(expansion)g(c)m(haracter\);)
+390 3093 y Fp(1)432 b Fq(if)30 b(expansions)g(did)g(tak)m(e)i(place;)
+390 3236 y Fp(-1)384 b Fq(if)30 b(there)h(w)m(as)g(an)f(error)g(in)g
+(expansion;)390 3380 y Fp(2)432 b Fq(if)28 b(the)f(returned)g(line)g
+(should)g(b)s(e)g(displa)m(y)m(ed,)i(but)e(not)h(executed,)h(as)f(with)
+f(the)h Fp(:p)870 3489 y Fq(mo)s(di\014er)h(\(see)j(Section)f(1.1.3)h
+([Mo)s(di\014ers],)e(page)i(2\).)390 3633 y(If)e(an)g(error)g(o)s
+(ccurred)g(in)g(expansion,)g(then)g Fk(output)i Fq(con)m(tains)g(a)f
+(descriptiv)m(e)g(error)f(message.)3350 3793 y([F)-8
+b(unction])-3599 b Fh(char)54 b(*)e(get_history_event)f
+Fg(\()p Ff(const)34 b(c)m(har)g(*string,)e(in)m(t)h(*cindex,)h(in)m(t)
+565 3903 y(qc)m(har)p Fg(\))390 4012 y Fq(Returns)45
+b(the)g(text)i(of)e(the)h(history)f(ev)m(en)m(t)i(b)s(eginning)e(at)h
+Fk(string)53 b Fp(+)45 b Fk(*cindex)p Fq(.)87 b Fk(*cindex)52
+b Fq(is)390 4122 y(mo)s(di\014ed)28 b(to)i(p)s(oin)m(t)f(to)h(after)g
+(the)g(ev)m(en)m(t)h(sp)s(eci\014er.)39 b(A)m(t)31 b(function)e(en)m
+(try)-8 b(,)30 b Fk(cindex)36 b Fq(p)s(oin)m(ts)29 b(to)h(the)390
+4232 y(index)35 b(in)m(to)i Fk(string)44 b Fq(where)35
+b(the)h(history)g(ev)m(en)m(t)h(sp)s(eci\014cation)g(b)s(egins.)57
+b Fk(qc)m(har)42 b Fq(is)36 b(a)g(c)m(haracter)390 4341
+y(that)27 b(is)g(allo)m(w)m(ed)i(to)f(end)e(the)h(ev)m(en)m(t)h(sp)s
+(eci\014cation)g(in)f(addition)g(to)g(the)g(\\normal")h(terminating)390
+4451 y(c)m(haracters.)3350 4611 y([F)-8 b(unction])-3599
+b Fh(char)54 b(**)e(history_tokenize)f Fg(\()p Ff(const)34
+b(c)m(har)g(*string)p Fg(\))390 4721 y Fq(Return)c(an)h(arra)m(y)g(of)g
+(tok)m(ens)h(parsed)e(out)h(of)g Fk(string)p Fq(,)h(m)m(uc)m(h)e(as)i
+(the)f(shell)g(migh)m(t.)43 b(The)30 b(tok)m(ens)390
+4830 y(are)h(split)g(on)f(the)h(c)m(haracters)h(in)e(the)h
+Fk(history)p 2006 4830 28 4 v 40 w(w)m(ord)p 2241 4830
+V 39 w(delimiters)k Fq(v)-5 b(ariable,)32 b(and)e(shell)g(quoting)390
+4940 y(con)m(v)m(en)m(tions)i(are)f(ob)s(ey)m(ed)g(as)f(describ)s(ed)g
+(b)s(elo)m(w.)3350 5101 y([F)-8 b(unction])-3599 b Fh(char)54
+b(*)e(history_arg_extract)f Fg(\()p Ff(in)m(t)34 b(\014rst,)f(in)m(t)g
+(last,)g(const)h(c)m(har)f(*string)p Fg(\))390 5210 y
+Fq(Extract)41 b(a)g(string)f(segmen)m(t)i(consisting)f(of)f(the)h
+Fk(\014rst)g Fq(through)f Fk(last)j Fq(argumen)m(ts)e(presen)m(t)f(in)
+390 5320 y Fk(string)p Fq(.)h(Argumen)m(ts)30 b(are)h(split)f(using)g
+Fp(history_tokenize)p Fq(.)p eop end
+%%Page: 9 12
+TeXDict begin 9 11 bop 150 -116 a Fq(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(History)1780 b(9)150
+299 y Fo(2.4)68 b(History)46 b(V)-11 b(ariables)150 458
+y Fq(This)26 b(section)i(describ)s(es)e(the)h(externally-visible)i(v)-5
+b(ariables)28 b(exp)s(orted)e(b)m(y)h(the)g Fl(gnu)g
+Fq(History)g(Library)-8 b(.)3371 641 y([V)g(ariable])-3598
+b Fh(int)53 b(history_base)390 750 y Fq(The)30 b(logical)j(o\013set)e
+(of)g(the)f(\014rst)g(en)m(try)g(in)h(the)f(history)g(list.)3371
+933 y([V)-8 b(ariable])-3598 b Fh(int)53 b(history_length)390
+1043 y Fq(The)30 b(n)m(um)m(b)s(er)f(of)h(en)m(tries)i(curren)m(tly)e
+(stored)h(in)f(the)g(history)g(list.)3371 1225 y([V)-8
+b(ariable])-3598 b Fh(int)53 b(history_max_entries)390
+1335 y Fq(The)45 b(maxim)m(um)h(n)m(um)m(b)s(er)f(of)h(history)g(en)m
+(tries.)88 b(This)45 b(m)m(ust)h(b)s(e)f(c)m(hanged)i(using)e
+Fp(stifle_)390 1444 y(history\(\))p Fq(.)3371 1627 y([V)-8
+b(ariable])-3598 b Fh(int)53 b(history_write_timesta)q(mps)390
+1736 y Fq(If)44 b(non-zero,)49 b(timestamps)c(are)g(written)g(to)g(the)
+g(history)f(\014le,)49 b(so)c(they)f(can)h(b)s(e)f(preserv)m(ed)390
+1846 y(b)s(et)m(w)m(een)31 b(sessions.)41 b(The)30 b(default)g(v)-5
+b(alue)31 b(is)f(0,)h(meaning)g(that)g(timestamps)g(are)g(not)f(sa)m(v)
+m(ed.)390 1980 y(The)41 b(curren)m(t)g(timestamp)h(format)g(uses)f(the)
+h(v)-5 b(alue)42 b(of)f Fk(history)p 2697 1980 28 4 v
+41 w(commen)m(t)p 3098 1980 V 41 w(c)m(har)48 b Fq(to)42
+b(delimit)390 2090 y(timestamp)h(en)m(tries)g(in)f(the)g(history)h
+(\014le.)76 b(If)42 b(that)h(v)-5 b(ariable)43 b(do)s(es)f(not)g(ha)m
+(v)m(e)i(a)f(v)-5 b(alue)42 b(\(the)390 2199 y(default\),)31
+b(timestamps)g(will)g(not)f(b)s(e)g(written.)3371 2382
+y([V)-8 b(ariable])-3598 b Fh(char)54 b(history_expansion_char)390
+2491 y Fq(The)35 b(c)m(haracter)i(that)e(in)m(tro)s(duces)g(a)h
+(history)f(ev)m(en)m(t.)57 b(The)34 b(default)i(is)f(`)p
+Fp(!)p Fq('.)56 b(Setting)35 b(this)h(to)g(0)390 2601
+y(inhibits)30 b(history)g(expansion.)3371 2783 y([V)-8
+b(ariable])-3598 b Fh(char)54 b(history_subst_char)390
+2893 y Fq(The)40 b(c)m(haracter)i(that)g(in)m(v)m(ok)m(es)g(w)m(ord)f
+(substitution)f(if)h(found)e(at)i(the)g(start)g(of)g(a)g(line.)72
+b(The)390 3003 y(default)31 b(is)f(`)p Fp(^)p Fq('.)3371
+3185 y([V)-8 b(ariable])-3598 b Fh(char)54 b(history_comment_char)390
+3295 y Fq(During)37 b(tok)m(enization,)43 b(if)38 b(this)f(c)m
+(haracter)j(is)e(seen)f(as)h(the)g(\014rst)f(c)m(haracter)j(of)e(a)g(w)
+m(ord,)h(then)390 3404 y(it)44 b(and)e(all)j(subsequen)m(t)d(c)m
+(haracters)j(up)d(to)i(a)g(newline)f(are)h(ignored,)i(suppressing)c
+(history)390 3514 y(expansion)30 b(for)g(the)h(remainder)f(of)g(the)h
+(line.)41 b(This)29 b(is)i(disabled)f(b)m(y)g(default.)3371
+3696 y([V)-8 b(ariable])-3598 b Fh(char)54 b(*)e
+(history_word_delimiter)q(s)390 3806 y Fq(The)27 b(c)m(haracters)i
+(that)f(separate)h(tok)m(ens)f(for)f Fp(history_tokenize\(\))p
+Fq(.)35 b(The)27 b(default)h(v)-5 b(alue)28 b(is)f Fp(")390
+3916 y(\\t\\n\(\)<>;&|")p Fq(.)3371 4098 y([V)-8 b(ariable])-3598
+b Fh(char)54 b(*)e(history_search_delimit)q(er_)q(cha)q(rs)390
+4208 y Fq(The)26 b(list)g(of)g(additional)h(c)m(haracters)h(whic)m(h)e
+(can)g(delimit)h(a)f(history)g(searc)m(h)h(string,)g(in)f(addition)390
+4317 y(to)31 b(space,)g(T)-8 b(AB,)32 b(`)p Fp(:)p Fq(')e(and)g(`)p
+Fp(?)p Fq(')g(in)g(the)h(case)g(of)g(a)g(substring)e(searc)m(h.)41
+b(The)30 b(default)h(is)f(empt)m(y)-8 b(.)3371 4500 y([V)g(ariable])
+-3598 b Fh(char)54 b(*)e(history_no_expand_char)q(s)390
+4609 y Fq(The)29 b(list)i(of)f(c)m(haracters)h(whic)m(h)e(inhibit)h
+(history)g(expansion)f(if)h(found)e(immediately)j(follo)m(wing)390
+4719 y Fk(history)p 672 4719 V 40 w(expansion)p 1104
+4719 V 40 w(c)m(har)p Fq(.)41 b(The)30 b(default)g(is)h(space,)g(tab,)g
+(newline,)f(carriage)i(return,)e(and)g(`)p Fp(=)p Fq('.)3371
+4902 y([V)-8 b(ariable])-3598 b Fh(int)53 b(history_quotes_inhibi)q
+(t_ex)q(pan)q(sio)q(n)390 5011 y Fq(If)33 b(non-zero,)j(the)d(history)h
+(expansion)f(co)s(de)h(implemen)m(ts)g(shell-lik)m(e)i(quoting:)48
+b(single-quoted)390 5121 y(w)m(ords)37 b(are)h(not)g(scanned)f(for)g
+(the)h(history)f(expansion)g(c)m(haracter)i(or)f(the)f(history)h
+(commen)m(t)390 5230 y(c)m(haracter,)48 b(and)42 b(double-quoted)h(w)m
+(ords)g(ma)m(y)g(ha)m(v)m(e)h(history)f(expansion)g(p)s(erformed,)i
+(since)390 5340 y(single)31 b(quotes)g(are)g(not)f(sp)s(ecial)h(within)
+f(double)g(quotes.)41 b(The)30 b(default)h(v)-5 b(alue)30
+b(is)h(0.)p eop end
+%%Page: 10 13
+TeXDict begin 10 12 bop 150 -116 a Fq(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(History)1734 b(10)3371
+299 y([V)-8 b(ariable])-3598 b Fh(int)53 b(history_quoting_state)390
+408 y Fq(An)27 b(application)j(ma)m(y)e(set)g(this)g(v)-5
+b(ariable)29 b(to)f(indicate)h(that)g(the)f(curren)m(t)f(line)h(b)s
+(eing)g(expanded)390 518 y(is)e(sub)5 b(ject)26 b(to)h(existing)g
+(quoting.)40 b(If)26 b(set)g(to)h(`)p Fp(')p Fq(',)g(the)g(history)f
+(expansion)g(function)g(will)g(assume)390 628 y(that)i(the)f(line)h(is)
+f(single-quoted)h(and)f(inhibit)f(expansion)h(un)m(til)h(it)g(reads)e
+(an)i(unquoted)e(closing)390 737 y(single)41 b(quote;)46
+b(if)40 b(set)h(to)f(`)p Fp(")p Fq(',)j(history)e(expansion)f(will)g
+(assume)g(the)g(line)h(is)f(double)g(quoted)390 847 y(un)m(til)26
+b(it)g(reads)f(an)g(unquoted)g(closing)h(double)f(quote.)40
+b(If)25 b(set)g(to)i(zero,)g(the)f(default,)g(the)g(history)390
+956 y(expansion)21 b(function)g(will)g(assume)g(the)g(line)h(is)f(not)g
+(quoted)g(and)g(treat)h(quote)g(c)m(haracters)g(within)390
+1066 y(the)29 b(line)g(as)g(describ)s(ed)f(ab)s(o)m(v)m(e.)42
+b(This)28 b(is)h(only)g(e\013ectiv)m(e)i(if)e Fk(history)p
+2726 1066 28 4 v 40 w(quotes)p 3021 1066 V 40 w(inhibit)p
+3324 1066 V 40 w(expansion)390 1176 y Fq(is)h(set.)3371
+1379 y([V)-8 b(ariable])-3598 b Fh(rl_linebuf_func_t)57
+b(*)c(history_inhibit_expans)q(ion)q(_fu)q(ncti)q(on)390
+1489 y Fq(This)32 b(should)h(b)s(e)f(set)i(to)g(the)g(address)e(of)i(a)
+f(function)g(that)h(tak)m(es)h(t)m(w)m(o)g(argumen)m(ts:)46
+b(a)34 b Fp(char)29 b(*)390 1598 y Fq(\()p Fk(string)8
+b Fq(\))27 b(and)f(an)g Fp(int)g Fq(index)g(in)m(to)i(that)f(string)f
+(\()p Fk(i)5 b Fq(\).)40 b(It)27 b(should)f(return)f(a)i(non-zero)g(v)
+-5 b(alue)27 b(if)g(the)390 1708 y(history)i(expansion)g(starting)h(at)
+g Fk(string[i])j Fq(should)28 b(not)i(b)s(e)e(p)s(erformed;)h(zero)h
+(if)f(the)g(expansion)390 1817 y(should)i(b)s(e)g(done.)45
+b(It)32 b(is)g(in)m(tended)g(for)g(use)g(b)m(y)f(applications)i(lik)m
+(e)h(Bash)e(that)g(use)g(the)g(history)390 1927 y(expansion)e(c)m
+(haracter)i(for)e(additional)i(purp)s(oses.)39 b(By)30
+b(default,)h(this)f(v)-5 b(ariable)31 b(is)g(set)g(to)g
+Fp(NULL)p Fq(.)150 2182 y Fo(2.5)68 b(History)46 b(Programming)g
+(Example)150 2342 y Fq(The)30 b(follo)m(wing)i(program)e(demonstrates)h
+(simple)f(use)g(of)h(the)f Fl(gnu)g Fq(History)h(Library)-8
+b(.)390 2463 y Fe(#include)41 b(<stdio.h>)390 2550 y(#include)g
+(<readline/history.h>)390 2725 y(main)f(\(argc,)h(argv\))586
+2812 y(int)f(argc;)586 2899 y(char)g(**argv;)390 2986
+y({)468 3073 y(char)h(line[1024],)g(*t;)468 3161 y(int)f(len,)g(done)h
+(=)e(0;)468 3335 y(line[0])i(=)f(0;)468 3509 y(using_history)j(\(\);)
+468 3597 y(while)e(\(!done\))547 3684 y({)625 3771 y(printf)g
+(\("history$)g("\);)625 3858 y(fflush)g(\(stdout\);)625
+3945 y(t)f(=)f(fgets)i(\(line,)f(sizeof)h(\(line\))f(-)g(1,)g(stdin\);)
+625 4032 y(if)g(\(t)g(&&)f(*t\))704 4120 y({)782 4207
+y(len)h(=)g(strlen)g(\(t\);)782 4294 y(if)g(\(t[len)h(-)e(1])h(==)f
+('\\n'\))861 4381 y(t[len)h(-)g(1])f(=)h('\\0';)704 4468
+y(})625 4643 y(if)g(\(!t\))704 4730 y(strcpy)g(\(line,)h("quit"\);)625
+4904 y(if)f(\(line[0]\))704 4991 y({)782 5078 y(char)g(*expansion;)782
+5166 y(int)g(result;)782 5340 y(result)h(=)e(history_expand)k(\(line,)d
+(&expansion\);)p eop end
+%%Page: 11 14
+TeXDict begin 11 13 bop 150 -116 a Fq(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(History)1734 b(11)782
+299 y Fe(if)40 b(\(result\))861 386 y(fprintf)h(\(stderr,)g
+("\045s\\n",)f(expansion\);)782 560 y(if)g(\(result)h(<)e(0)h(||)f
+(result)i(==)f(2\))861 648 y({)939 735 y(free)g(\(expansion\);)939
+822 y(continue;)861 909 y(})782 1083 y(add_history)i(\(expansion\);)782
+1171 y(strncpy)f(\(line,)g(expansion,)g(sizeof)g(\(line\))f(-)g(1\);)
+782 1258 y(free)g(\(expansion\);)704 1345 y(})625 1519
+y(if)g(\(strcmp)h(\(line,)f("quit"\))h(==)f(0\))704 1606
+y(done)g(=)f(1;)625 1694 y(else)h(if)g(\(strcmp)h(\(line,)g("save"\))f
+(==)g(0\))704 1781 y(write_history)i(\("history_file"\);)625
+1868 y(else)e(if)g(\(strcmp)h(\(line,)g("read"\))f(==)g(0\))704
+1955 y(read_history)i(\("history_file"\);)625 2042 y(else)e(if)g
+(\(strcmp)h(\(line,)g("list"\))f(==)g(0\))704 2130 y({)782
+2217 y(register)h(HIST_ENTRY)h(**the_list;)782 2304 y(register)f(int)f
+(i;)782 2478 y(the_list)h(=)f(history_list)i(\(\);)782
+2565 y(if)e(\(the_list\))861 2653 y(for)g(\(i)f(=)h(0;)f(the_list[i];)j
+(i++\))939 2740 y(printf)f(\("\045d:)f(\045s\\n",)h(i)e(+)h
+(history_base,)i(the_list[i]->line\);)704 2827 y(})625
+2914 y(else)e(if)g(\(strncmp)h(\(line,)g("delete",)g(6\))f(==)f(0\))704
+3001 y({)782 3088 y(int)h(which;)782 3176 y(if)g(\(\(sscanf)h(\(line)f
+(+)g(6,)g("\045d",)g(&which\)\))h(==)f(1\))861 3263 y({)939
+3350 y(HIST_ENTRY)i(*entry)e(=)g(remove_history)i(\(which\);)939
+3437 y(if)e(\(!entry\))1018 3524 y(fprintf)g(\(stderr,)i("No)d(such)i
+(entry)f(\045d\\n",)h(which\);)939 3611 y(else)1018 3699
+y({)1096 3786 y(free)f(\(entry->line\);)1096 3873 y(free)g(\(entry\);)
+1018 3960 y(})861 4047 y(})782 4134 y(else)861 4222 y({)939
+4309 y(fprintf)h(\(stderr,)g("non-numeric)h(arg)e(given)g(to)g
+(`delete'\\n"\);)861 4396 y(})704 4483 y(})547 4570 y(})390
+4658 y(})p eop end
+%%Page: 12 15
+TeXDict begin 12 14 bop 3659 -116 a Fq(12)150 299 y Fm(App)t(endix)52
+b(A)81 b(GNU)54 b(F)-13 b(ree)53 b(Do)t(cumen)l(tation)e(License)1359
+502 y Fq(V)-8 b(ersion)31 b(1.3,)g(3)g(No)m(v)m(em)m(b)s(er)h(2008)390
+635 y(Cop)m(yrigh)m(t)842 632 y(c)817 635 y Fn(\015)e
+Fq(2000,)j(2001,)f(2002,)g(2007,)h(2008)f(F)-8 b(ree)31
+b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 745
+y Fp(http://fsf.org/)390 964 y Fq(Ev)m(ery)m(one)g(is)g(p)s(ermitted)f
+(to)h(cop)m(y)g(and)f(distribute)g(v)m(erbatim)h(copies)390
+1074 y(of)g(this)f(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f
+(is)f(not)h(allo)m(w)m(ed.)199 1207 y(0.)61 b(PREAMBLE)330
+1340 y(The)37 b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g
+(a)g(man)m(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330
+1450 y(useful)29 b(do)s(cumen)m(t)h Fk(free)36 b Fq(in)29
+b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j
+(the)e(e\013ectiv)m(e)j(freedom)330 1559 y(to)f(cop)m(y)g(and)f
+(redistribute)g(it,)h(with)g(or)f(without)g(mo)s(difying)g(it,)i
+(either)f(commercially)h(or)e(non-)330 1669 y(commercially)-8
+b(.)56 b(Secondarily)-8 b(,)36 b(this)f(License)g(preserv)m(es)g(for)f
+(the)h(author)f(and)g(publisher)f(a)i(w)m(a)m(y)330 1778
+y(to)i(get)g(credit)g(for)f(their)g(w)m(ork,)i(while)e(not)g(b)s(eing)g
+(considered)g(resp)s(onsible)f(for)h(mo)s(di\014cations)330
+1888 y(made)30 b(b)m(y)h(others.)330 2021 y(This)22 b(License)i(is)f(a)
+h(kind)e(of)i(\\cop)m(yleft",)j(whic)m(h)c(means)g(that)h(deriv)-5
+b(ativ)m(e)24 b(w)m(orks)f(of)h(the)f(do)s(cumen)m(t)330
+2131 y(m)m(ust)34 b(themselv)m(es)h(b)s(e)e(free)h(in)g(the)g(same)g
+(sense.)51 b(It)34 b(complemen)m(ts)h(the)f(GNU)g(General)h(Public)330
+2240 y(License,)c(whic)m(h)f(is)h(a)f(cop)m(yleft)i(license)g(designed)
+e(for)g(free)h(soft)m(w)m(are.)330 2373 y(W)-8 b(e)31
+b(ha)m(v)m(e)f(designed)g(this)f(License)h(in)f(order)g(to)i(use)e(it)h
+(for)f(man)m(uals)h(for)f(free)h(soft)m(w)m(are,)h(b)s(ecause)330
+2483 y(free)42 b(soft)m(w)m(are)i(needs)e(free)g(do)s(cumen)m(tation:)
+65 b(a)42 b(free)h(program)f(should)f(come)i(with)f(man)m(uals)330
+2592 y(pro)m(viding)29 b(the)g(same)g(freedoms)f(that)i(the)f(soft)m(w)
+m(are)h(do)s(es.)40 b(But)29 b(this)f(License)i(is)f(not)g(limited)g
+(to)330 2702 y(soft)m(w)m(are)j(man)m(uals;)f(it)g(can)g(b)s(e)f(used)g
+(for)g(an)m(y)h(textual)h(w)m(ork,)f(regardless)g(of)g(sub)5
+b(ject)30 b(matter)i(or)330 2812 y(whether)f(it)h(is)f(published)f(as)i
+(a)f(prin)m(ted)g(b)s(o)s(ok.)44 b(W)-8 b(e)32 b(recommend)f(this)h
+(License)g(principally)f(for)330 2921 y(w)m(orks)f(whose)h(purp)s(ose)d
+(is)j(instruction)f(or)g(reference.)199 3054 y(1.)61
+b(APPLICABILITY)29 b(AND)j(DEFINITIONS)330 3187 y(This)39
+b(License)i(applies)f(to)g(an)m(y)h(man)m(ual)f(or)g(other)g(w)m(ork,)i
+(in)e(an)m(y)g(medium,)i(that)e(con)m(tains)i(a)330 3297
+y(notice)h(placed)f(b)m(y)f(the)h(cop)m(yrigh)m(t)h(holder)e(sa)m(ying)
+h(it)g(can)g(b)s(e)f(distributed)f(under)g(the)i(terms)330
+3407 y(of)c(this)f(License.)62 b(Suc)m(h)37 b(a)h(notice)h(gran)m(ts)f
+(a)g(w)m(orld-wide,)h(ro)m(y)m(alt)m(y-free)i(license,)f(unlimited)d
+(in)330 3516 y(duration,)49 b(to)d(use)f(that)g(w)m(ork)h(under)d(the)j
+(conditions)f(stated)h(herein.)85 b(The)45 b(\\Do)s(cumen)m(t",)330
+3626 y(b)s(elo)m(w,)29 b(refers)f(to)h(an)m(y)g(suc)m(h)f(man)m(ual)h
+(or)f(w)m(ork.)40 b(An)m(y)29 b(mem)m(b)s(er)e(of)i(the)f(public)g(is)g
+(a)h(licensee,)i(and)330 3735 y(is)25 b(addressed)f(as)h(\\y)m(ou".)40
+b(Y)-8 b(ou)26 b(accept)g(the)f(license)h(if)f(y)m(ou)h(cop)m(y)-8
+b(,)27 b(mo)s(dify)d(or)h(distribute)g(the)g(w)m(ork)330
+3845 y(in)30 b(a)h(w)m(a)m(y)g(requiring)f(p)s(ermission)f(under)g(cop)
+m(yrigh)m(t)j(la)m(w.)330 3978 y(A)i(\\Mo)s(di\014ed)f(V)-8
+b(ersion")35 b(of)f(the)g(Do)s(cumen)m(t)g(means)g(an)m(y)g(w)m(ork)f
+(con)m(taining)j(the)e(Do)s(cumen)m(t)g(or)330 4088 y(a)k(p)s(ortion)f
+(of)h(it,)i(either)e(copied)g(v)m(erbatim,)i(or)d(with)h(mo)s
+(di\014cations)f(and/or)h(translated)g(in)m(to)330 4197
+y(another)31 b(language.)330 4330 y(A)26 b(\\Secondary)g(Section")h(is)
+f(a)h(named)e(app)s(endix)f(or)i(a)h(fron)m(t-matter)g(section)g(of)f
+(the)g(Do)s(cumen)m(t)330 4440 y(that)c(deals)g(exclusiv)m(ely)h(with)e
+(the)g(relationship)h(of)f(the)h(publishers)d(or)i(authors)g(of)h(the)f
+(Do)s(cumen)m(t)330 4549 y(to)38 b(the)f(Do)s(cumen)m(t's)i(o)m(v)m
+(erall)g(sub)5 b(ject)37 b(\(or)h(to)g(related)g(matters\))g(and)f(con)
+m(tains)h(nothing)f(that)330 4659 y(could)j(fall)h(directly)g(within)f
+(that)h(o)m(v)m(erall)i(sub)5 b(ject.)70 b(\(Th)m(us,)42
+b(if)e(the)h(Do)s(cumen)m(t)g(is)f(in)g(part)h(a)330
+4769 y(textb)s(o)s(ok)24 b(of)g(mathematics,)j(a)d(Secondary)f(Section)
+h(ma)m(y)g(not)g(explain)g(an)m(y)g(mathematics.\))40
+b(The)330 4878 y(relationship)28 b(could)f(b)s(e)g(a)g(matter)i(of)e
+(historical)i(connection)f(with)f(the)h(sub)5 b(ject)27
+b(or)g(with)g(related)330 4988 y(matters,)38 b(or)d(of)h(legal,)i
+(commercial,)h(philosophical,)f(ethical)f(or)e(p)s(olitical)i(p)s
+(osition)f(regarding)330 5097 y(them.)330 5230 y(The)25
+b(\\In)m(v)-5 b(arian)m(t)27 b(Sections")g(are)f(certain)g(Secondary)g
+(Sections)g(whose)f(titles)i(are)f(designated,)i(as)330
+5340 y(b)s(eing)e(those)h(of)g(In)m(v)-5 b(arian)m(t)27
+b(Sections,)i(in)d(the)h(notice)h(that)f(sa)m(ys)g(that)g(the)g(Do)s
+(cumen)m(t)g(is)g(released)p eop end
+%%Page: 13 16
+TeXDict begin 13 15 bop 150 -116 a Fq(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(13)330 299 y(under)26 b(this)i(License.)40 b(If)27
+b(a)h(section)h(do)s(es)f(not)f(\014t)h(the)g(ab)s(o)m(v)m(e)h
+(de\014nition)e(of)h(Secondary)f(then)h(it)g(is)330 408
+y(not)k(allo)m(w)m(ed)i(to)e(b)s(e)g(designated)g(as)g(In)m(v)-5
+b(arian)m(t.)46 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f(con)m(tain)i(zero)
+e(In)m(v)-5 b(arian)m(t)330 518 y(Sections.)39 b(If)25
+b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)g(an)m(y)g(In)m(v)
+-5 b(arian)m(t)25 b(Sections)h(then)e(there)h(are)g(none.)330
+669 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g(short)
+g(passages)g(of)g(text)g(that)h(are)f(listed,)i(as)d(F)-8
+b(ron)m(t-Co)m(v)m(er)330 778 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m(er)
+j(T)-8 b(exts,)27 b(in)d(the)h(notice)i(that)e(sa)m(ys)h(that)g(the)f
+(Do)s(cumen)m(t)h(is)f(released)g(under)330 888 y(this)h(License.)40
+b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29 b(T)-8 b(ext)26
+b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)g(Bac)m(k-Co)m
+(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 998 y(b)s(e)k(at)h(most)g(25)g(w)m
+(ords.)330 1148 y(A)36 b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g
+(the)f(Do)s(cumen)m(t)h(means)g(a)g(mac)m(hine-readable)h(cop)m(y)-8
+b(,)38 b(represen)m(ted)330 1258 y(in)d(a)h(format)g(whose)g(sp)s
+(eci\014cation)g(is)g(a)m(v)-5 b(ailable)38 b(to)f(the)f(general)g
+(public,)h(that)f(is)g(suitable)g(for)330 1367 y(revising)c(the)g(do)s
+(cumen)m(t)f(straigh)m(tforw)m(ardly)i(with)e(generic)i(text)g(editors)
+f(or)f(\(for)h(images)h(com-)330 1477 y(p)s(osed)23 b(of)h(pixels\))g
+(generic)h(pain)m(t)f(programs)g(or)f(\(for)h(dra)m(wings\))g(some)g
+(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 1587
+y(editor,)k(and)f(that)g(is)g(suitable)h(for)f(input)f(to)i(text)g
+(formatters)f(or)g(for)g(automatic)i(translation)f(to)330
+1696 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input)
+g(to)i(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)g(an)g
+(otherwise)330 1806 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g
+(whose)f(markup,)i(or)e(absence)h(of)g(markup,)g(has)g(b)s(een)f
+(arranged)g(to)330 1915 y(th)m(w)m(art)27 b(or)g(discourage)g
+(subsequen)m(t)f(mo)s(di\014cation)h(b)m(y)g(readers)f(is)g(not)h(T)-8
+b(ransparen)m(t.)39 b(An)27 b(image)330 2025 y(format)35
+b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g
+(substan)m(tial)h(amoun)m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g
+(is)330 2134 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i
+(\\Opaque".)330 2285 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T)
+-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fl(asci)r(i)g
+Fq(without)330 2395 y(markup,)37 b(T)-8 b(exinfo)36 b(input)f(format,)j
+(LaT)1759 2414 y(E)1810 2395 y(X)e(input)f(format,)j
+Fd(SGML)f Fq(or)f Fd(XML)g Fq(using)g(a)g(publicly)330
+2504 y(a)m(v)-5 b(ailable)42 b Fd(DTD)p Fq(,)h(and)c
+(standard-conforming)g(simple)h Fd(HTML)p Fq(,)i(P)m(ostScript)e(or)f
+Fd(PDF)h Fq(designed)330 2614 y(for)e(h)m(uman)f(mo)s(di\014cation.)65
+b(Examples)38 b(of)h(transparen)m(t)f(image)h(formats)g(include)f
+Fd(PNG)p Fq(,)i Fd(X)n(CF)330 2724 y Fq(and)e Fd(JPG)p
+Fq(.)64 b(Opaque)38 b(formats)h(include)f(proprietary)h(formats)f(that)
+h(can)g(b)s(e)f(read)h(and)f(edited)330 2833 y(only)54
+b(b)m(y)f(proprietary)h(w)m(ord)f(pro)s(cessors,)59 b
+Fd(SGML)54 b Fq(or)f Fd(XML)h Fq(for)g(whic)m(h)f(the)h
+Fd(DTD)g Fq(and/or)330 2943 y(pro)s(cessing)61 b(to)s(ols)h(are)f(not)g
+(generally)i(a)m(v)-5 b(ailable,)71 b(and)60 b(the)h(mac)m
+(hine-generated)j Fd(HTML)p Fq(,)330 3052 y(P)m(ostScript)31
+b(or)f Fd(PDF)h Fq(pro)s(duced)d(b)m(y)j(some)f(w)m(ord)g(pro)s
+(cessors)g(for)g(output)g(purp)s(oses)f(only)-8 b(.)330
+3203 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m(ted)f(b)
+s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f(follo)m
+(wing)330 3313 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g(legibly)-8
+b(,)30 b(the)e(material)h(this)e(License)i(requires)e(to)h(app)s(ear)f
+(in)h(the)330 3422 y(title)g(page.)40 b(F)-8 b(or)28
+b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h(an)m(y)e
+(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330
+3532 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s
+(earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330
+3641 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330
+3792 y(The)j(\\publisher")g(means)h(an)m(y)f(p)s(erson)g(or)h(en)m(tit)
+m(y)h(that)f(distributes)f(copies)i(of)e(the)h(Do)s(cumen)m(t)330
+3902 y(to)c(the)g(public.)330 4052 y(A)f(section)h(\\En)m(titled)g
+(XYZ")f(means)f(a)h(named)g(subunit)e(of)h(the)h(Do)s(cumen)m(t)h
+(whose)e(title)i(either)330 4162 y(is)d(precisely)g(XYZ)g(or)f(con)m
+(tains)i(XYZ)f(in)f(paren)m(theses)i(follo)m(wing)g(text)g(that)f
+(translates)h(XYZ)e(in)330 4271 y(another)e(language.)40
+b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g(sp)s(eci\014c)g(section)h(name)f
+(men)m(tioned)h(b)s(elo)m(w,)g(suc)m(h)330 4381 y(as)i(\\Ac)m(kno)m
+(wledgemen)m(ts",)33 b(\\Dedications",)e(\\Endorsemen)m(ts",)e(or)f
+(\\History".\))42 b(T)-8 b(o)29 b(\\Preserv)m(e)330 4491
+y(the)34 b(Title")h(of)e(suc)m(h)h(a)g(section)g(when)f(y)m(ou)h(mo)s
+(dify)e(the)i(Do)s(cumen)m(t)h(means)e(that)h(it)g(remains)g(a)330
+4600 y(section)e(\\En)m(titled)f(XYZ")g(according)g(to)g(this)g
+(de\014nition.)330 4751 y(The)c(Do)s(cumen)m(t)i(ma)m(y)f(include)f(W)
+-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)g(the)g(notice)h(whic)m
+(h)e(states)i(that)330 4861 y(this)34 b(License)g(applies)g(to)h(the)f
+(Do)s(cumen)m(t.)52 b(These)33 b(W)-8 b(arran)m(t)m(y)36
+b(Disclaimers)f(are)g(considered)e(to)330 4970 y(b)s(e)k(included)g(b)m
+(y)g(reference)h(in)g(this)f(License,)j(but)d(only)h(as)g(regards)f
+(disclaiming)i(w)m(arran)m(ties:)330 5080 y(an)m(y)e(other)g
+(implication)i(that)e(these)g(W)-8 b(arran)m(t)m(y)39
+b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g(and)f(has)h(no)330
+5189 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h(this)f(License.)199
+5340 y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)p eop end
+%%Page: 14 17
+TeXDict begin 14 16 bop 150 -116 a Fq(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(14)330 299 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h
+(the)g(Do)s(cumen)m(t)h(in)f(an)m(y)g(medium,)h(either)g(commercially)h
+(or)330 408 y(noncommercially)-8 b(,)48 b(pro)m(vided)42
+b(that)h(this)f(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j
+(and)42 b(the)h(license)330 518 y(notice)37 b(sa)m(ying)g(this)e
+(License)i(applies)e(to)i(the)f(Do)s(cumen)m(t)g(are)g(repro)s(duced)e
+(in)i(all)g(copies,)j(and)330 628 y(that)27 b(y)m(ou)g(add)f(no)h
+(other)f(conditions)h(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f
+(License.)40 b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330
+737 y(tec)m(hnical)35 b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h
+(the)f(reading)g(or)g(further)e(cop)m(ying)j(of)f(the)g(copies)330
+847 y(y)m(ou)25 b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28
+b(y)m(ou)d(ma)m(y)g(accept)h(comp)s(ensation)f(in)f(exc)m(hange)j(for)d
+(copies.)330 956 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f
+(n)m(um)m(b)s(er)f(of)h(copies)h(y)m(ou)f(m)m(ust)h(also)g(follo)m(w)g
+(the)f(conditions)330 1066 y(in)e(section)i(3.)330 1200
+y(Y)-8 b(ou)21 b(ma)m(y)h(also)f(lend)g(copies,)i(under)d(the)h(same)g
+(conditions)g(stated)h(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g
+(publicly)330 1310 y(displa)m(y)31 b(copies.)199 1443
+y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1577 y(If)25
+b(y)m(ou)g(publish)f(prin)m(ted)g(copies)i(\(or)g(copies)g(in)f(media)g
+(that)h(commonly)g(ha)m(v)m(e)g(prin)m(ted)f(co)m(v)m(ers\))i(of)330
+1687 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f
+(100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)f(notice)h(requires)330
+1797 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i
+(the)e(copies)h(in)f(co)m(v)m(ers)i(that)f(carry)-8 b(,)36
+b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 1906 y(these)j(Co)m(v)m
+(er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41
+b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44
+b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330
+2016 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m)
+m(ust)e(also)h(clearly)g(and)f(legibly)h(iden)m(tify)f(y)m(ou)h(as)f
+(the)h(publisher)330 2125 y(of)k(these)h(copies.)53 b(The)34
+b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)f(title)i
+(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 2235 y(equally)e
+(prominen)m(t)e(and)g(visible.)43 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g
+(other)g(material)h(on)f(the)g(co)m(v)m(ers)h(in)e(addition.)330
+2345 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v)
+m(ers,)i(as)d(long)h(as)g(they)f(preserv)m(e)g(the)h(title)g(of)g(the)
+330 2454 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d
+(b)s(e)g(treated)h(as)f(v)m(erbatim)h(cop)m(ying)g(in)f(other)330
+2564 y(resp)s(ects.)330 2698 y(If)32 b(the)h(required)f(texts)i(for)e
+(either)h(co)m(v)m(er)i(are)e(to)s(o)g(v)m(oluminous)g(to)g(\014t)g
+(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 2807 y(the)h(\014rst)f
+(ones)h(listed)g(\(as)h(man)m(y)f(as)g(\014t)g(reasonably\))g(on)g(the)
+g(actual)h(co)m(v)m(er,)h(and)e(con)m(tin)m(ue)h(the)330
+2917 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 3051
+y(If)27 b(y)m(ou)g(publish)e(or)i(distribute)g(Opaque)f(copies)i(of)f
+(the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)f(more)i(than)e(100,)330
+3160 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g
+(T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)g(with)e(eac)m(h)i(Opaque)
+330 3270 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h
+(Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)h(from)d
+(whic)m(h)330 3380 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e
+(has)h(access)i(to)f(do)m(wnload)f(using)g(public-standard)f(net)m(w)m
+(ork)330 3489 y(proto)s(cols)40 b(a)f(complete)h(T)-8
+b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g
+(added)f(material.)67 b(If)330 3599 y(y)m(ou)39 b(use)g(the)g(latter)h
+(option,)h(y)m(ou)f(m)m(ust)e(tak)m(e)j(reasonably)e(pruden)m(t)e
+(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3708 y(distribution)f(of)g
+(Opaque)g(copies)h(in)e(quan)m(tit)m(y)-8 b(,)43 b(to)38
+b(ensure)g(that)h(this)f(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330
+3818 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s
+(cation)h(un)m(til)e(at)h(least)h(one)e(y)m(ear)h(after)g(the)f(last)h
+(time)330 3927 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i
+(\(directly)g(or)e(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))h
+(of)f(that)330 4037 y(edition)31 b(to)g(the)g(public.)330
+4171 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g
+(con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330
+4281 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s
+(er)d(of)i(copies,)h(to)f(giv)m(e)h(them)f(a)g(c)m(hance)h(to)f(pro)m
+(vide)g(y)m(ou)330 4390 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g
+(the)f(Do)s(cumen)m(t.)199 4524 y(4.)61 b(MODIFICA)-8
+b(TIONS)330 4658 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a)
+h(Mo)s(di\014ed)f(V)-8 b(ersion)26 b(of)g(the)g(Do)s(cumen)m(t)g(under)
+e(the)h(conditions)330 4768 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v)
+m(e,)k(pro)m(vided)20 b(that)i(y)m(ou)f(release)i(the)e(Mo)s(di\014ed)f
+(V)-8 b(ersion)22 b(under)d(precisely)330 4877 y(this)29
+b(License,)h(with)f(the)g(Mo)s(di\014ed)f(V)-8 b(ersion)30
+b(\014lling)f(the)g(role)h(of)f(the)g(Do)s(cumen)m(t,)h(th)m(us)f
+(licensing)330 4987 y(distribution)k(and)h(mo)s(di\014cation)g(of)h
+(the)f(Mo)s(di\014ed)f(V)-8 b(ersion)35 b(to)g(who)s(ev)m(er)f(p)s
+(ossesses)f(a)i(cop)m(y)g(of)330 5096 y(it.)41 b(In)30
+b(addition,)h(y)m(ou)f(m)m(ust)h(do)f(these)h(things)f(in)g(the)h(Mo)s
+(di\014ed)e(V)-8 b(ersion:)357 5230 y(A.)60 b(Use)33
+b(in)f(the)h(Title)h(P)m(age)g(\(and)f(on)f(the)h(co)m(v)m(ers,)i(if)e
+(an)m(y\))g(a)g(title)h(distinct)f(from)g(that)g(of)g(the)510
+5340 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f(previous)f(v)m
+(ersions)h(\(whic)m(h)g(should,)g(if)g(there)g(w)m(ere)g(an)m(y)-8
+b(,)p eop end
+%%Page: 15 18
+TeXDict begin 15 17 bop 150 -116 a Fq(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(15)510 299 y(b)s(e)31 b(listed)h(in)f(the)g(History)h(section)g(of)g
+(the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same)
+h(title)h(as)510 408 y(a)e(previous)f(v)m(ersion)g(if)h(the)f(original)
+i(publisher)d(of)h(that)h(v)m(ersion)g(giv)m(es)h(p)s(ermission.)360
+545 y(B.)61 b(List)31 b(on)f(the)h(Title)g(P)m(age,)i(as)d(authors,)h
+(one)g(or)f(more)h(p)s(ersons)e(or)h(en)m(tities)j(resp)s(onsible)c
+(for)510 655 y(authorship)c(of)h(the)h(mo)s(di\014cations)f(in)g(the)g
+(Mo)s(di\014ed)f(V)-8 b(ersion,)28 b(together)g(with)d(at)i(least)h
+(\014v)m(e)510 765 y(of)c(the)g(principal)g(authors)f(of)i(the)f(Do)s
+(cumen)m(t)g(\(all)h(of)g(its)f(principal)g(authors,)h(if)f(it)g(has)g
+(few)m(er)510 874 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g
+(y)m(ou)g(from)f(this)g(requiremen)m(t.)359 1011 y(C.)60
+b(State)32 b(on)e(the)h(Title)h(page)f(the)g(name)g(of)g(the)g
+(publisher)e(of)i(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)32
+b(as)f(the)510 1121 y(publisher.)355 1258 y(D.)61 b(Preserv)m(e)31
+b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f(of)g(the)f(Do)s(cumen)m(t.)
+363 1395 y(E.)60 b(Add)30 b(an)i(appropriate)f(cop)m(yrigh)m(t)i
+(notice)f(for)g(y)m(our)f(mo)s(di\014cations)g(adjacen)m(t)i(to)f(the)g
+(other)510 1504 y(cop)m(yrigh)m(t)g(notices.)365 1641
+y(F.)61 b(Include,)28 b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g
+(notices,)h(a)e(license)h(notice)g(giving)g(the)f(public)510
+1751 y(p)s(ermission)23 b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8
+b(ersion)25 b(under)e(the)i(terms)f(of)h(this)f(License,)j(in)d(the)g
+(form)510 1861 y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353
+1998 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f
+(full)g(lists)g(of)g(In)m(v)-5 b(arian)m(t)23 b(Sections)h(and)e
+(required)g(Co)m(v)m(er)510 2107 y(T)-8 b(exts)31 b(giv)m(en)g(in)f
+(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2244
+y(H.)60 b(Include)30 b(an)g(unaltered)g(cop)m(y)h(of)g(this)f(License.)
+392 2381 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g
+(\\History",)h(Preserv)m(e)f(its)f(Title,)i(and)d(add)h(to)h(it)f(an)g
+(item)510 2491 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d
+(authors,)i(and)e(publisher)f(of)j(the)f(Mo)s(di\014ed)f(V)-8
+b(ersion)510 2600 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45
+b(If)31 b(there)h(is)f(no)g(section)i(En)m(titled)f(\\History")h(in)e
+(the)g(Do)s(cu-)510 2710 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f
+(title,)i(y)m(ear,)g(authors,)f(and)e(publisher)f(of)i(the)g(Do)s
+(cumen)m(t)510 2819 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i
+(then)d(add)g(an)g(item)g(describing)g(the)g(Mo)s(di\014ed)g(V)-8
+b(ersion)37 b(as)510 2929 y(stated)31 b(in)f(the)h(previous)f(sen)m
+(tence.)378 3066 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s
+(cation,)i(if)d(an)m(y)-8 b(,)34 b(giv)m(en)f(in)g(the)f(Do)s(cumen)m
+(t)h(for)g(public)e(access)j(to)510 3176 y(a)e(T)-8 b(ransparen)m(t)30
+b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m(ewise)h(the)g(net)
+m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3285 y(the)g(Do)s(cumen)m
+(t)g(for)g(previous)f(v)m(ersions)h(it)g(w)m(as)g(based)f(on.)45
+b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3395
+y(\\History")27 b(section.)40 b(Y)-8 b(ou)25 b(ma)m(y)h(omit)g(a)f(net)
+m(w)m(ork)h(lo)s(cation)g(for)f(a)h(w)m(ork)f(that)g(w)m(as)h
+(published)510 3504 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e
+(the)h(Do)s(cumen)m(t)h(itself,)h(or)d(if)h(the)g(original)h(publisher)
+d(of)i(the)510 3614 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s
+(ermission.)354 3751 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m
+(titled)h(\\Ac)m(kno)m(wledgemen)m(ts")i(or)d(\\Dedications",)k
+(Preserv)m(e)c(the)g(Title)510 3861 y(of)j(the)f(section,)j(and)d
+(preserv)m(e)h(in)f(the)h(section)g(all)h(the)e(substance)h(and)f(tone)
+h(of)f(eac)m(h)i(of)f(the)510 3970 y(con)m(tributor)k(ac)m(kno)m
+(wledgemen)m(ts)i(and/or)d(dedications)h(giv)m(en)h(therein.)368
+4107 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5
+b(arian)m(t)36 b(Sections)g(of)f(the)h(Do)s(cumen)m(t,)h(unaltered)f
+(in)f(their)g(text)i(and)510 4217 y(in)f(their)g(titles.)58
+b(Section)37 b(n)m(um)m(b)s(ers)d(or)i(the)g(equiv)-5
+b(alen)m(t)38 b(are)e(not)g(considered)g(part)g(of)g(the)510
+4326 y(section)c(titles.)341 4463 y(M.)61 b(Delete)33
+b(an)m(y)e(section)h(En)m(titled)f(\\Endorsemen)m(ts".)42
+b(Suc)m(h)30 b(a)i(section)f(ma)m(y)h(not)f(b)s(e)f(included)510
+4573 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357
+4710 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f
+(to)g(b)s(e)f(En)m(titled)h(\\Endorsemen)m(ts")g(or)f(to)h(con\015ict)g
+(in)510 4819 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31
+b(Section.)354 4956 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 5121 y(If)h(the)g(Mo)s(di\014ed)g
+(V)-8 b(ersion)34 b(includes)f(new)g(fron)m(t-matter)i(sections)f(or)f
+(app)s(endices)g(that)h(qualify)330 5230 y(as)28 b(Secondary)g
+(Sections)g(and)f(con)m(tain)j(no)d(material)j(copied)e(from)f(the)h
+(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)330 5340 y(y)m(our)k(option)h
+(designate)h(some)e(or)h(all)g(of)f(these)h(sections)h(as)e(in)m(v)-5
+b(arian)m(t.)48 b(T)-8 b(o)33 b(do)f(this,)h(add)f(their)p
+eop end
+%%Page: 16 19
+TeXDict begin 16 18 bop 150 -116 a Fq(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(16)330 299 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5
+b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8
+b(ersion's)36 b(license)g(notice.)57 b(These)330 408
+y(titles)32 b(m)m(ust)e(b)s(e)g(distinct)h(from)e(an)m(y)i(other)g
+(section)g(titles.)330 551 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section)
+i(En)m(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g
+(nothing)g(but)330 661 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s
+(di\014ed)g(V)-8 b(ersion)31 b(b)m(y)e(v)-5 b(arious)30
+b(parties|for)g(example,)g(statemen)m(ts)i(of)330 770
+y(p)s(eer)27 b(review)g(or)g(that)h(the)f(text)i(has)d(b)s(een)h(appro)
+m(v)m(ed)g(b)m(y)g(an)h(organization)h(as)e(the)h(authoritativ)m(e)330
+880 y(de\014nition)i(of)h(a)f(standard.)330 1022 y(Y)-8
+b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g(up)e(to)i(\014v)m(e)g(w)m
+(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er)30 b(T)-8
+b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 1132 y(to)g(25)g(w)m(ords)e
+(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext,)29 b(to)f(the)f(end)f(of)i
+(the)f(list)h(of)f(Co)m(v)m(er)h(T)-8 b(exts)27 b(in)g(the)h(Mo)s
+(di\014ed)330 1241 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f
+(F)-8 b(ron)m(t-Co)m(v)m(er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m
+(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1351
+y(added)27 b(b)m(y)g(\(or)h(through)f(arrangemen)m(ts)h(made)g(b)m(y\))
+g(an)m(y)g(one)f(en)m(tit)m(y)-8 b(.)42 b(If)27 b(the)h(Do)s(cumen)m(t)
+g(already)330 1461 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g
+(same)h(co)m(v)m(er,)h(previously)e(added)f(b)m(y)h(y)m(ou)g(or)g(b)m
+(y)g(arrangemen)m(t)330 1570 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m
+(y)i(y)m(ou)f(are)f(acting)i(on)e(b)s(ehalf)f(of,)j(y)m(ou)f(ma)m(y)g
+(not)f(add)g(another;)j(but)330 1680 y(y)m(ou)c(ma)m(y)h(replace)g(the)
+f(old)g(one,)i(on)e(explicit)h(p)s(ermission)e(from)g(the)i(previous)e
+(publisher)f(that)330 1789 y(added)e(the)g(old)h(one.)330
+1932 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s
+(cumen)m(t)h(do)g(not)f(b)m(y)h(this)f(License)h(giv)m(e)h(p)s
+(ermission)330 2041 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g
+(for)h(or)f(to)h(assert)g(or)f(imply)g(endorsemen)m(t)g(of)h(an)m(y)g
+(Mo)s(di\014ed)330 2151 y(V)-8 b(ersion.)199 2293 y(5.)61
+b(COMBINING)31 b(DOCUMENTS)330 2436 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m
+(bine)h(the)f(Do)s(cumen)m(t)g(with)g(other)f(do)s(cumen)m(ts)h
+(released)g(under)f(this)g(License,)330 2545 y(under)f(the)h(terms)g
+(de\014ned)f(in)h(section)h(4)g(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)f
+(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2655
+y(include)25 b(in)g(the)g(com)m(bination)i(all)f(of)g(the)f(In)m(v)-5
+b(arian)m(t)26 b(Sections)g(of)g(all)g(of)f(the)h(original)g(do)s
+(cumen)m(ts,)330 2765 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g
+(as)g(In)m(v)-5 b(arian)m(t)28 b(Sections)f(of)g(y)m(our)g(com)m(bined)
+g(w)m(ork)f(in)h(its)g(license)330 2874 y(notice,)32
+b(and)e(that)h(y)m(ou)f(preserv)m(e)h(all)g(their)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 3017 y(The)e(com)m(bined)g(w)m
+(ork)h(need)e(only)i(con)m(tain)g(one)g(cop)m(y)g(of)f(this)g(License,)
+i(and)d(m)m(ultiple)i(iden)m(tical)330 3126 y(In)m(v)-5
+b(arian)m(t)33 b(Sections)g(ma)m(y)g(b)s(e)f(replaced)h(with)f(a)h
+(single)g(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)g(In)m
+(v)-5 b(arian)m(t)330 3236 y(Sections)27 b(with)g(the)g(same)g(name)g
+(but)f(di\013eren)m(t)h(con)m(ten)m(ts,)i(mak)m(e)f(the)f(title)h(of)f
+(eac)m(h)h(suc)m(h)f(section)330 3345 y(unique)33 b(b)m(y)h(adding)f
+(at)i(the)f(end)g(of)g(it,)h(in)f(paren)m(theses,)i(the)e(name)g(of)g
+(the)g(original)h(author)f(or)330 3455 y(publisher)23
+b(of)i(that)h(section)g(if)f(kno)m(wn,)h(or)f(else)h(a)f(unique)f(n)m
+(um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330
+3565 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5
+b(arian)m(t)26 b(Sections)f(in)f(the)g(license)i(notice)g(of)e(the)h
+(com)m(bined)330 3674 y(w)m(ork.)330 3817 y(In)41 b(the)g(com)m
+(bination,)46 b(y)m(ou)41 b(m)m(ust)g(com)m(bine)h(an)m(y)g(sections)g
+(En)m(titled)g(\\History")h(in)e(the)g(v)-5 b(ari-)330
+3926 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h
+(En)m(titled)g(\\History";)i(lik)m(ewise)f(com)m(bine)f(an)m(y)330
+4036 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31
+b(an)m(y)h(sections)h(En)m(titled)g(\\Dedications".)47
+b(Y)-8 b(ou)330 4145 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m
+(titled)f(\\Endorsemen)m(ts.")199 4288 y(6.)61 b(COLLECTIONS)28
+b(OF)i(DOCUMENTS)330 4430 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f
+(collection)i(consisting)f(of)f(the)g(Do)s(cumen)m(t)g(and)g(other)g
+(do)s(cumen)m(ts)f(released)330 4540 y(under)41 b(this)h(License,)k
+(and)c(replace)h(the)g(individual)f(copies)h(of)f(this)g(License)h(in)f
+(the)h(v)-5 b(arious)330 4650 y(do)s(cumen)m(ts)42 b(with)g(a)h(single)
+g(cop)m(y)h(that)f(is)f(included)g(in)g(the)h(collection,)48
+b(pro)m(vided)42 b(that)i(y)m(ou)330 4759 y(follo)m(w)38
+b(the)g(rules)e(of)h(this)g(License)h(for)f(v)m(erbatim)h(cop)m(ying)g
+(of)f(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)h(all)330
+4869 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32
+b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h
+(collection,)i(and)d(distribute)g(it)h(individu-)330
+5121 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g
+(a)g(cop)m(y)h(of)f(this)g(License)g(in)m(to)h(the)g(extracted)330
+5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g
+(other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330
+5340 y(that)d(do)s(cumen)m(t.)p eop end
+%%Page: 17 20
+TeXDict begin 17 19 bop 150 -116 a Fq(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(17)199 299 y(7.)61 b(A)m(GGREGA)-8 b(TION)32 b(WITH)e(INDEPENDENT)h
+(W)m(ORKS)330 441 y(A)d(compilation)i(of)e(the)g(Do)s(cumen)m(t)h(or)f
+(its)g(deriv)-5 b(ativ)m(es)30 b(with)d(other)i(separate)g(and)e(indep)
+s(enden)m(t)330 551 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h
+(on)f(a)g(v)m(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g
+(is)h(called)330 661 y(an)c(\\aggregate")k(if)c(the)g(cop)m(yrigh)m(t)i
+(resulting)e(from)f(the)i(compilation)g(is)f(not)h(used)e(to)i(limit)g
+(the)330 770 y(legal)d(righ)m(ts)f(of)g(the)g(compilation's)h(users)e
+(b)s(ey)m(ond)g(what)g(the)h(individual)f(w)m(orks)g(p)s(ermit.)39
+b(When)330 880 y(the)g(Do)s(cumen)m(t)g(is)f(included)g(in)g(an)g
+(aggregate,)44 b(this)38 b(License)h(do)s(es)f(not)h(apply)f(to)h(the)g
+(other)330 989 y(w)m(orks)30 b(in)g(the)h(aggregate)i(whic)m(h)d(are)h
+(not)g(themselv)m(es)g(deriv)-5 b(ativ)m(e)32 b(w)m(orks)f(of)f(the)h
+(Do)s(cumen)m(t.)330 1132 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8
+b(ext)23 b(requiremen)m(t)g(of)g(section)h(3)f(is)g(applicable)h(to)f
+(these)h(copies)f(of)g(the)g(Do)s(cumen)m(t,)330 1241
+y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f(than)g(one)h(half)f
+(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s(cumen)m(t's)g(Co)m(v)m
+(er)330 1351 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)h(on)g(co)m(v)m
+(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)f(the)h
+(aggregate,)j(or)d(the)330 1461 y(electronic)37 b(equiv)-5
+b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m(t)h(is)f
+(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330
+1570 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f
+(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1713 y(8.)61
+b(TRANSLA)-8 b(TION)330 1855 y(T)g(ranslation)41 b(is)f(considered)f(a)
+i(kind)e(of)h(mo)s(di\014cation,)j(so)d(y)m(ou)g(ma)m(y)h(distribute)e
+(translations)330 1965 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h
+(terms)h(of)f(section)i(4.)83 b(Replacing)45 b(In)m(v)-5
+b(arian)m(t)45 b(Sections)g(with)330 2074 y(translations)h(requires)f
+(sp)s(ecial)h(p)s(ermission)f(from)g(their)g(cop)m(yrigh)m(t)i
+(holders,)i(but)c(y)m(ou)g(ma)m(y)330 2184 y(include)24
+b(translations)i(of)e(some)h(or)g(all)g(In)m(v)-5 b(arian)m(t)25
+b(Sections)g(in)f(addition)h(to)g(the)g(original)h(v)m(ersions)330
+2293 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44
+b(Y)-8 b(ou)32 b(ma)m(y)g(include)f(a)h(translation)g(of)g(this)f
+(License,)i(and)d(all)j(the)330 2403 y(license)42 b(notices)g(in)f(the)
+h(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42
+b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2513
+y(also)f(include)f(the)g(original)h(English)f(v)m(ersion)g(of)g(this)g
+(License)h(and)e(the)h(original)h(v)m(ersions)g(of)330
+2622 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33
+b(case)i(of)g(a)f(disagreemen)m(t)h(b)s(et)m(w)m(een)g(the)f
+(translation)i(and)330 2732 y(the)f(original)i(v)m(ersion)e(of)h(this)f
+(License)h(or)f(a)g(notice)i(or)e(disclaimer,)i(the)f(original)g(v)m
+(ersion)g(will)330 2841 y(prev)-5 b(ail.)330 2984 y(If)28
+b(a)h(section)h(in)e(the)h(Do)s(cumen)m(t)h(is)e(En)m(titled)i(\\Ac)m
+(kno)m(wledgemen)m(ts",)i(\\Dedications",)g(or)d(\\His-)330
+3093 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m
+(e)g(its)f(Title)i(\(section)f(1\))g(will)g(t)m(ypically)h(require)330
+3203 y(c)m(hanging)j(the)g(actual)h(title.)199 3345 y(9.)61
+b(TERMINA)-8 b(TION)330 3488 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8
+b(,)31 b(mo)s(dify)-8 b(,)30 b(sublicense,)g(or)g(distribute)f(the)h
+(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3598 y(pro)m(vided)38
+b(under)f(this)i(License.)65 b(An)m(y)39 b(attempt)h(otherwise)f(to)g
+(cop)m(y)-8 b(,)42 b(mo)s(dify)-8 b(,)40 b(sublicense,)h(or)330
+3707 y(distribute)30 b(it)h(is)f(v)m(oid,)h(and)f(will)h(automatically)
+i(terminate)f(y)m(our)e(righ)m(ts)h(under)e(this)h(License.)330
+3850 y(Ho)m(w)m(ev)m(er,)35 b(if)e(y)m(ou)f(cease)i(all)f(violation)i
+(of)d(this)g(License,)i(then)e(y)m(our)h(license)g(from)f(a)h
+(particular)330 3959 y(cop)m(yrigh)m(t)k(holder)e(is)h(reinstated)h
+(\(a\))f(pro)m(visionally)-8 b(,)39 b(unless)c(and)g(un)m(til)h(the)g
+(cop)m(yrigh)m(t)h(holder)330 4069 y(explicitly)42 b(and)e(\014nally)h
+(terminates)g(y)m(our)g(license,)j(and)c(\(b\))h(p)s(ermanen)m(tly)-8
+b(,)43 b(if)e(the)g(cop)m(yrigh)m(t)330 4178 y(holder)34
+b(fails)h(to)g(notify)g(y)m(ou)g(of)f(the)h(violation)h(b)m(y)e(some)h
+(reasonable)g(means)g(prior)e(to)i(60)h(da)m(ys)330 4288
+y(after)31 b(the)f(cessation.)330 4430 y(Moreo)m(v)m(er,)k(y)m(our)d
+(license)i(from)e(a)h(particular)f(cop)m(yrigh)m(t)i(holder)e(is)h
+(reinstated)g(p)s(ermanen)m(tly)f(if)330 4540 y(the)d(cop)m(yrigh)m(t)h
+(holder)f(noti\014es)g(y)m(ou)g(of)g(the)g(violation)h(b)m(y)f(some)g
+(reasonable)h(means,)f(this)g(is)g(the)330 4650 y(\014rst)f(time)i(y)m
+(ou)f(ha)m(v)m(e)h(receiv)m(ed)g(notice)g(of)f(violation)i(of)e(this)f
+(License)i(\(for)f(an)m(y)g(w)m(ork\))g(from)f(that)330
+4759 y(cop)m(yrigh)m(t)33 b(holder,)g(and)e(y)m(ou)h(cure)g(the)g
+(violation)i(prior)d(to)i(30)f(da)m(ys)h(after)f(y)m(our)g(receipt)h
+(of)f(the)330 4869 y(notice.)330 5011 y(T)-8 b(ermination)28
+b(of)g(y)m(our)f(righ)m(ts)h(under)e(this)i(section)g(do)s(es)f(not)h
+(terminate)h(the)e(licenses)i(of)f(parties)330 5121 y(who)38
+b(ha)m(v)m(e)h(receiv)m(ed)h(copies)e(or)h(righ)m(ts)f(from)g(y)m(ou)g
+(under)f(this)h(License.)64 b(If)38 b(y)m(our)g(righ)m(ts)h(ha)m(v)m(e)
+330 5230 y(b)s(een)25 b(terminated)i(and)e(not)h(p)s(ermanen)m(tly)g
+(reinstated,)i(receipt)f(of)f(a)g(cop)m(y)h(of)f(some)h(or)f(all)h(of)f
+(the)330 5340 y(same)31 b(material)h(do)s(es)e(not)g(giv)m(e)i(y)m(ou)f
+(an)m(y)g(righ)m(ts)f(to)i(use)e(it.)p eop end
+%%Page: 18 21
+TeXDict begin 18 20 bop 150 -116 a Fq(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(18)154 299 y(10.)61 b(FUTURE)30 b(REVISIONS)f(OF)i(THIS)e(LICENSE)330
+433 y(The)41 b(F)-8 b(ree)43 b(Soft)m(w)m(are)f(F)-8
+b(oundation)43 b(ma)m(y)f(publish)e(new,)k(revised)d(v)m(ersions)h(of)g
+(the)g(GNU)g(F)-8 b(ree)330 543 y(Do)s(cumen)m(tation)34
+b(License)e(from)g(time)h(to)g(time.)46 b(Suc)m(h)31
+b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h(in)g(spirit)330
+653 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)m(y)h(di\013er)f
+(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i(concerns.)330
+762 y(See)c Fp(http://www.gnu.org/copy)o(left)o(/)p Fq(.)330
+897 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m(en)g(a)g
+(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39 b(If)29
+b(the)g(Do)s(cumen)m(t)330 1006 y(sp)s(eci\014es)45 b(that)h(a)g
+(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g(License)h
+(\\or)g(an)m(y)g(later)g(v)m(ersion")330 1116 y(applies)33
+b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f(follo)m(wing)i
+(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330
+1225 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m
+(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g
+(b)m(y)330 1335 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8
+b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s
+(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 1445
+y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m
+(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the)
+h(F)-8 b(ree)330 1554 y(Soft)m(w)m(are)33 b(F)-8 b(oundation.)46
+b(If)32 b(the)g(Do)s(cumen)m(t)g(sp)s(eci\014es)g(that)g(a)h(pro)m(xy)f
+(can)g(decide)g(whic)m(h)g(future)330 1664 y(v)m(ersions)h(of)g(this)f
+(License)h(can)g(b)s(e)f(used,)g(that)i(pro)m(xy's)e(public)g(statemen)
+m(t)i(of)f(acceptance)i(of)e(a)330 1773 y(v)m(ersion)e(p)s(ermanen)m
+(tly)f(authorizes)h(y)m(ou)g(to)g(c)m(ho)s(ose)g(that)g(v)m(ersion)g
+(for)f(the)h(Do)s(cumen)m(t.)154 1908 y(11.)61 b(RELICENSING)330
+2042 y(\\Massiv)m(e)39 b(Multiauthor)f(Collab)s(oration)g(Site")h(\(or)
+e(\\MMC)h(Site"\))h(means)e(an)m(y)h(W)-8 b(orld)37 b(Wide)330
+2152 y(W)-8 b(eb)36 b(serv)m(er)g(that)h(publishes)d(cop)m(yrigh)m
+(table)k(w)m(orks)e(and)f(also)i(pro)m(vides)e(prominen)m(t)h
+(facilities)330 2262 y(for)27 b(an)m(yb)s(o)s(dy)g(to)h(edit)g(those)g
+(w)m(orks.)39 b(A)28 b(public)f(wiki)h(that)g(an)m(yb)s(o)s(dy)e(can)i
+(edit)g(is)f(an)h(example)g(of)330 2371 y(suc)m(h)33
+b(a)h(serv)m(er.)51 b(A)34 b(\\Massiv)m(e)i(Multiauthor)e(Collab)s
+(oration")h(\(or)f(\\MMC"\))h(con)m(tained)g(in)f(the)330
+2481 y(site)d(means)f(an)m(y)h(set)g(of)g(cop)m(yrigh)m(table)h(w)m
+(orks)e(th)m(us)g(published)f(on)h(the)h(MMC)f(site.)330
+2615 y(\\CC-BY-SA")36 b(means)f(the)g(Creativ)m(e)i(Commons)e(A)m
+(ttribution-Share)g(Alik)m(e)i(3.0)f(license)g(pub-)330
+2725 y(lished)27 b(b)m(y)f(Creativ)m(e)j(Commons)d(Corp)s(oration,)h(a)
+g(not-for-pro\014t)g(corp)s(oration)h(with)e(a)h(principal)330
+2834 y(place)g(of)f(business)e(in)i(San)f(F)-8 b(rancisco,)29
+b(California,)f(as)e(w)m(ell)h(as)f(future)f(cop)m(yleft)i(v)m(ersions)
+f(of)g(that)330 2944 y(license)31 b(published)e(b)m(y)h(that)h(same)g
+(organization.)330 3078 y(\\Incorp)s(orate")h(means)e(to)h(publish)e
+(or)i(republish)e(a)i(Do)s(cumen)m(t,)g(in)g(whole)g(or)f(in)g(part,)h
+(as)g(part)330 3188 y(of)g(another)f(Do)s(cumen)m(t.)330
+3323 y(An)c(MMC)g(is)h(\\eligible)h(for)e(relicensing")h(if)g(it)f(is)h
+(licensed)f(under)f(this)h(License,)i(and)e(if)g(all)h(w)m(orks)330
+3432 y(that)43 b(w)m(ere)f(\014rst)f(published)f(under)h(this)h
+(License)g(somewhere)g(other)g(than)g(this)g(MMC,)h(and)330
+3542 y(subsequen)m(tly)34 b(incorp)s(orated)h(in)f(whole)h(or)g(in)f
+(part)h(in)m(to)h(the)f(MMC,)g(\(1\))h(had)e(no)h(co)m(v)m(er)h(texts)
+330 3651 y(or)30 b(in)m(v)-5 b(arian)m(t)32 b(sections,)g(and)d(\(2\))j
+(w)m(ere)f(th)m(us)f(incorp)s(orated)g(prior)g(to)h(No)m(v)m(em)m(b)s
+(er)g(1,)g(2008.)330 3786 y(The)40 b(op)s(erator)h(of)g(an)f(MMC)h
+(Site)g(ma)m(y)g(republish)e(an)h(MMC)h(con)m(tained)h(in)e(the)h(site)
+g(under)330 3895 y(CC-BY-SA)30 b(on)g(the)h(same)f(site)h(at)g(an)m(y)g
+(time)g(b)s(efore)e(August)h(1,)h(2009,)h(pro)m(vided)e(the)g(MMC)h(is)
+330 4005 y(eligible)h(for)e(relicensing.)p eop end
+%%Page: 19 22
+TeXDict begin 19 21 bop 150 -116 a Fq(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(19)150 299 y Fo(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g(this)h(License)f
+(for)g(y)l(our)g(do)t(cumen)l(ts)150 458 y Fq(T)-8 b(o)35
+b(use)f(this)h(License)g(in)f(a)h(do)s(cumen)m(t)g(y)m(ou)f(ha)m(v)m(e)
+i(written,)g(include)f(a)f(cop)m(y)i(of)f(the)f(License)h(in)g(the)150
+568 y(do)s(cumen)m(t)30 b(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh)
+m(t)g(and)e(license)h(notices)g(just)f(after)h(the)g(title)h(page:)468
+680 y Fe(Copyright)42 b(\(C\))79 b Fc(year)g(your)40
+b(name)p Fe(.)468 767 y(Permission)i(is)e(granted)g(to)g(copy,)h
+(distribute)g(and/or)g(modify)f(this)g(document)468 854
+y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i
+(License,)f(Version)g(1.3)468 941 y(or)f(any)g(later)g(version)h
+(published)h(by)d(the)h(Free)g(Software)h(Foundation;)468
+1029 y(with)g(no)e(Invariant)j(Sections,)f(no)f(Front-Cover)h(Texts,)g
+(and)f(no)f(Back-Cover)468 1116 y(Texts.)80 b(A)40 b(copy)g(of)g(the)f
+(license)i(is)f(included)h(in)f(the)g(section)g(entitled)h(``GNU)468
+1203 y(Free)g(Documentation)h(License''.)275 1337 y Fq(If)d(y)m(ou)h
+(ha)m(v)m(e)h(In)m(v)-5 b(arian)m(t)41 b(Sections,)i(F)-8
+b(ron)m(t-Co)m(v)m(er)42 b(T)-8 b(exts)41 b(and)e(Bac)m(k-Co)m(v)m(er)k
+(T)-8 b(exts,)43 b(replace)e(the)150 1447 y(\\with)6
+b(.)22 b(.)g(.)12 b(T)-8 b(exts.")41 b(line)31 b(with)f(this:)547
+1559 y Fe(with)40 b(the)g(Invariant)h(Sections)g(being)g
+Fc(list)f(their)g(titles)p Fe(,)h(with)547 1646 y(the)f(Front-Cover)i
+(Texts)e(being)g Fc(list)p Fe(,)h(and)f(with)g(the)g(Back-Cover)h
+(Texts)547 1733 y(being)f Fc(list)p Fe(.)275 1868 y Fq(If)34
+b(y)m(ou)i(ha)m(v)m(e)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(without)f
+(Co)m(v)m(er)h(T)-8 b(exts,)38 b(or)d(some)g(other)h(com)m(bination)g
+(of)g(the)150 1978 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g
+(alternativ)m(es)i(to)e(suit)f(the)h(situation.)275 2112
+y(If)23 b(y)m(our)h(do)s(cumen)m(t)f(con)m(tains)i(non)m(trivial)g
+(examples)g(of)f(program)f(co)s(de,)j(w)m(e)e(recommend)g(releasing)150
+2222 y(these)44 b(examples)f(in)g(parallel)h(under)e(y)m(our)h(c)m
+(hoice)i(of)e(free)g(soft)m(w)m(are)h(license,)k(suc)m(h)43
+b(as)g(the)g(GNU)150 2331 y(General)31 b(Public)f(License,)i(to)f(p)s
+(ermit)e(their)i(use)f(in)g(free)g(soft)m(w)m(are.)p
+eop end
+%%Page: 20 23
+TeXDict begin 20 22 bop 150 -116 a Fq(App)s(endix)29
+b(B:)i(Concept)f(Index)2391 b(20)150 100 y Fm(App)t(endix)52
+b(B)81 b(Concept)51 b(Index)146 434 y Fo(A)150 550 y
+Fb(anc)n(hored)26 b(searc)n(h)12 b Fa(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)27 b Fb(7)146 782 y Fo(E)150
+898 y Fb(ev)n(en)n(t)e(designators)7 b Fa(:)14 b(:)f(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)22 b Fb(1)146 1140 y Fo(H)150
+1256 y Fb(history)k(ev)n(en)n(ts)12 b Fa(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)27 b Fb(1)150
+1344 y(history)f(expansion)18 b Fa(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)34 b Fb(1)150 1431 y(History)26 b(Searc)n(hing)16
+b Fa(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)31
+b Fb(7)p eop end
+%%Page: 21 24
+TeXDict begin 21 23 bop 150 -116 a Fq(App)s(endix)29
+b(C:)h(F)-8 b(unction)31 b(and)f(V)-8 b(ariable)32 b(Index)1832
+b(21)150 100 y Fm(App)t(endix)52 b(C)81 b(F)-13 b(unction)52
+b(and)h(V)-13 b(ariable)53 b(Index)150 400 y Fe(history_base)10
+b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)25 b Fb(9)150 487 y Fe(history_comment_char)7 b Fa(:)17
+b(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)22 b Fb(9)150 574 y Fe
+(history_expansion_char)i Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34
+b Fb(9)150 661 y Fe(history_inhibit_expansion_fun)q(ctio)q(n)26
+b Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)34 b Fb(10)150
+749 y Fe(history_length)25 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)37 b Fb(9)150 836 y Fe(history_max_entries)9
+b Fa(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)24 b Fb(9)150
+923 y Fe(history_no_expand_chars)16 b Fa(:)i(:)c(:)f(:)g(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)31
+b Fb(9)150 1010 y Fe(history_quotes_inhibit_expans)q(ion)11
+b Fa(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)25
+b Fb(9)150 1097 y Fe(history_quoting_state)f Fa(:)13
+b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)33 b Fb(10)150 1184 y Fe
+(history_search_delimiter_char)q(s)15 b Fa(:)k(:)13 b(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)30 b Fb(9)150 1272 y Fe
+(history_subst_char)12 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+27 b Fb(9)150 1359 y Fe(history_word_delimiters)16 b
+Fa(:)i(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)31 b Fb(9)150 1446 y Fe(history_write_timestamps)13
+b Fa(:)19 b(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)28 b Fb(9)p eop end
+%%Trailer
+
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/doc/history.texi b/doc/history.texi
new file mode 100644
index 0000000..721118b
--- /dev/null
+++ b/doc/history.texi
@@ -0,0 +1,85 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header (This is for running Texinfo on a region.)
+@setfilename history.info
+@settitle GNU History Library
+@include version.texi
+
+@c %**end of header (This is for running Texinfo on a region.)
+
+@copying
+This document describes the GNU History library
+(version @value{VERSION}, @value{UPDATED}),
+a programming tool that provides a consistent user interface for
+recalling lines of previously typed input.
+
+Copyright @copyright{} 1988--2022 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+
+@end quotation
+@end copying
+
+@dircategory Libraries
+@direntry
+* History: (history). The GNU history library API.
+@end direntry
+
+@titlepage
+@title GNU History Library
+@subtitle Edition @value{EDITION}, for @code{History Library} Version @value{VERSION}.
+@subtitle @value{UPDATED-MONTH}
+@author Chet Ramey, Case Western Reserve University
+@author Brian Fox, Free Software Foundation
+
+@page
+
+@vskip 0pt plus 1filll
+@insertcopying
+
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top GNU History Library
+
+This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+
+@menu
+* Using History Interactively:: GNU History User's Manual.
+* Programming with GNU History:: GNU History Programmer's Manual.
+* GNU Free Documentation License:: License for copying this manual.
+* Concept Index:: Index of concepts described in this manual.
+* Function and Variable Index:: Index of externally visible functions
+ and variables.
+@end menu
+@end ifnottex
+
+@syncodeindex fn vr
+
+@include hsuser.texi
+@include hstech.texi
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+
+@include fdl.texi
+
+@node Concept Index
+@appendix Concept Index
+@printindex cp
+
+@node Function and Variable Index
+@appendix Function and Variable Index
+@printindex vr
+
+@bye
diff --git a/doc/history_3.ps b/doc/history_3.ps
new file mode 100644
index 0000000..4440b3f
--- /dev/null
+++ b/doc/history_3.ps
@@ -0,0 +1,896 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.22.4
+%%CreationDate: Fri Sep 23 09:52:37 2022
+%%DocumentNeededResources: font Times-Roman
+%%+ font Times-Bold
+%%+ font Times-Italic
+%%DocumentSuppliedResources: procset grops 1.22 4
+%%Pages: 7
+%%PageOrder: Ascend
+%%DocumentMedia: Default 612 792 0 () ()
+%%Orientation: Portrait
+%%EndComments
+%%BeginDefaults
+%%PageMedia: Default
+%%EndDefaults
+%%BeginProlog
+%%BeginResource: procset grops 1.22 4
+%!PS-Adobe-3.0 Resource-ProcSet
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/MANUAL{
+statusdict begin/manualfeed true store end
+}bind def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+DEFS/BPhook known{DEFS begin BPhook end}if
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/Fr{
+setrgbcolor fill
+}bind def
+/setcmykcolor where{
+pop
+/Fk{
+setcmykcolor fill
+}bind def
+}if
+/Fg{
+setgray fill
+}bind def
+/FL/fill load def
+/LW/setlinewidth load def
+/Cr/setrgbcolor load def
+/setcmykcolor where{
+pop
+/Ck/setcmykcolor load def
+}if
+/Cg/setgray load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne
+2 index/UniqueID ne
+and
+{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+/setpagedevice{}def
+mark
+}bind def
+/PEND{
+cleartomark
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%BeginFeature: *PageSize Default
+<< /PageSize [ 612 792 ] /ImagingBBox null >> setpagedevice
+%%EndFeature
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Times-Bold
+%%IncludeResource: font Times-Italic
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72
+def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron
+/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent
+/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen
+/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
+/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O
+/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex
+/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y
+/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft
+/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl
+/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen
+/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft
+/logicalnot/minus/registered/macron/degree/plusminus/twosuperior
+/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
+/ordmasculine/guilsinglright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
+/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
+/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash
+/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def
+/Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE
+/Times-Roman@0 ENC0/Times-Roman RE
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library)
+-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E/F1
+10.95/Times-Bold@0 SF -.219(NA)72 84 S(ME).219 E F0
+(history \255 GNU History Library)108 96 Q F1(COPYRIGHT)72 112.8 Q F0
+(The GNU History Library is Cop)108 124.8 Q
+(yright \251 1989-2020 by the Free Softw)-.1 E(are F)-.1 E
+(oundation, Inc.)-.15 E F1(DESCRIPTION)72 141.6 Q F0(Man)108 153.6 Q
+2.81(yp)-.15 G .31(rograms read input from the user a line at a time.)
+-2.81 F .309(The GNU History library is able to k)5.309 F .309
+(eep track of)-.1 F .024(those lines, associate arbitrary data with eac\
+h line, and utilize information from pre)108 165.6 R .024
+(vious lines in composing)-.25 F(ne)108 177.6 Q 2.5(wo)-.25 G(nes.)-2.5
+E F1(HIST)72 194.4 Q(OR)-.197 E 2.738(YE)-.383 G(XP)-2.738 E(ANSION)-.81
+E F0 .823(The history library supports a history e)108 206.4 R .822
+(xpansion feature that is identical to the history e)-.15 F .822
+(xpansion in)-.15 F/F2 10/Times-Bold@0 SF(bash.)3.322 E F0
+(This section describes what syntax features are a)108 218.4 Q -.25(va)
+-.2 G(ilable.).25 E 1.305(History e)108 235.2 R 1.305
+(xpansions introduce w)-.15 F 1.306(ords from the history list into the\
+ input stream, making it easy to repeat)-.1 F .21
+(commands, insert the ar)108 247.2 R .21(guments to a pre)-.18 F .209
+(vious command into the current input line, or \214x errors in pre)-.25
+F(vious)-.25 E(commands quickly)108 259.2 Q(.)-.65 E 1.296(History e)108
+276 R 1.297(xpansion is usually performed immediately after a complete \
+line is read.)-.15 F 1.297(It tak)6.297 F 1.297(es place in tw)-.1 F(o)
+-.1 E 2.855(parts. The)108 288 R .354(\214rst is to determine which lin\
+e from the history list to use during substitution.)2.855 F .354
+(The second is to)5.354 F .116
+(select portions of that line for inclusion into the current one.)108
+300 R .117(The line selected from the history is the)5.116 F/F3 10
+/Times-Italic@0 SF -.15(ev)2.617 G(ent).15 E F0(,)A .846
+(and the portions of that line that are acted upon are)108 312 R F3(wor)
+3.346 E(ds)-.37 E F0 5.846(.V)C(arious)-6.956 E F3(modi\214er)3.346 E(s)
+-.1 E F0 .846(are a)3.346 F -.25(va)-.2 G .845(ilable to manipulate).25
+F .304(the selected w)108 324 R 2.804(ords. The)-.1 F .304(line is brok)
+2.804 F .304(en into w)-.1 F .304(ords in the same f)-.1 F .304
+(ashion as)-.1 F F2(bash)2.804 E F0 .305(does when reading input, so)
+2.804 F .539(that se)108 336 R -.15(ve)-.25 G .539(ral w).15 F .539
+(ords that w)-.1 F .539
+(ould otherwise be separated are considered one w)-.1 F .538
+(ord when surrounded by quotes)-.1 F .307(\(see the description of)108
+348 R F2(history_tok)2.807 E(enize\(\))-.1 E F0(belo)2.807 E 2.807
+(w\). History)-.25 F -.15(ex)2.807 G .307
+(pansions are introduced by the appearance of).15 F .52(the history e)
+108 360 R .52(xpansion character)-.15 F 3.02(,w)-.4 G .52(hich is)-3.02
+F F2(!)3.853 E F0 .52(by def)3.853 F 3.02(ault. Only)-.1 F .52
+(backslash \()3.02 F F2(\\).833 E F0 3.02(\)a).833 G .52
+(nd single quotes can quote the)-3.02 F(history e)108 372 Q
+(xpansion character)-.15 E(.)-.55 E F2(Ev)87 388.8 Q(ent Designators)-.1
+E F0 .204(An e)108 400.8 R -.15(ve)-.25 G .204(nt designator is a refer\
+ence to a command line entry in the history list.).15 F .205
+(Unless the reference is abso-)5.204 F(lute, e)108 412.8 Q -.15(ve)-.25
+G(nts are relati).15 E .3 -.15(ve t)-.25 H 2.5(ot).15 G
+(he current position in the history list.)-2.5 E F2(!)108 429.6 Q F0
+(Start a history substitution, e)144 429.6 Q(xcept when follo)-.15 E
+(wed by a)-.25 E F2(blank)2.5 E F0 2.5(,n)C -.25(ew)-2.5 G
+(line, = or \(.).25 E F2(!)108 441.6 Q F3(n)A F0(Refer to command line)
+144 441.6 Q F3(n)2.86 E F0(.).24 E F2<21ad>108 453.6 Q F3(n)A F0
+(Refer to the current command minus)144 453.6 Q F3(n)2.86 E F0(.).24 E
+F2(!!)108 465.6 Q F0(Refer to the pre)144 465.6 Q(vious command.)-.25 E
+(This is a synon)5 E(ym for `!\2551'.)-.15 E F2(!)108 477.6 Q F3(string)
+A F0 .865(Refer to the most recent command preceding the current positi\
+on in the history list starting with)144 477.6 R F3(string)144.34 489.6
+Q F0(.).22 E F2(!?)108 501.6 Q F3(string)A F2([?])A F0 1.503(Refer to t\
+he most recent command preceding the current position in the history li\
+st containing)144 513.6 R F3(string)144.34 525.6 Q F0 5.497(.T).22 G
+.497(he trailing)-5.497 F F2(?)2.997 E F0 .497(may be omitted if)2.997 F
+F3(string)3.337 E F0 .496(is follo)3.216 F .496(wed immediately by a ne)
+-.25 F 2.996(wline. If)-.25 F F3(string)2.996 E F0(is)2.996 E .39(missi\
+ng, the string from the most recent search is used; it is an error if t\
+here is no pre)144 537.6 R .391(vious search)-.25 F(string.)144 549.6 Q
+/F4 12/Times-Bold@0 SF(^)108 566.6 Q F3(string1)-5 I F4(^)5 I F3
+(string2)-5 I F4(^)5 I F0 2.599(Quick substitution.)144 573.6 R 2.598
+(Repeat the last command, replacing)7.599 F F3(string1)5.438 E F0(with)
+5.098 E F3(string2)5.438 E F0 7.598(.E).02 G(qui)-7.598 E -.25(va)-.25 G
+2.598(lent to).25 F -.74(``)144 585.6 S(!!:s).74 E/F5 12/Times-Roman@0
+SF(^)5 I F3(string1)-5 I F5(^)5 I F3(string2)-5 I F5(^)5 I F0 1.48 -.74
+('' \()-5 L(see).74 E F2(Modi\214ers)2.5 E F0(belo)2.5 E(w\).)-.25 E F2
+(!#)108 597.6 Q F0(The entire command line typed so f)144 597.6 Q(ar)-.1
+E(.)-.55 E F2 -.75(Wo)87 614.4 S(rd Designators).75 E F0 -.8(Wo)108
+626.4 S 1.313(rd designators are used to select desired w).8 F 1.314
+(ords from the e)-.1 F -.15(ve)-.25 G 3.814(nt. A).15 F F2(:)3.814 E F0
+1.314(separates the e)3.814 F -.15(ve)-.25 G 1.314(nt speci\214cation)
+.15 F .53(from the w)108 638.4 R .529(ord designator)-.1 F 5.529(.I)-.55
+G 3.029(tm)-5.529 G .529(ay be omitted if the w)-3.029 F .529
+(ord designator be)-.1 F .529(gins with a)-.15 F F2(^)3.029 E F0(,)A F2
+($)3.029 E F0(,)A F2(*)3.029 E F0(,)A F2<ad>3.029 E F0 3.029(,o)C(r)
+-3.029 E F2(%)3.029 E F0 5.529(.W)C(ords)-6.329 E .515
+(are numbered from the be)108 650.4 R .516
+(ginning of the line, with the \214rst w)-.15 F .516
+(ord being denoted by 0 \(zero\).)-.1 F -.8(Wo)5.516 G .516(rds are in-)
+.8 F(serted into the current line separated by single spaces.)108 662.4
+Q F2 2.5(0\()108 679.2 S(zer)-2.5 E(o\))-.18 E F0(The zeroth w)144 691.2
+Q 2.5(ord. F)-.1 F(or the shell, this is the command w)-.15 E(ord.)-.1 E
+F3(n)108.36 703.2 Q F0(The)144 703.2 Q F3(n)2.5 E F0(th w)A(ord.)-.1 E
+F2(^)108 715.2 Q F0(The \214rst ar)144 715.2 Q 2.5(gument. That)-.18 F
+(is, w)2.5 E(ord 1.)-.1 E(GNU History 8.1)72 768 Q(2020 July 17)139.005
+E(1)203.165 E 0 Cg EP
+%%Page: 2 2
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library)
+-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E/F1
+10/Times-Bold@0 SF($)108 84 Q F0 .064(The last w)144 84 R 2.564
+(ord. This)-.1 F .064(is usually the last ar)2.564 F .064(gument, b)-.18
+F .064(ut will e)-.2 F .064(xpand to the zeroth w)-.15 F .063
+(ord if there is only)-.1 F(one w)144 96 Q(ord in the line.)-.1 E F1(%)
+108 108 Q F0 1.419(The \214rst w)144 108 R 1.419
+(ord matched by the most recent `?)-.1 F/F2 10/Times-Italic@0 SF(string)
+A F0 1.42(?' search, if the search string be)B 1.42(gins with a)-.15 F
+(character that is part of a w)144 120 Q(ord.)-.1 E F2(x)108.77 132 Q F1
+<ad>A F2(y)A F0 2.5(Ar)144 132 S(ange of w)-2.5 E(ords; `\255)-.1 E F2
+(y)A F0 2.5('a)C(bbre)-2.5 E(viates `0\255)-.25 E F2(y)A F0('.)A F1(*)
+108 144 Q F0 .316(All of the w)144 144 R .316(ords b)-.1 F .316
+(ut the zeroth.)-.2 F .315(This is a synon)5.315 F .315(ym for `)-.15 F
+F2(1\255$)A F0 2.815('. It)B .315(is not an error to use)2.815 F F1(*)
+2.815 E F0 .315(if there is)2.815 F(just one w)144 156 Q(ord in the e)
+-.1 E -.15(ve)-.25 G(nt; the empty string is returned in that case.).15
+E F1(x*)108 168 Q F0(Abbre)144 168 Q(viates)-.25 E F2(x\255$)2.5 E F0(.)
+A F1<78ad>108 180 Q F0(Abbre)144 180 Q(viates)-.25 E F2(x\255$)2.5 E F0
+(lik)2.5 E(e)-.1 E F1(x*)2.5 E F0 2.5(,b)C(ut omits the last w)-2.7 E
+2.5(ord. If)-.1 F F1(x)2.5 E F0(is missing, it def)2.5 E(aults to 0.)-.1
+E(If a w)108 196.8 Q(ord designator is supplied without an e)-.1 E -.15
+(ve)-.25 G(nt speci\214cation, the pre).15 E
+(vious command is used as the e)-.25 E -.15(ve)-.25 G(nt.).15 E F1
+(Modi\214ers)87 213.6 Q F0 .183(After the optional w)108 225.6 R .183
+(ord designator)-.1 F 2.683(,t)-.4 G .184
+(here may appear a sequence of one or more of the follo)-2.683 F .184
+(wing modi\214ers,)-.25 F(each preceded by a `:'.)108 237.6 Q
+(These modify)5 E 2.5(,o)-.65 G 2.5(re)-2.5 G(dit, the w)-2.5 E
+(ord or w)-.1 E(ords selected from the history e)-.1 E -.15(ve)-.25 G
+(nt.).15 E F1(h)108 254.4 Q F0(Remo)144 254.4 Q .3 -.15(ve a t)-.15 H
+(railing \214le name component, lea).15 E(ving only the head.)-.2 E F1
+(t)108 266.4 Q F0(Remo)144 266.4 Q .3 -.15(ve a)-.15 H
+(ll leading \214le name components, lea).15 E(ving the tail.)-.2 E F1(r)
+108 278.4 Q F0(Remo)144 278.4 Q .3 -.15(ve a t)-.15 H(railing suf).15 E
+(\214x of the form)-.25 E F2(.xxx)2.5 E F0 2.5(,l)C(ea)-2.5 E
+(ving the basename.)-.2 E F1(e)108 290.4 Q F0(Remo)144 290.4 Q .3 -.15
+(ve a)-.15 H(ll b).15 E(ut the trailing suf)-.2 E(\214x.)-.25 E F1(p)108
+302.4 Q F0(Print the ne)144 302.4 Q 2.5(wc)-.25 G(ommand b)-2.5 E
+(ut do not e)-.2 E -.15(xe)-.15 G(cute it.).15 E F1(q)108 314.4 Q F0
+(Quote the substituted w)144 314.4 Q
+(ords, escaping further substitutions.)-.1 E F1(x)108 326.4 Q F0 .386
+(Quote the substituted w)144 326.4 R .386(ords as with)-.1 F F1(q)2.886
+E F0 2.886(,b)C .386(ut break into w)-3.086 F .385(ords at)-.1 F F1
+(blanks)2.885 E F0 .385(and ne)2.885 F 2.885(wlines. The)-.25 F F1(q)
+2.885 E F0(and)2.885 E F1(x)2.885 E F0(modi\214ers are mutually e)144
+338.4 Q(xclusi)-.15 E -.15(ve)-.25 G 2.5(;t).15 G
+(he last one supplied is used.)-2.5 E F1(s/)108 350.4 Q F2(old)A F1(/)A
+F2(ne)A(w)-.15 E F1(/)A F0(Substitute)144 362.4 Q F2(ne)3.328 E(w)-.15 E
+F0 .469(for the \214rst occurrence of)3.278 F F2(old)3.199 E F0 .469
+(in the e)3.739 F -.15(ve)-.25 G .469(nt line.).15 F(An)5.469 E 2.969
+(yc)-.15 G .469(haracter may be used as the)-2.969 F .954
+(delimiter in place of /.)144 374.4 R .953
+(The \214nal delimiter is optional if it is the last character of the e)
+5.953 F -.15(ve)-.25 G .953(nt line.).15 F .131
+(The delimiter may be quoted in)144 386.4 R F2(old)2.861 E F0(and)3.401
+E F2(ne)2.991 E(w)-.15 E F0 .131(with a single backslash.)2.941 F .131
+(If & appears in)5.131 F F2(ne)2.991 E(w)-.15 E F0 2.631(,i).31 G 2.631
+(ti)-2.631 G 2.631(sr)-2.631 G(e-)-2.631 E .62(placed by)144 398.4 R F2
+(old)3.349 E F0 5.619(.A).77 G .619(single backslash will quote the &.)
+-2.5 F(If)5.619 E F2(old)3.349 E F0 .619(is null, it is set to the last)
+3.889 F F2(old)3.349 E F0(substi-)3.889 E .486(tuted, or)144 410.4 R
+2.986(,i)-.4 G 2.986(fn)-2.986 G 2.986(op)-2.986 G(re)-2.986 E .486
+(vious history substitutions took place, the last)-.25 F F2(string)3.326
+E F0 .487(in a)3.206 F F1(!?)2.987 E F2(string)A F1([?])A F0 2.987
+(search. If)5.487 F F2(ne)144.36 422.4 Q(w)-.15 E F0
+(is null, each matching)2.81 E F2(old)2.73 E F0(is deleted.)3.27 E F1(&)
+108 434.4 Q F0(Repeat the pre)144 434.4 Q(vious substitution.)-.25 E F1
+(g)108 446.4 Q F0 .398(Cause changes to be applied o)144 446.4 R -.15
+(ve)-.15 G 2.898(rt).15 G .398(he entire e)-2.898 F -.15(ve)-.25 G .398
+(nt line.).15 F .397(This is used in conjunction with `)5.398 F F1(:s)A
+F0 2.897('\()C(e.g.,)-2.897 E(`)144 458.4 Q F1(:gs/)A F2(old)A F1(/)A F2
+(ne)A(w)-.15 E F1(/)A F0 .35('\) or `)B F1(:&)A F0 2.85('. If)B .35
+(used with `)2.85 F F1(:s)A F0 .35(', an)B 2.85(yd)-.15 G .351
+(elimiter can be used in place of /, and the \214nal de-)-2.85 F
+(limiter is optional if it is the last character of the e)144 470.4 Q
+-.15(ve)-.25 G(nt line.).15 E(An)5 E F1(a)2.5 E F0
+(may be used as a synon)2.5 E(ym for)-.15 E F1(g)2.5 E F0(.)A F1(G)108
+482.4 Q F0(Apply the follo)144 482.4 Q(wing `)-.25 E F1(s)A F0 2.5('o)C
+2.5(r`)-2.5 G F1(&)-2.5 E F0 2.5('m)C(odi\214er once to each w)-2.5 E
+(ord in the e)-.1 E -.15(ve)-.25 G(nt line.).15 E/F3 10.95/Times-Bold@0
+SF(PR)72 499.2 Q(OGRAMMING WITH HIST)-.329 E(OR)-.197 E 2.738(YF)-.383 G
+(UNCTIONS)-2.738 E F0(This section describes ho)108 511.2 Q 2.5(wt)-.25
+G 2.5(ou)-2.5 G(se the History library in other programs.)-2.5 E F1
+(Intr)87 528 Q(oduction to History)-.18 E F0 2.883(Ap)108 540 S .383
+(rogrammer using the History library has a)-2.883 F -.25(va)-.2 G .382
+(ilable functions for remembering lines on a history list, as-).25 F .77
+(sociating arbitrary data with a line, remo)108 552 R .771
+(ving lines from the list, searching through the list for a line con-)
+-.15 F .303(taining an arbitrary te)108 564 R .303
+(xt string, and referencing an)-.15 F 2.803(yl)-.15 G .303
+(ine in the list directly)-2.803 F 5.303(.I)-.65 G 2.803(na)-5.303 G
+.303(ddition, a history)-2.803 F F2 -.2(ex)2.802 G(pansion).2 E F0
+(function is a)108 576 Q -.25(va)-.2 G(ilable which pro).25 E
+(vides for a consistent user interf)-.15 E(ace across dif)-.1 E
+(ferent programs.)-.25 E .059(The user using programs written with the \
+History library has the bene\214t of a consistent user interf)108 592.8
+R .059(ace with a)-.1 F .918(set of well-kno)108 604.8 R .917
+(wn commands for manipulating the te)-.25 F .917(xt of pre)-.15 F .917
+(vious lines and using that te)-.25 F .917(xt in ne)-.15 F 3.417(wc)-.25
+G(om-)-3.417 E 4.183(mands. The)108 616.8 R 1.684(basic history manipul\
+ation commands are identical to the history substitution pro)4.183 F
+1.684(vided by)-.15 F F1(bash)108 628.8 Q F0(.)A 1.154
+(The programmer can also use the readline library)108 645.6 R 3.654(,w)
+-.65 G 1.153(hich includes some history manipulation by def)-3.654 F
+(ault,)-.1 E(and has the added adv)108 657.6 Q
+(antage of command line editing.)-.25 E .39(Before declaring an)108
+674.4 R 2.89(yf)-.15 G .39(unctions using an)-2.89 F 2.89(yf)-.15 G .39
+(unctionality the History library pro)-2.89 F .39
+(vides in other code, an appli-)-.15 F .067
+(cation writer should include the \214le)108 686.4 R F2(<r)4.233 E
+(eadline/history)-.37 E(.h>)-.55 E F0 .067(in an)4.233 F 2.566<798c>-.15
+G .066(le that uses the History library')-2.566 F 2.566(sf)-.55 G
+(eatures.)-2.566 E .538(It supplies e)108 698.4 R .538
+(xtern declarations for all of the library')-.15 F 3.038(sp)-.55 G .538
+(ublic functions and v)-3.038 F .539(ariables, and declares all of the)
+-.25 F(public data structures.)108 710.4 Q(GNU History 8.1)72 768 Q
+(2020 July 17)139.005 E(2)203.165 E 0 Cg EP
+%%Page: 3 3
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library)
+-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E/F1
+10/Times-Bold@0 SF(History Storage)87 84 Q F0
+(The history list is an array of history entries.)108 96 Q 2.5(Ah)5 G
+(istory entry is declared as follo)-2.5 E(ws:)-.25 E/F2 10
+/Times-Italic@0 SF(typedef void *)108 112.8 Q F1(histdata_t;)2.5 E F0
+(typedef struct _hist_entry {)108 129.6 Q(char *line;)113 141.6 Q
+(char *timestamp;)113 153.6 Q(histdata_t data;)113 165.6 Q 2.5(}H)108
+177.6 S(IST_ENTR)-2.5 E -.92(Y;)-.65 G
+(The history list itself might therefore be declared as)108 194.4 Q F2
+(HIST_ENTR)108 211.2 Q 2.5(Y*)-.18 G(*)-2.5 E F1(the_history_list;)2.5 E
+F0(The state of the History library is encapsulated into a single struc\
+ture:)108 228 Q(/*)108 244.8 Q 2.5(*As)110.5 256.8 S
+(tructure used to pass around the current state of the history)-2.5 E(.)
+-.65 E(*/)110.5 268.8 Q(typedef struct _hist_state {)108 280.8 Q
+(HIST_ENTR)113 292.8 Q 2.5(Y*)-.65 G
+(*entries; /* Pointer to the entries themselv)-2.5 E(es. */)-.15 E
+(int of)113 304.8 Q 25(fset; /*)-.25 F
+(The location pointer within this array)2.5 E 2.5(.*)-.65 G(/)-2.5 E
+(int length;)113 316.8 Q(/* Number of elements within this array)27.5 E
+2.5(.*)-.65 G(/)-2.5 E(int size;)113 328.8 Q
+(/* Number of slots allocated to this array)32.5 E 2.5(.*)-.65 G(/)-2.5
+E(int \215ags;)113 340.8 Q 2.5(}H)108 352.8 S(IST)-2.5 E(OR)-.18 E(Y_ST)
+-.65 E -1.11(AT)-.93 G(E;)1.11 E(If the \215ags member includes)108
+369.6 Q F1(HS_STIFLED)2.5 E F0 2.5(,t)C(he history has been sti\215ed.)
+-2.5 E/F3 10.95/Times-Bold@0 SF(History Functions)72 386.4 Q F0
+(This section describes the calling sequence for the v)108 398.4 Q
+(arious functions e)-.25 E(xported by the GNU History library)-.15 E(.)
+-.65 E F1(Initializing History and State Management)87 415.2 Q F0 1.274
+(This section describes functions used to initialize and manage the sta\
+te of the History library when you)108 427.2 R -.1(wa)108 439.2 S
+(nt to use the history functions in your program.).1 E F2(void)108 463.2
+Q F1(using_history)2.5 E F0(\()4.166 E F2(void)A F0(\))1.666 E(Be)108
+475.2 Q(gin a session in which the history functions might be used.)-.15
+E(This initializes the interacti)5 E .3 -.15(ve v)-.25 H(ariables.)-.1 E
+F2(HIST)108 499.2 Q(OR)-.18 E(Y_ST)-.18 E -.37(AT)-.5 G 2.5(E*).37 G F1
+(history_get_history_state)A F0(\()4.166 E F2(void)A F0(\))1.666 E
+(Return a structure describing the current state of the input history)
+108 511.2 Q(.)-.65 E F2(void)108 535.2 Q F1(history_set_history_state)
+2.5 E F0(\()4.166 E F2(HIST)A(OR)-.18 E(Y_ST)-.18 E -.37(AT)-.5 G 2.5
+(E*).37 G(state)-2.5 E F0(\))1.666 E
+(Set the state of the history list according to)108 547.2 Q F2(state)2.5
+E F0(.)A F1(History List Management)87 576 Q F0
+(These functions manage indi)108 588 Q(vidual entries on the history li\
+st, or set parameters managing the list itself.)-.25 E F2(void)108 612 Q
+F1(add_history)2.5 E F0(\()4.166 E F2(const c)A(har *string)-.15 E F0
+(\))1.666 E(Place)108 624 Q F2(string)3.279 E F0 .779
+(at the end of the history list.)3.279 F .779
+(The associated data \214eld \(if an)5.779 F .779(y\) is set to)-.15 F
+F1(NULL)3.279 E F0 5.779(.I)C 3.279(ft)-5.779 G .78(he maxi-)-3.279 F
+.787(mum number of history entries has been set using)108 636 R F1
+(sti\215e_history\(\))3.286 E F0 3.286(,a)C .786(nd the ne)-3.286 F
+3.286(wn)-.25 G .786(umber of history entries)-3.286 F -.1(wo)108 648 S
+(uld e).1 E(xceed that maximum, the oldest history entry is remo)-.15 E
+-.15(ve)-.15 G(d.).15 E F2(void)108 672 Q F1(add_history_time)2.5 E F0
+(\()4.166 E F2(const c)A(har *string)-.15 E F0(\))1.666 E
+(Change the time stamp associated with the most recent history entry to)
+108 684 Q F2(string)2.5 E F0(.)A F2(HIST_ENTR)108 708 Q 2.5(Y*)-.18 G F1
+-.18(re)C(mo).18 E -.1(ve)-.1 G(_history).1 E F0(\()4.166 E F2(int whic)
+A(h)-.15 E F0(\))1.666 E(Remo)108 720 Q .352 -.15(ve h)-.15 H .052
+(istory entry at of).15 F(fset)-.25 E F2(whic)2.553 E(h)-.15 E F0 .053
+(from the history)2.553 F 5.053(.T)-.65 G .053(he remo)-5.053 F -.15(ve)
+-.15 G 2.553(de).15 G .053(lement is returned so you can free the)-2.553
+F(GNU History 8.1)72 768 Q(2020 July 17)139.005 E(3)203.165 E 0 Cg EP
+%%Page: 4 4
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library)
+-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E
+(line, data, and containing structure.)108 84 Q/F1 10/Times-Italic@0 SF
+(histdata_t)108 108 Q/F2 10/Times-Bold@0 SF(fr)2.5 E(ee_history_entry)
+-.18 E F0(\()4.166 E F1(HIST_ENTR)A 2.5(Y*)-.18 G(histent)-2.5 E F0(\))
+1.666 E .934(Free the history entry)108 120 R F1(histent)3.433 E F0 .933
+(and an)3.433 F 3.433(yh)-.15 G .933(istory library pri)-3.433 F -.25
+(va)-.25 G .933(te data associated with it.).25 F .933
+(Returns the applica-)5.933 F
+(tion-speci\214c data so the caller can dispose of it.)108 132 Q F1
+(HIST_ENTR)108 156 Q 2.5(Y*)-.18 G F2 -.18(re)C(place_history_entry).18
+E F0(\()4.166 E F1(int whic)A -.834(h, const)-.15 F -.15(ch)2.5 G
+(ar *line).15 E 1.666(,h)-.1 G(istdata_t data)-1.666 E F0(\))3.332 E
+(Mak)108 168 Q 3.062(et)-.1 G .562(he history entry at of)-3.062 F(fset)
+-.25 E F1(whic)3.062 E(h)-.15 E F0(ha)3.062 E -.15(ve)-.2 G F1(line)
+3.212 E F0(and)3.062 E F1(data)3.062 E F0 5.563(.T)C .563
+(his returns the old entry so the caller can dis-)-5.563 F(pose of an)
+108 180 Q 2.5(ya)-.15 G(pplication-speci\214c data.)-2.5 E
+(In the case of an in)5 E -.25(va)-.4 G(lid).25 E F1(whic)2.5 E(h)-.15 E
+F0 2.5(,a)C F2(NULL)A F0(pointer is returned.)2.5 E F1(void)108 204 Q F2
+(clear_history)2.5 E F0(\()4.166 E F1(void)A F0(\))1.666 E
+(Clear the history list by deleting all the entries.)108 216 Q F1(void)
+108 240 Q F2(sti\215e_history)2.5 E F0(\()4.166 E F1(int max)A F0(\))
+1.666 E .38(Sti\215e the history list, remembering only the last)108 252
+R F1(max)2.88 E F0 2.88(entries. The)2.88 F .38
+(history list will contain only)2.88 F F1(max)2.88 E F0(entries)2.88 E
+(at a time.)108 264 Q F1(int)108 288 Q F2(unsti\215e_history)2.5 E F0
+(\()4.166 E F1(void)A F0(\))1.666 E .46(Stop sti\215ing the history)108
+300 R 5.46(.T)-.65 G .46(his returns the pre)-5.46 F .46
+(viously-set maximum number of history entries \(as set by)-.25 F F2
+(sti-)2.96 E(\215e_history\(\))108 312 Q F0 2.5(\). history)B -.1(wa)2.5
+G 2.5(ss).1 G 2.5(ti\215ed. The)-2.5 F -.25(va)2.5 G(lue is positi).25 E
+.3 -.15(ve i)-.25 H 2.5(ft).15 G(he history w)-2.5 E(as sti\215ed, ne)
+-.1 E -.05(ga)-.15 G(ti).05 E .3 -.15(ve i)-.25 H 2.5(fi).15 G 2.5(tw)
+-2.5 G(asn')-2.6 E(t.)-.18 E F1(int)108 336 Q F2(history_is_sti\215ed)
+2.5 E F0(\()4.166 E F1(void)A F0(\))1.666 E
+(Returns non-zero if the history is sti\215ed, zero if it is not.)108
+348 Q F2(Inf)87 376.8 Q(ormation About the History List)-.25 E F0(These\
+ functions return information about the entire history list or indi)108
+388.8 Q(vidual list entries.)-.25 E F1(HIST_ENTR)108 412.8 Q 2.5(Y*)-.18
+G(*)-2.5 E F2(history_list)2.5 E F0(\()4.166 E F1(void)A F0(\))1.666 E
+.708(Return a)108 424.8 R F2(NULL)3.208 E F0 .708(terminated array of)
+3.208 F F1(HIST_ENTR)3.208 E 3.208(Y*)-.18 G F0 .708
+(which is the current input history)B 5.707(.E)-.65 G .707
+(lement 0 of this)-5.707 F(list is the be)108 436.8 Q(ginning of time.)
+-.15 E(If there is no history)5 E 2.5(,r)-.65 G(eturn)-2.5 E F2(NULL)2.5
+E F0(.)A F1(int)108 460.8 Q F2(wher)2.5 E(e_history)-.18 E F0(\()4.166 E
+F1(void)A F0(\))1.666 E(Returns the of)108 472.8 Q
+(fset of the current history element.)-.25 E F1(HIST_ENTR)108 496.8 Q
+2.5(Y*)-.18 G F2(curr)A(ent_history)-.18 E F0(\()4.166 E F1(void)A F0
+(\))1.666 E 1.373
+(Return the history entry at the current position, as determined by)108
+508.8 R F2(wher)3.873 E(e_history\(\))-.18 E F0 6.373(.I)C 3.873(ft)
+-6.373 G 1.374(here is no entry)-3.873 F(there, return a)108 520.8 Q F2
+(NULL)2.5 E F0(pointer)2.5 E(.)-.55 E F1(HIST_ENTR)108 544.8 Q 2.5(Y*)
+-.18 G F2(history_get)A F0(\()4.166 E F1(int of)A(fset)-.18 E F0(\))
+1.666 E 1.069(Return the history entry at position)108 556.8 R F1(of)
+3.569 E(fset)-.18 E F0 6.069(.T)C 1.069(he range of v)-6.069 F 1.069
+(alid v)-.25 F 1.069(alues of)-.25 F F1(of)3.569 E(fset)-.18 E F0 1.068
+(starts at)3.569 F F2(history_base)3.568 E F0(and)3.568 E .286(ends at)
+108 568.8 R F2(history_length)2.786 E F0 2.786<ad31>2.786 G 5.286(.I)
+-2.786 G 2.786(ft)-5.286 G .286(here is no entry there, or if)-2.786 F
+F1(of)2.786 E(fset)-.18 E F0 .286(is outside the v)2.786 F .287
+(alid range, return a)-.25 F F2(NULL)2.787 E F0(pointer)108 580.8 Q(.)
+-.55 E F1(time_t)108 604.8 Q F2(history_get_time)2.5 E F0(\()4.166 E F1
+(HIST_ENTR)A 2.5(Y*)-.18 G F0(\))-.834 E(Return the time stamp associat\
+ed with the history entry passed as the ar)108 616.8 Q(gument.)-.18 E F1
+(int)108 640.8 Q F2(history_total_bytes)2.5 E F0(\()4.166 E F1(void)A F0
+(\))1.666 E .392
+(Return the number of bytes that the primary history entries are using.)
+108 652.8 R .391(This function returns the sum of the)5.392 F
+(lengths of all the lines in the history)108 664.8 Q(.)-.65 E F2(Mo)87
+693.6 Q(ving Ar)-.1 E(ound the History List)-.18 E F0
+(These functions allo)108 705.6 Q 2.5(wt)-.25 G(he current inde)-2.5 E
+2.5(xi)-.15 G(nto the history list to be set or changed.)-2.5 E F1(int)
+108 729.6 Q F2(history_set_pos)2.5 E F0(\()4.166 E F1(int pos)A F0(\))
+1.666 E(GNU History 8.1)72 768 Q(2020 July 17)139.005 E(4)203.165 E 0 Cg
+EP
+%%Page: 5 5
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library)
+-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E .79
+(Set the current history of)108 84 R .79(fset to)-.25 F/F1 10
+/Times-Italic@0 SF(pos)3.29 E F0 3.29(,a)C 3.29(na)-3.29 G .79
+(bsolute inde)-3.29 F 3.29(xi)-.15 G .79(nto the list.)-3.29 F .79
+(Returns 1 on success, 0 if)5.79 F F1(pos)3.29 E F0 .79(is less)3.29 F
+(than zero or greater than the number of history entries.)108 96 Q F1
+(HIST_ENTR)108 120 Q 2.5(Y*)-.18 G/F2 10/Times-Bold@0 SF(pr)A -.15(ev)
+-.18 G(ious_history).15 E F0(\()4.166 E F1(void)A F0(\))1.666 E .208
+(Back up the current history of)108 132 R .208(fset to the pre)-.25 F
+.208(vious history entry)-.25 F 2.707(,a)-.65 G .207
+(nd return a pointer to that entry)-2.707 F 5.207(.I)-.65 G 2.707(ft)
+-5.207 G .207(here is)-2.707 F(no pre)108 144 Q(vious entry)-.25 E 2.5
+(,r)-.65 G(eturn a)-2.5 E F2(NULL)2.5 E F0(pointer)2.5 E(.)-.55 E F1
+(HIST_ENTR)108 168 Q 2.5(Y*)-.18 G F2(next_history)A F0(\()4.166 E F1
+(void)A F0(\))1.666 E .332(If the current history of)108 180 R .333
+(fset refers to a v)-.25 F .333(alid history entry)-.25 F 2.833(,i)-.65
+G .333(ncrement the current history of)-2.833 F 2.833(fset. If)-.25 F
+.333(the possi-)2.833 F .202(bly-incremented history of)108 192 R .202
+(fset refers to a v)-.25 F .202(alid history entry)-.25 F 2.702(,r)-.65
+G .202(eturn a pointer to that entry; otherwise, return)-2.702 F(a)108
+204 Q F2(NULL)2.5 E F0(pointer)2.5 E(.)-.55 E F2(Sear)87 232.8 Q
+(ching the History List)-.18 E F0 .005(These functions allo)108 244.8 R
+2.505(ws)-.25 G .006(earching of the history list for entries containin\
+g a speci\214c string.)-2.505 F .006(Searching may be)5.006 F 1.452
+(performed both forw)108 256.8 R 1.452(ard and backw)-.1 F 1.451
+(ard from the current history position.)-.1 F 1.451(The search may be)
+6.451 F F1(anc)3.951 E(hor)-.15 E(ed)-.37 E F0(,)A
+(meaning that the string must match at the be)108 268.8 Q
+(ginning of the history entry)-.15 E(.)-.65 E F1(int)108 292.8 Q F2
+(history_sear)2.5 E(ch)-.18 E F0(\()4.166 E F1(const c)A(har *string)
+-.15 E 1.666(,i)-.1 G(nt dir)-1.666 E(ection)-.37 E F0(\))1.666 E .155
+(Search the history for)108 304.8 R F1(string)2.655 E F0 2.656(,s)C .156
+(tarting at the current history of)-2.656 F 2.656(fset. If)-.25 F F1
+(dir)2.656 E(ection)-.37 E F0 .156(is less than 0, then the search)2.656
+F .802(is through pre)108 316.8 R .802
+(vious entries, otherwise through subsequent entries.)-.25 F(If)5.801 E
+F1(string)3.301 E F0 .801(is found, then the current his-)3.301 F .064
+(tory inde)108 328.8 R 2.564(xi)-.15 G 2.564(ss)-2.564 G .064
+(et to that history entry)-2.564 F 2.564(,a)-.65 G .064(nd the v)-2.564
+F .064(alue returned is the of)-.25 F .064
+(fset in the line of the entry where)-.25 F F1(string)2.565 E F0 -.1(wa)
+108 340.8 S 2.5(sf).1 G 2.5(ound. Otherwise,)-2.5 F
+(nothing is changed, and a -1 is returned.)2.5 E F1(int)108 364.8 Q F2
+(history_sear)2.5 E(ch_pr)-.18 E(e\214x)-.18 E F0(\()4.166 E F1(const c)
+A(har *string)-.15 E 1.666(,i)-.1 G(nt dir)-1.666 E(ection)-.37 E F0(\))
+1.666 E .684(Search the history for)108 376.8 R F1(string)3.183 E F0
+3.183(,s)C .683(tarting at the current history of)-3.183 F 3.183
+(fset. The)-.25 F .683(search is anchored: matching lines)3.183 F 1.063
+(must be)108 388.8 R 1.063(gin with)-.15 F F1(string)3.563 E F0 6.063
+(.I)C(f)-6.063 E F1(dir)3.563 E(ection)-.37 E F0 1.064
+(is less than 0, then the search is through pre)3.563 F 1.064
+(vious entries, otherwise)-.25 F .34(through subsequent entries.)108
+400.8 R(If)5.34 E F1(string)2.84 E F0 .34
+(is found, then the current history inde)2.84 F 2.84(xi)-.15 G 2.84(ss)
+-2.84 G .34(et to that entry)-2.84 F 2.84(,a)-.65 G .34(nd the re-)-2.84
+F(turn v)108 412.8 Q(alue is 0.)-.25 E
+(Otherwise, nothing is changed, and a -1 is returned.)5 E F1(int)108
+436.8 Q F2(history_sear)2.5 E(ch_pos)-.18 E F0(\()4.166 E F1(const c)A
+(har *string)-.15 E 1.666(,i)-.1 G(nt dir)-1.666 E -.834(ection, int)
+-.37 F(pos)2.5 E F0(\))3.332 E .603(Search for)108 448.8 R F1(string)
+3.103 E F0 .603(in the history list, starting at)3.103 F F1(pos)3.104 E
+F0 3.104(,a)C 3.104(na)-3.104 G .604(bsolute inde)-3.104 F 3.104(xi)-.15
+G .604(nto the list.)-3.104 F(If)5.604 E F1(dir)3.104 E(ection)-.37 E F0
+.604(is ne)3.104 F -.05(ga)-.15 G(ti).05 E -.15(ve)-.25 G(,).15 E .608
+(the search proceeds backw)108 460.8 R .608(ard from)-.1 F F1(pos)3.108
+E F0 3.108(,o)C .608(therwise forw)-3.108 F 3.108(ard. Returns)-.1 F
+.608(the absolute inde)3.108 F 3.108(xo)-.15 G 3.108(ft)-3.108 G .608
+(he history ele-)-3.108 F(ment where)108 472.8 Q F1(string)2.5 E F0 -.1
+(wa)2.5 G 2.5(sf).1 G(ound, or -1 otherwise.)-2.5 E F2
+(Managing the History File)87 501.6 Q F0 .035(The History library can r\
+ead the history from and write it to a \214le.)108 513.6 R .036
+(This section documents the functions for)5.035 F
+(managing a history \214le.)108 525.6 Q F1(int)108 549.6 Q F2 -.18(re)
+2.5 G(ad_history).18 E F0(\()4.166 E F1(const c)A(har *\214lename)-.15 E
+F0(\))1.666 E .151(Add the contents of)108 561.6 R F1(\214lename)2.651 E
+F0 .151(to the history list, a line at a time.)2.651 F(If)5.15 E F1
+(\214lename)2.65 E F0(is)2.65 E F2(NULL)2.65 E F0 2.65(,t)C .15
+(hen read from)-2.65 F F1(~/.his-)2.65 E(tory)108 573.6 Q F0 5(.R)C
+(eturns 0 if successful, or)-5 E F2(err)2.5 E(no)-.15 E F0(if not.)2.5 E
+F1(int)108 597.6 Q F2 -.18(re)2.5 G(ad_history_range).18 E F0(\()4.166 E
+F1(const c)A(har *\214lename)-.15 E 1.666(,i)-.1 G(nt fr)-1.666 E -.834
+(om, int)-.45 F(to)2.5 E F0(\))3.332 E .052(Read a range of lines from)
+108 609.6 R F1(\214lename)2.553 E F0 2.553(,a)C .053
+(dding them to the history list.)-2.553 F .053(Start reading at line)
+5.053 F F1(fr)2.553 E(om)-.45 E F0 .053(and end at)2.553 F F1(to)2.553 E
+F0(.)A(If)108 621.6 Q F1(fr)2.889 E(om)-.45 E F0 .389
+(is zero, start at the be)2.889 F 2.889(ginning. If)-.15 F F1(to)2.889 E
+F0 .389(is less than)2.889 F F1(fr)2.889 E(om)-.45 E F0 2.889(,t)C .388
+(hen read until the end of the \214le.)-2.889 F(If)5.388 E F1
+(\214lename)2.888 E F0(is)108 633.6 Q F2(NULL)2.5 E F0 2.5(,t)C
+(hen read from)-2.5 E F1(~/.history)2.5 E F0 5(.R)C
+(eturns 0 if successful, or)-5 E F2(err)2.5 E(no)-.15 E F0(if not.)2.5 E
+F1(int)108 657.6 Q F2(write_history)2.5 E F0(\()4.166 E F1(const c)A
+(har *\214lename)-.15 E F0(\))1.666 E .961(Write the current history to)
+108 669.6 R F1(\214lename)3.461 E F0 3.461(,o)C -.15(ve)-3.611 G
+(rwriting).15 E F1(\214lename)3.461 E F0 .961(if necessary)3.461 F 5.961
+(.I)-.65 G(f)-5.961 E F1(\214lename)3.462 E F0(is)3.462 E F2(NULL)3.462
+E F0 3.462(,t)C .962(hen write)-3.462 F(the history list to)108 681.6 Q
+F1(~/.history)2.5 E F0 5(.R)C(eturns 0 on success, or)-5 E F2(err)2.5 E
+(no)-.15 E F0(on a read or write error)2.5 E(.)-.55 E F1(int)108 717.6 Q
+F2(append_history)2.5 E F0(\()4.166 E F1(int nelements,)A(const c)1.666
+E(har *\214lename)-.15 E F0(\))1.666 E .839(Append the last)108 729.6 R
+F1(nelements)3.339 E F0 .839(of the history list to)3.339 F F1
+(\214lename)3.339 E F0 5.839(.I)C(f)-5.839 E F1(\214lename)3.339 E F0
+(is)3.339 E F2(NULL)3.339 E F0 3.339(,t)C .838(hen append to)-3.339 F F1
+(~/.history)3.338 E F0(.)A(GNU History 8.1)72 768 Q(2020 July 17)139.005
+E(5)203.165 E 0 Cg EP
+%%Page: 6 6
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library)
+-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E
+(Returns 0 on success, or)108 84 Q/F1 10/Times-Bold@0 SF(err)2.5 E(no)
+-.15 E F0(on a read or write error)2.5 E(.)-.55 E/F2 10/Times-Italic@0
+SF(int)108 108 Q F1(history_truncate_\214le)2.5 E F0(\()4.166 E F2
+(const c)A(har *\214lename)-.15 E 1.666(,i)-.1 G(nt nlines)-1.666 E F0
+(\))1.666 E -.35(Tr)108 120 S .38(uncate the history \214le).35 F F2
+(\214lename)2.88 E F0 2.88(,l)C(ea)-2.88 E .38(ving only the last)-.2 F
+F2(nlines)2.881 E F0 2.881(lines. If)2.881 F F2(\214lename)2.881 E F0
+(is)2.881 E F1(NULL)2.881 E F0 2.881(,t)C(hen)-2.881 E F2(~/.history)
+2.881 E F0(is)2.881 E 2.5(truncated. Returns)108 132 R 2.5(0o)2.5 G 2.5
+(ns)-2.5 G(uccess, or)-2.5 E F1(err)2.5 E(no)-.15 E F0(on f)2.5 E
+(ailure.)-.1 E F1(History Expansion)87 160.8 Q F0
+(These functions implement history e)108 172.8 Q(xpansion.)-.15 E F2
+(int)108 196.8 Q F1(history_expand)2.5 E F0(\()4.166 E F2 -.15(ch)C
+(ar *string).15 E 1.666(,c)-.1 G(har **output)-1.816 E F0(\))1.666 E
+(Expand)108 208.8 Q F2(string)2.5 E F0 2.5(,p)C(lacing the result into)
+-2.5 E F2(output)2.5 E F0 2.5(,ap)C(ointer to a string.)-2.5 E(Returns:)
+5 E(0)144 220.8 Q .566(If no e)180 220.8 R .566
+(xpansions took place \(or)-.15 F 3.065(,i)-.4 G 3.065(ft)-3.065 G .565
+(he only change in the te)-3.065 F .565(xt w)-.15 F .565(as the remo)-.1
+F -.25(va)-.15 G 3.065(lo).25 G 3.065(fe)-3.065 G(scape)-3.065 E
+(characters preceding the history e)180 232.8 Q(xpansion character\);)
+-.15 E(1)144 244.8 Q(if e)180 244.8 Q(xpansions did tak)-.15 E 2.5(ep)
+-.1 G(lace;)-2.5 E(-1)144 256.8 Q(if there w)180 256.8 Q
+(as an error in e)-.1 E(xpansion;)-.15 E(2)144 268.8 Q
+(if the returned line should be displayed, b)180 268.8 Q(ut not e)-.2 E
+-.15(xe)-.15 G(cuted, as with the).15 E F1(:p)2.5 E F0(modi\214er)2.5 E
+(.)-.55 E(If an error occurred in e)108 280.8 Q(xpansion, then)-.15 E F2
+(output)2.5 E F0(contains a descripti)2.5 E .3 -.15(ve e)-.25 H
+(rror message.).15 E F2 -.15(ch)108 304.8 S(ar *).15 E F1(get_history_e)
+2.5 E -.1(ve)-.15 G(nt).1 E F0(\()4.166 E F2(const c)A(har *string)-.15
+E 1.666(,i)-.1 G(nt *cinde)-1.666 E -.834(x, int)-.2 F(qc)2.5 E(har)-.15
+E F0(\))3.332 E .262(Returns the te)108 316.8 R .262
+(xt of the history e)-.15 F -.15(ve)-.25 G .262(nt be).15 F .263
+(ginning at)-.15 F F2(string)2.763 E F0(+)2.763 E F2(*cinde)2.763 E(x)
+-.2 E F0(.)A F2(*cinde)5.263 E(x)-.2 E F0 .263
+(is modi\214ed to point to after the)2.763 F -2.15 -.25(ev e)108 328.8 T
+.71(nt speci\214er).25 F 5.71(.A)-.55 G 3.21(tf)-5.71 G .71
+(unction entry)-3.21 F(,)-.65 E F2(cinde)3.21 E(x)-.2 E F0 .709
+(points to the inde)3.21 F 3.209(xi)-.15 G(nto)-3.209 E F2(string)3.209
+E F0 .709(where the history e)3.209 F -.15(ve)-.25 G .709
+(nt speci\214ca-).15 F .527(tion be)108 340.8 R(gins.)-.15 E F2(qc)5.527
+E(har)-.15 E F0 .527(is a character that is allo)3.027 F .527
+(wed to end the e)-.25 F -.15(ve)-.25 G .528
+(nt speci\214cation in addition to the `).15 F(`normal')-.74 E(')-.74 E
+(terminating characters.)108 352.8 Q F2 -.15(ch)108 376.8 S(ar **).15 E
+F1(history_tok)2.5 E(enize)-.1 E F0(\()4.166 E F2(const c)A(har *string)
+-.15 E F0(\))1.666 E .239(Return an array of tok)108 388.8 R .239
+(ens parsed out of)-.1 F F2(string)2.739 E F0 2.739(,m)C .238
+(uch as the shell might.)-2.739 F .238(The tok)5.238 F .238
+(ens are split on the charac-)-.1 F(ters in the)108 400.8 Q F1
+(history_w)2.5 E(ord_delimiters)-.1 E F0 -.25(va)2.5 G
+(riable, and shell quoting con).25 E -.15(ve)-.4 G(ntions are obe).15 E
+(yed.)-.15 E F2 -.15(ch)108 424.8 S(ar *).15 E F1(history_ar)2.5 E
+(g_extract)-.1 E F0(\()4.166 E F2(int \214r)A -.834(st, int)-.1 F -.834
+(last, const)2.5 F -.15(ch)2.5 G(ar *string).15 E F0(\))3.332 E .025
+(Extract a string se)108 436.8 R .025(gment consisting of the)-.15 F F2
+<8c72>2.526 E(st)-.1 E F0(through)2.526 E F2(last)2.526 E F0(ar)2.526 E
+.026(guments present in)-.18 F F2(string)2.526 E F0 5.026(.A)C -.18(rg)
+-5.026 G .026(uments are split).18 F(using)108 448.8 Q F1(history_tok)
+2.5 E(enize\(\))-.1 E F0(.)A F1(History V)87 477.6 Q(ariables)-.92 E F0
+(This section describes the e)108 489.6 Q(xternally-visible v)-.15 E
+(ariables e)-.25 E(xported by the GNU History Library)-.15 E(.)-.65 E F2
+(int)108 513.6 Q F1(history_base)2.5 E F0(The logical of)108 525.6 Q
+(fset of the \214rst entry in the history list.)-.25 E F2(int)108 549.6
+Q F1(history_length)2.5 E F0
+(The number of entries currently stored in the history list.)108 561.6 Q
+F2(int)108 585.6 Q F1(history_max_entries)2.5 E F0
+(The maximum number of history entries.)108 597.6 Q
+(This must be changed using)5 E F1(sti\215e_history\(\))2.5 E F0(.)A F2
+(int)108 621.6 Q F1(history_write_timestamps)2.5 E F0 .484
+(If non-zero, timestamps are written to the history \214le, so the)108
+633.6 R 2.983(yc)-.15 G .483(an be preserv)-2.983 F .483
+(ed between sessions.)-.15 F .483(The de-)5.483 F -.1(fa)108 645.6 S
+.994(ult v).1 F .994(alue is 0, meaning that timestamps are not sa)-.25
+F -.15(ve)-.2 G 3.494(d. The).15 F .994
+(current timestamp format uses the v)3.494 F .995(alue of)-.25 F F2
+(history_comment_c)108 657.6 Q(har)-.15 E F0 .051
+(to delimit timestamp entries in the history \214le.)2.552 F .051
+(If that v)5.051 F .051(ariable does not ha)-.25 F .351 -.15(ve a v)-.2
+H(alue)-.1 E(\(the def)108 669.6 Q
+(ault\), timestamps will not be written.)-.1 E F2 -.15(ch)108 693.6 S
+(ar).15 E F1(history_expansion_char)2.5 E F0
+(The character that introduces a history e)108 705.6 Q -.15(ve)-.25 G
+2.5(nt. The).15 F(def)2.5 E(ault is)-.1 E F1(!)2.5 E F0 5(.S)C
+(etting this to 0 inhibits history e)-5 E(xpansion.)-.15 E F2 -.15(ch)
+108 729.6 S(ar).15 E F1(history_subst_char)2.5 E F0(GNU History 8.1)72
+768 Q(2020 July 17)139.005 E(6)203.165 E 0 Cg EP
+%%Page: 7 7
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 124.845(Y\(3\) Library)
+-.65 F(Functions Manual)2.5 E(HIST)127.345 E(OR)-.18 E(Y\(3\))-.65 E
+(The character that in)108 84 Q -.2(vo)-.4 G -.1(ke).2 G 2.5(sw).1 G
+(ord substitution if found at the start of a line.)-2.6 E(The def)5 E
+(ault is)-.1 E/F1 10/Times-Bold@0 SF(^)2.5 E F0(.)A/F2 10/Times-Italic@0
+SF -.15(ch)108 108 S(ar).15 E F1(history_comment_char)2.5 E F0 .116
+(During tok)108 120 R .117
+(enization, if this character is seen as the \214rst character of a w)
+-.1 F .117(ord, then it and all subsequent char)-.1 F(-)-.2 E .277
+(acters up to a ne)108 132 R .276
+(wline are ignored, suppressing history e)-.25 F .276
+(xpansion for the remainder of the line.)-.15 F .276(This is dis-)5.276
+F(abled by def)108 144 Q(ault.)-.1 E F2 -.15(ch)108 168 S(ar *).15 E F1
+(history_w)2.5 E(ord_delimiters)-.1 E F0
+(The characters that separate tok)108 180 Q(ens for)-.1 E F1
+(history_tok)2.5 E(enize\(\))-.1 E F0 5(.T)C(he def)-5 E(ault v)-.1 E
+(alue is)-.25 E F1 2.5("\\)2.5 G(t\\n\(\)<>;&|")-2.5 E F0(.)A F2 -.15
+(ch)108 204 S(ar *).15 E F1(history_no_expand_chars)2.5 E F0 2.054
+(The list of characters which inhibit history e)108 216 R 2.054
+(xpansion if found immediately follo)-.15 F(wing)-.25 E F1
+(history_expan-)4.555 E(sion_char)108 228 Q F0 5(.T)C(he def)-5 E
+(ault is space, tab, ne)-.1 E(wline,)-.25 E F1(\\r)2.5 E F0 2.5(,a)C(nd)
+-2.5 E F1(=)2.5 E F0(.)A F2 -.15(ch)108 252 S(ar *).15 E F1
+(history_sear)2.5 E(ch_delimiter_chars)-.18 E F0 .401(The list of addit\
+ional characters which can delimit a history search string, in addition\
+ to space, tab,)108 264 R F2(:)2.901 E F0(and)2.901 E F2(?)2.901 E F0
+(in the case of a substring search.)108 276 Q(The def)5 E(ault is empty)
+-.1 E(.)-.65 E F2(int)108 300 Q F1(history_quotes_inhibit_expansion)2.5
+E F0 .86(If non-zero, double-quoted w)108 312 R .861
+(ords are not scanned for the history e)-.1 F .861
+(xpansion character or the history com-)-.15 F(ment character)108 324 Q
+5(.T)-.55 G(he def)-5 E(ault v)-.1 E(alue is 0.)-.25 E F2(rl_lineb)108
+348 Q(uf_func_t *)-.2 E F1(history_inhibit_expansion_function)2.5 E F0
+.348(This should be set to the address of a function that tak)108 360 R
+.348(es tw)-.1 F 2.848(oa)-.1 G -.18(rg)-2.848 G .347(uments: a).18 F F1
+.347(char *)2.847 F F0(\()2.847 E F2(string)A F0 2.847(\)a)C .347(nd an)
+-2.847 F F1(int)2.847 E F0(inde)2.847 E(x)-.15 E .227
+(into that string \()108 372 R F2(i)A F0 2.727(\). It)B .227
+(should return a non-zero v)2.727 F .227(alue if the history e)-.25 F
+.227(xpansion starting at)-.15 F F2(string[i])2.728 E F0 .228
+(should not)2.728 F .019(be performed; zero if the e)108 384 R .019
+(xpansion should be done.)-.15 F .019
+(It is intended for use by applications lik)5.019 F(e)-.1 E F1(bash)
+2.519 E F0 .018(that use)2.519 F(the history e)108 396 Q
+(xpansion character for additional purposes.)-.15 E(By def)5 E
+(ault, this v)-.1 E(ariable is set to)-.25 E F1(NULL)2.5 E F0(.)A/F3
+10.95/Times-Bold@0 SF(FILES)72 412.8 Q F2(~/.history)109.666 424.8 Q F0
+(Def)144 436.8 Q(ault \214lename for reading and writing sa)-.1 E -.15
+(ve)-.2 G 2.5(dh).15 G(istory)-2.5 E F3(SEE ALSO)72 453.6 Q F2
+(The Gnu Readline Libr)108 465.6 Q(ary)-.15 E F0 2.5(,B)C(rian F)-2.5 E
+(ox and Chet Rame)-.15 E(y)-.15 E F2(The Gnu History Libr)108 477.6 Q
+(ary)-.15 E F0 2.5(,B)C(rian F)-2.5 E(ox and Chet Rame)-.15 E(y)-.15 E
+F2(bash)108 489.6 Q F0(\(1\))A F2 -.37(re)108 501.6 S(adline).37 E F0
+(\(3\))A F3 -.548(AU)72 518.4 S(THORS).548 E F0(Brian F)108 530.4 Q
+(ox, Free Softw)-.15 E(are F)-.1 E(oundation)-.15 E(bfox@gnu.or)108
+542.4 Q(g)-.18 E(Chet Rame)108 559.2 Q 1.3 -.65(y, C)-.15 H(ase W).65 E
+(estern Reserv)-.8 E 2.5(eU)-.15 G(ni)-2.5 E -.15(ve)-.25 G(rsity).15 E
+(chet.rame)108 571.2 Q(y@case.edu)-.15 E F3 -.11(BU)72 588 S 2.738(GR)
+.11 G(EPOR)-2.738 E(TS)-.438 E F0 .16(If you \214nd a b)108 600 R .16
+(ug in the)-.2 F F1(history)2.66 E F0(library)2.66 E 2.66(,y)-.65 G .16
+(ou should report it.)-2.66 F .16(But \214rst, you should mak)5.16 F
+2.66(es)-.1 G .16(ure that it really is)-2.66 F 2.5(ab)108 612 S
+(ug, and that it appears in the latest v)-2.7 E(ersion of the)-.15 E F1
+(history)2.5 E F0(library that you ha)2.5 E -.15(ve)-.2 G(.).15 E .705
+(Once you ha)108 628.8 R 1.005 -.15(ve d)-.2 H .705(etermined that a b)
+.15 F .704(ug actually e)-.2 F .704(xists, mail a b)-.15 F .704
+(ug report to)-.2 F F2 -.2(bu)3.204 G(g\255r).2 E(eadline)-.37 E F0(@)A
+F2(gnu.or)A(g)-.37 E F0 5.704(.I)C 3.204(fy)-5.704 G(ou)-3.204 E(ha)108
+640.8 Q 1.809 -.15(ve a \214)-.2 H 1.509
+(x, you are welcome to mail that as well!).15 F 1.51
+(Suggestions and `philosophical' b)6.51 F 1.51(ug reports may be)-.2 F
+(mailed to)108 652.8 Q F2 -.2(bu)2.5 G(g-r).2 E(eadline)-.37 E F0(@)A F2
+(gnu.or)A(g)-.37 E F0(or posted to the Usenet ne)2.5 E(wsgroup)-.25 E F1
+(gnu.bash.b)2.5 E(ug)-.2 E F0(.)A(Comments and b)108 669.6 Q
+(ug reports concerning this manual page should be directed to)-.2 E F2
+-.15(ch)2.5 G(et.r).15 E(ame)-.15 E(y@case)-.3 E(.edu)-.15 E F0(.).25 E
+(GNU History 8.1)72 768 Q(2020 July 17)139.005 E(7)203.165 E 0 Cg EP
+%%Trailer
+end
+%%EOF
diff --git a/doc/hstech.texi b/doc/hstech.texi
new file mode 100644
index 0000000..da6417b
--- /dev/null
+++ b/doc/hstech.texi
@@ -0,0 +1,602 @@
+@ignore
+This file documents the user interface to the GNU History library.
+
+Copyright (C) 1988-2022 Free Software Foundation, Inc.
+Authored by Brian Fox and Chet Ramey.
+
+Permission is granted to make and distribute verbatim copies of this manual
+provided the copyright notice and this permission notice are preserved on
+all copies.
+
+Permission is granted to process this file through Tex and print the
+results, provided the printed document carries copying permission notice
+identical to this one except for the removal of this paragraph (this
+paragraph not being relevant to the printed manual).
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+GNU Copyright statement is available to the distributee, and provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions.
+@end ignore
+
+@node Programming with GNU History
+@chapter Programming with GNU History
+
+This chapter describes how to interface programs that you write
+with the @sc{gnu} History Library.
+It should be considered a technical guide.
+For information on the interactive use of @sc{gnu} History, @pxref{Using
+History Interactively}.
+
+@menu
+* Introduction to History:: What is the GNU History library for?
+* History Storage:: How information is stored.
+* History Functions:: Functions that you can use.
+* History Variables:: Variables that control behaviour.
+* History Programming Example:: Example of using the GNU History Library.
+@end menu
+
+@node Introduction to History
+@section Introduction to History
+
+Many programs read input from the user a line at a time. The @sc{gnu}
+History library is able to keep track of those lines, associate arbitrary
+data with each line, and utilize information from previous lines in
+composing new ones.
+
+A programmer using the History library has available functions
+for remembering lines on a history list, associating arbitrary data
+with a line, removing lines from the list, searching through the list
+for a line containing an arbitrary text string, and referencing any line
+in the list directly. In addition, a history @dfn{expansion} function
+is available which provides for a consistent user interface across
+different programs.
+
+The user using programs written with the History library has the
+benefit of a consistent user interface with a set of well-known
+commands for manipulating the text of previous lines and using that text
+in new commands. The basic history manipulation commands are similar to
+the history substitution provided by @code{csh}.
+
+The programmer can also use the Readline library, which
+includes some history manipulation by default, and has the added
+advantage of command line editing.
+
+Before declaring any functions using any functionality the History
+library provides in other code, an application writer should include
+the file @code{<readline/history.h>} in any file that uses the
+History library's features. It supplies extern declarations for all
+of the library's public functions and variables, and declares all of
+the public data structures.
+
+@node History Storage
+@section History Storage
+
+The history list is an array of history entries. A history entry is
+declared as follows:
+
+@example
+typedef void *histdata_t;
+
+typedef struct _hist_entry @{
+ char *line;
+ char *timestamp;
+ histdata_t data;
+@} HIST_ENTRY;
+@end example
+
+The history list itself might therefore be declared as
+
+@example
+HIST_ENTRY **the_history_list;
+@end example
+
+The state of the History library is encapsulated into a single structure:
+
+@example
+/*
+ * A structure used to pass around the current state of the history.
+ */
+typedef struct _hist_state @{
+ HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+ int offset; /* The location pointer within this array. */
+ int length; /* Number of elements within this array. */
+ int size; /* Number of slots allocated to this array. */
+ int flags;
+@} HISTORY_STATE;
+@end example
+
+If the flags member includes @code{HS_STIFLED}, the history has been
+stifled.
+
+@node History Functions
+@section History Functions
+
+This section describes the calling sequence for the various functions
+exported by the @sc{gnu} History library.
+
+@menu
+* Initializing History and State Management:: Functions to call when you
+ want to use history in a
+ program.
+* History List Management:: Functions used to manage the list
+ of history entries.
+* Information About the History List:: Functions returning information about
+ the history list.
+* Moving Around the History List:: Functions used to change the position
+ in the history list.
+* Searching the History List:: Functions to search the history list
+ for entries containing a string.
+* Managing the History File:: Functions that read and write a file
+ containing the history list.
+* History Expansion:: Functions to perform csh-like history
+ expansion.
+@end menu
+
+@node Initializing History and State Management
+@subsection Initializing History and State Management
+
+This section describes functions used to initialize and manage
+the state of the History library when you want to use the history
+functions in your program.
+
+@deftypefun void using_history (void)
+Begin a session in which the history functions might be used. This
+initializes the interactive variables.
+@end deftypefun
+
+@deftypefun {HISTORY_STATE *} history_get_history_state (void)
+Return a structure describing the current state of the input history.
+@end deftypefun
+
+@deftypefun void history_set_history_state (HISTORY_STATE *state)
+Set the state of the history list according to @var{state}.
+@end deftypefun
+
+@node History List Management
+@subsection History List Management
+
+These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+
+@deftypefun void add_history (const char *string)
+Place @var{string} at the end of the history list. The associated data
+field (if any) is set to @code{NULL}.
+If the maximum number of history entries has been set using
+@code{stifle_history()}, and the new number of history entries would exceed
+that maximum, the oldest history entry is removed.
+@end deftypefun
+
+@deftypefun void add_history_time (const char *string)
+Change the time stamp associated with the most recent history entry to
+@var{string}.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} remove_history (int which)
+Remove history entry at offset @var{which} from the history. The
+removed element is returned so you can free the line, data,
+and containing structure.
+@end deftypefun
+
+@deftypefun {histdata_t} free_history_entry (HIST_ENTRY *histent)
+Free the history entry @var{histent} and any history library private
+data associated with it. Returns the application-specific data
+so the caller can dispose of it.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} replace_history_entry (int which, const char *line, histdata_t data)
+Make the history entry at offset @var{which} have @var{line} and @var{data}.
+This returns the old entry so the caller can dispose of any
+application-specific data. In the case
+of an invalid @var{which}, a @code{NULL} pointer is returned.
+@end deftypefun
+
+@deftypefun void clear_history (void)
+Clear the history list by deleting all the entries.
+@end deftypefun
+
+@deftypefun void stifle_history (int max)
+Stifle the history list, remembering only the last @var{max} entries.
+The history list will contain only @var{max} entries at a time.
+@end deftypefun
+
+@deftypefun int unstifle_history (void)
+Stop stifling the history. This returns the previously-set
+maximum number of history entries (as set by @code{stifle_history()}).
+The value is positive if the history was
+stifled, negative if it wasn't.
+@end deftypefun
+
+@deftypefun int history_is_stifled (void)
+Returns non-zero if the history is stifled, zero if it is not.
+@end deftypefun
+
+@node Information About the History List
+@subsection Information About the History List
+
+These functions return information about the entire history list or
+individual list entries.
+
+@deftypefun {HIST_ENTRY **} history_list (void)
+Return a @code{NULL} terminated array of @code{HIST_ENTRY *} which is the
+current input history. Element 0 of this list is the beginning of time.
+If there is no history, return @code{NULL}.
+@end deftypefun
+
+@deftypefun int where_history (void)
+Returns the offset of the current history element.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} current_history (void)
+Return the history entry at the current position, as determined by
+@code{where_history()}. If there is no entry there, return a @code{NULL}
+pointer.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} history_get (int offset)
+Return the history entry at position @var{offset}.
+The range of valid
+values of @var{offset} starts at @code{history_base} and ends at
+@var{history_length} - 1 (@pxref{History Variables}).
+If there is no entry there, or if @var{offset} is outside the valid
+range, return a @code{NULL} pointer.
+@end deftypefun
+
+@deftypefun time_t history_get_time (HIST_ENTRY *entry)
+Return the time stamp associated with the history entry @var{entry}.
+If the timestamp is missing or invalid, return 0.
+@end deftypefun
+
+@deftypefun int history_total_bytes (void)
+Return the number of bytes that the primary history entries are using.
+This function returns the sum of the lengths of all the lines in the
+history.
+@end deftypefun
+
+@node Moving Around the History List
+@subsection Moving Around the History List
+
+These functions allow the current index into the history list to be
+set or changed.
+
+@deftypefun int history_set_pos (int pos)
+Set the current history offset to @var{pos}, an absolute index
+into the list.
+Returns 1 on success, 0 if @var{pos} is less than zero or greater
+than the number of history entries.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} previous_history (void)
+Back up the current history offset to the previous history entry, and
+return a pointer to that entry. If there is no previous entry, return
+a @code{NULL} pointer.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} next_history (void)
+If the current history offset refers to a valid history entry,
+increment the current history offset.
+If the possibly-incremented history offset refers to a valid history
+entry, return a pointer to that entry;
+otherwise, return a @code{BNULL} pointer.
+@end deftypefun
+
+@node Searching the History List
+@subsection Searching the History List
+@cindex History Searching
+
+These functions allow searching of the history list for entries containing
+a specific string. Searching may be performed both forward and backward
+from the current history position. The search may be @dfn{anchored},
+meaning that the string must match at the beginning of the history entry.
+@cindex anchored search
+
+@deftypefun int history_search (const char *string, int direction)
+Search the history for @var{string}, starting at the current history offset.
+If @var{direction} is less than 0, then the search is through
+previous entries, otherwise through subsequent entries.
+If @var{string} is found, then
+the current history index is set to that history entry, and the value
+returned is the offset in the line of the entry where
+@var{string} was found. Otherwise, nothing is changed, and a -1 is
+returned.
+@end deftypefun
+
+@deftypefun int history_search_prefix (const char *string, int direction)
+Search the history for @var{string}, starting at the current history
+offset. The search is anchored: matching lines must begin with
+@var{string}. If @var{direction} is less than 0, then the search is
+through previous entries, otherwise through subsequent entries.
+If @var{string} is found, then the
+current history index is set to that entry, and the return value is 0.
+Otherwise, nothing is changed, and a -1 is returned.
+@end deftypefun
+
+@deftypefun int history_search_pos (const char *string, int direction, int pos)
+Search for @var{string} in the history list, starting at @var{pos}, an
+absolute index into the list. If @var{direction} is negative, the search
+proceeds backward from @var{pos}, otherwise forward. Returns the absolute
+index of the history element where @var{string} was found, or -1 otherwise.
+@end deftypefun
+
+@node Managing the History File
+@subsection Managing the History File
+
+The History library can read the history from and write it to a file.
+This section documents the functions for managing a history file.
+
+@deftypefun int read_history (const char *filename)
+Add the contents of @var{filename} to the history list, a line at a time.
+If @var{filename} is @code{NULL}, then read from @file{~/.history}.
+Returns 0 if successful, or @code{errno} if not.
+@end deftypefun
+
+@deftypefun int read_history_range (const char *filename, int from, int to)
+Read a range of lines from @var{filename}, adding them to the history list.
+Start reading at line @var{from} and end at @var{to}.
+If @var{from} is zero, start at the beginning. If @var{to} is less than
+@var{from}, then read until the end of the file. If @var{filename} is
+@code{NULL}, then read from @file{~/.history}. Returns 0 if successful,
+or @code{errno} if not.
+@end deftypefun
+
+@deftypefun int write_history (const char *filename)
+Write the current history to @var{filename}, overwriting @var{filename}
+if necessary.
+If @var{filename} is @code{NULL}, then write the history list to
+@file{~/.history}.
+Returns 0 on success, or @code{errno} on a read or write error.
+@end deftypefun
+
+@deftypefun int append_history (int nelements, const char *filename)
+Append the last @var{nelements} of the history list to @var{filename}.
+If @var{filename} is @code{NULL}, then append to @file{~/.history}.
+Returns 0 on success, or @code{errno} on a read or write error.
+@end deftypefun
+
+@deftypefun int history_truncate_file (const char *filename, int nlines)
+Truncate the history file @var{filename}, leaving only the last
+@var{nlines} lines.
+If @var{filename} is @code{NULL}, then @file{~/.history} is truncated.
+Returns 0 on success, or @code{errno} on failure.
+@end deftypefun
+
+@node History Expansion
+@subsection History Expansion
+
+These functions implement history expansion.
+
+@deftypefun int history_expand (char *string, char **output)
+Expand @var{string}, placing the result into @var{output}, a pointer
+to a string (@pxref{History Interaction}). Returns:
+@table @code
+@item 0
+If no expansions took place (or, if the only change in
+the text was the removal of escape characters preceding the history expansion
+character);
+@item 1
+if expansions did take place;
+@item -1
+if there was an error in expansion;
+@item 2
+if the returned line should be displayed, but not executed,
+as with the @code{:p} modifier (@pxref{Modifiers}).
+@end table
+
+If an error occurred in expansion, then @var{output} contains a descriptive
+error message.
+@end deftypefun
+
+@deftypefun {char *} get_history_event (const char *string, int *cindex, int qchar)
+Returns the text of the history event beginning at @var{string} +
+@var{*cindex}. @var{*cindex} is modified to point to after the event
+specifier. At function entry, @var{cindex} points to the index into
+@var{string} where the history event specification begins. @var{qchar}
+is a character that is allowed to end the event specification in addition
+to the ``normal'' terminating characters.
+@end deftypefun
+
+@deftypefun {char **} history_tokenize (const char *string)
+Return an array of tokens parsed out of @var{string}, much as the
+shell might. The tokens are split on the characters in the
+@var{history_word_delimiters} variable,
+and shell quoting conventions are obeyed as described below.
+@end deftypefun
+
+@deftypefun {char *} history_arg_extract (int first, int last, const char *string)
+Extract a string segment consisting of the @var{first} through @var{last}
+arguments present in @var{string}. Arguments are split using
+@code{history_tokenize}.
+@end deftypefun
+
+@node History Variables
+@section History Variables
+
+This section describes the externally-visible variables exported by
+the @sc{gnu} History Library.
+
+@deftypevar int history_base
+The logical offset of the first entry in the history list.
+@end deftypevar
+
+@deftypevar int history_length
+The number of entries currently stored in the history list.
+@end deftypevar
+
+@deftypevar int history_max_entries
+The maximum number of history entries. This must be changed using
+@code{stifle_history()}.
+@end deftypevar
+
+@deftypevar int history_write_timestamps
+If non-zero, timestamps are written to the history file, so they can be
+preserved between sessions. The default value is 0, meaning that
+timestamps are not saved.
+
+The current timestamp format uses the value of @var{history_comment_char}
+to delimit timestamp entries in the history file. If that variable does
+not have a value (the default), timestamps will not be written.
+@end deftypevar
+
+@deftypevar char history_expansion_char
+The character that introduces a history event. The default is @samp{!}.
+Setting this to 0 inhibits history expansion.
+@end deftypevar
+
+@deftypevar char history_subst_char
+The character that invokes word substitution if found at the start of
+a line. The default is @samp{^}.
+@end deftypevar
+
+@deftypevar char history_comment_char
+During tokenization, if this character is seen as the first character
+of a word, then it and all subsequent characters up to a newline are
+ignored, suppressing history expansion for the remainder of the line.
+This is disabled by default.
+@end deftypevar
+
+@deftypevar {char *} history_word_delimiters
+The characters that separate tokens for @code{history_tokenize()}.
+The default value is @code{" \t\n()<>;&|"}.
+@end deftypevar
+
+@deftypevar {char *} history_search_delimiter_chars
+The list of additional characters which can delimit a history search
+string, in addition to space, TAB, @samp{:} and @samp{?} in the case of
+a substring search. The default is empty.
+@end deftypevar
+
+@deftypevar {char *} history_no_expand_chars
+The list of characters which inhibit history expansion if found immediately
+following @var{history_expansion_char}. The default is space, tab, newline,
+carriage return, and @samp{=}.
+@end deftypevar
+
+@deftypevar int history_quotes_inhibit_expansion
+If non-zero, the history expansion code implements shell-like quoting:
+single-quoted words are not scanned for the history expansion
+character or the history comment character, and double-quoted words may
+have history expansion performed, since single quotes are not special
+within double quotes.
+The default value is 0.
+@end deftypevar
+
+@deftypevar int history_quoting_state
+An application may set this variable to indicate that the current line
+being expanded is subject to existing quoting. If set to @samp{'}, the
+history expansion function will assume that the line is single-quoted and
+inhibit expansion until it reads an unquoted closing single quote; if set
+to @samp{"}, history expansion will assume the line is double quoted until
+it reads an unquoted closing double quote. If set to zero, the default,
+the history expansion function will assume the line is not quoted and
+treat quote characters within the line as described above.
+This is only effective if @var{history_quotes_inhibit_expansion} is set.
+@end deftypevar
+
+@deftypevar {rl_linebuf_func_t *} history_inhibit_expansion_function
+This should be set to the address of a function that takes two arguments:
+a @code{char *} (@var{string})
+and an @code{int} index into that string (@var{i}).
+It should return a non-zero value if the history expansion starting at
+@var{string[i]} should not be performed; zero if the expansion should
+be done.
+It is intended for use by applications like Bash that use the history
+expansion character for additional purposes.
+By default, this variable is set to @code{NULL}.
+@end deftypevar
+
+@node History Programming Example
+@section History Programming Example
+
+The following program demonstrates simple use of the @sc{gnu} History Library.
+
+@smallexample
+#include <stdio.h>
+#include <readline/history.h>
+
+main (argc, argv)
+ int argc;
+ char **argv;
+@{
+ char line[1024], *t;
+ int len, done = 0;
+
+ line[0] = 0;
+
+ using_history ();
+ while (!done)
+ @{
+ printf ("history$ ");
+ fflush (stdout);
+ t = fgets (line, sizeof (line) - 1, stdin);
+ if (t && *t)
+ @{
+ len = strlen (t);
+ if (t[len - 1] == '\n')
+ t[len - 1] = '\0';
+ @}
+
+ if (!t)
+ strcpy (line, "quit");
+
+ if (line[0])
+ @{
+ char *expansion;
+ int result;
+
+ result = history_expand (line, &expansion);
+ if (result)
+ fprintf (stderr, "%s\n", expansion);
+
+ if (result < 0 || result == 2)
+ @{
+ free (expansion);
+ continue;
+ @}
+
+ add_history (expansion);
+ strncpy (line, expansion, sizeof (line) - 1);
+ free (expansion);
+ @}
+
+ if (strcmp (line, "quit") == 0)
+ done = 1;
+ else if (strcmp (line, "save") == 0)
+ write_history ("history_file");
+ else if (strcmp (line, "read") == 0)
+ read_history ("history_file");
+ else if (strcmp (line, "list") == 0)
+ @{
+ register HIST_ENTRY **the_list;
+ register int i;
+
+ the_list = history_list ();
+ if (the_list)
+ for (i = 0; the_list[i]; i++)
+ printf ("%d: %s\n", i + history_base, the_list[i]->line);
+ @}
+ else if (strncmp (line, "delete", 6) == 0)
+ @{
+ int which;
+ if ((sscanf (line + 6, "%d", &which)) == 1)
+ @{
+ HIST_ENTRY *entry = remove_history (which);
+ if (!entry)
+ fprintf (stderr, "No such entry %d\n", which);
+ else
+ @{
+ free (entry->line);
+ free (entry);
+ @}
+ @}
+ else
+ @{
+ fprintf (stderr, "non-numeric arg given to `delete'\n");
+ @}
+ @}
+ @}
+@}
+@end smallexample
diff --git a/doc/hsuser.texi b/doc/hsuser.texi
new file mode 100644
index 0000000..9081baf
--- /dev/null
+++ b/doc/hsuser.texi
@@ -0,0 +1,533 @@
+@ignore
+This file documents the user interface to the GNU History library.
+
+Copyright (C) 1988--2022 Free Software Foundation, Inc.
+Authored by Brian Fox and Chet Ramey.
+
+Permission is granted to make and distribute verbatim copies of this manual
+provided the copyright notice and this permission notice are preserved on
+all copies.
+
+Permission is granted to process this file through Tex and print the
+results, provided the printed document carries copying permission notice
+identical to this one except for the removal of this paragraph (this
+paragraph not being relevant to the printed manual).
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+GNU Copyright statement is available to the distributee, and provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions.
+@end ignore
+
+@node Using History Interactively
+@chapter Using History Interactively
+
+@ifclear BashFeatures
+@defcodeindex bt
+@end ifclear
+
+@ifset BashFeatures
+This chapter describes how to use the @sc{gnu} History Library
+interactively, from a user's standpoint.
+It should be considered a user's guide.
+For information on using the @sc{gnu} History Library in other programs,
+see the @sc{gnu} Readline Library Manual.
+@end ifset
+@ifclear BashFeatures
+This chapter describes how to use the @sc{gnu} History Library interactively,
+from a user's standpoint. It should be considered a user's guide. For
+information on using the @sc{gnu} History Library in your own programs,
+@pxref{Programming with GNU History}.
+@end ifclear
+
+@ifset BashFeatures
+@menu
+* Bash History Facilities:: How Bash lets you manipulate your command
+ history.
+* Bash History Builtins:: The Bash builtin commands that manipulate
+ the command history.
+* History Interaction:: What it feels like using History as a user.
+@end menu
+@end ifset
+@ifclear BashFeatures
+@menu
+* History Interaction:: What it feels like using History as a user.
+@end menu
+@end ifclear
+
+@ifset BashFeatures
+@node Bash History Facilities
+@section Bash History Facilities
+@cindex command history
+@cindex history list
+
+When the @option{-o history} option to the @code{set} builtin
+is enabled (@pxref{The Set Builtin}),
+the shell provides access to the @dfn{command history},
+the list of commands previously typed.
+The value of the @env{HISTSIZE} shell variable is used as the
+number of commands to save in a history list.
+The text of the last @env{$HISTSIZE}
+commands (default 500) is saved.
+The shell stores each command in the history list prior to
+parameter and variable expansion
+but after history expansion is performed, subject to the
+values of the shell variables
+@env{HISTIGNORE} and @env{HISTCONTROL}.
+
+When the shell starts up, the history is initialized from the
+file named by the @env{HISTFILE} variable (default @file{~/.bash_history}).
+The file named by the value of @env{HISTFILE} is truncated, if
+necessary, to contain no more than the number of lines specified by
+the value of the @env{HISTFILESIZE} variable.
+When a shell with history enabled exits, the last
+@env{$HISTSIZE} lines are copied from the history list to the file
+named by @env{$HISTFILE}.
+If the @code{histappend} shell option is set (@pxref{Bash Builtins}),
+the lines are appended to the history file,
+otherwise the history file is overwritten.
+If @env{HISTFILE}
+is unset, or if the history file is unwritable, the history is not saved.
+After saving the history, the history file is truncated
+to contain no more than @env{$HISTFILESIZE} lines.
+If @env{HISTFILESIZE} is unset, or set to null, a non-numeric value, or
+a numeric value less than zero, the history file is not truncated.
+
+If the @env{HISTTIMEFORMAT} is set, the time stamp information
+associated with each history entry is written to the history file,
+marked with the history comment character.
+When the history file is read, lines beginning with the history
+comment character followed immediately by a digit are interpreted
+as timestamps for the following history entry.
+
+The builtin command @code{fc} may be used to list or edit and re-execute
+a portion of the history list.
+The @code{history} builtin may be used to display or modify the history
+list and manipulate the history file.
+When using command-line editing, search commands
+are available in each editing mode that provide access to the
+history list (@pxref{Commands For History}).
+
+The shell allows control over which commands are saved on the history
+list. The @env{HISTCONTROL} and @env{HISTIGNORE}
+variables may be set to cause the shell to save only a subset of the
+commands entered.
+The @code{cmdhist}
+shell option, if enabled, causes the shell to attempt to save each
+line of a multi-line command in the same history entry, adding
+semicolons where necessary to preserve syntactic correctness.
+The @code{lithist}
+shell option causes the shell to save the command with embedded newlines
+instead of semicolons.
+The @code{shopt} builtin is used to set these options.
+@xref{The Shopt Builtin}, for a description of @code{shopt}.
+
+@node Bash History Builtins
+@section Bash History Builtins
+@cindex history builtins
+
+Bash provides two builtin commands which manipulate the
+history list and history file.
+
+@table @code
+
+@item fc
+@btindex fc
+@example
+@code{fc [-e @var{ename}] [-lnr] [@var{first}] [@var{last}]}
+@code{fc -s [@var{pat}=@var{rep}] [@var{command}]}
+@end example
+
+The first form selects a range of commands from @var{first} to
+@var{last} from the history list and displays or edits and re-executes
+them.
+Both @var{first} and
+@var{last} may be specified as a string (to locate the most recent
+command beginning with that string) or as a number (an index into the
+history list, where a negative number is used as an offset from the
+current command number).
+
+When listing, a @var{first} or @var{last} of 0 is equivalent to -1
+and -0 is equivalent to the current command (usually the @code{fc}
+command);
+otherwise 0 is equivalent to -1 and -0 is invalid.
+
+If @var{last} is not specified, it is set to
+@var{first}. If @var{first} is not specified, it is set to the previous
+command for editing and @minus{}16 for listing. If the @option{-l} flag is
+given, the commands are listed on standard output. The @option{-n} flag
+suppresses the command numbers when listing. The @option{-r} flag
+reverses the order of the listing. Otherwise, the editor given by
+@var{ename} is invoked on a file containing those commands. If
+@var{ename} is not given, the value of the following variable expansion
+is used: @code{$@{FCEDIT:-$@{EDITOR:-vi@}@}}. This says to use the
+value of the @env{FCEDIT} variable if set, or the value of the
+@env{EDITOR} variable if that is set, or @code{vi} if neither is set.
+When editing is complete, the edited commands are echoed and executed.
+
+In the second form, @var{command} is re-executed after each instance
+of @var{pat} in the selected command is replaced by @var{rep}.
+@var{command} is interpreted the same as @var{first} above.
+
+A useful alias to use with the @code{fc} command is @code{r='fc -s'}, so
+that typing @samp{r cc} runs the last command beginning with @code{cc}
+and typing @samp{r} re-executes the last command (@pxref{Aliases}).
+
+@item history
+@btindex history
+@example
+history [@var{n}]
+history -c
+history -d @var{offset}
+history -d @var{start}-@var{end}
+history [-anrw] [@var{filename}]
+history -ps @var{arg}
+@end example
+
+With no options, display the history list with line numbers.
+Lines prefixed with a @samp{*} have been modified.
+An argument of @var{n} lists only the last @var{n} lines.
+If the shell variable @env{HISTTIMEFORMAT} is set and not null,
+it is used as a format string for @var{strftime} to display
+the time stamp associated with each displayed history entry.
+No intervening blank is printed between the formatted time stamp
+and the history line.
+
+Options, if supplied, have the following meanings:
+
+@table @code
+@item -c
+Clear the history list. This may be combined
+with the other options to replace the history list completely.
+
+@item -d @var{offset}
+Delete the history entry at position @var{offset}.
+If @var{offset} is positive, it should be specified as it appears when
+the history is displayed.
+If @var{offset} is negative, it is interpreted as relative to one greater
+than the last history position, so negative indices count back from the
+end of the history, and an index of @samp{-1} refers to the current
+@code{history -d} command.
+
+@item -d @var{start}-@var{end}
+Delete the range of history entries between positions @var{start} and
+@var{end}, inclusive.
+Positive and negative values for @var{start} and @var{end}
+are interpreted as described above.
+
+@item -a
+Append the new history lines to the history file.
+These are history lines entered since the beginning of the current
+Bash session, but not already appended to the history file.
+
+@item -n
+Append the history lines not already read from the history file
+to the current history list. These are lines appended to the history
+file since the beginning of the current Bash session.
+
+@item -r
+Read the history file and append its contents to
+the history list.
+
+@item -w
+Write out the current history list to the history file.
+
+@item -p
+Perform history substitution on the @var{arg}s and display the result
+on the standard output, without storing the results in the history list.
+
+@item -s
+The @var{arg}s are added to the end of
+the history list as a single entry.
+
+@end table
+
+If a @var{filename} argument is supplied
+when any of the @option{-w}, @option{-r}, @option{-a}, or @option{-n} options
+is used, Bash uses @var{filename} as the history file.
+If not, then the value of the @env{HISTFILE} variable is used.
+
+The return value is 0 unless an invalid option is encountered, an
+error occurs while reading or writing the history file, an invalid
+@var{offset} or range is supplied as an argument to @option{-d}, or the
+history expansion supplied as an argument to @option{-p} fails.
+
+@end table
+@end ifset
+
+@node History Interaction
+@section History Expansion
+@cindex history expansion
+
+The History library provides a history expansion feature that is similar
+to the history expansion provided by @code{csh}. This section
+describes the syntax used to manipulate the history information.
+
+History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+
+@ifset BashFeatures
+History expansion is performed immediately after a complete line
+is read, before the shell breaks it into words, and is performed
+on each line individually. Bash attempts to inform the history
+expansion functions about quoting still in effect from previous lines.
+@end ifset
+
+History expansion takes place in two parts. The first is to determine
+which line from the history list should be used during substitution.
+The second is to select portions of that line for inclusion into the
+current one. The line selected from the history is called the
+@dfn{event}, and the portions of that line that are acted upon are
+called @dfn{words}. Various @dfn{modifiers} are available to manipulate
+the selected words. The line is broken into words in the same fashion
+that Bash does, so that several words
+surrounded by quotes are considered one word.
+History expansions are introduced by the appearance of the
+history expansion character, which is @samp{!} by default.
+
+History expansion implements shell-like quoting conventions:
+a backslash can be used to remove the special handling for the next character;
+single quotes enclose verbatim sequences of characters, and can be used to
+inhibit history expansion;
+and characters enclosed within double quotes may be subject to history
+expansion, since backslash can escape the history expansion character,
+but single quotes may not, since they are not treated specially within
+double quotes.
+
+@ifset BashFeatures
+When using the shell, only @samp{\} and @samp{'} may be used to escape the
+history expansion character, but the history expansion character is
+also treated as quoted if it immediately precedes the closing double quote
+in a double-quoted string.
+@end ifset
+
+@ifset BashFeatures
+Several shell options settable with the @code{shopt}
+builtin (@pxref{The Shopt Builtin}) may be used to tailor
+the behavior of history expansion. If the
+@code{histverify} shell option is enabled, and Readline
+is being used, history substitutions are not immediately passed to
+the shell parser.
+Instead, the expanded line is reloaded into the Readline
+editing buffer for further modification.
+If Readline is being used, and the @code{histreedit}
+shell option is enabled, a failed history expansion will be
+reloaded into the Readline editing buffer for correction.
+The @option{-p} option to the @code{history} builtin command
+may be used to see what a history expansion will do before using it.
+The @option{-s} option to the @code{history} builtin may be used to
+add commands to the end of the history list without actually executing
+them, so that they are available for subsequent recall.
+This is most useful in conjunction with Readline.
+
+The shell allows control of the various characters used by the
+history expansion mechanism with the @code{histchars} variable,
+as explained above (@pxref{Bash Variables}). The shell uses
+the history comment character to mark history timestamps when
+writing the history file.
+@end ifset
+
+@menu
+* Event Designators:: How to specify which history line to use.
+* Word Designators:: Specifying which words are of interest.
+* Modifiers:: Modifying the results of substitution.
+@end menu
+
+@node Event Designators
+@subsection Event Designators
+@cindex event designators
+
+An event designator is a reference to a command line entry in the
+history list.
+Unless the reference is absolute, events are relative to the current
+position in the history list.
+@cindex history events
+
+@table @asis
+
+@item @code{!}
+@ifset BashFeatures
+Start a history substitution, except when followed by a space, tab,
+the end of the line, @samp{=} or @samp{(} (when the
+@code{extglob} shell option is enabled using the @code{shopt} builtin).
+@end ifset
+@ifclear BashFeatures
+Start a history substitution, except when followed by a space, tab,
+the end of the line, or @samp{=}.
+@end ifclear
+
+@item @code{!@var{n}}
+Refer to command line @var{n}.
+
+@item @code{!-@var{n}}
+Refer to the command @var{n} lines back.
+
+@item @code{!!}
+Refer to the previous command. This is a synonym for @samp{!-1}.
+
+@item @code{!@var{string}}
+Refer to the most recent command
+preceding the current position in the history list
+starting with @var{string}.
+
+@item @code{!?@var{string}[?]}
+Refer to the most recent command
+preceding the current position in the history list
+containing @var{string}.
+The trailing
+@samp{?} may be omitted if the @var{string} is followed immediately by
+a newline.
+If @var{string} is missing, the string from the most recent search is used;
+it is an error if there is no previous search string.
+
+@item @code{^@var{string1}^@var{string2}^}
+Quick Substitution. Repeat the last command, replacing @var{string1}
+with @var{string2}. Equivalent to
+@code{!!:s^@var{string1}^@var{string2}^}.
+
+@item @code{!#}
+The entire command line typed so far.
+
+@end table
+
+@node Word Designators
+@subsection Word Designators
+
+Word designators are used to select desired words from the event.
+A @samp{:} separates the event specification from the word designator. It
+may be omitted if the word designator begins with a @samp{^}, @samp{$},
+@samp{*}, @samp{-}, or @samp{%}. Words are numbered from the beginning
+of the line, with the first word being denoted by 0 (zero). Words are
+inserted into the current line separated by single spaces.
+
+@need 0.75
+For example,
+
+@table @code
+@item !!
+designates the preceding command. When you type this, the preceding
+command is repeated in toto.
+
+@item !!:$
+designates the last argument of the preceding command. This may be
+shortened to @code{!$}.
+
+@item !fi:2
+designates the second argument of the most recent command starting with
+the letters @code{fi}.
+@end table
+
+@need 0.75
+Here are the word designators:
+
+@table @code
+
+@item 0 (zero)
+The @code{0}th word. For many applications, this is the command word.
+
+@item @var{n}
+The @var{n}th word.
+
+@item ^
+The first argument; that is, word 1.
+
+@item $
+The last argument.
+
+@item %
+The first word matched by the most recent @samp{?@var{string}?} search,
+if the search string begins with a character that is part of a word.
+
+@item @var{x}-@var{y}
+A range of words; @samp{-@var{y}} abbreviates @samp{0-@var{y}}.
+
+@item *
+All of the words, except the @code{0}th. This is a synonym for @samp{1-$}.
+It is not an error to use @samp{*} if there is just one word in the event;
+the empty string is returned in that case.
+
+@item @var{x}*
+Abbreviates @samp{@var{x}-$}
+
+@item @var{x}-
+Abbreviates @samp{@var{x}-$} like @samp{@var{x}*}, but omits the last word.
+If @samp{x} is missing, it defaults to 0.
+
+@end table
+
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+
+@node Modifiers
+@subsection Modifiers
+
+After the optional word designator, you can add a sequence of one or more
+of the following modifiers, each preceded by a @samp{:}.
+These modify, or edit, the word or words selected from the history event.
+
+@table @code
+
+@item h
+Remove a trailing pathname component, leaving only the head.
+
+@item t
+Remove all leading pathname components, leaving the tail.
+
+@item r
+Remove a trailing suffix of the form @samp{.@var{suffix}}, leaving
+the basename.
+
+@item e
+Remove all but the trailing suffix.
+
+@item p
+Print the new command but do not execute it.
+
+@ifset BashFeatures
+@item q
+Quote the substituted words, escaping further substitutions.
+
+@item x
+Quote the substituted words as with @samp{q},
+but break into words at spaces, tabs, and newlines.
+The @samp{q} and @samp{x} modifiers are mutually exclusive; the last one
+supplied is used.
+@end ifset
+
+@item s/@var{old}/@var{new}/
+Substitute @var{new} for the first occurrence of @var{old} in the
+event line.
+Any character may be used as the delimiter in place of @samp{/}.
+The delimiter may be quoted in @var{old} and @var{new}
+with a single backslash. If @samp{&} appears in @var{new},
+it is replaced by @var{old}. A single backslash will quote
+the @samp{&}.
+If @var{old} is null, it is set to the last @var{old}
+substituted, or, if no previous history substitutions took place,
+the last @var{string}
+in a !?@var{string}@code{[?]}
+search.
+If @var{new} is null, each matching @var{old} is deleted.
+The final delimiter is optional if it is the last
+character on the input line.
+
+@item &
+Repeat the previous substitution.
+
+@item g
+@itemx a
+Cause changes to be applied over the entire event line. Used in
+conjunction with @samp{s}, as in @code{gs/@var{old}/@var{new}/},
+or with @samp{&}.
+
+@item G
+Apply the following @samp{s} or @samp{&} modifier once to each word
+in the event.
+
+@end table
diff --git a/doc/readline.0 b/doc/readline.0
new file mode 100644
index 0000000..b7c45a7
--- /dev/null
+++ b/doc/readline.0
@@ -0,0 +1,1175 @@
+READLINE(3) Library Functions Manual READLINE(3)
+
+
+
+NAME
+ readline - get a line from a user with editing
+
+SYNOPSIS
+ #include <stdio.h>
+ #include <readline/readline.h>
+ #include <readline/history.h>
+
+ char *
+ readline (const char *prompt);
+
+COPYRIGHT
+ Readline is Copyright (C) 1989-2020 Free Software Foundation, Inc.
+
+DESCRIPTION
+ readline will read a line from the terminal and return it, using prompt
+ as a prompt. If prompt is NULL or the empty string, no prompt is is-
+ sued. The line returned is allocated with malloc(3); the caller must
+ free it when finished. The line returned has the final newline re-
+ moved, so only the text of the line remains.
+
+ readline offers editing capabilities while the user is entering the
+ line. By default, the line editing commands are similar to those of
+ emacs. A vi-style line editing interface is also available.
+
+ This manual page describes only the most basic use of readline. Much
+ more functionality is available; see The GNU Readline Library and The
+ GNU History Library for additional information.
+
+RETURN VALUE
+ readline returns the text of the line read. A blank line returns the
+ empty string. If EOF is encountered while reading a line, and the line
+ is empty, NULL is returned. If an EOF is read with a non-empty line,
+ it is treated as a newline.
+
+NOTATION
+ An Emacs-style notation is used to denote keystrokes. Control keys are
+ denoted by C-key, e.g., C-n means Control-N. Similarly, meta keys are
+ denoted by M-key, so M-x means Meta-X. (On keyboards without a meta
+ key, M-x means ESC x, i.e., press the Escape key then the x key. This
+ makes ESC the meta prefix. The combination M-C-x means ESC-Control-x,
+ or press the Escape key then hold the Control key while pressing the x
+ key.)
+
+ Readline commands may be given numeric arguments, which normally act as
+ a repeat count. Sometimes, however, it is the sign of the argument
+ that is significant. Passing a negative argument to a command that
+ acts in the forward direction (e.g., kill-line) causes that command to
+ act in a backward direction. Commands whose behavior with arguments
+ deviates from this are noted below.
+
+ When a command is described as killing text, the text deleted is saved
+ for possible future retrieval (yanking). The killed text is saved in a
+ kill ring. Consecutive kills cause the text to be accumulated into one
+ unit, which can be yanked all at once. Commands which do not kill text
+ separate the chunks of text on the kill ring.
+
+INITIALIZATION FILE
+ Readline is customized by putting commands in an initialization file
+ (the inputrc file). The name of this file is taken from the value of
+ the INPUTRC environment variable. If that variable is unset, the de-
+ fault is ~/.inputrc. If that file does not exist or cannot be read,
+ the ultimate default is /etc/inputrc. When a program which uses the
+ readline library starts up, the init file is read, and the key bindings
+ and variables are set. There are only a few basic constructs allowed
+ in the readline init file. Blank lines are ignored. Lines beginning
+ with a # are comments. Lines beginning with a $ indicate conditional
+ constructs. Other lines denote key bindings and variable settings.
+ Each program using this library may add its own commands and bindings.
+
+ For example, placing
+
+ M-Control-u: universal-argument
+ or
+ C-Meta-u: universal-argument
+
+ into the inputrc would make M-C-u execute the readline command univer-
+ sal-argument.
+
+ The following symbolic character names are recognized while processing
+ key bindings: DEL, ESC, ESCAPE, LFD, NEWLINE, RET, RETURN, RUBOUT,
+ SPACE, SPC, and TAB.
+
+ In addition to command names, readline allows keys to be bound to a
+ string that is inserted when the key is pressed (a macro).
+
+ Key Bindings
+ The syntax for controlling key bindings in the inputrc file is simple.
+ All that is required is the name of the command or the text of a macro
+ and a key sequence to which it should be bound. The name may be speci-
+ fied in one of two ways: as a symbolic key name, possibly with Meta- or
+ Control- prefixes, or as a key sequence. The name and key sequence are
+ separated by a colon. There can be no whitespace between the name and
+ the colon.
+
+ When using the form keyname:function-name or macro, keyname is the name
+ of a key spelled out in English. For example:
+
+ Control-u: universal-argument
+ Meta-Rubout: backward-kill-word
+ Control-o: "> output"
+
+ In the above example, C-u is bound to the function universal-argument,
+ M-DEL is bound to the function backward-kill-word, and C-o is bound to
+ run the macro expressed on the right hand side (that is, to insert the
+ text ``> output'' into the line).
+
+ In the second form, "keyseq":function-name or macro, keyseq differs
+ from keyname above in that strings denoting an entire key sequence may
+ be specified by placing the sequence within double quotes. Some GNU
+ Emacs style key escapes can be used, as in the following example, but
+ the symbolic character names are not recognized.
+
+ "\C-u": universal-argument
+ "\C-x\C-r": re-read-init-file
+ "\e[11~": "Function Key 1"
+
+ In this example, C-u is again bound to the function universal-argument.
+ C-x C-r is bound to the function re-read-init-file, and ESC [ 1 1 ~ is
+ bound to insert the text ``Function Key 1''.
+
+ The full set of GNU Emacs style escape sequences available when speci-
+ fying key sequences is
+ \C- control prefix
+ \M- meta prefix
+ \e an escape character
+ \\ backslash
+ \" literal ", a double quote
+ \' literal ', a single quote
+
+ In addition to the GNU Emacs style escape sequences, a second set of
+ backslash escapes is available:
+ \a alert (bell)
+ \b backspace
+ \d delete
+ \f form feed
+ \n newline
+ \r carriage return
+ \t horizontal tab
+ \v vertical tab
+ \nnn the eight-bit character whose value is the octal value
+ nnn (one to three digits)
+ \xHH the eight-bit character whose value is the hexadecimal
+ value HH (one or two hex digits)
+
+ When entering the text of a macro, single or double quotes should be
+ used to indicate a macro definition. Unquoted text is assumed to be a
+ function name. In the macro body, the backslash escapes described
+ above are expanded. Backslash will quote any other character in the
+ macro text, including " and '.
+
+ Bash allows the current readline key bindings to be displayed or modi-
+ fied with the bind builtin command. The editing mode may be switched
+ during interactive use by using the -o option to the set builtin com-
+ mand. Other programs using this library provide similar mechanisms.
+ The inputrc file may be edited and re-read if a program does not pro-
+ vide any other means to incorporate new bindings.
+
+ Variables
+ Readline has variables that can be used to further customize its behav-
+ ior. A variable may be set in the inputrc file with a statement of the
+ form
+
+ set variable-name value
+
+ Except where noted, readline variables can take the values On or Off
+ (without regard to case). Unrecognized variable names are ignored.
+ When a variable value is read, empty or null values, "on" (case-insen-
+ sitive), and "1" are equivalent to On. All other values are equivalent
+ to Off. The variables and their default values are:
+
+ active-region-start-color
+ A string variable that controls the text color and background
+ when displaying the text in the active region (see the descrip-
+ tion of enable-active-region below). This string must not take
+ up any physical character positions on the display, so it should
+ consist only of terminal escape sequences. It is output to the
+ terminal before displaying the text in the active region. This
+ variable is reset to the default value whenever the terminal
+ type changes. The default value is the string that puts the
+ terminal in standout mode, as obtained from the terminal's ter-
+ minfo description. A sample value might be "\e[01;33m".
+ active-region-end-color
+ A string variable that "undoes" the effects of active-re-
+ gion-start-color and restores "normal" terminal display appear-
+ ance after displaying text in the active region. This string
+ must not take up any physical character positions on the dis-
+ play, so it should consist only of terminal escape sequences.
+ It is output to the terminal after displaying the text in the
+ active region. This variable is reset to the default value
+ whenever the terminal type changes. The default value is the
+ string that restores the terminal from standout mode, as ob-
+ tained from the terminal's terminfo description. A sample value
+ might be "\e[0m".
+ bell-style (audible)
+ Controls what happens when readline wants to ring the terminal
+ bell. If set to none, readline never rings the bell. If set to
+ visible, readline uses a visible bell if one is available. If
+ set to audible, readline attempts to ring the terminal's bell.
+ bind-tty-special-chars (On)
+ If set to On (the default), readline attempts to bind the con-
+ trol characters treated specially by the kernel's terminal
+ driver to their readline equivalents.
+ blink-matching-paren (Off)
+ If set to On, readline attempts to briefly move the cursor to an
+ opening parenthesis when a closing parenthesis is inserted.
+ colored-completion-prefix (Off)
+ If set to On, when listing completions, readline displays the
+ common prefix of the set of possible completions using a differ-
+ ent color. The color definitions are taken from the value of
+ the LS_COLORS environment variable. If there is a color defini-
+ tion in $LS_COLORS for the custom suffix "readline-colored-com-
+ pletion-prefix", readline uses this color for the common prefix
+ instead of its default.
+ colored-stats (Off)
+ If set to On, readline displays possible completions using dif-
+ ferent colors to indicate their file type. The color defini-
+ tions are taken from the value of the LS_COLORS environment
+ variable.
+ comment-begin (``#'')
+ The string that is inserted in vi mode when the insert-comment
+ command is executed. This command is bound to M-# in emacs mode
+ and to # in vi command mode.
+ completion-display-width (-1)
+ The number of screen columns used to display possible matches
+ when performing completion. The value is ignored if it is less
+ than 0 or greater than the terminal screen width. A value of 0
+ will cause matches to be displayed one per line. The default
+ value is -1.
+ completion-ignore-case (Off)
+ If set to On, readline performs filename matching and completion
+ in a case-insensitive fashion.
+ completion-map-case (Off)
+ If set to On, and completion-ignore-case is enabled, readline
+ treats hyphens (-) and underscores (_) as equivalent when per-
+ forming case-insensitive filename matching and completion.
+ completion-prefix-display-length (0)
+ The length in characters of the common prefix of a list of pos-
+ sible completions that is displayed without modification. When
+ set to a value greater than zero, common prefixes longer than
+ this value are replaced with an ellipsis when displaying possi-
+ ble completions.
+ completion-query-items (100)
+ This determines when the user is queried about viewing the num-
+ ber of possible completions generated by the possible-comple-
+ tions command. It may be set to any integer value greater than
+ or equal to zero. If the number of possible completions is
+ greater than or equal to the value of this variable, readline
+ will ask whether or not the user wishes to view them; otherwise
+ they are simply listed on the terminal. A negative value causes
+ readline to never ask.
+ convert-meta (On)
+ If set to On, readline will convert characters with the eighth
+ bit set to an ASCII key sequence by stripping the eighth bit and
+ prefixing it with an escape character (in effect, using escape
+ as the meta prefix). The default is On, but readline will set
+ it to Off if the locale contains eight-bit characters. This
+ variable is dependent on the LC_CTYPE locale category, and may
+ change if the locale is changed.
+ disable-completion (Off)
+ If set to On, readline will inhibit word completion. Completion
+ characters will be inserted into the line as if they had been
+ mapped to self-insert.
+ echo-control-characters (On)
+ When set to On, on operating systems that indicate they support
+ it, readline echoes a character corresponding to a signal gener-
+ ated from the keyboard.
+ editing-mode (emacs)
+ Controls whether readline begins with a set of key bindings sim-
+ ilar to Emacs or vi. editing-mode can be set to either emacs or
+ vi.
+ emacs-mode-string (@)
+ If the show-mode-in-prompt variable is enabled, this string is
+ displayed immediately before the last line of the primary prompt
+ when emacs editing mode is active. The value is expanded like a
+ key binding, so the standard set of meta- and control prefixes
+ and backslash escape sequences is available. Use the \1 and \2
+ escapes to begin and end sequences of non-printing characters,
+ which can be used to embed a terminal control sequence into the
+ mode string.
+ enable-active-region (On)
+ The point is the current cursor position, and mark refers to a
+ saved cursor position. The text between the point and mark is
+ referred to as the region. When this variable is set to On,
+ readline allows certain commands to designate the region as ac-
+ tive. When the region is active, readline highlights the text
+ in the region using the value of the active-region-start-color,
+ which defaults to the string that enables the terminal's stand-
+ out mode. The active region shows the text inserted by brack-
+ eted-paste and any matching text found by incremental and non-
+ incremental history searches.
+ enable-bracketed-paste (On)
+ When set to On, readline configures the terminal to insert each
+ paste into the editing buffer as a single string of characters,
+ instead of treating each character as if it had been read from
+ the keyboard. This prevents readline from executing any editing
+ commands bound to key sequences appearing in the pasted text.
+ enable-keypad (Off)
+ When set to On, readline will try to enable the application key-
+ pad when it is called. Some systems need this to enable the ar-
+ row keys.
+ enable-meta-key (On)
+ When set to On, readline will try to enable any meta modifier
+ key the terminal claims to support when it is called. On many
+ terminals, the meta key is used to send eight-bit characters.
+ expand-tilde (Off)
+ If set to On, tilde expansion is performed when readline at-
+ tempts word completion.
+ history-preserve-point (Off)
+ If set to On, the history code attempts to place point at the
+ same location on each history line retrieved with previous-his-
+ tory or next-history.
+ history-size (unset)
+ Set the maximum number of history entries saved in the history
+ list. If set to zero, any existing history entries are deleted
+ and no new entries are saved. If set to a value less than zero,
+ the number of history entries is not limited. By default, the
+ number of history entries is not limited. If an attempt is made
+ to set history-size to a non-numeric value, the maximum number
+ of history entries will be set to 500.
+ horizontal-scroll-mode (Off)
+ When set to On, makes readline use a single line for display,
+ scrolling the input horizontally on a single screen line when it
+ becomes longer than the screen width rather than wrapping to a
+ new line. This setting is automatically enabled for terminals
+ of height 1.
+ input-meta (Off)
+ If set to On, readline will enable eight-bit input (that is, it
+ will not clear the eighth bit in the characters it reads), re-
+ gardless of what the terminal claims it can support. The name
+ meta-flag is a synonym for this variable. The default is Off,
+ but readline will set it to On if the locale contains eight-bit
+ characters. This variable is dependent on the LC_CTYPE locale
+ category, and may change if the locale is changed.
+ isearch-terminators (``C-[ C-J'')
+ The string of characters that should terminate an incremental
+ search without subsequently executing the character as a com-
+ mand. If this variable has not been given a value, the charac-
+ ters ESC and C-J will terminate an incremental search.
+ keymap (emacs)
+ Set the current readline keymap. The set of legal keymap names
+ is emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,
+ vi-command, and vi-insert. vi is equivalent to vi-command;
+ emacs is equivalent to emacs-standard. The default value is
+ emacs. The value of editing-mode also affects the default
+ keymap.
+ keyseq-timeout (500)
+ Specifies the duration readline will wait for a character when
+ reading an ambiguous key sequence (one that can form a complete
+ key sequence using the input read so far, or can take additional
+ input to complete a longer key sequence). If no input is re-
+ ceived within the timeout, readline will use the shorter but
+ complete key sequence. The value is specified in milliseconds,
+ so a value of 1000 means that readline will wait one second for
+ additional input. If this variable is set to a value less than
+ or equal to zero, or to a non-numeric value, readline will wait
+ until another key is pressed to decide which key sequence to
+ complete.
+ mark-directories (On)
+ If set to On, completed directory names have a slash appended.
+ mark-modified-lines (Off)
+ If set to On, history lines that have been modified are dis-
+ played with a preceding asterisk (*).
+ mark-symlinked-directories (Off)
+ If set to On, completed names which are symbolic links to direc-
+ tories have a slash appended (subject to the value of mark-di-
+ rectories).
+ match-hidden-files (On)
+ This variable, when set to On, causes readline to match files
+ whose names begin with a `.' (hidden files) when performing
+ filename completion. If set to Off, the leading `.' must be
+ supplied by the user in the filename to be completed.
+ menu-complete-display-prefix (Off)
+ If set to On, menu completion displays the common prefix of the
+ list of possible completions (which may be empty) before cycling
+ through the list.
+ output-meta (Off)
+ If set to On, readline will display characters with the eighth
+ bit set directly rather than as a meta-prefixed escape sequence.
+ The default is Off, but readline will set it to On if the locale
+ contains eight-bit characters. This variable is dependent on
+ the LC_CTYPE locale category, and may change if the locale is
+ changed.
+ page-completions (On)
+ If set to On, readline uses an internal more-like pager to dis-
+ play a screenful of possible completions at a time.
+ print-completions-horizontally (Off)
+ If set to On, readline will display completions with matches
+ sorted horizontally in alphabetical order, rather than down the
+ screen.
+ revert-all-at-newline (Off)
+ If set to On, readline will undo all changes to history lines
+ before returning when accept-line is executed. By default, his-
+ tory lines may be modified and retain individual undo lists
+ across calls to readline.
+ show-all-if-ambiguous (Off)
+ This alters the default behavior of the completion functions.
+ If set to On, words which have more than one possible completion
+ cause the matches to be listed immediately instead of ringing
+ the bell.
+ show-all-if-unmodified (Off)
+ This alters the default behavior of the completion functions in
+ a fashion similar to show-all-if-ambiguous. If set to On, words
+ which have more than one possible completion without any possi-
+ ble partial completion (the possible completions don't share a
+ common prefix) cause the matches to be listed immediately in-
+ stead of ringing the bell.
+ show-mode-in-prompt (Off)
+ If set to On, add a string to the beginning of the prompt indi-
+ cating the editing mode: emacs, vi command, or vi insertion.
+ The mode strings are user-settable (e.g., emacs-mode-string).
+ skip-completed-text (Off)
+ If set to On, this alters the default completion behavior when
+ inserting a single match into the line. It's only active when
+ performing completion in the middle of a word. If enabled,
+ readline does not insert characters from the completion that
+ match characters after point in the word being completed, so
+ portions of the word following the cursor are not duplicated.
+ vi-cmd-mode-string ((cmd))
+ If the show-mode-in-prompt variable is enabled, this string is
+ displayed immediately before the last line of the primary prompt
+ when vi editing mode is active and in command mode. The value
+ is expanded like a key binding, so the standard set of meta- and
+ control prefixes and backslash escape sequences is available.
+ Use the \1 and \2 escapes to begin and end sequences of non-
+ printing characters, which can be used to embed a terminal con-
+ trol sequence into the mode string.
+ vi-ins-mode-string ((ins))
+ If the show-mode-in-prompt variable is enabled, this string is
+ displayed immediately before the last line of the primary prompt
+ when vi editing mode is active and in insertion mode. The value
+ is expanded like a key binding, so the standard set of meta- and
+ control prefixes and backslash escape sequences is available.
+ Use the \1 and \2 escapes to begin and end sequences of non-
+ printing characters, which can be used to embed a terminal con-
+ trol sequence into the mode string.
+ visible-stats (Off)
+ If set to On, a character denoting a file's type as reported by
+ stat(2) is appended to the filename when listing possible com-
+ pletions.
+
+ Conditional Constructs
+ Readline implements a facility similar in spirit to the conditional
+ compilation features of the C preprocessor which allows key bindings
+ and variable settings to be performed as the result of tests. There
+ are four parser directives used.
+
+ $if The $if construct allows bindings to be made based on the edit-
+ ing mode, the terminal being used, or the application using
+ readline. The text of the test, after any comparison operator,
+ extends to the end of the line; unless otherwise noted, no char-
+ acters are required to isolate it.
+
+ mode The mode= form of the $if directive is used to test
+ whether readline is in emacs or vi mode. This may be
+ used in conjunction with the set keymap command, for in-
+ stance, to set bindings in the emacs-standard and emacs-
+ ctlx keymaps only if readline is starting out in emacs
+ mode.
+
+ term The term= form may be used to include terminal-specific
+ key bindings, perhaps to bind the key sequences output by
+ the terminal's function keys. The word on the right side
+ of the = is tested against the full name of the terminal
+ and the portion of the terminal name before the first -.
+ This allows sun to match both sun and sun-cmd, for in-
+ stance.
+
+ version
+ The version test may be used to perform comparisons
+ against specific readline versions. The version expands
+ to the current readline version. The set of comparison
+ operators includes =, (and ==), !=, <=, >=, <, and >.
+ The version number supplied on the right side of the op-
+ erator consists of a major version number, an optional
+ decimal point, and an optional minor version (e.g., 7.1).
+ If the minor version is omitted, it is assumed to be 0.
+ The operator may be separated from the string version and
+ from the version number argument by whitespace.
+
+ application
+ The application construct is used to include application-
+ specific settings. Each program using the readline li-
+ brary sets the application name, and an initialization
+ file can test for a particular value. This could be used
+ to bind key sequences to functions useful for a specific
+ program. For instance, the following command adds a key
+ sequence that quotes the current or previous word in
+ bash:
+
+ $if Bash
+ # Quote the current or previous word
+ "\C-xq": "\eb\"\ef\""
+ $endif
+
+ variable
+ The variable construct provides simple equality tests for
+ readline variables and values. The permitted comparison
+ operators are =, ==, and !=. The variable name must be
+ separated from the comparison operator by whitespace; the
+ operator may be separated from the value on the right
+ hand side by whitespace. Both string and boolean vari-
+ ables may be tested. Boolean variables must be tested
+ against the values on and off.
+
+ $endif This command, as seen in the previous example, terminates an $if
+ command.
+
+ $else Commands in this branch of the $if directive are executed if the
+ test fails.
+
+ $include
+ This directive takes a single filename as an argument and reads
+ commands and bindings from that file. For example, the follow-
+ ing directive would read /etc/inputrc:
+
+ $include /etc/inputrc
+
+SEARCHING
+ Readline provides commands for searching through the command history
+ for lines containing a specified string. There are two search modes:
+ incremental and non-incremental.
+
+ Incremental searches begin before the user has finished typing the
+ search string. As each character of the search string is typed, read-
+ line displays the next entry from the history matching the string typed
+ so far. An incremental search requires only as many characters as
+ needed to find the desired history entry. To search backward in the
+ history for a particular string, type C-r. Typing C-s searches forward
+ through the history. The characters present in the value of the
+ isearch-terminators variable are used to terminate an incremental
+ search. If that variable has not been assigned a value the Escape and
+ C-J characters will terminate an incremental search. C-G will abort an
+ incremental search and restore the original line. When the search is
+ terminated, the history entry containing the search string becomes the
+ current line.
+
+ To find other matching entries in the history list, type C-s or C-r as
+ appropriate. This will search backward or forward in the history for
+ the next line matching the search string typed so far. Any other key
+ sequence bound to a readline command will terminate the search and exe-
+ cute that command. For instance, a newline will terminate the search
+ and accept the line, thereby executing the command from the history
+ list. A movement command will terminate the search, make the last line
+ found the current line, and begin editing.
+
+ Non-incremental searches read the entire search string before starting
+ to search for matching history lines. The search string may be typed
+ by the user or be part of the contents of the current line.
+
+EDITING COMMANDS
+ The following is a list of the names of the commands and the default
+ key sequences to which they are bound. Command names without an accom-
+ panying key sequence are unbound by default.
+
+ In the following descriptions, point refers to the current cursor posi-
+ tion, and mark refers to a cursor position saved by the set-mark com-
+ mand. The text between the point and mark is referred to as the re-
+ gion.
+
+ Commands for Moving
+ beginning-of-line (C-a)
+ Move to the start of the current line.
+ end-of-line (C-e)
+ Move to the end of the line.
+ forward-char (C-f)
+ Move forward a character.
+ backward-char (C-b)
+ Move back a character.
+ forward-word (M-f)
+ Move forward to the end of the next word. Words are composed of
+ alphanumeric characters (letters and digits).
+ backward-word (M-b)
+ Move back to the start of the current or previous word. Words
+ are composed of alphanumeric characters (letters and digits).
+ previous-screen-line
+ Attempt to move point to the same physical screen column on the
+ previous physical screen line. This will not have the desired
+ effect if the current readline line does not take up more than
+ one physical line or if point is not greater than the length of
+ the prompt plus the screen width.
+ next-screen-line
+ Attempt to move point to the same physical screen column on the
+ next physical screen line. This will not have the desired effect
+ if the current readline line does not take up more than one
+ physical line or if the length of the current readline line is
+ not greater than the length of the prompt plus the screen width.
+ clear-display (M-C-l)
+ Clear the screen and, if possible, the terminal's scrollback
+ buffer, then redraw the current line, leaving the current line
+ at the top of the screen.
+ clear-screen (C-l)
+ Clear the screen, then redraw the current line, leaving the cur-
+ rent line at the top of the screen. With an argument, refresh
+ the current line without clearing the screen.
+ redraw-current-line
+ Refresh the current line.
+
+ Commands for Manipulating the History
+ accept-line (Newline, Return)
+ Accept the line regardless of where the cursor is. If this line
+ is non-empty, it may be added to the history list for future re-
+ call with add_history(). If the line is a modified history
+ line, the history line is restored to its original state.
+ previous-history (C-p)
+ Fetch the previous command from the history list, moving back in
+ the list.
+ next-history (C-n)
+ Fetch the next command from the history list, moving forward in
+ the list.
+ beginning-of-history (M-<)
+ Move to the first line in the history.
+ end-of-history (M->)
+ Move to the end of the input history, i.e., the line currently
+ being entered.
+ operate-and-get-next (C-o)
+ Accept the current line for return to the calling application as
+ if a newline had been entered, and fetch the next line relative
+ to the current line from the history for editing. A numeric ar-
+ gument, if supplied, specifies the history entry to use instead
+ of the current line.
+ fetch-history
+ With a numeric argument, fetch that entry from the history list
+ and make it the current line. Without an argument, move back to
+ the first entry in the history list.
+ reverse-search-history (C-r)
+ Search backward starting at the current line and moving `up'
+ through the history as necessary. This is an incremental
+ search.
+ forward-search-history (C-s)
+ Search forward starting at the current line and moving `down'
+ through the history as necessary. This is an incremental
+ search.
+ non-incremental-reverse-search-history (M-p)
+ Search backward through the history starting at the current line
+ using a non-incremental search for a string supplied by the
+ user.
+ non-incremental-forward-search-history (M-n)
+ Search forward through the history using a non-incremental
+ search for a string supplied by the user.
+ history-search-backward
+ Search backward through the history for the string of characters
+ between the start of the current line and the current cursor po-
+ sition (the point). The search string must match at the begin-
+ ning of a history line. This is a non-incremental search.
+ history-search-forward
+ Search forward through the history for the string of characters
+ between the start of the current line and the point. The search
+ string must match at the beginning of a history line. This is a
+ non-incremental search.
+ history-substring-search-backward
+ Search backward through the history for the string of characters
+ between the start of the current line and the current cursor po-
+ sition (the point). The search string may match anywhere in a
+ history line. This is a non-incremental search.
+ history-substring-search-forward
+ Search forward through the history for the string of characters
+ between the start of the current line and the point. The search
+ string may match anywhere in a history line. This is a non-in-
+ cremental search.
+ yank-nth-arg (M-C-y)
+ Insert the first argument to the previous command (usually the
+ second word on the previous line) at point. With an argument n,
+ insert the nth word from the previous command (the words in the
+ previous command begin with word 0). A negative argument in-
+ serts the nth word from the end of the previous command. Once
+ the argument n is computed, the argument is extracted as if the
+ "!n" history expansion had been specified.
+ yank-last-arg (M-., M-_)
+ Insert the last argument to the previous command (the last word
+ of the previous history entry). With a numeric argument, behave
+ exactly like yank-nth-arg. Successive calls to yank-last-arg
+ move back through the history list, inserting the last word (or
+ the word specified by the argument to the first call) of each
+ line in turn. Any numeric argument supplied to these successive
+ calls determines the direction to move through the history. A
+ negative argument switches the direction through the history
+ (back or forward). The history expansion facilities are used to
+ extract the last argument, as if the "!$" history expansion had
+ been specified.
+
+ Commands for Changing Text
+ end-of-file (usually C-d)
+ The character indicating end-of-file as set, for example, by
+ ``stty''. If this character is read when there are no charac-
+ ters on the line, and point is at the beginning of the line,
+ readline interprets it as the end of input and returns EOF.
+ delete-char (C-d)
+ Delete the character at point. If this function is bound to the
+ same character as the tty EOF character, as C-d commonly is, see
+ above for the effects.
+ backward-delete-char (Rubout)
+ Delete the character behind the cursor. When given a numeric
+ argument, save the deleted text on the kill ring.
+ forward-backward-delete-char
+ Delete the character under the cursor, unless the cursor is at
+ the end of the line, in which case the character behind the cur-
+ sor is deleted.
+ quoted-insert (C-q, C-v)
+ Add the next character that you type to the line verbatim. This
+ is how to insert characters like C-q, for example.
+ tab-insert (M-TAB)
+ Insert a tab character.
+ self-insert (a, b, A, 1, !, ...)
+ Insert the character typed.
+ transpose-chars (C-t)
+ Drag the character before point forward over the character at
+ point, moving point forward as well. If point is at the end of
+ the line, then this transposes the two characters before point.
+ Negative arguments have no effect.
+ transpose-words (M-t)
+ Drag the word before point past the word after point, moving
+ point over that word as well. If point is at the end of the
+ line, this transposes the last two words on the line.
+ upcase-word (M-u)
+ Uppercase the current (or following) word. With a negative ar-
+ gument, uppercase the previous word, but do not move point.
+ downcase-word (M-l)
+ Lowercase the current (or following) word. With a negative ar-
+ gument, lowercase the previous word, but do not move point.
+ capitalize-word (M-c)
+ Capitalize the current (or following) word. With a negative ar-
+ gument, capitalize the previous word, but do not move point.
+ overwrite-mode
+ Toggle overwrite mode. With an explicit positive numeric argu-
+ ment, switches to overwrite mode. With an explicit non-positive
+ numeric argument, switches to insert mode. This command affects
+ only emacs mode; vi mode does overwrite differently. Each call
+ to readline() starts in insert mode. In overwrite mode, charac-
+ ters bound to self-insert replace the text at point rather than
+ pushing the text to the right. Characters bound to back-
+ ward-delete-char replace the character before point with a
+ space. By default, this command is unbound.
+
+ Killing and Yanking
+ kill-line (C-k)
+ Kill the text from point to the end of the line.
+ backward-kill-line (C-x Rubout)
+ Kill backward to the beginning of the line.
+ unix-line-discard (C-u)
+ Kill backward from point to the beginning of the line. The
+ killed text is saved on the kill-ring.
+ kill-whole-line
+ Kill all characters on the current line, no matter where point
+ is.
+ kill-word (M-d)
+ Kill from point the end of the current word, or if between
+ words, to the end of the next word. Word boundaries are the
+ same as those used by forward-word.
+ backward-kill-word (M-Rubout)
+ Kill the word behind point. Word boundaries are the same as
+ those used by backward-word.
+ unix-word-rubout (C-w)
+ Kill the word behind point, using white space as a word bound-
+ ary. The killed text is saved on the kill-ring.
+ unix-filename-rubout
+ Kill the word behind point, using white space and the slash
+ character as the word boundaries. The killed text is saved on
+ the kill-ring.
+ delete-horizontal-space (M-\)
+ Delete all spaces and tabs around point.
+ kill-region
+ Kill the text between the point and mark (saved cursor posi-
+ tion). This text is referred to as the region.
+ copy-region-as-kill
+ Copy the text in the region to the kill buffer.
+ copy-backward-word
+ Copy the word before point to the kill buffer. The word bound-
+ aries are the same as backward-word.
+ copy-forward-word
+ Copy the word following point to the kill buffer. The word
+ boundaries are the same as forward-word.
+ yank (C-y)
+ Yank the top of the kill ring into the buffer at point.
+ yank-pop (M-y)
+ Rotate the kill ring, and yank the new top. Only works follow-
+ ing yank or yank-pop.
+
+ Numeric Arguments
+ digit-argument (M-0, M-1, ..., M--)
+ Add this digit to the argument already accumulating, or start a
+ new argument. M-- starts a negative argument.
+ universal-argument
+ This is another way to specify an argument. If this command is
+ followed by one or more digits, optionally with a leading minus
+ sign, those digits define the argument. If the command is fol-
+ lowed by digits, executing universal-argument again ends the nu-
+ meric argument, but is otherwise ignored. As a special case, if
+ this command is immediately followed by a character that is nei-
+ ther a digit or minus sign, the argument count for the next com-
+ mand is multiplied by four. The argument count is initially
+ one, so executing this function the first time makes the argu-
+ ment count four, a second time makes the argument count sixteen,
+ and so on.
+
+ Completing
+ complete (TAB)
+ Attempt to perform completion on the text before point. The ac-
+ tual completion performed is application-specific. Bash, for
+ instance, attempts completion treating the text as a variable
+ (if the text begins with $), username (if the text begins with
+ ~), hostname (if the text begins with @), or command (including
+ aliases and functions) in turn. If none of these produces a
+ match, filename completion is attempted. Gdb, on the other
+ hand, allows completion of program functions and variables, and
+ only attempts filename completion under certain circumstances.
+ possible-completions (M-?)
+ List the possible completions of the text before point. When
+ displaying completions, readline sets the number of columns used
+ for display to the value of completion-display-width, the value
+ of the environment variable COLUMNS, or the screen width, in
+ that order.
+ insert-completions (M-*)
+ Insert all completions of the text before point that would have
+ been generated by possible-completions.
+ menu-complete
+ Similar to complete, but replaces the word to be completed with
+ a single match from the list of possible completions. Repeated
+ execution of menu-complete steps through the list of possible
+ completions, inserting each match in turn. At the end of the
+ list of completions, the bell is rung (subject to the setting of
+ bell-style) and the original text is restored. An argument of n
+ moves n positions forward in the list of matches; a negative ar-
+ gument may be used to move backward through the list. This com-
+ mand is intended to be bound to TAB, but is unbound by default.
+ menu-complete-backward
+ Identical to menu-complete, but moves backward through the list
+ of possible completions, as if menu-complete had been given a
+ negative argument. This command is unbound by default.
+ delete-char-or-list
+ Deletes the character under the cursor if not at the beginning
+ or end of the line (like delete-char). If at the end of the
+ line, behaves identically to possible-completions.
+
+ Keyboard Macros
+ start-kbd-macro (C-x ()
+ Begin saving the characters typed into the current keyboard
+ macro.
+ end-kbd-macro (C-x ))
+ Stop saving the characters typed into the current keyboard macro
+ and store the definition.
+ call-last-kbd-macro (C-x e)
+ Re-execute the last keyboard macro defined, by making the char-
+ acters in the macro appear as if typed at the keyboard.
+ print-last-kbd-macro ()
+ Print the last keyboard macro defined in a format suitable for
+ the inputrc file.
+
+ Miscellaneous
+ re-read-init-file (C-x C-r)
+ Read in the contents of the inputrc file, and incorporate any
+ bindings or variable assignments found there.
+ abort (C-g)
+ Abort the current editing command and ring the terminal's bell
+ (subject to the setting of bell-style).
+ do-lowercase-version (M-A, M-B, M-x, ...)
+ If the metafied character x is uppercase, run the command that
+ is bound to the corresponding metafied lowercase character. The
+ behavior is undefined if x is already lowercase.
+ prefix-meta (ESC)
+ Metafy the next character typed. ESC f is equivalent to Meta-f.
+ undo (C-_, C-x C-u)
+ Incremental undo, separately remembered for each line.
+ revert-line (M-r)
+ Undo all changes made to this line. This is like executing the
+ undo command enough times to return the line to its initial
+ state.
+ tilde-expand (M-&)
+ Perform tilde expansion on the current word.
+ set-mark (C-@, M-<space>)
+ Set the mark to the point. If a numeric argument is supplied,
+ the mark is set to that position.
+ exchange-point-and-mark (C-x C-x)
+ Swap the point with the mark. The current cursor position is
+ set to the saved position, and the old cursor position is saved
+ as the mark.
+ character-search (C-])
+ A character is read and point is moved to the next occurrence of
+ that character. A negative argument searches for previous oc-
+ currences.
+ character-search-backward (M-C-])
+ A character is read and point is moved to the previous occur-
+ rence of that character. A negative argument searches for sub-
+ sequent occurrences.
+ skip-csi-sequence
+ Read enough characters to consume a multi-key sequence such as
+ those defined for keys like Home and End. Such sequences begin
+ with a Control Sequence Indicator (CSI), usually ESC-[. If this
+ sequence is bound to "\[", keys producing such sequences will
+ have no effect unless explicitly bound to a readline command,
+ instead of inserting stray characters into the editing buffer.
+ This is unbound by default, but usually bound to ESC-[.
+ insert-comment (M-#)
+ Without a numeric argument, the value of the readline com-
+ ment-begin variable is inserted at the beginning of the current
+ line. If a numeric argument is supplied, this command acts as a
+ toggle: if the characters at the beginning of the line do not
+ match the value of comment-begin, the value is inserted, other-
+ wise the characters in comment-begin are deleted from the begin-
+ ning of the line. In either case, the line is accepted as if a
+ newline had been typed. The default value of comment-begin
+ makes the current line a shell comment. If a numeric argument
+ causes the comment character to be removed, the line will be ex-
+ ecuted by the shell.
+ dump-functions
+ Print all of the functions and their key bindings to the read-
+ line output stream. If a numeric argument is supplied, the out-
+ put is formatted in such a way that it can be made part of an
+ inputrc file.
+ dump-variables
+ Print all of the settable variables and their values to the
+ readline output stream. If a numeric argument is supplied, the
+ output is formatted in such a way that it can be made part of an
+ inputrc file.
+ dump-macros
+ Print all of the readline key sequences bound to macros and the
+ strings they output. If a numeric argument is supplied, the
+ output is formatted in such a way that it can be made part of an
+ inputrc file.
+ emacs-editing-mode (C-e)
+ When in vi command mode, this causes a switch to emacs editing
+ mode.
+ vi-editing-mode (M-C-j)
+ When in emacs editing mode, this causes a switch to vi editing
+ mode.
+
+DEFAULT KEY BINDINGS
+ The following is a list of the default emacs and vi bindings. Charac-
+ ters with the eighth bit set are written as M-<character>, and are re-
+ ferred to as metafied characters. The printable ASCII characters not
+ mentioned in the list of emacs standard bindings are bound to the
+ self-insert function, which just inserts the given character into the
+ input line. In vi insertion mode, all characters not specifically men-
+ tioned are bound to self-insert. Characters assigned to signal genera-
+ tion by stty(1) or the terminal driver, such as C-Z or C-C, retain that
+ function. Upper and lower case metafied characters are bound to the
+ same function in the emacs mode meta keymap. The remaining characters
+ are unbound, which causes readline to ring the bell (subject to the
+ setting of the bell-style variable).
+
+ Emacs Mode
+ Emacs Standard bindings
+
+ "C-@" set-mark
+ "C-A" beginning-of-line
+ "C-B" backward-char
+ "C-D" delete-char
+ "C-E" end-of-line
+ "C-F" forward-char
+ "C-G" abort
+ "C-H" backward-delete-char
+ "C-I" complete
+ "C-J" accept-line
+ "C-K" kill-line
+ "C-L" clear-screen
+ "C-M" accept-line
+ "C-N" next-history
+ "C-P" previous-history
+ "C-Q" quoted-insert
+ "C-R" reverse-search-history
+ "C-S" forward-search-history
+ "C-T" transpose-chars
+ "C-U" unix-line-discard
+ "C-V" quoted-insert
+ "C-W" unix-word-rubout
+ "C-Y" yank
+ "C-]" character-search
+ "C-_" undo
+ " " to "/" self-insert
+ "0" to "9" self-insert
+ ":" to "~" self-insert
+ "C-?" backward-delete-char
+
+ Emacs Meta bindings
+
+ "M-C-G" abort
+ "M-C-H" backward-kill-word
+ "M-C-I" tab-insert
+ "M-C-J" vi-editing-mode
+ "M-C-L" clear-display
+ "M-C-M" vi-editing-mode
+ "M-C-R" revert-line
+ "M-C-Y" yank-nth-arg
+ "M-C-[" complete
+ "M-C-]" character-search-backward
+ "M-space" set-mark
+ "M-#" insert-comment
+ "M-&" tilde-expand
+ "M-*" insert-completions
+ "M--" digit-argument
+ "M-." yank-last-arg
+ "M-0" digit-argument
+ "M-1" digit-argument
+ "M-2" digit-argument
+ "M-3" digit-argument
+ "M-4" digit-argument
+ "M-5" digit-argument
+ "M-6" digit-argument
+ "M-7" digit-argument
+ "M-8" digit-argument
+ "M-9" digit-argument
+ "M-<" beginning-of-history
+ "M-=" possible-completions
+ "M->" end-of-history
+ "M-?" possible-completions
+ "M-B" backward-word
+ "M-C" capitalize-word
+ "M-D" kill-word
+ "M-F" forward-word
+ "M-L" downcase-word
+ "M-N" non-incremental-forward-search-history
+ "M-P" non-incremental-reverse-search-history
+ "M-R" revert-line
+ "M-T" transpose-words
+ "M-U" upcase-word
+ "M-Y" yank-pop
+ "M-\" delete-horizontal-space
+ "M-~" tilde-expand
+ "M-C-?" backward-kill-word
+ "M-_" yank-last-arg
+
+ Emacs Control-X bindings
+
+ "C-XC-G" abort
+ "C-XC-R" re-read-init-file
+ "C-XC-U" undo
+ "C-XC-X" exchange-point-and-mark
+ "C-X(" start-kbd-macro
+ "C-X)" end-kbd-macro
+ "C-XE" call-last-kbd-macro
+ "C-XC-?" backward-kill-line
+
+
+ VI Mode bindings
+ VI Insert Mode functions
+
+ "C-D" vi-eof-maybe
+ "C-H" backward-delete-char
+ "C-I" complete
+ "C-J" accept-line
+ "C-M" accept-line
+ "C-R" reverse-search-history
+ "C-S" forward-search-history
+ "C-T" transpose-chars
+ "C-U" unix-line-discard
+ "C-V" quoted-insert
+ "C-W" unix-word-rubout
+ "C-Y" yank
+ "C-[" vi-movement-mode
+ "C-_" undo
+ " " to "~" self-insert
+ "C-?" backward-delete-char
+
+ VI Command Mode functions
+
+ "C-D" vi-eof-maybe
+ "C-E" emacs-editing-mode
+ "C-G" abort
+ "C-H" backward-char
+ "C-J" accept-line
+ "C-K" kill-line
+ "C-L" clear-screen
+ "C-M" accept-line
+ "C-N" next-history
+ "C-P" previous-history
+ "C-Q" quoted-insert
+ "C-R" reverse-search-history
+ "C-S" forward-search-history
+ "C-T" transpose-chars
+ "C-U" unix-line-discard
+ "C-V" quoted-insert
+ "C-W" unix-word-rubout
+ "C-Y" yank
+ "C-_" vi-undo
+ " " forward-char
+ "#" insert-comment
+ "$" end-of-line
+ "%" vi-match
+ "&" vi-tilde-expand
+ "*" vi-complete
+ "+" next-history
+ "," vi-char-search
+ "-" previous-history
+ "." vi-redo
+ "/" vi-search
+ "0" beginning-of-line
+ "1" to "9" vi-arg-digit
+ ";" vi-char-search
+ "=" vi-complete
+ "?" vi-search
+ "A" vi-append-eol
+ "B" vi-prev-word
+ "C" vi-change-to
+ "D" vi-delete-to
+ "E" vi-end-word
+ "F" vi-char-search
+ "G" vi-fetch-history
+ "I" vi-insert-beg
+ "N" vi-search-again
+ "P" vi-put
+ "R" vi-replace
+ "S" vi-subst
+ "T" vi-char-search
+ "U" revert-line
+ "W" vi-next-word
+ "X" backward-delete-char
+ "Y" vi-yank-to
+ "\" vi-complete
+ "^" vi-first-print
+ "_" vi-yank-arg
+ "`" vi-goto-mark
+ "a" vi-append-mode
+ "b" vi-prev-word
+ "c" vi-change-to
+ "d" vi-delete-to
+ "e" vi-end-word
+ "f" vi-char-search
+ "h" backward-char
+ "i" vi-insertion-mode
+ "j" next-history
+ "k" prev-history
+ "l" forward-char
+ "m" vi-set-mark
+ "n" vi-search-again
+ "p" vi-put
+ "r" vi-change-char
+ "s" vi-subst
+ "t" vi-char-search
+ "u" vi-undo
+ "w" vi-next-word
+ "x" vi-delete
+ "y" vi-yank-to
+ "|" vi-column
+ "~" vi-change-case
+
+SEE ALSO
+ The Gnu Readline Library, Brian Fox and Chet Ramey
+ The Gnu History Library, Brian Fox and Chet Ramey
+ bash(1)
+
+FILES
+ ~/.inputrc
+ Individual readline initialization file
+
+AUTHORS
+ Brian Fox, Free Software Foundation
+ bfox@gnu.org
+
+ Chet Ramey, Case Western Reserve University
+ chet.ramey@case.edu
+
+BUG REPORTS
+ If you find a bug in readline, you should report it. But first, you
+ should make sure that it really is a bug, and that it appears in the
+ latest version of the readline library that you have.
+
+ Once you have determined that a bug actually exists, mail a bug report
+ to bug-readline@gnu.org. If you have a fix, you are welcome to mail
+ that as well! Suggestions and `philosophical' bug reports may be
+ mailed to bug-readline@gnu.org or posted to the Usenet newsgroup
+ gnu.bash.bug.
+
+ Comments and bug reports concerning this manual page should be directed
+ to chet.ramey@case.edu.
+
+BUGS
+ It's too big and too slow.
+
+
+
+GNU Readline 8.2 2022 September 19 READLINE(3)
diff --git a/doc/readline.3 b/doc/readline.3
new file mode 100644
index 0000000..77ef02a
--- /dev/null
+++ b/doc/readline.3
@@ -0,0 +1,1597 @@
+.\"
+.\" MAN PAGE COMMENTS to
+.\"
+.\" Chet Ramey
+.\" Information Network Services
+.\" Case Western Reserve University
+.\" chet.ramey@case.edu
+.\"
+.\" Last Change: Mon Sep 19 11:11:22 EDT 2022
+.\"
+.TH READLINE 3 "2022 September 19" "GNU Readline 8.2"
+.\"
+.\" File Name macro. This used to be `.PN', for Path Name,
+.\" but Sun doesn't seem to like that very much.
+.\"
+.de FN
+\fI\|\\$1\|\fP
+..
+.SH NAME
+readline \- get a line from a user with editing
+.SH SYNOPSIS
+.LP
+.nf
+.ft B
+#include <stdio.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+.ft
+.fi
+.LP
+.nf
+\fIchar *\fP
+.br
+\fBreadline\fP (\fIconst char *prompt\fP);
+.fi
+.SH COPYRIGHT
+.if n Readline is Copyright (C) 1989\-2020 Free Software Foundation, Inc.
+.if t Readline is Copyright \(co 1989\-2020 Free Software Foundation, Inc.
+.SH DESCRIPTION
+.LP
+.B readline
+will read a line from the terminal
+and return it, using
+.B prompt
+as a prompt. If
+.B prompt
+is \fBNULL\fP or the empty string, no prompt is issued.
+The line returned is allocated with
+.IR malloc (3);
+the caller must free it when finished. The line returned
+has the final newline removed, so only the text of the line
+remains.
+.LP
+.B readline
+offers editing capabilities while the user is entering the
+line.
+By default, the line editing commands
+are similar to those of emacs.
+A vi\-style line editing interface is also available.
+.LP
+This manual page describes only the most basic use of \fBreadline\fP.
+Much more functionality is available; see
+\fIThe GNU Readline Library\fP and \fIThe GNU History Library\fP
+for additional information.
+.SH RETURN VALUE
+.LP
+.B readline
+returns the text of the line read. A blank line
+returns the empty string. If
+.B EOF
+is encountered while reading a line, and the line is empty,
+.B NULL
+is returned. If an
+.B EOF
+is read with a non\-empty line, it is
+treated as a newline.
+.SH NOTATION
+.LP
+An Emacs-style notation is used to denote
+keystrokes. Control keys are denoted by C\-\fIkey\fR, e.g., C\-n
+means Control\-N. Similarly,
+.I meta
+keys are denoted by M\-\fIkey\fR, so M\-x means Meta\-X. (On keyboards
+without a
+.I meta
+key, M\-\fIx\fP means ESC \fIx\fP, i.e., press the Escape key
+then the
+.I x
+key. This makes ESC the \fImeta prefix\fP.
+The combination M\-C\-\fIx\fP means ESC\-Control\-\fIx\fP,
+or press the Escape key
+then hold the Control key while pressing the
+.I x
+key.)
+.PP
+Readline commands may be given numeric
+.IR arguments ,
+which normally act as a repeat count. Sometimes, however, it is the
+sign of the argument that is significant. Passing a negative argument
+to a command that acts in the forward direction (e.g., \fBkill\-line\fP)
+causes that command to act in a backward direction.
+Commands whose behavior with arguments deviates from this are noted
+below.
+.PP
+When a command is described as \fIkilling\fP text, the text
+deleted is saved for possible future retrieval
+(\fIyanking\fP). The killed text is saved in a
+\fIkill ring\fP. Consecutive kills cause the text to be
+accumulated into one unit, which can be yanked all at once.
+Commands which do not kill text separate the chunks of text
+on the kill ring.
+.SH INITIALIZATION FILE
+.LP
+Readline is customized by putting commands in an initialization
+file (the \fIinputrc\fP file).
+The name of this file is taken from the value of the
+.B INPUTRC
+environment variable. If that variable is unset, the default is
+.IR ~/.inputrc .
+If that file does not exist or cannot be read, the ultimate default is
+.IR /etc/inputrc .
+When a program which uses the readline library starts up, the
+init file is read, and the key bindings and variables are set.
+There are only a few basic constructs allowed in the
+readline init file. Blank lines are ignored.
+Lines beginning with a \fB#\fP are comments.
+Lines beginning with a \fB$\fP indicate conditional constructs.
+Other lines denote key bindings and variable settings.
+Each program using this library may add its own commands
+and bindings.
+.PP
+For example, placing
+.RS
+.PP
+M\-Control\-u: universal\-argument
+.RE
+or
+.RS
+C\-Meta\-u: universal\-argument
+.RE
+.sp
+into the
+.I inputrc
+would make M\-C\-u execute the readline command
+.IR universal\-argument .
+.PP
+The following symbolic character names are recognized while
+processing key bindings:
+.IR DEL ,
+.IR ESC ,
+.IR ESCAPE ,
+.IR LFD ,
+.IR NEWLINE ,
+.IR RET ,
+.IR RETURN ,
+.IR RUBOUT ,
+.IR SPACE ,
+.IR SPC ,
+and
+.IR TAB .
+.PP
+In addition to command names, readline allows keys to be bound
+to a string that is inserted when the key is pressed (a \fImacro\fP).
+.PP
+.SS Key Bindings
+The syntax for controlling key bindings in the
+.I inputrc
+file is simple. All that is required is the name of the
+command or the text of a macro and a key sequence to which
+it should be bound. The name may be specified in one of two ways:
+as a symbolic key name, possibly with \fIMeta\-\fP or \fIControl\-\fP
+prefixes, or as a key sequence.
+The name and key sequence are separated by a colon. There can be no
+whitespace between the name and the colon.
+.PP
+When using the form \fBkeyname\fP:\^\fIfunction-name\fP or \fImacro\fP,
+.I keyname
+is the name of a key spelled out in English. For example:
+.sp
+.RS
+Control\-u: universal\-argument
+.br
+Meta\-Rubout: backward\-kill\-word
+.br
+Control\-o: "> output"
+.RE
+.LP
+In the above example,
+.I C\-u
+is bound to the function
+.BR universal\-argument ,
+.I M-DEL
+is bound to the function
+.BR backward\-kill\-word ,
+and
+.I C\-o
+is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+.if t \f(CW> output\fP
+.if n ``> output''
+into the line).
+.PP
+In the second form, \fB"keyseq"\fP:\^\fIfunction\-name\fP or \fImacro\fP,
+.B keyseq
+differs from
+.B keyname
+above in that strings denoting
+an entire key sequence may be specified by placing the sequence
+within double quotes. Some GNU Emacs style key escapes can be
+used, as in the following example, but the symbolic character names
+are not recognized.
+.sp
+.RS
+"\eC\-u": universal\-argument
+.br
+"\eC\-x\eC\-r": re\-read\-init\-file
+.br
+"\ee[11~": "Function Key 1"
+.RE
+.PP
+In this example,
+.I C-u
+is again bound to the function
+.BR universal\-argument .
+.I "C-x C-r"
+is bound to the function
+.BR re\-read\-init\-file ,
+and
+.I "ESC [ 1 1 ~"
+is bound to insert the text
+.if t \f(CWFunction Key 1\fP.
+.if n ``Function Key 1''.
+.PP
+The full set of GNU Emacs style escape sequences available when specifying
+key sequences is
+.RS
+.PD 0
+.TP
+.B \eC\-
+control prefix
+.TP
+.B \eM\-
+meta prefix
+.TP
+.B \ee
+an escape character
+.TP
+.B \e\e
+backslash
+.TP
+.B \e"
+literal ", a double quote
+.TP
+.B \e'
+literal ', a single quote
+.RE
+.PD
+.PP
+In addition to the GNU Emacs style escape sequences, a second
+set of backslash escapes is available:
+.RS
+.PD 0
+.TP
+.B \ea
+alert (bell)
+.TP
+.B \eb
+backspace
+.TP
+.B \ed
+delete
+.TP
+.B \ef
+form feed
+.TP
+.B \en
+newline
+.TP
+.B \er
+carriage return
+.TP
+.B \et
+horizontal tab
+.TP
+.B \ev
+vertical tab
+.TP
+.B \e\fInnn\fP
+the eight-bit character whose value is the octal value \fInnn\fP
+(one to three digits)
+.TP
+.B \ex\fIHH\fP
+the eight-bit character whose value is the hexadecimal value \fIHH\fP
+(one or two hex digits)
+.RE
+.PD
+.PP
+When entering the text of a macro, single or double quotes should
+be used to indicate a macro definition. Unquoted text
+is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including " and '.
+.PP
+.B Bash
+allows the current readline key bindings to be displayed or modified
+with the
+.B bind
+builtin command. The editing mode may be switched during interactive
+use by using the
+.B \-o
+option to the
+.B set
+builtin command. Other programs using this library provide
+similar mechanisms. The
+.I inputrc
+file may be edited and re-read if a program does not provide
+any other means to incorporate new bindings.
+.SS Variables
+Readline has variables that can be used to further customize its
+behavior. A variable may be set in the
+.I inputrc
+file with a statement of the form
+.RS
+.PP
+\fBset\fP \fIvariable\-name\fP \fIvalue\fP
+.RE
+.PP
+Except where noted, readline variables can take the values
+.B On
+or
+.B Off
+(without regard to case).
+Unrecognized variable names are ignored.
+When a variable value is read, empty or null values, "on" (case-insensitive),
+and "1" are equivalent to \fBOn\fP. All other values are equivalent to
+\fBOff\fP.
+The variables and their default values are:
+.PP
+.PD 0
+.TP
+.B active\-region\-start\-color
+A string variable that controls the text color and background when displaying
+the text in the active region (see the description of
+\fBenable\-active\-region\fP below).
+This string must not take up any physical character positions on the display,
+so it should consist only of terminal escape sequences.
+It is output to the terminal before displaying the text in the active region.
+This variable is reset to the default value whenever the terminal type changes.
+The default value is the string that puts the terminal in standout mode,
+as obtained from the terminal's terminfo description.
+A sample value might be \f(CW"\ee[01;33m"\fP.
+.TP
+.B active\-region\-end\-color
+A string variable that "undoes" the effects of \fBactive\-region\-start\-color\fP
+and restores "normal" terminal display appearance after displaying text
+in the active region.
+This string must not take up any physical character positions on the display,
+so it should consist only of terminal escape sequences.
+It is output to the terminal after displaying the text in the active region.
+This variable is reset to the default value whenever the terminal type changes.
+The default value is the string that restores the terminal from standout mode,
+as obtained from the terminal's terminfo description.
+A sample value might be \f(CW"\ee[0m\fP".
+.TP
+.B bell\-style (audible)
+Controls what happens when readline wants to ring the terminal bell.
+If set to \fBnone\fP, readline never rings the bell. If set to
+\fBvisible\fP, readline uses a visible bell if one is available.
+If set to \fBaudible\fP, readline attempts to ring the terminal's bell.
+.TP
+.B bind\-tty\-special\-chars (On)
+If set to \fBOn\fP (the default), readline attempts to bind the control
+characters treated specially by the kernel's terminal driver to their
+readline equivalents.
+.TP
+.B blink\-matching\-paren (Off)
+If set to \fBOn\fP, readline attempts to briefly move the cursor to an
+opening parenthesis when a closing parenthesis is inserted.
+.TP
+.B colored\-completion\-prefix (Off)
+If set to \fBOn\fP, when listing completions, readline displays the
+common prefix of the set of possible completions using a different color.
+The color definitions are taken from the value of the \fBLS_COLORS\fP
+environment variable.
+If there is a color definition in \fB$LS_COLORS\fP for the custom suffix
+"readline-colored-completion-prefix", readline uses this color for
+the common prefix instead of its default.
+.TP
+.B colored\-stats (Off)
+If set to \fBOn\fP, readline displays possible completions using different
+colors to indicate their file type.
+The color definitions are taken from the value of the \fBLS_COLORS\fP
+environment variable.
+.TP
+.B comment\-begin (``#'')
+The string that is inserted in \fBvi\fP mode when the
+.B insert\-comment
+command is executed.
+This command is bound to
+.B M\-#
+in emacs mode and to
+.B #
+in vi command mode.
+.TP
+.B completion\-display\-width (\-1)
+The number of screen columns used to display possible matches
+when performing completion.
+The value is ignored if it is less than 0 or greater than the terminal
+screen width.
+A value of 0 will cause matches to be displayed one per line.
+The default value is \-1.
+.TP
+.B completion\-ignore\-case (Off)
+If set to \fBOn\fP, readline performs filename matching and completion
+in a case\-insensitive fashion.
+.TP
+.B completion\-map\-case (Off)
+If set to \fBOn\fP, and \fBcompletion\-ignore\-case\fP is enabled, readline
+treats hyphens (\fI\-\fP) and underscores (\fI_\fP) as equivalent when
+performing case\-insensitive filename matching and completion.
+.TP
+.B completion\-prefix\-display\-length (0)
+The length in characters of the common prefix of a list of possible
+completions that is displayed without modification. When set to a
+value greater than zero, common prefixes longer than this value are
+replaced with an ellipsis when displaying possible completions.
+.TP
+.B completion\-query\-items (100)
+This determines when the user is queried about viewing
+the number of possible completions
+generated by the \fBpossible\-completions\fP command.
+It may be set to any integer value greater than or equal to zero.
+If the number of possible completions is greater than
+or equal to the value of this variable,
+readline will ask whether or not the user wishes to view them;
+otherwise they are simply listed
+on the terminal.
+A negative value causes readline to never ask.
+.TP
+.B convert\-meta (On)
+If set to \fBOn\fP, readline will convert characters with the
+eighth bit set to an ASCII key sequence
+by stripping the eighth bit and prefixing it with an
+escape character (in effect, using escape as the \fImeta prefix\fP).
+The default is \fIOn\fP, but readline will set it to \fIOff\fP if the
+locale contains eight-bit characters.
+This variable is dependent on the \fBLC_CTYPE\fP locale category, and
+may change if the locale is changed.
+.TP
+.B disable\-completion (Off)
+If set to \fBOn\fP, readline will inhibit word completion. Completion
+characters will be inserted into the line as if they had been
+mapped to \fBself-insert\fP.
+.TP
+.B echo\-control\-characters (On)
+When set to \fBOn\fP, on operating systems that indicate they support it,
+readline echoes a character corresponding to a signal generated from the
+keyboard.
+.TP
+.B editing\-mode (emacs)
+Controls whether readline begins with a set of key bindings similar
+to \fIEmacs\fP or \fIvi\fP.
+.B editing\-mode
+can be set to either
+.B emacs
+or
+.BR vi .
+.TP
+.B emacs\-mode\-string (@)
+If the \fIshow\-mode\-in\-prompt\fP variable is enabled,
+this string is displayed immediately before the last line of the primary
+prompt when emacs editing mode is active. The value is expanded like a
+key binding, so the standard set of meta- and control prefixes and
+backslash escape sequences is available.
+Use the \e1 and \e2 escapes to begin and end sequences of
+non-printing characters, which can be used to embed a terminal control
+sequence into the mode string.
+.TP
+.B enable\-active\-region (On)
+The \fIpoint\fP is the current cursor position, and \fImark\fP refers
+to a saved cursor position.
+The text between the point and mark is referred to as the \fIregion\fP.
+When this variable is set to \fIOn\fP, readline allows certain commands
+to designate the region as \fIactive\fP.
+When the region is active, readline highlights the text in the region using
+the value of the \fBactive\-region\-start\-color\fP, which defaults to the
+string that enables
+the terminal's standout mode.
+The active region shows the text inserted by bracketed-paste and any
+matching text found by incremental and non-incremental history searches.
+.TP
+.B enable\-bracketed\-paste (On)
+When set to \fBOn\fP, readline configures the terminal to insert each
+paste into the editing buffer as a single string of characters, instead
+of treating each character as if it had been read from the keyboard.
+This prevents readline from executing any editing commands bound to key
+sequences appearing in the pasted text.
+.TP
+.B enable\-keypad (Off)
+When set to \fBOn\fP, readline will try to enable the application
+keypad when it is called. Some systems need this to enable the
+arrow keys.
+.TP
+.B enable\-meta\-key (On)
+When set to \fBOn\fP, readline will try to enable any meta modifier
+key the terminal claims to support when it is called. On many terminals,
+the meta key is used to send eight-bit characters.
+.TP
+.B expand\-tilde (Off)
+If set to \fBOn\fP, tilde expansion is performed when readline
+attempts word completion.
+.TP
+.B history\-preserve\-point (Off)
+If set to \fBOn\fP, the history code attempts to place point at the
+same location on each history line retrieved with \fBprevious-history\fP
+or \fBnext-history\fP.
+.TP
+.B history\-size (unset)
+Set the maximum number of history entries saved in the history list.
+If set to zero, any existing history entries are deleted and no new entries
+are saved.
+If set to a value less than zero, the number of history entries is not
+limited.
+By default, the number of history entries is not limited.
+If an attempt is made to set \fIhistory\-size\fP to a non-numeric value,
+the maximum number of history entries will be set to 500.
+.TP
+.B horizontal\-scroll\-mode (Off)
+When set to \fBOn\fP, makes readline use a single line for display,
+scrolling the input horizontally on a single screen line when it
+becomes longer than the screen width rather than wrapping to a new line.
+This setting is automatically enabled for terminals of height 1.
+.TP
+.B input\-meta (Off)
+If set to \fBOn\fP, readline will enable eight-bit input (that is,
+it will not clear the eighth bit in the characters it reads),
+regardless of what the terminal claims it can support. The name
+.B meta\-flag
+is a synonym for this variable.
+The default is \fIOff\fP, but readline will set it to \fIOn\fP if the
+locale contains eight-bit characters.
+This variable is dependent on the \fBLC_CTYPE\fP locale category, and
+may change if the locale is changed.
+.TP
+.B isearch\-terminators (``C\-[ C\-J'')
+The string of characters that should terminate an incremental
+search without subsequently executing the character as a command.
+If this variable has not been given a value, the characters
+\fIESC\fP and \fIC\-J\fP will terminate an incremental search.
+.TP
+.B keymap (emacs)
+Set the current readline keymap. The set of legal keymap names is
+\fIemacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,
+vi-command\fP, and
+.IR vi-insert .
+\fIvi\fP is equivalent to \fIvi-command\fP; \fIemacs\fP is
+equivalent to \fIemacs-standard\fP. The default value is
+.IR emacs .
+The value of
+.B editing\-mode
+also affects the default keymap.
+.TP
+.B keyseq\-timeout (500)
+Specifies the duration \fIreadline\fP will wait for a character when reading an
+ambiguous key sequence (one that can form a complete key sequence using
+the input read so far, or can take additional input to complete a longer
+key sequence).
+If no input is received within the timeout, \fIreadline\fP will use the shorter
+but complete key sequence.
+The value is specified in milliseconds, so a value of 1000 means that
+\fIreadline\fP will wait one second for additional input.
+If this variable is set to a value less than or equal to zero, or to a
+non-numeric value, \fIreadline\fP will wait until another key is pressed to
+decide which key sequence to complete.
+.TP
+.B mark\-directories (On)
+If set to \fBOn\fP, completed directory names have a slash
+appended.
+.TP
+.B mark\-modified\-lines (Off)
+If set to \fBOn\fP, history lines that have been modified are displayed
+with a preceding asterisk (\fB*\fP).
+.TP
+.B mark\-symlinked\-directories (Off)
+If set to \fBOn\fP, completed names which are symbolic links to directories
+have a slash appended (subject to the value of
+\fBmark\-directories\fP).
+.TP
+.B match\-hidden\-files (On)
+This variable, when set to \fBOn\fP, causes readline to match files whose
+names begin with a `.' (hidden files) when performing filename
+completion.
+If set to \fBOff\fP, the leading `.' must be
+supplied by the user in the filename to be completed.
+.TP
+.B menu\-complete\-display\-prefix (Off)
+If set to \fBOn\fP, menu completion displays the common prefix of the
+list of possible completions (which may be empty) before cycling through
+the list.
+.TP
+.B output\-meta (Off)
+If set to \fBOn\fP, readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.
+The default is \fIOff\fP, but readline will set it to \fIOn\fP if the
+locale contains eight-bit characters.
+This variable is dependent on the \fBLC_CTYPE\fP locale category, and
+may change if the locale is changed.
+.TP
+.B page\-completions (On)
+If set to \fBOn\fP, readline uses an internal \fImore\fP-like pager
+to display a screenful of possible completions at a time.
+.TP
+.B print\-completions\-horizontally (Off)
+If set to \fBOn\fP, readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+.TP
+.B revert\-all\-at\-newline (Off)
+If set to \fBOn\fP, readline will undo all changes to history lines
+before returning when \fBaccept\-line\fP is executed. By default,
+history lines may be modified and retain individual undo lists across
+calls to \fBreadline\fP.
+.TP
+.B show\-all\-if\-ambiguous (Off)
+This alters the default behavior of the completion functions. If
+set to
+.BR On ,
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+.TP
+.B show\-all\-if\-unmodified (Off)
+This alters the default behavior of the completion functions in
+a fashion similar to \fBshow\-all\-if\-ambiguous\fP.
+If set to
+.BR On ,
+words which have more than one possible completion without any
+possible partial completion (the possible completions don't share
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+.TP
+.B show\-mode\-in\-prompt (Off)
+If set to \fBOn\fP, add a string to the beginning of the prompt
+indicating the editing mode: emacs, vi command, or vi insertion.
+The mode strings are user-settable (e.g., \fIemacs\-mode\-string\fP).
+.TP
+.B skip\-completed\-text (Off)
+If set to \fBOn\fP, this alters the default completion behavior when
+inserting a single match into the line. It's only active when
+performing completion in the middle of a word. If enabled, readline
+does not insert characters from the completion that match characters
+after point in the word being completed, so portions of the word
+following the cursor are not duplicated.
+.TP
+.B vi\-cmd\-mode\-string ((cmd))
+If the \fIshow\-mode\-in\-prompt\fP variable is enabled,
+this string is displayed immediately before the last line of the primary
+prompt when vi editing mode is active and in command mode.
+The value is expanded like a
+key binding, so the standard set of meta- and control prefixes and
+backslash escape sequences is available.
+Use the \e1 and \e2 escapes to begin and end sequences of
+non-printing characters, which can be used to embed a terminal control
+sequence into the mode string.
+.TP
+.B vi\-ins\-mode\-string ((ins))
+If the \fIshow\-mode\-in\-prompt\fP variable is enabled,
+this string is displayed immediately before the last line of the primary
+prompt when vi editing mode is active and in insertion mode.
+The value is expanded like a
+key binding, so the standard set of meta- and control prefixes and
+backslash escape sequences is available.
+Use the \e1 and \e2 escapes to begin and end sequences of
+non-printing characters, which can be used to embed a terminal control
+sequence into the mode string.
+.TP
+.B visible\-stats (Off)
+If set to \fBOn\fP, a character denoting a file's type as reported
+by \fIstat\fP(2) is appended to the filename when listing possible
+completions.
+.PD
+.SS Conditional Constructs
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests. There are four parser directives used.
+.IP \fB$if\fP
+The
+.B $if
+construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+readline. The text of the test, after any comparison operator,
+extends to the end of the line;
+unless otherwise noted, no characters are required to isolate it.
+.RS
+.IP \fBmode\fP
+The \fBmode=\fP form of the \fB$if\fP directive is used to test
+whether readline is in emacs or vi mode.
+This may be used in conjunction
+with the \fBset keymap\fP command, for instance, to set bindings in
+the \fIemacs-standard\fP and \fIemacs-ctlx\fP keymaps only if
+readline is starting out in emacs mode.
+.IP \fBterm\fP
+The \fBterm=\fP form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys. The word on the right side of the
+.B =
+is tested against the full name of the terminal and the portion
+of the terminal name before the first \fB\-\fP. This allows
+.I sun
+to match both
+.I sun
+and
+.IR sun\-cmd ,
+for instance.
+.IP \fBversion\fP
+The \fBversion\fP test may be used to perform comparisons against
+specific readline versions.
+The \fBversion\fP expands to the current readline version.
+The set of comparison operators includes
+.BR = ,
+(and
+.BR == ),
+.BR != ,
+.BR <= ,
+.BR >= ,
+.BR < ,
+and
+.BR > .
+The version number supplied on the right side of the operator consists
+of a major version number, an optional decimal point, and an optional
+minor version (e.g., \fB7.1\fP). If the minor version is omitted, it
+is assumed to be \fB0\fP.
+The operator may be separated from the string \fBversion\fP
+and from the version number argument by whitespace.
+.IP \fBapplication\fP
+The \fBapplication\fP construct is used to include
+application-specific settings. Each program using the readline
+library sets the \fIapplication name\fP, and an initialization
+file can test for a particular value.
+This could be used to bind key sequences to functions useful for
+a specific program. For instance, the following command adds a
+key sequence that quotes the current or previous word in \fBbash\fP:
+.sp 1
+.RS
+.nf
+\fB$if\fP Bash
+# Quote the current or previous word
+"\eC-xq": "\eeb\e"\eef\e""
+\fB$endif\fP
+.fi
+.RE
+.IP \fIvariable\fP
+The \fIvariable\fP construct provides simple equality tests for readline
+variables and values.
+The permitted comparison operators are \fI=\fP, \fI==\fP, and \fI!=\fP.
+The variable name must be separated from the comparison operator by
+whitespace; the operator may be separated from the value on the right hand
+side by whitespace.
+Both string and boolean variables may be tested. Boolean variables must be
+tested against the values \fIon\fP and \fIoff\fP.
+.RE
+.IP \fB$endif\fP
+This command, as seen in the previous example, terminates an
+\fB$if\fP command.
+.IP \fB$else\fP
+Commands in this branch of the \fB$if\fP directive are executed if
+the test fails.
+.IP \fB$include\fP
+This directive takes a single filename as an argument and reads commands
+and bindings from that file. For example, the following directive
+would read \fI/etc/inputrc\fP:
+.sp 1
+.RS
+.nf
+\fB$include\fP \^ \fI/etc/inputrc\fP
+.fi
+.RE
+.SH SEARCHING
+Readline provides commands for searching through the command history
+for lines containing a specified string.
+There are two search modes:
+.I incremental
+and
+.IR non-incremental .
+.PP
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+To search backward in the history for a particular string, type
+\fBC\-r\fP. Typing \fBC\-s\fP searches forward through the history.
+The characters present in the value of the \fBisearch-terminators\fP
+variable are used to terminate an incremental search.
+If that variable has not been assigned a value the \fIEscape\fP and
+\fBC\-J\fP characters will terminate an incremental search.
+\fBC\-G\fP will abort an incremental search and restore the original
+line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+.PP
+To find other matching entries in the history list, type \fBC\-s\fP or
+\fBC\-r\fP as appropriate.
+This will search backward or forward in the history for the next
+line matching the search string typed so far.
+Any other key sequence bound to a readline command will terminate
+the search and execute that command.
+For instance, a newline will terminate the search and accept
+the line, thereby executing the command from the history list.
+A movement command will terminate the search, make the last line found
+the current line, and begin editing.
+.PP
+Non-incremental searches read the entire search string before starting
+to search for matching history lines. The search string may be
+typed by the user or be part of the contents of the current line.
+.SH EDITING COMMANDS
+The following is a list of the names of the commands and the default
+key sequences to which they are bound.
+Command names without an accompanying key sequence are unbound by default.
+.PP
+In the following descriptions, \fIpoint\fP refers to the current cursor
+position, and \fImark\fP refers to a cursor position saved by the
+\fBset\-mark\fP command.
+The text between the point and mark is referred to as the \fIregion\fP.
+.SS Commands for Moving
+.PD 0
+.TP
+.B beginning\-of\-line (C\-a)
+Move to the start of the current line.
+.TP
+.B end\-of\-line (C\-e)
+Move to the end of the line.
+.TP
+.B forward\-char (C\-f)
+Move forward a character.
+.TP
+.B backward\-char (C\-b)
+Move back a character.
+.TP
+.B forward\-word (M\-f)
+Move forward to the end of the next word. Words are composed of
+alphanumeric characters (letters and digits).
+.TP
+.B backward\-word (M\-b)
+Move back to the start of the current or previous word. Words are
+composed of alphanumeric characters (letters and digits).
+.TP
+.B previous\-screen\-line
+Attempt to move point to the same physical screen column on the previous
+physical screen line. This will not have the desired effect if the current
+readline line does not take up more than one physical line or if point is not
+greater than the length of the prompt plus the screen width.
+.TP
+.B next\-screen\-line
+Attempt to move point to the same physical screen column on the next
+physical screen line. This will not have the desired effect if the current
+readline line does not take up more than one physical line or if the length
+of the current readline line is not greater than the length of the prompt
+plus the screen width.
+.TP
+.B clear\-display (M\-C\-l)
+Clear the screen and, if possible, the terminal's scrollback buffer,
+then redraw the current line,
+leaving the current line at the top of the screen.
+.TP
+.B clear\-screen (C\-l)
+Clear the screen,
+then redraw the current line,
+leaving the current line at the top of the screen.
+With an argument, refresh the current line without clearing the
+screen.
+.TP
+.B redraw\-current\-line
+Refresh the current line.
+.PD
+.SS Commands for Manipulating the History
+.PD 0
+.TP
+.B accept\-line (Newline, Return)
+Accept the line regardless of where the cursor is.
+If this line is
+non-empty, it may be added to the history list for future recall with
+\fBadd_history()\fP.
+If the line is a modified history line, the history line is restored to its original state.
+.TP
+.B previous\-history (C\-p)
+Fetch the previous command from the history list, moving back in
+the list.
+.TP
+.B next\-history (C\-n)
+Fetch the next command from the history list, moving forward in the
+list.
+.TP
+.B beginning\-of\-history (M\-<)
+Move to the first line in the history.
+.TP
+.B end\-of\-history (M\->)
+Move to the end of the input history, i.e., the line currently being
+entered.
+.TP
+.B
+operate\-and\-get\-next (C\-o)
+Accept the current line for return to the calling application as if a
+newline had been entered,
+and fetch the next line relative to the current line from the history
+for editing.
+A numeric argument, if supplied, specifies the history entry to use instead
+of the current line.
+.TP
+.B
+fetch\-history
+With a numeric argument, fetch that entry from the history list
+and make it the current line.
+Without an argument, move back to the first entry in the history list.
+.TP
+.B reverse\-search\-history (C\-r)
+Search backward starting at the current line and moving `up' through
+the history as necessary. This is an incremental search.
+.TP
+.B forward\-search\-history (C\-s)
+Search forward starting at the current line and moving `down' through
+the history as necessary. This is an incremental search.
+.TP
+.B non\-incremental\-reverse\-search\-history (M\-p)
+Search backward through the history starting at the current line
+using a non-incremental search for a string supplied by the user.
+.TP
+.B non\-incremental\-forward\-search\-history (M\-n)
+Search forward through the history using a non-incremental search
+for a string supplied by the user.
+.TP
+.B history\-search\-backward
+Search backward through the history for the string of characters
+between the start of the current line and the current cursor
+position (the \fIpoint\fP).
+The search string must match at the beginning of a history line.
+This is a non-incremental search.
+.TP
+.B history\-search\-forward
+Search forward through the history for the string of characters
+between the start of the current line and the point.
+The search string must match at the beginning of a history line.
+This is a non-incremental search.
+.TP
+.B history\-substring\-search\-backward
+Search backward through the history for the string of characters
+between the start of the current line and the current cursor
+position (the \fIpoint\fP).
+The search string may match anywhere in a history line.
+This is a non-incremental search.
+.TP
+.B history\-substring\-search\-forward
+Search forward through the history for the string of characters
+between the start of the current line and the point.
+The search string may match anywhere in a history line.
+This is a non-incremental search.
+.TP
+.B yank\-nth\-arg (M\-C\-y)
+Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument
+.IR n ,
+insert the \fIn\fPth word from the previous command (the words
+in the previous command begin with word 0). A negative argument
+inserts the \fIn\fPth word from the end of the previous command.
+Once the argument \fIn\fP is computed, the argument is extracted
+as if the "!\fIn\fP" history expansion had been specified.
+.TP
+.B
+yank\-last\-arg (M\-.\^, M\-_\^)
+Insert the last argument to the previous command (the last word of
+the previous history entry).
+With a numeric argument, behave exactly like \fByank\-nth\-arg\fP.
+Successive calls to \fByank\-last\-arg\fP move back through the history
+list, inserting the last word (or the word specified by the argument to
+the first call) of each line in turn.
+Any numeric argument supplied to these successive calls determines
+the direction to move through the history. A negative argument switches
+the direction through the history (back or forward).
+The history expansion facilities are used to extract the last argument,
+as if the "!$" history expansion had been specified.
+.PD
+.SS Commands for Changing Text
+.PD 0
+.TP
+.B \fIend\-of\-file\fP (usually C\-d)
+The character indicating end-of-file as set, for example, by
+.if t \f(CWstty\fP.
+.if n ``stty''.
+If this character is read when there are no characters
+on the line, and point is at the beginning of the line, readline
+interprets it as the end of input and returns
+.SM
+.BR EOF .
+.TP
+.B delete\-char (C\-d)
+Delete the character at point.
+If this function is bound to the
+same character as the tty \fBEOF\fP character, as \fBC\-d\fP
+commonly is, see above for the effects.
+.TP
+.B backward\-delete\-char (Rubout)
+Delete the character behind the cursor. When given a numeric argument,
+save the deleted text on the kill ring.
+.TP
+.B forward\-backward\-delete\-char
+Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted.
+.TP
+.B quoted\-insert (C\-q, C\-v)
+Add the next character that you type to the line verbatim. This is
+how to insert characters like \fBC\-q\fP, for example.
+.TP
+.B tab\-insert (M-TAB)
+Insert a tab character.
+.TP
+.B self\-insert (a,\ b,\ A,\ 1,\ !,\ ...)
+Insert the character typed.
+.TP
+.B transpose\-chars (C\-t)
+Drag the character before point forward over the character at point,
+moving point forward as well.
+If point is at the end of the line, then this transposes
+the two characters before point.
+Negative arguments have no effect.
+.TP
+.B transpose\-words (M\-t)
+Drag the word before point past the word after point,
+moving point over that word as well.
+If point is at the end of the line, this transposes
+the last two words on the line.
+.TP
+.B upcase\-word (M\-u)
+Uppercase the current (or following) word. With a negative argument,
+uppercase the previous word, but do not move point.
+.TP
+.B downcase\-word (M\-l)
+Lowercase the current (or following) word. With a negative argument,
+lowercase the previous word, but do not move point.
+.TP
+.B capitalize\-word (M\-c)
+Capitalize the current (or following) word. With a negative argument,
+capitalize the previous word, but do not move point.
+.TP
+.B overwrite\-mode
+Toggle overwrite mode. With an explicit positive numeric argument,
+switches to overwrite mode. With an explicit non-positive numeric
+argument, switches to insert mode. This command affects only
+\fBemacs\fP mode; \fBvi\fP mode does overwrite differently.
+Each call to \fIreadline()\fP starts in insert mode.
+In overwrite mode, characters bound to \fBself\-insert\fP replace
+the text at point rather than pushing the text to the right.
+Characters bound to \fBbackward\-delete\-char\fP replace the character
+before point with a space. By default, this command is unbound.
+.PD
+.SS Killing and Yanking
+.PD 0
+.TP
+.B kill\-line (C\-k)
+Kill the text from point to the end of the line.
+.TP
+.B backward\-kill\-line (C\-x Rubout)
+Kill backward to the beginning of the line.
+.TP
+.B unix\-line\-discard (C\-u)
+Kill backward from point to the beginning of the line.
+The killed text is saved on the kill-ring.
+.\" There is no real difference between this and backward-kill-line
+.TP
+.B kill\-whole\-line
+Kill all characters on the current line, no matter where point is.
+.TP
+.B kill\-word (M\-d)
+Kill from point the end of the current word, or if between
+words, to the end of the next word. Word boundaries are the same as
+those used by \fBforward\-word\fP.
+.TP
+.B backward\-kill\-word (M\-Rubout)
+Kill the word behind point.
+Word boundaries are the same as those used by \fBbackward\-word\fP.
+.TP
+.B unix\-word\-rubout (C\-w)
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+.TP
+.B unix\-filename\-rubout
+Kill the word behind point, using white space and the slash character
+as the word boundaries.
+The killed text is saved on the kill-ring.
+.TP
+.B delete\-horizontal\-space (M\-\e)
+Delete all spaces and tabs around point.
+.TP
+.B kill\-region
+Kill the text between the point and \fImark\fP (saved cursor position).
+This text is referred to as the \fIregion\fP.
+.TP
+.B copy\-region\-as\-kill
+Copy the text in the region to the kill buffer.
+.TP
+.B copy\-backward\-word
+Copy the word before point to the kill buffer.
+The word boundaries are the same as \fBbackward\-word\fP.
+.TP
+.B copy\-forward\-word
+Copy the word following point to the kill buffer.
+The word boundaries are the same as \fBforward\-word\fP.
+.TP
+.B yank (C\-y)
+Yank the top of the kill ring into the buffer at point.
+.TP
+.B yank\-pop (M\-y)
+Rotate the kill ring, and yank the new top. Only works following
+.B yank
+or
+.BR yank\-pop .
+.PD
+.SS Numeric Arguments
+.PD 0
+.TP
+.B digit\-argument (M\-0, M\-1, ..., M\-\-)
+Add this digit to the argument already accumulating, or start a new
+argument. M\-\- starts a negative argument.
+.TP
+.B universal\-argument
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing
+.B universal\-argument
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+.PD
+.SS Completing
+.PD 0
+.TP
+.B complete (TAB)
+Attempt to perform completion on the text before point.
+The actual completion performed is application-specific.
+.BR Bash ,
+for instance, attempts completion treating the text as a variable
+(if the text begins with \fB$\fP), username (if the text begins with
+\fB~\fP), hostname (if the text begins with \fB@\fP), or
+command (including aliases and functions) in turn. If none
+of these produces a match, filename completion is attempted.
+.BR Gdb ,
+on the other hand,
+allows completion of program functions and variables, and
+only attempts filename completion under certain circumstances.
+.TP
+.B possible\-completions (M\-?)
+List the possible completions of the text before point.
+When displaying completions, readline sets the number of columns used
+for display to the value of \fBcompletion-display-width\fP, the value of
+the environment variable
+.SM
+.BR COLUMNS ,
+or the screen width, in that order.
+.TP
+.B insert\-completions (M\-*)
+Insert all completions of the text before point
+that would have been generated by
+\fBpossible\-completions\fP.
+.TP
+.B menu\-complete
+Similar to \fBcomplete\fP, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of \fBmenu\-complete\fP steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of \fBbell\-style\fP)
+and the original text is restored.
+An argument of \fIn\fP moves \fIn\fP positions forward in the list
+of matches; a negative argument may be used to move backward
+through the list.
+This command is intended to be bound to \fBTAB\fP, but is unbound
+by default.
+.TP
+.B menu\-complete\-backward
+Identical to \fBmenu\-complete\fP, but moves backward through the list
+of possible completions, as if \fBmenu\-complete\fP had been given a
+negative argument. This command is unbound by default.
+.TP
+.B delete\-char\-or\-list
+Deletes the character under the cursor if not at the beginning or
+end of the line (like \fBdelete-char\fP).
+If at the end of the line, behaves identically to
+\fBpossible-completions\fP.
+.PD
+.SS Keyboard Macros
+.PD 0
+.TP
+.B start\-kbd\-macro (C\-x (\^)
+Begin saving the characters typed into the current keyboard macro.
+.TP
+.B end\-kbd\-macro (C\-x )\^)
+Stop saving the characters typed into the current keyboard macro
+and store the definition.
+.TP
+.B call\-last\-kbd\-macro (C\-x e)
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+.TP
+.B print\-last\-kbd\-macro ()
+Print the last keyboard macro defined in a format suitable for the
+\fIinputrc\fP file.
+.PD
+.SS Miscellaneous
+.PD 0
+.TP
+.B re\-read\-init\-file (C\-x C\-r)
+Read in the contents of the \fIinputrc\fP file, and incorporate
+any bindings or variable assignments found there.
+.TP
+.B abort (C\-g)
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+.BR bell\-style ).
+.TP
+.B do\-lowercase\-version (M\-A, M\-B, M\-\fIx\fP, ...)
+If the metafied character \fIx\fP is uppercase, run the command
+that is bound to the corresponding metafied lowercase character.
+The behavior is undefined if \fIx\fP is already lowercase.
+.TP
+.B prefix\-meta (ESC)
+Metafy the next character typed.
+.SM
+.B ESC
+.B f
+is equivalent to
+.BR Meta\-f .
+.TP
+.B undo (C\-_, C\-x C\-u)
+Incremental undo, separately remembered for each line.
+.TP
+.B revert\-line (M\-r)
+Undo all changes made to this line. This is like executing the
+.B undo
+command enough times to return the line to its initial state.
+.TP
+.B tilde\-expand (M\-&)
+Perform tilde expansion on the current word.
+.TP
+.B set\-mark (C\-@, M\-<space>)
+Set the mark to the point. If a
+numeric argument is supplied, the mark is set to that position.
+.TP
+.B exchange\-point\-and\-mark (C\-x C\-x)
+Swap the point with the mark. The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+.TP
+.B character\-search (C\-])
+A character is read and point is moved to the next occurrence of that
+character. A negative argument searches for previous occurrences.
+.TP
+.B character\-search\-backward (M\-C\-])
+A character is read and point is moved to the previous occurrence of that
+character. A negative argument searches for subsequent occurrences.
+.TP
+.B skip\-csi\-sequence
+Read enough characters to consume a multi-key sequence such as those
+defined for keys like Home and End. Such sequences begin with a
+Control Sequence Indicator (CSI), usually ESC\-[. If this sequence is
+bound to "\e[", keys producing such sequences will have no effect
+unless explicitly bound to a readline command, instead of inserting
+stray characters into the editing buffer. This is unbound by default,
+but usually bound to ESC\-[.
+.TP
+.B insert\-comment (M\-#)
+Without a numeric argument, the value of the readline
+.B comment\-begin
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle: if
+the characters at the beginning of the line do not match the value
+of \fBcomment\-begin\fP, the value is inserted, otherwise
+the characters in \fBcomment-begin\fP are deleted from the beginning of
+the line.
+In either case, the line is accepted as if a newline had been typed.
+The default value of
+.B comment\-begin
+makes the current line a shell comment.
+If a numeric argument causes the comment character to be removed, the line
+will be executed by the shell.
+.TP
+.B dump\-functions
+Print all of the functions and their key bindings to the
+readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B dump\-variables
+Print all of the settable variables and their values to the
+readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B dump\-macros
+Print all of the readline key sequences bound to macros and the
+strings they output. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B emacs\-editing\-mode (C\-e)
+When in
+.B vi
+command mode, this causes a switch to
+.B emacs
+editing mode.
+.TP
+.B vi\-editing\-mode (M\-C\-j)
+When in
+.B emacs
+editing mode, this causes a switch to
+.B vi
+editing mode.
+.PD
+.SH DEFAULT KEY BINDINGS
+.LP
+The following is a list of the default emacs and vi bindings.
+Characters with the eighth bit set are written as M\-<character>, and
+are referred to as
+.I metafied
+characters.
+The printable ASCII characters not mentioned in the list of emacs
+standard bindings are bound to the
+.B self\-insert
+function, which just inserts the given character into the input line.
+In vi insertion mode, all characters not specifically mentioned are
+bound to
+.BR self\-insert .
+Characters assigned to signal generation by
+.IR stty (1)
+or the terminal driver, such as C-Z or C-C,
+retain that function.
+Upper and lower case metafied characters are bound to the same function in
+the emacs mode meta keymap.
+The remaining characters are unbound, which causes readline
+to ring the bell (subject to the setting of the
+.B bell\-style
+variable).
+.SS Emacs Mode
+.RS +.6i
+.nf
+.ta 2.5i
+.sp
+Emacs Standard bindings
+.sp
+"C-@" set-mark
+"C-A" beginning-of-line
+"C-B" backward-char
+"C-D" delete-char
+"C-E" end-of-line
+"C-F" forward-char
+"C-G" abort
+"C-H" backward-delete-char
+"C-I" complete
+"C-J" accept-line
+"C-K" kill-line
+"C-L" clear-screen
+"C-M" accept-line
+"C-N" next-history
+"C-P" previous-history
+"C-Q" quoted-insert
+"C-R" reverse-search-history
+"C-S" forward-search-history
+"C-T" transpose-chars
+"C-U" unix-line-discard
+"C-V" quoted-insert
+"C-W" unix-word-rubout
+"C-Y" yank
+"C-]" character-search
+"C-_" undo
+"\^ " to "/" self-insert
+"0" to "9" self-insert
+":" to "~" self-insert
+"C-?" backward-delete-char
+.PP
+Emacs Meta bindings
+.sp
+"M-C-G" abort
+"M-C-H" backward-kill-word
+"M-C-I" tab-insert
+"M-C-J" vi-editing-mode
+"M-C-L" clear-display
+"M-C-M" vi-editing-mode
+"M-C-R" revert-line
+"M-C-Y" yank-nth-arg
+"M-C-[" complete
+"M-C-]" character-search-backward
+"M-space" set-mark
+"M-#" insert-comment
+"M-&" tilde-expand
+"M-*" insert-completions
+"M--" digit-argument
+"M-." yank-last-arg
+"M-0" digit-argument
+"M-1" digit-argument
+"M-2" digit-argument
+"M-3" digit-argument
+"M-4" digit-argument
+"M-5" digit-argument
+"M-6" digit-argument
+"M-7" digit-argument
+"M-8" digit-argument
+"M-9" digit-argument
+"M-<" beginning-of-history
+"M-=" possible-completions
+"M->" end-of-history
+"M-?" possible-completions
+"M-B" backward-word
+"M-C" capitalize-word
+"M-D" kill-word
+"M-F" forward-word
+"M-L" downcase-word
+"M-N" non-incremental-forward-search-history
+"M-P" non-incremental-reverse-search-history
+"M-R" revert-line
+"M-T" transpose-words
+"M-U" upcase-word
+"M-Y" yank-pop
+"M-\e" delete-horizontal-space
+"M-~" tilde-expand
+"M-C-?" backward-kill-word
+"M-_" yank-last-arg
+.PP
+Emacs Control-X bindings
+.sp
+"C-XC-G" abort
+"C-XC-R" re-read-init-file
+"C-XC-U" undo
+"C-XC-X" exchange-point-and-mark
+"C-X(" start-kbd-macro
+"C-X)" end-kbd-macro
+"C-XE" call-last-kbd-macro
+"C-XC-?" backward-kill-line
+.sp
+.RE
+.SS VI Mode bindings
+.RS +.6i
+.nf
+.ta 2.5i
+.sp
+.PP
+VI Insert Mode functions
+.sp
+"C-D" vi-eof-maybe
+"C-H" backward-delete-char
+"C-I" complete
+"C-J" accept-line
+"C-M" accept-line
+"C-R" reverse-search-history
+"C-S" forward-search-history
+"C-T" transpose-chars
+"C-U" unix-line-discard
+"C-V" quoted-insert
+"C-W" unix-word-rubout
+"C-Y" yank
+"C-[" vi-movement-mode
+"C-_" undo
+"\^ " to "~" self-insert
+"C-?" backward-delete-char
+.PP
+VI Command Mode functions
+.sp
+"C-D" vi-eof-maybe
+"C-E" emacs-editing-mode
+"C-G" abort
+"C-H" backward-char
+"C-J" accept-line
+"C-K" kill-line
+"C-L" clear-screen
+"C-M" accept-line
+"C-N" next-history
+"C-P" previous-history
+"C-Q" quoted-insert
+"C-R" reverse-search-history
+"C-S" forward-search-history
+"C-T" transpose-chars
+"C-U" unix-line-discard
+"C-V" quoted-insert
+"C-W" unix-word-rubout
+"C-Y" yank
+"C-_" vi-undo
+"\^ " forward-char
+"#" insert-comment
+"$" end-of-line
+"%" vi-match
+"&" vi-tilde-expand
+"*" vi-complete
+"+" next-history
+"," vi-char-search
+"-" previous-history
+"." vi-redo
+"/" vi-search
+"0" beginning-of-line
+"1" to "9" vi-arg-digit
+";" vi-char-search
+"=" vi-complete
+"?" vi-search
+"A" vi-append-eol
+"B" vi-prev-word
+"C" vi-change-to
+"D" vi-delete-to
+"E" vi-end-word
+"F" vi-char-search
+"G" vi-fetch-history
+"I" vi-insert-beg
+"N" vi-search-again
+"P" vi-put
+"R" vi-replace
+"S" vi-subst
+"T" vi-char-search
+"U" revert-line
+"W" vi-next-word
+"X" backward-delete-char
+"Y" vi-yank-to
+"\e" vi-complete
+"^" vi-first-print
+"_" vi-yank-arg
+"`" vi-goto-mark
+"a" vi-append-mode
+"b" vi-prev-word
+"c" vi-change-to
+"d" vi-delete-to
+"e" vi-end-word
+"f" vi-char-search
+"h" backward-char
+"i" vi-insertion-mode
+"j" next-history
+"k" prev-history
+"l" forward-char
+"m" vi-set-mark
+"n" vi-search-again
+"p" vi-put
+"r" vi-change-char
+"s" vi-subst
+"t" vi-char-search
+"u" vi-undo
+"w" vi-next-word
+"x" vi-delete
+"y" vi-yank-to
+"|" vi-column
+"~" vi-change-case
+.RE
+.SH "SEE ALSO"
+.PD 0
+.TP
+\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIbash\fP(1)
+.PD
+.SH FILES
+.PD 0
+.TP
+.FN ~/.inputrc
+Individual \fBreadline\fP initialization file
+.PD
+.SH AUTHORS
+Brian Fox, Free Software Foundation
+.br
+bfox@gnu.org
+.PP
+Chet Ramey, Case Western Reserve University
+.br
+chet.ramey@case.edu
+.SH BUG REPORTS
+If you find a bug in
+.B readline,
+you should report it. But first, you should
+make sure that it really is a bug, and that it appears in the latest
+version of the
+.B readline
+library that you have.
+.PP
+Once you have determined that a bug actually exists, mail a
+bug report to \fIbug\-readline\fP@\fIgnu.org\fP.
+If you have a fix, you are welcome to mail that
+as well! Suggestions and `philosophical' bug reports may be mailed
+to \fPbug-readline\fP@\fIgnu.org\fP or posted to the Usenet
+newsgroup
+.BR gnu.bash.bug .
+.PP
+Comments and bug reports concerning
+this manual page should be directed to
+.IR chet.ramey@case.edu .
+.SH BUGS
+It's too big and too slow.
diff --git a/doc/readline.dvi b/doc/readline.dvi
new file mode 100644
index 0000000..7296d40
--- /dev/null
+++ b/doc/readline.dvi
Binary files differ
diff --git a/doc/readline.html b/doc/readline.html
new file mode 100644
index 0000000..1002f4f
--- /dev/null
+++ b/doc/readline.html
@@ -0,0 +1,6286 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!-- Created by GNU Texinfo 6.8, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<!-- This manual describes the GNU Readline Library
+(version 8.2, 19 September 2022), a library which aids in the
+consistency of user interface across discrete programs which provide
+a command line interface.
+
+Copyright (C) 1988-2022 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+"GNU Free Documentation License".
+ -->
+<title>GNU Readline Library</title>
+
+<meta name="description" content="GNU Readline Library">
+<meta name="keywords" content="GNU Readline Library">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="#Top" rel="start" title="Top">
+<link href="#Concept-Index" rel="index" title="Concept Index">
+<link href="#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="#Command-Line-Editing" rel="next" title="Command Line Editing">
+<style type="text/css">
+<!--
+a.copiable-anchor {visibility: hidden; text-decoration: none; line-height: 0em}
+a.summary-letter {text-decoration: none}
+blockquote.indentedblock {margin-right: 0em}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+kbd {font-style: oblique}
+pre.display {font-family: inherit}
+pre.format {font-family: inherit}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+span.nolinebreak {white-space: nowrap}
+span.roman {font-family: initial; font-weight: normal}
+span.sansserif {font-family: sans-serif; font-weight: normal}
+span:hover a.copiable-anchor {visibility: visible}
+ul.no-bullet {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<h1 class="settitle" align="center">GNU Readline Library</h1>
+
+
+
+
+
+
+
+
+
+<div class="top" id="Top">
+<div class="header">
+<p>
+Next: <a href="#Command-Line-Editing" accesskey="n" rel="next">Command Line Editing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="GNU-Readline-Library"></span><h1 class="top">GNU Readline Library</h1>
+
+<p>This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs which
+provide a command line interface.
+The Readline home page is <a href="http://www.gnu.org/software/readline/">http://www.gnu.org/software/readline/</a>.
+</p>
+
+
+
+
+
+<div class="Contents_element" id="SEC_Contents">
+<h2 class="contents-heading">Table of Contents</h2>
+
+<div class="contents">
+
+<ul class="no-bullet">
+ <li><a id="toc-Command-Line-Editing-1" href="#Command-Line-Editing">1 Command Line Editing</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Introduction-to-Line-Editing" href="#Introduction-and-Notation">1.1 Introduction to Line Editing</a></li>
+ <li><a id="toc-Readline-Interaction-1" href="#Readline-Interaction">1.2 Readline Interaction</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Readline-Bare-Essentials-1" href="#Readline-Bare-Essentials">1.2.1 Readline Bare Essentials</a></li>
+ <li><a id="toc-Readline-Movement-Commands-1" href="#Readline-Movement-Commands">1.2.2 Readline Movement Commands</a></li>
+ <li><a id="toc-Readline-Killing-Commands-1" href="#Readline-Killing-Commands">1.2.3 Readline Killing Commands</a></li>
+ <li><a id="toc-Readline-Arguments-1" href="#Readline-Arguments">1.2.4 Readline Arguments</a></li>
+ <li><a id="toc-Searching-for-Commands-in-the-History" href="#Searching">1.2.5 Searching for Commands in the History</a></li>
+ </ul></li>
+ <li><a id="toc-Readline-Init-File-1" href="#Readline-Init-File">1.3 Readline Init File</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Readline-Init-File-Syntax-1" href="#Readline-Init-File-Syntax">1.3.1 Readline Init File Syntax</a></li>
+ <li><a id="toc-Conditional-Init-Constructs-1" href="#Conditional-Init-Constructs">1.3.2 Conditional Init Constructs</a></li>
+ <li><a id="toc-Sample-Init-File-1" href="#Sample-Init-File">1.3.3 Sample Init File</a></li>
+ </ul></li>
+ <li><a id="toc-Bindable-Readline-Commands-1" href="#Bindable-Readline-Commands">1.4 Bindable Readline Commands</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Commands-For-Moving-1" href="#Commands-For-Moving">1.4.1 Commands For Moving</a></li>
+ <li><a id="toc-Commands-For-Manipulating-The-History" href="#Commands-For-History">1.4.2 Commands For Manipulating The History</a></li>
+ <li><a id="toc-Commands-For-Changing-Text" href="#Commands-For-Text">1.4.3 Commands For Changing Text</a></li>
+ <li><a id="toc-Killing-And-Yanking" href="#Commands-For-Killing">1.4.4 Killing And Yanking</a></li>
+ <li><a id="toc-Specifying-Numeric-Arguments" href="#Numeric-Arguments">1.4.5 Specifying Numeric Arguments</a></li>
+ <li><a id="toc-Letting-Readline-Type-For-You" href="#Commands-For-Completion">1.4.6 Letting Readline Type For You</a></li>
+ <li><a id="toc-Keyboard-Macros-1" href="#Keyboard-Macros">1.4.7 Keyboard Macros</a></li>
+ <li><a id="toc-Some-Miscellaneous-Commands" href="#Miscellaneous-Commands">1.4.8 Some Miscellaneous Commands</a></li>
+ </ul></li>
+ <li><a id="toc-Readline-vi-Mode-1" href="#Readline-vi-Mode">1.5 Readline vi Mode</a></li>
+ </ul></li>
+ <li><a id="toc-Programming-with-GNU-Readline-1" href="#Programming-with-GNU-Readline">2 Programming with GNU Readline</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Basic-Behavior-1" href="#Basic-Behavior">2.1 Basic Behavior</a></li>
+ <li><a id="toc-Custom-Functions-1" href="#Custom-Functions">2.2 Custom Functions</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Readline-Typedefs-1" href="#Readline-Typedefs">2.2.1 Readline Typedefs</a></li>
+ <li><a id="toc-Writing-a-New-Function" href="#Function-Writing">2.2.2 Writing a New Function</a></li>
+ </ul></li>
+ <li><a id="toc-Readline-Variables-1" href="#Readline-Variables">2.3 Readline Variables</a></li>
+ <li><a id="toc-Readline-Convenience-Functions-1" href="#Readline-Convenience-Functions">2.4 Readline Convenience Functions</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Naming-a-Function" href="#Function-Naming">2.4.1 Naming a Function</a></li>
+ <li><a id="toc-Selecting-a-Keymap" href="#Keymaps">2.4.2 Selecting a Keymap</a></li>
+ <li><a id="toc-Binding-Keys-1" href="#Binding-Keys">2.4.3 Binding Keys</a></li>
+ <li><a id="toc-Associating-Function-Names-and-Bindings-1" href="#Associating-Function-Names-and-Bindings">2.4.4 Associating Function Names and Bindings</a></li>
+ <li><a id="toc-Allowing-Undoing-1" href="#Allowing-Undoing">2.4.5 Allowing Undoing</a></li>
+ <li><a id="toc-Redisplay-1" href="#Redisplay">2.4.6 Redisplay</a></li>
+ <li><a id="toc-Modifying-Text-1" href="#Modifying-Text">2.4.7 Modifying Text</a></li>
+ <li><a id="toc-Character-Input-1" href="#Character-Input">2.4.8 Character Input</a></li>
+ <li><a id="toc-Terminal-Management-1" href="#Terminal-Management">2.4.9 Terminal Management</a></li>
+ <li><a id="toc-Utility-Functions-1" href="#Utility-Functions">2.4.10 Utility Functions</a></li>
+ <li><a id="toc-Miscellaneous-Functions-1" href="#Miscellaneous-Functions">2.4.11 Miscellaneous Functions</a></li>
+ <li><a id="toc-Alternate-Interface-1" href="#Alternate-Interface">2.4.12 Alternate Interface</a></li>
+ <li><a id="toc-A-Readline-Example-1" href="#A-Readline-Example">2.4.13 A Readline Example</a></li>
+ <li><a id="toc-Alternate-Interface-Example-1" href="#Alternate-Interface-Example">2.4.14 Alternate Interface Example</a></li>
+ </ul></li>
+ <li><a id="toc-Readline-Signal-Handling-1" href="#Readline-Signal-Handling">2.5 Readline Signal Handling</a></li>
+ <li><a id="toc-Custom-Completers-1" href="#Custom-Completers">2.6 Custom Completers</a>
+ <ul class="no-bullet">
+ <li><a id="toc-How-Completing-Works-1" href="#How-Completing-Works">2.6.1 How Completing Works</a></li>
+ <li><a id="toc-Completion-Functions-1" href="#Completion-Functions">2.6.2 Completion Functions</a></li>
+ <li><a id="toc-Completion-Variables-1" href="#Completion-Variables">2.6.3 Completion Variables</a></li>
+ <li><a id="toc-A-Short-Completion-Example-1" href="#A-Short-Completion-Example">2.6.4 A Short Completion Example</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-GNU-Free-Documentation-License-1" href="#GNU-Free-Documentation-License">Appendix A GNU Free Documentation License</a></li>
+ <li><a id="toc-Concept-Index-1" href="#Concept-Index" rel="index">Concept Index</a></li>
+ <li><a id="toc-Function-and-Variable-Index-1" href="#Function-and-Variable-Index" rel="index">Function and Variable Index</a></li>
+</ul>
+</div>
+</div>
+<hr>
+<div class="chapter" id="Command-Line-Editing">
+<div class="header">
+<p>
+Next: <a href="#Programming-with-GNU-Readline" accesskey="n" rel="next">Programming with GNU Readline</a>, Previous: <a href="#Top" accesskey="p" rel="prev">GNU Readline Library</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU Readline Library</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Command-Line-Editing-1"></span><h2 class="chapter">1 Command Line Editing</h2>
+
+<p>This chapter describes the basic features of the <small>GNU</small>
+command line editing interface.
+</p>
+
+<ul class="section-toc">
+<li><a href="#Introduction-and-Notation" accesskey="1">Introduction to Line Editing</a></li>
+<li><a href="#Readline-Interaction" accesskey="2">Readline Interaction</a></li>
+<li><a href="#Readline-Init-File" accesskey="3">Readline Init File</a></li>
+<li><a href="#Bindable-Readline-Commands" accesskey="4">Bindable Readline Commands</a></li>
+<li><a href="#Readline-vi-Mode" accesskey="5">Readline vi Mode</a></li>
+</ul>
+<hr>
+<div class="section" id="Introduction-and-Notation">
+<div class="header">
+<p>
+Next: <a href="#Readline-Interaction" accesskey="n" rel="next">Readline Interaction</a>, Up: <a href="#Command-Line-Editing" accesskey="u" rel="up">Command Line Editing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Introduction-to-Line-Editing"></span><h3 class="section">1.1 Introduction to Line Editing</h3>
+
+<p>The following paragraphs describe the notation used to represent
+keystrokes.
+</p>
+<p>The text <kbd>C-k</kbd> is read as &lsquo;Control-K&rsquo; and describes the character
+produced when the <tt class="key">k</tt> key is pressed while the Control key
+is depressed.
+</p>
+<p>The text <kbd>M-k</kbd> is read as &lsquo;Meta-K&rsquo; and describes the character
+produced when the Meta key (if you have one) is depressed, and the <tt class="key">k</tt>
+key is pressed.
+The Meta key is labeled <tt class="key">ALT</tt> on many keyboards.
+On keyboards with two keys labeled <tt class="key">ALT</tt> (usually to either side of
+the space bar), the <tt class="key">ALT</tt> on the left side is generally set to
+work as a Meta key.
+The <tt class="key">ALT</tt> key on the right may also be configured to work as a
+Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+</p>
+<p>If you do not have a Meta or <tt class="key">ALT</tt> key, or another key working as
+a Meta key, the identical keystroke can be generated by typing <tt class="key">ESC</tt>
+<em>first</em>, and then typing <tt class="key">k</tt>.
+Either process is known as <em>metafying</em> the <tt class="key">k</tt> key.
+</p>
+<p>The text <kbd>M-C-k</kbd> is read as &lsquo;Meta-Control-k&rsquo; and describes the
+character produced by <em>metafying</em> <kbd>C-k</kbd>.
+</p>
+<p>In addition, several keys have their own names. Specifically,
+<tt class="key">DEL</tt>, <tt class="key">ESC</tt>, <tt class="key">LFD</tt>, <tt class="key">SPC</tt>, <tt class="key">RET</tt>, and <tt class="key">TAB</tt> all
+stand for themselves when seen in this text, or in an init file
+(see <a href="#Readline-Init-File">Readline Init File</a>).
+If your keyboard lacks a <tt class="key">LFD</tt> key, typing <tt class="key">C-j</tt> will
+produce the desired character.
+The <tt class="key">RET</tt> key may be labeled <tt class="key">Return</tt> or <tt class="key">Enter</tt> on
+some keyboards.
+</p>
+<hr>
+</div>
+<div class="section" id="Readline-Interaction">
+<div class="header">
+<p>
+Next: <a href="#Readline-Init-File" accesskey="n" rel="next">Readline Init File</a>, Previous: <a href="#Introduction-and-Notation" accesskey="p" rel="prev">Introduction to Line Editing</a>, Up: <a href="#Command-Line-Editing" accesskey="u" rel="up">Command Line Editing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Readline-Interaction-1"></span><h3 class="section">1.2 Readline Interaction</h3>
+<span id="index-interaction_002c-readline"></span>
+
+<p>Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled. The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line. Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections. Then, when you are satisfied with
+the line, you simply press <tt class="key">RET</tt>. You do not have to be at the
+end of the line to press <tt class="key">RET</tt>; the entire line is accepted
+regardless of the location of the cursor within the line.
+</p>
+
+<ul class="section-toc">
+<li><a href="#Readline-Bare-Essentials" accesskey="1">Readline Bare Essentials</a></li>
+<li><a href="#Readline-Movement-Commands" accesskey="2">Readline Movement Commands</a></li>
+<li><a href="#Readline-Killing-Commands" accesskey="3">Readline Killing Commands</a></li>
+<li><a href="#Readline-Arguments" accesskey="4">Readline Arguments</a></li>
+<li><a href="#Searching" accesskey="5">Searching for Commands in the History</a></li>
+</ul>
+<hr>
+<div class="subsection" id="Readline-Bare-Essentials">
+<div class="header">
+<p>
+Next: <a href="#Readline-Movement-Commands" accesskey="n" rel="next">Readline Movement Commands</a>, Up: <a href="#Readline-Interaction" accesskey="u" rel="up">Readline Interaction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Readline-Bare-Essentials-1"></span><h4 class="subsection">1.2.1 Readline Bare Essentials</h4>
+<span id="index-notation_002c-readline"></span>
+<span id="index-command-editing"></span>
+<span id="index-editing-command-lines"></span>
+
+<p>In order to enter characters into the line, simply type them. The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right. If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+</p>
+<p>Sometimes you may mistype a character, and
+not notice the error until you have typed several other characters. In
+that case, you can type <kbd>C-b</kbd> to move the cursor to the left, and then
+correct your mistake. Afterwards, you can move the cursor to the right
+with <kbd>C-f</kbd>.
+</p>
+<p>When you add text in the middle of a line, you will notice that characters
+to the right of the cursor are &lsquo;pushed over&rsquo; to make room for the text
+that you have inserted. Likewise, when you delete text behind the cursor,
+characters to the right of the cursor are &lsquo;pulled back&rsquo; to fill in the
+blank space created by the removal of the text. A list of the bare
+essentials for editing the text of an input line follows.
+</p>
+<dl compact="compact">
+<dt><span><kbd>C-b</kbd></span></dt>
+<dd><p>Move back one character.
+</p></dd>
+<dt><span><kbd>C-f</kbd></span></dt>
+<dd><p>Move forward one character.
+</p></dd>
+<dt><span><tt class="key">DEL</tt> or <tt class="key">Backspace</tt></span></dt>
+<dd><p>Delete the character to the left of the cursor.
+</p></dd>
+<dt><span><kbd>C-d</kbd></span></dt>
+<dd><p>Delete the character underneath the cursor.
+</p></dd>
+<dt><span>Printing&nbsp;characters<!-- /@w --></span></dt>
+<dd><p>Insert the character into the line at the cursor.
+</p></dd>
+<dt><span><kbd>C-_</kbd> or <kbd>C-x C-u</kbd></span></dt>
+<dd><p>Undo the last editing command. You can undo all the way back to an
+empty line.
+</p></dd>
+</dl>
+
+<p>(Depending on your configuration, the <tt class="key">Backspace</tt> key might be set to
+delete the character to the left of the cursor and the <tt class="key">DEL</tt> key set
+to delete the character underneath the cursor, like <kbd>C-d</kbd>, rather
+than the character to the left of the cursor.)
+</p>
+<hr>
+</div>
+<div class="subsection" id="Readline-Movement-Commands">
+<div class="header">
+<p>
+Next: <a href="#Readline-Killing-Commands" accesskey="n" rel="next">Readline Killing Commands</a>, Previous: <a href="#Readline-Bare-Essentials" accesskey="p" rel="prev">Readline Bare Essentials</a>, Up: <a href="#Readline-Interaction" accesskey="u" rel="up">Readline Interaction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Readline-Movement-Commands-1"></span><h4 class="subsection">1.2.2 Readline Movement Commands</h4>
+
+
+<p>The above table describes the most basic keystrokes that you need
+in order to do editing of the input line. For your convenience, many
+other commands have been added in addition to <kbd>C-b</kbd>, <kbd>C-f</kbd>,
+<kbd>C-d</kbd>, and <tt class="key">DEL</tt>. Here are some commands for moving more rapidly
+about the line.
+</p>
+<dl compact="compact">
+<dt><span><kbd>C-a</kbd></span></dt>
+<dd><p>Move to the start of the line.
+</p></dd>
+<dt><span><kbd>C-e</kbd></span></dt>
+<dd><p>Move to the end of the line.
+</p></dd>
+<dt><span><kbd>M-f</kbd></span></dt>
+<dd><p>Move forward a word, where a word is composed of letters and digits.
+</p></dd>
+<dt><span><kbd>M-b</kbd></span></dt>
+<dd><p>Move backward a word.
+</p></dd>
+<dt><span><kbd>C-l</kbd></span></dt>
+<dd><p>Clear the screen, reprinting the current line at the top.
+</p></dd>
+</dl>
+
+<p>Notice how <kbd>C-f</kbd> moves forward a character, while <kbd>M-f</kbd> moves
+forward a word. It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+</p>
+<hr>
+</div>
+<div class="subsection" id="Readline-Killing-Commands">
+<div class="header">
+<p>
+Next: <a href="#Readline-Arguments" accesskey="n" rel="next">Readline Arguments</a>, Previous: <a href="#Readline-Movement-Commands" accesskey="p" rel="prev">Readline Movement Commands</a>, Up: <a href="#Readline-Interaction" accesskey="u" rel="up">Readline Interaction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Readline-Killing-Commands-1"></span><h4 class="subsection">1.2.3 Readline Killing Commands</h4>
+
+<span id="index-killing-text"></span>
+<span id="index-yanking-text"></span>
+
+<p><em>Killing</em> text means to delete the text from the line, but to save
+it away for later use, usually by <em>yanking</em> (re-inserting)
+it back into the line.
+(&lsquo;Cut&rsquo; and &lsquo;paste&rsquo; are more recent jargon for &lsquo;kill&rsquo; and &lsquo;yank&rsquo;.)
+</p>
+<p>If the description for a command says that it &lsquo;kills&rsquo; text, then you can
+be sure that you can get the text back in a different (or the same)
+place later.
+</p>
+<p>When you use a kill command, the text is saved in a <em>kill-ring</em>.
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all. The kill
+ring is not line specific; the text that you killed on a previously
+typed line is available to be yanked back later, when you are typing
+another line.
+<span id="index-kill-ring"></span>
+</p>
+<p>Here is the list of commands for killing text.
+</p>
+<dl compact="compact">
+<dt><span><kbd>C-k</kbd></span></dt>
+<dd><p>Kill the text from the current cursor position to the end of the line.
+</p>
+</dd>
+<dt><span><kbd>M-d</kbd></span></dt>
+<dd><p>Kill from the cursor to the end of the current word, or, if between
+words, to the end of the next word.
+Word boundaries are the same as those used by <kbd>M-f</kbd>.
+</p>
+</dd>
+<dt><span><kbd>M-<span class="key">DEL</span></kbd></span></dt>
+<dd><p>Kill from the cursor to the start of the current word, or, if between
+words, to the start of the previous word.
+Word boundaries are the same as those used by <kbd>M-b</kbd>.
+</p>
+</dd>
+<dt><span><kbd>C-w</kbd></span></dt>
+<dd><p>Kill from the cursor to the previous whitespace. This is different than
+<kbd>M-<span class="key">DEL</span></kbd> because the word boundaries differ.
+</p>
+</dd>
+</dl>
+
+<p>Here is how to <em>yank</em> the text back into the line. Yanking
+means to copy the most-recently-killed text from the kill buffer.
+</p>
+<dl compact="compact">
+<dt><span><kbd>C-y</kbd></span></dt>
+<dd><p>Yank the most recently killed text back into the buffer at the cursor.
+</p>
+</dd>
+<dt><span><kbd>M-y</kbd></span></dt>
+<dd><p>Rotate the kill-ring, and yank the new top. You can only do this if
+the prior command is <kbd>C-y</kbd> or <kbd>M-y</kbd>.
+</p></dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Readline-Arguments">
+<div class="header">
+<p>
+Next: <a href="#Searching" accesskey="n" rel="next">Searching for Commands in the History</a>, Previous: <a href="#Readline-Killing-Commands" accesskey="p" rel="prev">Readline Killing Commands</a>, Up: <a href="#Readline-Interaction" accesskey="u" rel="up">Readline Interaction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Readline-Arguments-1"></span><h4 class="subsection">1.2.4 Readline Arguments</h4>
+
+<p>You can pass numeric arguments to Readline commands. Sometimes the
+argument acts as a repeat count, other times it is the <i>sign</i> of the
+argument that is significant. If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction. For example, to kill text back to the
+start of the line, you might type &lsquo;<samp>M-- C-k</samp>&rsquo;.
+</p>
+<p>The general way to pass numeric arguments to a command is to type meta
+digits before the command. If the first &lsquo;digit&rsquo; typed is a minus
+sign (&lsquo;<samp>-</samp>&rsquo;), then the sign of the argument will be negative. Once
+you have typed one meta digit to get the argument started, you can type
+the remainder of the digits, and then the command. For example, to give
+the <kbd>C-d</kbd> command an argument of 10, you could type &lsquo;<samp>M-1 0 C-d</samp>&rsquo;,
+which will delete the next ten characters on the input line.
+</p>
+<hr>
+</div>
+<div class="subsection" id="Searching">
+<div class="header">
+<p>
+Previous: <a href="#Readline-Arguments" accesskey="p" rel="prev">Readline Arguments</a>, Up: <a href="#Readline-Interaction" accesskey="u" rel="up">Readline Interaction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Searching-for-Commands-in-the-History"></span><h4 class="subsection">1.2.5 Searching for Commands in the History</h4>
+
+<p>Readline provides commands for searching through the command history
+for lines containing a specified string.
+There are two search modes: <em>incremental</em> and <em>non-incremental</em>.
+</p>
+<p>Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, Readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+To search backward in the history for a particular string, type
+<kbd>C-r</kbd>. Typing <kbd>C-s</kbd> searches forward through the history.
+The characters present in the value of the <code>isearch-terminators</code> variable
+are used to terminate an incremental search.
+If that variable has not been assigned a value, the <tt class="key">ESC</tt> and
+<kbd>C-J</kbd> characters will terminate an incremental search.
+<kbd>C-g</kbd> will abort an incremental search and restore the original line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+</p>
+<p>To find other matching entries in the history list, type <kbd>C-r</kbd> or
+<kbd>C-s</kbd> as appropriate.
+This will search backward or forward in the history for the next
+entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate
+the search and execute that command.
+For instance, a <tt class="key">RET</tt> will terminate the search and accept
+the line, thereby executing the command from the history list.
+A movement command will terminate the search, make the last line found
+the current line, and begin editing.
+</p>
+<p>Readline remembers the last incremental search string. If two
+<kbd>C-r</kbd>s are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+</p>
+<p>Non-incremental searches read the entire search string before starting
+to search for matching history lines. The search string may be
+typed by the user or be part of the contents of the current line.
+</p>
+<hr>
+</div>
+</div>
+<div class="section" id="Readline-Init-File">
+<div class="header">
+<p>
+Next: <a href="#Bindable-Readline-Commands" accesskey="n" rel="next">Bindable Readline Commands</a>, Previous: <a href="#Readline-Interaction" accesskey="p" rel="prev">Readline Interaction</a>, Up: <a href="#Command-Line-Editing" accesskey="u" rel="up">Command Line Editing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Readline-Init-File-1"></span><h3 class="section">1.3 Readline Init File</h3>
+<span id="index-initialization-file_002c-readline"></span>
+
+<p>Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.
+Any user can customize programs that use Readline by putting
+commands in an <em>inputrc</em> file,
+conventionally in their home directory.
+The name of this
+file is taken from the value of the environment variable <code>INPUTRC</code>. If
+that variable is unset, the default is <samp>~/.inputrc</samp>. If that
+file does not exist or cannot be read, the ultimate default is
+<samp>/etc/inputrc</samp>.
+</p>
+<p>When a program which uses the Readline library starts up, the
+init file is read, and the key bindings are set.
+</p>
+<p>In addition, the <code>C-x C-r</code> command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+</p>
+
+<ul class="section-toc">
+<li><a href="#Readline-Init-File-Syntax" accesskey="1">Readline Init File Syntax</a></li>
+<li><a href="#Conditional-Init-Constructs" accesskey="2">Conditional Init Constructs</a></li>
+<li><a href="#Sample-Init-File" accesskey="3">Sample Init File</a></li>
+</ul>
+<hr>
+<div class="subsection" id="Readline-Init-File-Syntax">
+<div class="header">
+<p>
+Next: <a href="#Conditional-Init-Constructs" accesskey="n" rel="next">Conditional Init Constructs</a>, Up: <a href="#Readline-Init-File" accesskey="u" rel="up">Readline Init File</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Readline-Init-File-Syntax-1"></span><h4 class="subsection">1.3.1 Readline Init File Syntax</h4>
+
+<p>There are only a few basic constructs allowed in the
+Readline init file. Blank lines are ignored.
+Lines beginning with a &lsquo;<samp>#</samp>&rsquo; are comments.
+Lines beginning with a &lsquo;<samp>$</samp>&rsquo; indicate conditional
+constructs (see <a href="#Conditional-Init-Constructs">Conditional Init Constructs</a>). Other lines
+denote variable settings and key bindings.
+</p>
+<dl compact="compact">
+<dt><span>Variable Settings</span></dt>
+<dd><p>You can modify the run-time behavior of Readline by
+altering the values of variables in Readline
+using the <code>set</code> command within the init file.
+The syntax is simple:
+</p>
+<div class="example">
+<pre class="example">set <var>variable</var> <var>value</var>
+</pre></div>
+
+<p>Here, for example, is how to
+change from the default Emacs-like key binding to use
+<code>vi</code> line editing commands:
+</p>
+<div class="example">
+<pre class="example">set editing-mode vi
+</pre></div>
+
+<p>Variable names and values, where appropriate, are recognized without regard
+to case. Unrecognized variable names are ignored.
+</p>
+<p>Boolean variables (those that can be set to on or off) are set to on if
+the value is null or empty, <var>on</var> (case-insensitive), or 1. Any other
+value results in the variable being set to off.
+</p>
+
+<p>A great deal of run-time behavior is changeable with the following
+variables.
+</p>
+<span id="index-variables_002c-readline"></span>
+<dl compact="compact">
+<dt id='index-active_002dregion_002dstart_002dcolor'><span><code>active-region-start-color</code><a href='#index-active_002dregion_002dstart_002dcolor' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A string variable that controls the text color and background when displaying
+the text in the active region (see the description of
+<code>enable-active-region</code> below).
+This string must not take up any physical character positions on the display,
+so it should consist only of terminal escape sequences.
+It is output to the terminal before displaying the text in the active region.
+This variable is reset to the default value whenever the terminal type changes.
+The default value is the string that puts the terminal in standout mode,
+as obtained from the terminal&rsquo;s terminfo description.
+A sample value might be &lsquo;<samp>\e[01;33m</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-active_002dregion_002dend_002dcolor'><span><code>active-region-end-color</code><a href='#index-active_002dregion_002dend_002dcolor' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A string variable that &quot;undoes&quot; the effects of <code>active-region-start-color</code>
+and restores &quot;normal&quot; terminal display appearance after displaying text
+in the active region.
+This string must not take up any physical character positions on the display,
+so it should consist only of terminal escape sequences.
+It is output to the terminal after displaying the text in the active region.
+This variable is reset to the default value whenever the terminal type changes.
+The default value is the string that restores the terminal from standout mode,
+as obtained from the terminal&rsquo;s terminfo description.
+A sample value might be &lsquo;<samp>\e[0m</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-bell_002dstyle'><span><code>bell-style</code><a href='#index-bell_002dstyle' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Controls what happens when Readline wants to ring the terminal bell.
+If set to &lsquo;<samp>none</samp>&rsquo;, Readline never rings the bell. If set to
+&lsquo;<samp>visible</samp>&rsquo;, Readline uses a visible bell if one is available.
+If set to &lsquo;<samp>audible</samp>&rsquo; (the default), Readline attempts to ring
+the terminal&rsquo;s bell.
+</p>
+</dd>
+<dt id='index-bind_002dtty_002dspecial_002dchars'><span><code>bind-tty-special-chars</code><a href='#index-bind_002dtty_002dspecial_002dchars' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo; (the default), Readline attempts to bind the control
+characters treated specially by the kernel&rsquo;s terminal driver to their
+Readline equivalents.
+</p>
+</dd>
+<dt id='index-blink_002dmatching_002dparen'><span><code>blink-matching-paren</code><a href='#index-blink_002dmatching_002dparen' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline attempts to briefly move the cursor to an
+opening parenthesis when a closing parenthesis is inserted. The default
+is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-colored_002dcompletion_002dprefix'><span><code>colored-completion-prefix</code><a href='#index-colored_002dcompletion_002dprefix' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, when listing completions, Readline displays the
+common prefix of the set of possible completions using a different color.
+The color definitions are taken from the value of the <code>LS_COLORS</code>
+environment variable.
+If there is a color definition in <code>LS_COLORS</code> for the custom suffix
+&lsquo;<samp>readline-colored-completion-prefix</samp>&rsquo;, Readline uses this color for
+the common prefix instead of its default.
+The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-colored_002dstats'><span><code>colored-stats</code><a href='#index-colored_002dstats' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline displays possible completions using different
+colors to indicate their file type.
+The color definitions are taken from the value of the <code>LS_COLORS</code>
+environment variable.
+The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-comment_002dbegin'><span><code>comment-begin</code><a href='#index-comment_002dbegin' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The string to insert at the beginning of the line when the
+<code>insert-comment</code> command is executed. The default value
+is <code>&quot;#&quot;</code>.
+</p>
+</dd>
+<dt id='index-completion_002ddisplay_002dwidth'><span><code>completion-display-width</code><a href='#index-completion_002ddisplay_002dwidth' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The number of screen columns used to display possible matches
+when performing completion.
+The value is ignored if it is less than 0 or greater than the terminal
+screen width.
+A value of 0 will cause matches to be displayed one per line.
+The default value is -1.
+</p>
+</dd>
+<dt id='index-completion_002dignore_002dcase'><span><code>completion-ignore-case</code><a href='#index-completion_002dignore_002dcase' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline performs filename matching and completion
+in a case-insensitive fashion.
+The default value is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-completion_002dmap_002dcase'><span><code>completion-map-case</code><a href='#index-completion_002dmap_002dcase' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, and <var>completion-ignore-case</var> is enabled, Readline
+treats hyphens (&lsquo;<samp>-</samp>&rsquo;) and underscores (&lsquo;<samp>_</samp>&rsquo;) as equivalent when
+performing case-insensitive filename matching and completion.
+The default value is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-completion_002dprefix_002ddisplay_002dlength'><span><code>completion-prefix-display-length</code><a href='#index-completion_002dprefix_002ddisplay_002dlength' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The length in characters of the common prefix of a list of possible
+completions that is displayed without modification. When set to a
+value greater than zero, common prefixes longer than this value are
+replaced with an ellipsis when displaying possible completions.
+</p>
+</dd>
+<dt id='index-completion_002dquery_002ditems'><span><code>completion-query-items</code><a href='#index-completion_002dquery_002ditems' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The number of possible completions that determines when the user is
+asked whether the list of possibilities should be displayed.
+If the number of possible completions is greater than or equal to this value,
+Readline will ask whether or not the user wishes to view them;
+otherwise, they are simply listed.
+This variable must be set to an integer value greater than or equal to zero.
+A zero value means Readline should never ask; negative values are
+treated as zero.
+The default limit is <code>100</code>.
+</p>
+</dd>
+<dt id='index-convert_002dmeta'><span><code>convert-meta</code><a href='#index-convert_002dmeta' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline will convert characters with the
+eighth bit set to an <small>ASCII</small> key sequence by stripping the eighth
+bit and prefixing an <tt class="key">ESC</tt> character, converting them to a
+meta-prefixed key sequence.
+The default value is &lsquo;<samp>on</samp>&rsquo;, but
+will be set to &lsquo;<samp>off</samp>&rsquo; if the locale is one that contains
+eight-bit characters.
+This variable is dependent on the <code>LC_CTYPE</code> locale category, and
+may change if the locale is changed.
+</p>
+</dd>
+<dt id='index-disable_002dcompletion'><span><code>disable-completion</code><a href='#index-disable_002dcompletion' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>On</samp>&rsquo;, Readline will inhibit word completion.
+Completion characters will be inserted into the line as if they had
+been mapped to <code>self-insert</code>. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-echo_002dcontrol_002dcharacters'><span><code>echo-control-characters</code><a href='#index-echo_002dcontrol_002dcharacters' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When set to &lsquo;<samp>on</samp>&rsquo;, on operating systems that indicate they support it,
+Readline echoes a character corresponding to a signal generated from the
+keyboard. The default is &lsquo;<samp>on</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-editing_002dmode'><span><code>editing-mode</code><a href='#index-editing_002dmode' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The <code>editing-mode</code> variable controls which default set of
+key bindings is used. By default, Readline starts up in Emacs editing
+mode, where the keystrokes are most similar to Emacs. This variable can be
+set to either &lsquo;<samp>emacs</samp>&rsquo; or &lsquo;<samp>vi</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-emacs_002dmode_002dstring'><span><code>emacs-mode-string</code><a href='#index-emacs_002dmode_002dstring' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If the <var>show-mode-in-prompt</var> variable is enabled,
+this string is displayed immediately before the last line of the primary
+prompt when emacs editing mode is active. The value is expanded like a
+key binding, so the standard set of meta- and control prefixes and
+backslash escape sequences is available.
+Use the &lsquo;<samp>\1</samp>&rsquo; and &lsquo;<samp>\2</samp>&rsquo; escapes to begin and end sequences of
+non-printing characters, which can be used to embed a terminal control
+sequence into the mode string.
+The default is &lsquo;<samp>@</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-enable_002dactive_002dregion'><span><code>enable-active-region</code><a href='#index-enable_002dactive_002dregion' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The <em>point</em> is the current cursor position, and <em>mark</em> refers
+to a saved cursor position (see <a href="#Commands-For-Moving">Commands For Moving</a>).
+The text between the point and mark is referred to as the <em>region</em>.
+When this variable is set to &lsquo;<samp>On</samp>&rsquo;, Readline allows certain commands
+to designate the region as <em>active</em>.
+When the region is active, Readline highlights the text in the region using
+the value of the <code>active-region-start-color</code>, which defaults to the
+string that enables
+the terminal&rsquo;s standout mode.
+The active region shows the text inserted by bracketed-paste and any
+matching text found by incremental and non-incremental history searches.
+The default is &lsquo;<samp>On</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-enable_002dbracketed_002dpaste'><span><code>enable-bracketed-paste</code><a href='#index-enable_002dbracketed_002dpaste' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When set to &lsquo;<samp>On</samp>&rsquo;, Readline configures the terminal to insert each
+paste into the editing buffer as a single string of characters, instead
+of treating each character as if it had been read from the keyboard.
+This is called putting the terminal into <em>bracketed paste mode</em>;
+it prevents Readline from executing any editing commands bound to key
+sequences appearing in the pasted text.
+The default is &lsquo;<samp>On</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-enable_002dkeypad'><span><code>enable-keypad</code><a href='#index-enable_002dkeypad' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When set to &lsquo;<samp>on</samp>&rsquo;, Readline will try to enable the application
+keypad when it is called. Some systems need this to enable the
+arrow keys. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt><span><code>enable-meta-key</code></span></dt>
+<dd><p>When set to &lsquo;<samp>on</samp>&rsquo;, Readline will try to enable any meta modifier
+key the terminal claims to support when it is called. On many terminals,
+the meta key is used to send eight-bit characters.
+The default is &lsquo;<samp>on</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-expand_002dtilde'><span><code>expand-tilde</code><a href='#index-expand_002dtilde' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, tilde expansion is performed when Readline
+attempts word completion. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-history_002dpreserve_002dpoint'><span><code>history-preserve-point</code><a href='#index-history_002dpreserve_002dpoint' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, the history code attempts to place the point (the
+current cursor position) at the
+same location on each history line retrieved with <code>previous-history</code>
+or <code>next-history</code>. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-history_002dsize'><span><code>history-size</code><a href='#index-history_002dsize' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set the maximum number of history entries saved in the history list.
+If set to zero, any existing history entries are deleted and no new entries
+are saved.
+If set to a value less than zero, the number of history entries is not
+limited.
+By default, the number of history entries is not limited.
+If an attempt is made to set <var>history-size</var> to a non-numeric value,
+the maximum number of history entries will be set to 500.
+</p>
+</dd>
+<dt id='index-horizontal_002dscroll_002dmode'><span><code>horizontal-scroll-mode</code><a href='#index-horizontal_002dscroll_002dmode' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This variable can be set to either &lsquo;<samp>on</samp>&rsquo; or &lsquo;<samp>off</samp>&rsquo;. Setting it
+to &lsquo;<samp>on</samp>&rsquo; means that the text of the lines being edited will scroll
+horizontally on a single screen line when they are longer than the width
+of the screen, instead of wrapping onto a new screen line.
+This variable is automatically set to &lsquo;<samp>on</samp>&rsquo; for terminals of height 1.
+By default, this variable is set to &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-input_002dmeta'><span><code>input-meta</code><a href='#index-input_002dmeta' class='copiable-anchor'> &para;</a></span></dt>
+<dd><span id="index-meta_002dflag"></span>
+<p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline will enable eight-bit input (it
+will not clear the eighth bit in the characters it reads),
+regardless of what the terminal claims it can support. The
+default value is &lsquo;<samp>off</samp>&rsquo;, but Readline will set it to &lsquo;<samp>on</samp>&rsquo; if the
+locale contains eight-bit characters.
+The name <code>meta-flag</code> is a synonym for this variable.
+This variable is dependent on the <code>LC_CTYPE</code> locale category, and
+may change if the locale is changed.
+</p>
+</dd>
+<dt id='index-isearch_002dterminators'><span><code>isearch-terminators</code><a href='#index-isearch_002dterminators' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The string of characters that should terminate an incremental search without
+subsequently executing the character as a command (see <a href="#Searching">Searching for Commands in the History</a>).
+If this variable has not been given a value, the characters <tt class="key">ESC</tt> and
+<kbd>C-J</kbd> will terminate an incremental search.
+</p>
+</dd>
+<dt id='index-keymap'><span><code>keymap</code><a href='#index-keymap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Sets Readline&rsquo;s idea of the current keymap for key binding commands.
+Built-in <code>keymap</code> names are
+<code>emacs</code>,
+<code>emacs-standard</code>,
+<code>emacs-meta</code>,
+<code>emacs-ctlx</code>,
+<code>vi</code>,
+<code>vi-move</code>,
+<code>vi-command</code>, and
+<code>vi-insert</code>.
+<code>vi</code> is equivalent to <code>vi-command</code> (<code>vi-move</code> is also a
+synonym); <code>emacs</code> is equivalent to <code>emacs-standard</code>.
+Applications may add additional names.
+The default value is <code>emacs</code>.
+The value of the <code>editing-mode</code> variable also affects the
+default keymap.
+</p>
+</dd>
+<dt><span><code>keyseq-timeout</code></span></dt>
+<dd><p>Specifies the duration Readline will wait for a character when reading an
+ambiguous key sequence (one that can form a complete key sequence using
+the input read so far, or can take additional input to complete a longer
+key sequence).
+If no input is received within the timeout, Readline will use the shorter
+but complete key sequence.
+Readline uses this value to determine whether or not input is
+available on the current input source (<code>rl_instream</code> by default).
+The value is specified in milliseconds, so a value of 1000 means that
+Readline will wait one second for additional input.
+If this variable is set to a value less than or equal to zero, or to a
+non-numeric value, Readline will wait until another key is pressed to
+decide which key sequence to complete.
+The default value is <code>500</code>.
+</p>
+</dd>
+<dt><span><code>mark-directories</code></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, completed directory names have a slash
+appended. The default is &lsquo;<samp>on</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-mark_002dmodified_002dlines'><span><code>mark-modified-lines</code><a href='#index-mark_002dmodified_002dlines' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This variable, when set to &lsquo;<samp>on</samp>&rsquo;, causes Readline to display an
+asterisk (&lsquo;<samp>*</samp>&rsquo;) at the start of history lines which have been modified.
+This variable is &lsquo;<samp>off</samp>&rsquo; by default.
+</p>
+</dd>
+<dt id='index-mark_002dsymlinked_002ddirectories'><span><code>mark-symlinked-directories</code><a href='#index-mark_002dsymlinked_002ddirectories' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, completed names which are symbolic links
+to directories have a slash appended (subject to the value of
+<code>mark-directories</code>).
+The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-match_002dhidden_002dfiles'><span><code>match-hidden-files</code><a href='#index-match_002dhidden_002dfiles' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This variable, when set to &lsquo;<samp>on</samp>&rsquo;, causes Readline to match files whose
+names begin with a &lsquo;<samp>.</samp>&rsquo; (hidden files) when performing filename
+completion.
+If set to &lsquo;<samp>off</samp>&rsquo;, the leading &lsquo;<samp>.</samp>&rsquo; must be
+supplied by the user in the filename to be completed.
+This variable is &lsquo;<samp>on</samp>&rsquo; by default.
+</p>
+</dd>
+<dt id='index-menu_002dcomplete_002ddisplay_002dprefix'><span><code>menu-complete-display-prefix</code><a href='#index-menu_002dcomplete_002ddisplay_002dprefix' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, menu completion displays the common prefix of the
+list of possible completions (which may be empty) before cycling through
+the list. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-output_002dmeta'><span><code>output-meta</code><a href='#index-output_002dmeta' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.
+The default is &lsquo;<samp>off</samp>&rsquo;, but Readline will set it to &lsquo;<samp>on</samp>&rsquo; if the
+locale contains eight-bit characters.
+This variable is dependent on the <code>LC_CTYPE</code> locale category, and
+may change if the locale is changed.
+</p>
+</dd>
+<dt id='index-page_002dcompletions'><span><code>page-completions</code><a href='#index-page_002dcompletions' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline uses an internal <code>more</code>-like pager
+to display a screenful of possible completions at a time.
+This variable is &lsquo;<samp>on</samp>&rsquo; by default.
+</p>
+</dd>
+<dt><span><code>print-completions-horizontally</code></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-revert_002dall_002dat_002dnewline'><span><code>revert-all-at-newline</code><a href='#index-revert_002dall_002dat_002dnewline' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline will undo all changes to history lines
+before returning when <code>accept-line</code> is executed. By default,
+history lines may be modified and retain individual undo lists across
+calls to <code>readline()</code>. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-show_002dall_002dif_002dambiguous'><span><code>show-all-if-ambiguous</code><a href='#index-show_002dall_002dif_002dambiguous' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This alters the default behavior of the completion functions. If
+set to &lsquo;<samp>on</samp>&rsquo;,
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+The default value is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-show_002dall_002dif_002dunmodified'><span><code>show-all-if-unmodified</code><a href='#index-show_002dall_002dif_002dunmodified' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This alters the default behavior of the completion functions in
+a fashion similar to <var>show-all-if-ambiguous</var>.
+If set to &lsquo;<samp>on</samp>&rsquo;,
+words which have more than one possible completion without any
+possible partial completion (the possible completions don&rsquo;t share
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+The default value is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-show_002dmode_002din_002dprompt'><span><code>show-mode-in-prompt</code><a href='#index-show_002dmode_002din_002dprompt' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, add a string to the beginning of the prompt
+indicating the editing mode: emacs, vi command, or vi insertion.
+The mode strings are user-settable (e.g., <var>emacs-mode-string</var>).
+The default value is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-skip_002dcompleted_002dtext'><span><code>skip-completed-text</code><a href='#index-skip_002dcompleted_002dtext' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, this alters the default completion behavior when
+inserting a single match into the line. It&rsquo;s only active when
+performing completion in the middle of a word. If enabled, Readline
+does not insert characters from the completion that match characters
+after point in the word being completed, so portions of the word
+following the cursor are not duplicated.
+For instance, if this is enabled, attempting completion when the cursor
+is after the &lsquo;<samp>e</samp>&rsquo; in &lsquo;<samp>Makefile</samp>&rsquo; will result in &lsquo;<samp>Makefile</samp>&rsquo;
+rather than &lsquo;<samp>Makefilefile</samp>&rsquo;, assuming there is a single possible
+completion.
+The default value is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-vi_002dcmd_002dmode_002dstring'><span><code>vi-cmd-mode-string</code><a href='#index-vi_002dcmd_002dmode_002dstring' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If the <var>show-mode-in-prompt</var> variable is enabled,
+this string is displayed immediately before the last line of the primary
+prompt when vi editing mode is active and in command mode.
+The value is expanded like a
+key binding, so the standard set of meta- and control prefixes and
+backslash escape sequences is available.
+Use the &lsquo;<samp>\1</samp>&rsquo; and &lsquo;<samp>\2</samp>&rsquo; escapes to begin and end sequences of
+non-printing characters, which can be used to embed a terminal control
+sequence into the mode string.
+The default is &lsquo;<samp>(cmd)</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-vi_002dins_002dmode_002dstring'><span><code>vi-ins-mode-string</code><a href='#index-vi_002dins_002dmode_002dstring' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If the <var>show-mode-in-prompt</var> variable is enabled,
+this string is displayed immediately before the last line of the primary
+prompt when vi editing mode is active and in insertion mode.
+The value is expanded like a
+key binding, so the standard set of meta- and control prefixes and
+backslash escape sequences is available.
+Use the &lsquo;<samp>\1</samp>&rsquo; and &lsquo;<samp>\2</samp>&rsquo; escapes to begin and end sequences of
+non-printing characters, which can be used to embed a terminal control
+sequence into the mode string.
+The default is &lsquo;<samp>(ins)</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-visible_002dstats'><span><code>visible-stats</code><a href='#index-visible_002dstats' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, a character denoting a file&rsquo;s type
+is appended to the filename when listing possible
+completions. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+</dl>
+
+</dd>
+<dt><span>Key Bindings</span></dt>
+<dd><p>The syntax for controlling key bindings in the init file is
+simple. First you need to find the name of the command that you
+want to change. The following sections contain tables of the command
+name, the default keybinding, if any, and a short description of what
+the command does.
+</p>
+<p>Once you know the name of the command, simply place on a line
+in the init file the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command.
+There can be no space between the key name and the colon &ndash; that will be
+interpreted as part of the key name.
+The name of the key can be expressed in different ways, depending on
+what you find most comfortable.
+</p>
+<p>In addition to command names, Readline allows keys to be bound
+to a string that is inserted when the key is pressed (a <var>macro</var>).
+</p>
+
+<dl compact="compact">
+<dt><span><var>keyname</var>:&nbsp;<var><span class="nolinebreak">function-name</span></var>&nbsp;or&nbsp;<var>macro</var><!-- /@w --></span></dt>
+<dd><p><var>keyname</var> is the name of a key spelled out in English. For example:
+</p><div class="example">
+<pre class="example">Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: &quot;&gt; output&quot;
+</pre></div>
+
+<p>In the example above, <kbd>C-u</kbd> is bound to the function
+<code>universal-argument</code>,
+<kbd>M-DEL</kbd> is bound to the function <code>backward-kill-word</code>, and
+<kbd>C-o</kbd> is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+&lsquo;<samp>&gt; output</samp>&rsquo; into the line).
+</p>
+<p>A number of symbolic character names are recognized while
+processing this key binding syntax:
+<var>DEL</var>,
+<var>ESC</var>,
+<var>ESCAPE</var>,
+<var>LFD</var>,
+<var>NEWLINE</var>,
+<var>RET</var>,
+<var>RETURN</var>,
+<var>RUBOUT</var>,
+<var>SPACE</var>,
+<var>SPC</var>,
+and
+<var>TAB</var>.
+</p>
+</dd>
+<dt><span>&quot;<var>keyseq</var>&quot;:&nbsp;<var><span class="nolinebreak">function-name</span></var>&nbsp;or&nbsp;<var>macro</var><!-- /@w --></span></dt>
+<dd><p><var>keyseq</var> differs from <var>keyname</var> above in that strings
+denoting an entire key sequence can be specified, by placing
+the key sequence in double quotes. Some <small>GNU</small> Emacs style key
+escapes can be used, as in the following example, but the
+special character names are not recognized.
+</p>
+<div class="example">
+<pre class="example">&quot;\C-u&quot;: universal-argument
+&quot;\C-x\C-r&quot;: re-read-init-file
+&quot;\e[11~&quot;: &quot;Function Key 1&quot;
+</pre></div>
+
+<p>In the above example, <kbd>C-u</kbd> is again bound to the function
+<code>universal-argument</code> (just as it was in the first example),
+&lsquo;<samp><kbd>C-x</kbd> <kbd>C-r</kbd></samp>&rsquo; is bound to the function <code>re-read-init-file</code>,
+and &lsquo;<samp><span class="key">ESC</span> <span class="key">[</span> <span class="key">1</span> <span class="key">1</span> <span class="key">~</span></samp>&rsquo; is bound to insert
+the text &lsquo;<samp>Function Key 1</samp>&rsquo;.
+</p>
+</dd>
+</dl>
+
+<p>The following <small>GNU</small> Emacs style escape sequences are available when
+specifying key sequences:
+</p>
+<dl compact="compact">
+<dt><span><code><kbd>\C-</kbd></code></span></dt>
+<dd><p>control prefix
+</p></dd>
+<dt><span><code><kbd>\M-</kbd></code></span></dt>
+<dd><p>meta prefix
+</p></dd>
+<dt><span><code><kbd>\e</kbd></code></span></dt>
+<dd><p>an escape character
+</p></dd>
+<dt><span><code><kbd>\\</kbd></code></span></dt>
+<dd><p>backslash
+</p></dd>
+<dt><span><code><kbd>\&quot;</kbd></code></span></dt>
+<dd><p><tt class="key">&quot;</tt>, a double quotation mark
+</p></dd>
+<dt><span><code><kbd>\'</kbd></code></span></dt>
+<dd><p><tt class="key">'</tt>, a single quote or apostrophe
+</p></dd>
+</dl>
+
+<p>In addition to the <small>GNU</small> Emacs style escape sequences, a second
+set of backslash escapes is available:
+</p>
+<dl compact="compact">
+<dt><span><code>\a</code></span></dt>
+<dd><p>alert (bell)
+</p></dd>
+<dt><span><code>\b</code></span></dt>
+<dd><p>backspace
+</p></dd>
+<dt><span><code>\d</code></span></dt>
+<dd><p>delete
+</p></dd>
+<dt><span><code>\f</code></span></dt>
+<dd><p>form feed
+</p></dd>
+<dt><span><code>\n</code></span></dt>
+<dd><p>newline
+</p></dd>
+<dt><span><code>\r</code></span></dt>
+<dd><p>carriage return
+</p></dd>
+<dt><span><code>\t</code></span></dt>
+<dd><p>horizontal tab
+</p></dd>
+<dt><span><code>\v</code></span></dt>
+<dd><p>vertical tab
+</p></dd>
+<dt><span><code>\<var>nnn</var></code></span></dt>
+<dd><p>the eight-bit character whose value is the octal value <var>nnn</var>
+(one to three digits)
+</p></dd>
+<dt><span><code>\x<var>HH</var></code></span></dt>
+<dd><p>the eight-bit character whose value is the hexadecimal value <var>HH</var>
+(one or two hex digits)
+</p></dd>
+</dl>
+
+<p>When entering the text of a macro, single or double quotes must
+be used to indicate a macro definition.
+Unquoted text is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including &lsquo;<samp>&quot;</samp>&rsquo; and &lsquo;<samp>'</samp>&rsquo;.
+For example, the following binding will make &lsquo;<samp><kbd>C-x</kbd> \</samp>&rsquo;
+insert a single &lsquo;<samp>\</samp>&rsquo; into the line:
+</p><div class="example">
+<pre class="example">&quot;\C-x\\&quot;: &quot;\\&quot;
+</pre></div>
+
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Conditional-Init-Constructs">
+<div class="header">
+<p>
+Next: <a href="#Sample-Init-File" accesskey="n" rel="next">Sample Init File</a>, Previous: <a href="#Readline-Init-File-Syntax" accesskey="p" rel="prev">Readline Init File Syntax</a>, Up: <a href="#Readline-Init-File" accesskey="u" rel="up">Readline Init File</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Conditional-Init-Constructs-1"></span><h4 class="subsection">1.3.2 Conditional Init Constructs</h4>
+
+<p>Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests. There are four parser directives used.
+</p>
+<dl compact="compact">
+<dt><span><code>$if</code></span></dt>
+<dd><p>The <code>$if</code> construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+Readline. The text of the test, after any comparison operator,
+extends to the end of the line;
+unless otherwise noted, no characters are required to isolate it.
+</p>
+<dl compact="compact">
+<dt><span><code>mode</code></span></dt>
+<dd><p>The <code>mode=</code> form of the <code>$if</code> directive is used to test
+whether Readline is in <code>emacs</code> or <code>vi</code> mode.
+This may be used in conjunction
+with the &lsquo;<samp>set keymap</samp>&rsquo; command, for instance, to set bindings in
+the <code>emacs-standard</code> and <code>emacs-ctlx</code> keymaps only if
+Readline is starting out in <code>emacs</code> mode.
+</p>
+</dd>
+<dt><span><code>term</code></span></dt>
+<dd><p>The <code>term=</code> form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal&rsquo;s function keys. The word on the right side of the
+&lsquo;<samp>=</samp>&rsquo; is tested against both the full name of the terminal and
+the portion of the terminal name before the first &lsquo;<samp>-</samp>&rsquo;. This
+allows <code>sun</code> to match both <code>sun</code> and <code>sun-cmd</code>,
+for instance.
+</p>
+</dd>
+<dt><span><code>version</code></span></dt>
+<dd><p>The <code>version</code> test may be used to perform comparisons against
+specific Readline versions.
+The <code>version</code> expands to the current Readline version.
+The set of comparison operators includes
+&lsquo;<samp>=</samp>&rsquo; (and &lsquo;<samp>==</samp>&rsquo;), &lsquo;<samp>!=</samp>&rsquo;, &lsquo;<samp>&lt;=</samp>&rsquo;, &lsquo;<samp>&gt;=</samp>&rsquo;, &lsquo;<samp>&lt;</samp>&rsquo;,
+and &lsquo;<samp>&gt;</samp>&rsquo;.
+The version number supplied on the right side of the operator consists
+of a major version number, an optional decimal point, and an optional
+minor version (e.g., &lsquo;<samp>7.1</samp>&rsquo;). If the minor version is omitted, it
+is assumed to be &lsquo;<samp>0</samp>&rsquo;.
+The operator may be separated from the string <code>version</code> and
+from the version number argument by whitespace.
+The following example sets a variable if the Readline version being used
+is 7.0 or newer:
+</p><div class="example">
+<pre class="example">$if version &gt;= 7.0
+set show-mode-in-prompt on
+$endif
+</pre></div>
+
+</dd>
+<dt><span><code>application</code></span></dt>
+<dd><p>The <var>application</var> construct is used to include
+application-specific settings. Each program using the Readline
+library sets the <var>application name</var>, and you can test for
+a particular value.
+This could be used to bind key sequences to functions useful for
+a specific program. For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+</p><div class="example">
+<pre class="example">$if Bash
+# Quote the current or previous word
+&quot;\C-xq&quot;: &quot;\eb\&quot;\ef\&quot;&quot;
+$endif
+</pre></div>
+
+</dd>
+<dt><span><code>variable</code></span></dt>
+<dd><p>The <var>variable</var> construct provides simple equality tests for Readline
+variables and values.
+The permitted comparison operators are &lsquo;<samp>=</samp>&rsquo;, &lsquo;<samp>==</samp>&rsquo;, and &lsquo;<samp>!=</samp>&rsquo;.
+The variable name must be separated from the comparison operator by
+whitespace; the operator may be separated from the value on the right hand
+side by whitespace.
+Both string and boolean variables may be tested. Boolean variables must be
+tested against the values <var>on</var> and <var>off</var>.
+The following example is equivalent to the <code>mode=emacs</code> test described
+above:
+</p><div class="example">
+<pre class="example">$if editing-mode == emacs
+set show-mode-in-prompt on
+$endif
+</pre></div>
+</dd>
+</dl>
+
+</dd>
+<dt><span><code>$endif</code></span></dt>
+<dd><p>This command, as seen in the previous example, terminates an
+<code>$if</code> command.
+</p>
+</dd>
+<dt><span><code>$else</code></span></dt>
+<dd><p>Commands in this branch of the <code>$if</code> directive are executed if
+the test fails.
+</p>
+</dd>
+<dt><span><code>$include</code></span></dt>
+<dd><p>This directive takes a single filename as an argument and reads commands
+and bindings from that file.
+For example, the following directive reads from <samp>/etc/inputrc</samp>:
+</p><div class="example">
+<pre class="example">$include /etc/inputrc
+</pre></div>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Sample-Init-File">
+<div class="header">
+<p>
+Previous: <a href="#Conditional-Init-Constructs" accesskey="p" rel="prev">Conditional Init Constructs</a>, Up: <a href="#Readline-Init-File" accesskey="u" rel="up">Readline Init File</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Sample-Init-File-1"></span><h4 class="subsection">1.3.3 Sample Init File</h4>
+
+<p>Here is an example of an <var>inputrc</var> file. This illustrates key
+binding, variable assignment, and conditional syntax.
+</p>
+<div class="example">
+<pre class="example"># This file controls the behaviour of line input editing for
+# programs that use the GNU Readline library. Existing
+# programs include FTP, Bash, and GDB.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# First, include any system-wide bindings and variable
+# assignments from /etc/Inputrc
+$include /etc/Inputrc
+
+#
+# Set various bindings for emacs mode.
+
+set editing-mode emacs
+
+$if mode=emacs
+
+Meta-Control-h: backward-kill-word Text after the function name is ignored
+
+#
+# Arrow keys in keypad mode
+#
+#&quot;\M-OD&quot;: backward-char
+#&quot;\M-OC&quot;: forward-char
+#&quot;\M-OA&quot;: previous-history
+#&quot;\M-OB&quot;: next-history
+#
+# Arrow keys in ANSI mode
+#
+&quot;\M-[D&quot;: backward-char
+&quot;\M-[C&quot;: forward-char
+&quot;\M-[A&quot;: previous-history
+&quot;\M-[B&quot;: next-history
+#
+# Arrow keys in 8 bit keypad mode
+#
+#&quot;\M-\C-OD&quot;: backward-char
+#&quot;\M-\C-OC&quot;: forward-char
+#&quot;\M-\C-OA&quot;: previous-history
+#&quot;\M-\C-OB&quot;: next-history
+#
+# Arrow keys in 8 bit ANSI mode
+#
+#&quot;\M-\C-[D&quot;: backward-char
+#&quot;\M-\C-[C&quot;: forward-char
+#&quot;\M-\C-[A&quot;: previous-history
+#&quot;\M-\C-[B&quot;: next-history
+
+C-q: quoted-insert
+
+$endif
+
+# An old-style binding. This happens to be the default.
+TAB: complete
+
+# Macros that are convenient for shell interaction
+$if Bash
+# edit the path
+&quot;\C-xp&quot;: &quot;PATH=${PATH}\e\C-e\C-a\ef\C-f&quot;
+# prepare to type a quoted word --
+# insert open and close double quotes
+# and move to just after the open quote
+&quot;\C-x\&quot;&quot;: &quot;\&quot;\&quot;\C-b&quot;
+# insert a backslash (testing backslash escapes
+# in sequences and macros)
+&quot;\C-x\\&quot;: &quot;\\&quot;
+# Quote the current or previous word
+&quot;\C-xq&quot;: &quot;\eb\&quot;\ef\&quot;&quot;
+# Add a binding to refresh the line, which is unbound
+&quot;\C-xr&quot;: redraw-current-line
+# Edit variable on current line.
+&quot;\M-\C-v&quot;: &quot;\C-a\C-k$\C-y\M-\C-e\C-a\C-y=&quot;
+$endif
+
+# use a visible bell if one is available
+set bell-style visible
+
+# don't strip characters to 7 bits when reading
+set input-meta on
+
+# allow iso-latin1 characters to be inserted rather
+# than converted to prefix-meta sequences
+set convert-meta off
+
+# display characters with the eighth bit set directly
+# rather than as meta-prefixed characters
+set output-meta on
+
+# if there are 150 or more possible completions for a word,
+# ask whether or not the user wants to see all of them
+set completion-query-items 150
+
+# For FTP
+$if Ftp
+&quot;\C-xg&quot;: &quot;get \M-?&quot;
+&quot;\C-xt&quot;: &quot;put \M-?&quot;
+&quot;\M-.&quot;: yank-last-arg
+$endif
+</pre></div>
+
+<hr>
+</div>
+</div>
+<div class="section" id="Bindable-Readline-Commands">
+<div class="header">
+<p>
+Next: <a href="#Readline-vi-Mode" accesskey="n" rel="next">Readline vi Mode</a>, Previous: <a href="#Readline-Init-File" accesskey="p" rel="prev">Readline Init File</a>, Up: <a href="#Command-Line-Editing" accesskey="u" rel="up">Command Line Editing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Bindable-Readline-Commands-1"></span><h3 class="section">1.4 Bindable Readline Commands</h3>
+
+
+<p>This section describes Readline commands that may be bound to key
+sequences.
+Command names without an accompanying key sequence are unbound by default.
+</p>
+<p>In the following descriptions, <em>point</em> refers to the current cursor
+position, and <em>mark</em> refers to a cursor position saved by the
+<code>set-mark</code> command.
+The text between the point and mark is referred to as the <em>region</em>.
+</p>
+<ul class="section-toc">
+<li><a href="#Commands-For-Moving" accesskey="1">Commands For Moving</a></li>
+<li><a href="#Commands-For-History" accesskey="2">Commands For Manipulating The History</a></li>
+<li><a href="#Commands-For-Text" accesskey="3">Commands For Changing Text</a></li>
+<li><a href="#Commands-For-Killing" accesskey="4">Killing And Yanking</a></li>
+<li><a href="#Numeric-Arguments" accesskey="5">Specifying Numeric Arguments</a></li>
+<li><a href="#Commands-For-Completion" accesskey="6">Letting Readline Type For You</a></li>
+<li><a href="#Keyboard-Macros" accesskey="7">Keyboard Macros</a></li>
+<li><a href="#Miscellaneous-Commands" accesskey="8">Some Miscellaneous Commands</a></li>
+</ul>
+<hr>
+<div class="subsection" id="Commands-For-Moving">
+<div class="header">
+<p>
+Next: <a href="#Commands-For-History" accesskey="n" rel="next">Commands For Manipulating The History</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Commands-For-Moving-1"></span><h4 class="subsection">1.4.1 Commands For Moving</h4>
+<dl compact="compact">
+<dt id='index-beginning_002dof_002dline-_0028C_002da_0029'><span><code>beginning-of-line (C-a)</code><a href='#index-beginning_002dof_002dline-_0028C_002da_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move to the start of the current line.
+</p>
+</dd>
+<dt id='index-end_002dof_002dline-_0028C_002de_0029'><span><code>end-of-line (C-e)</code><a href='#index-end_002dof_002dline-_0028C_002de_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move to the end of the line.
+</p>
+</dd>
+<dt id='index-forward_002dchar-_0028C_002df_0029'><span><code>forward-char (C-f)</code><a href='#index-forward_002dchar-_0028C_002df_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move forward a character.
+</p>
+</dd>
+<dt id='index-backward_002dchar-_0028C_002db_0029'><span><code>backward-char (C-b)</code><a href='#index-backward_002dchar-_0028C_002db_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move back a character.
+</p>
+</dd>
+<dt id='index-forward_002dword-_0028M_002df_0029'><span><code>forward-word (M-f)</code><a href='#index-forward_002dword-_0028M_002df_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move forward to the end of the next word.
+Words are composed of letters and digits.
+</p>
+</dd>
+<dt id='index-backward_002dword-_0028M_002db_0029'><span><code>backward-word (M-b)</code><a href='#index-backward_002dword-_0028M_002db_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move back to the start of the current or previous word.
+Words are composed of letters and digits.
+</p>
+
+</dd>
+<dt id='index-previous_002dscreen_002dline-_0028_0029'><span><code>previous-screen-line ()</code><a href='#index-previous_002dscreen_002dline-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Attempt to move point to the same physical screen column on the previous
+physical screen line. This will not have the desired effect if the current
+Readline line does not take up more than one physical line or if point is not
+greater than the length of the prompt plus the screen width.
+</p>
+</dd>
+<dt id='index-next_002dscreen_002dline-_0028_0029'><span><code>next-screen-line ()</code><a href='#index-next_002dscreen_002dline-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Attempt to move point to the same physical screen column on the next
+physical screen line. This will not have the desired effect if the current
+Readline line does not take up more than one physical line or if the length
+of the current Readline line is not greater than the length of the prompt
+plus the screen width.
+</p>
+</dd>
+<dt id='index-clear_002ddisplay-_0028M_002dC_002dl_0029'><span><code>clear-display (M-C-l)</code><a href='#index-clear_002ddisplay-_0028M_002dC_002dl_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Clear the screen and, if possible, the terminal&rsquo;s scrollback buffer,
+then redraw the current line,
+leaving the current line at the top of the screen.
+</p>
+</dd>
+<dt id='index-clear_002dscreen-_0028C_002dl_0029'><span><code>clear-screen (C-l)</code><a href='#index-clear_002dscreen-_0028C_002dl_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Clear the screen,
+then redraw the current line,
+leaving the current line at the top of the screen.
+</p>
+</dd>
+<dt id='index-redraw_002dcurrent_002dline-_0028_0029'><span><code>redraw-current-line ()</code><a href='#index-redraw_002dcurrent_002dline-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Refresh the current line. By default, this is unbound.
+</p>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Commands-For-History">
+<div class="header">
+<p>
+Next: <a href="#Commands-For-Text" accesskey="n" rel="next">Commands For Changing Text</a>, Previous: <a href="#Commands-For-Moving" accesskey="p" rel="prev">Commands For Moving</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Commands-For-Manipulating-The-History"></span><h4 class="subsection">1.4.2 Commands For Manipulating The History</h4>
+
+<dl compact="compact">
+<dt id='index-accept_002dline-_0028Newline-or-Return_0029'><span><code>accept-line (Newline or Return)</code><a href='#index-accept_002dline-_0028Newline-or-Return_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Accept the line regardless of where the cursor is.
+If this line is
+non-empty, it may be added to the history list for future recall with
+<code>add_history()</code>.
+If this line is a modified history line, the history line is restored
+to its original state.
+</p>
+</dd>
+<dt id='index-previous_002dhistory-_0028C_002dp_0029'><span><code>previous-history (C-p)</code><a href='#index-previous_002dhistory-_0028C_002dp_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move &lsquo;back&rsquo; through the history list, fetching the previous command.
+</p>
+</dd>
+<dt id='index-next_002dhistory-_0028C_002dn_0029'><span><code>next-history (C-n)</code><a href='#index-next_002dhistory-_0028C_002dn_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move &lsquo;forward&rsquo; through the history list, fetching the next command.
+</p>
+</dd>
+<dt id='index-beginning_002dof_002dhistory-_0028M_002d_003c_0029'><span><code>beginning-of-history (M-&lt;)</code><a href='#index-beginning_002dof_002dhistory-_0028M_002d_003c_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move to the first line in the history.
+</p>
+</dd>
+<dt id='index-end_002dof_002dhistory-_0028M_002d_003e_0029'><span><code>end-of-history (M-&gt;)</code><a href='#index-end_002dof_002dhistory-_0028M_002d_003e_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move to the end of the input history, i.e., the line currently
+being entered.
+</p>
+</dd>
+<dt id='index-reverse_002dsearch_002dhistory-_0028C_002dr_0029'><span><code>reverse-search-history (C-r)</code><a href='#index-reverse_002dsearch_002dhistory-_0028C_002dr_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search backward starting at the current line and moving &lsquo;up&rsquo; through
+the history as necessary. This is an incremental search.
+This command sets the region to the matched text and activates the mark.
+</p>
+</dd>
+<dt id='index-forward_002dsearch_002dhistory-_0028C_002ds_0029'><span><code>forward-search-history (C-s)</code><a href='#index-forward_002dsearch_002dhistory-_0028C_002ds_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search forward starting at the current line and moving &lsquo;down&rsquo; through
+the history as necessary. This is an incremental search.
+This command sets the region to the matched text and activates the mark.
+</p>
+</dd>
+<dt id='index-non_002dincremental_002dreverse_002dsearch_002dhistory-_0028M_002dp_0029'><span><code>non-incremental-reverse-search-history (M-p)</code><a href='#index-non_002dincremental_002dreverse_002dsearch_002dhistory-_0028M_002dp_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search backward starting at the current line and moving &lsquo;up&rsquo;
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+The search string may match anywhere in a history line.
+</p>
+</dd>
+<dt id='index-non_002dincremental_002dforward_002dsearch_002dhistory-_0028M_002dn_0029'><span><code>non-incremental-forward-search-history (M-n)</code><a href='#index-non_002dincremental_002dforward_002dsearch_002dhistory-_0028M_002dn_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search forward starting at the current line and moving &lsquo;down&rsquo;
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+The search string may match anywhere in a history line.
+</p>
+</dd>
+<dt id='index-history_002dsearch_002dforward-_0028_0029'><span><code>history-search-forward ()</code><a href='#index-history_002dsearch_002dforward-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search forward through the history for the string of characters
+between the start of the current line and the point.
+The search string must match at the beginning of a history line.
+This is a non-incremental search.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-history_002dsearch_002dbackward-_0028_0029'><span><code>history-search-backward ()</code><a href='#index-history_002dsearch_002dbackward-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search backward through the history for the string of characters
+between the start of the current line and the point.
+The search string must match at the beginning of a history line.
+This is a non-incremental search.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-history_002dsubstring_002dsearch_002dforward-_0028_0029'><span><code>history-substring-search-forward ()</code><a href='#index-history_002dsubstring_002dsearch_002dforward-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search forward through the history for the string of characters
+between the start of the current line and the point.
+The search string may match anywhere in a history line.
+This is a non-incremental search.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-history_002dsubstring_002dsearch_002dbackward-_0028_0029'><span><code>history-substring-search-backward ()</code><a href='#index-history_002dsubstring_002dsearch_002dbackward-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search backward through the history for the string of characters
+between the start of the current line and the point.
+The search string may match anywhere in a history line.
+This is a non-incremental search.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-yank_002dnth_002darg-_0028M_002dC_002dy_0029'><span><code>yank-nth-arg (M-C-y)</code><a href='#index-yank_002dnth_002darg-_0028M_002dC_002dy_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument <var>n</var>,
+insert the <var>n</var>th word from the previous command (the words
+in the previous command begin with word 0). A negative argument
+inserts the <var>n</var>th word from the end of the previous command.
+Once the argument <var>n</var> is computed, the argument is extracted
+as if the &lsquo;<samp>!<var>n</var></samp>&rsquo; history expansion had been specified.
+</p>
+</dd>
+<dt id='index-yank_002dlast_002darg-_0028M_002d_002e-or-M_002d_005f_0029'><span><code>yank-last-arg (M-. or M-_)</code><a href='#index-yank_002dlast_002darg-_0028M_002d_002e-or-M_002d_005f_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert last argument to the previous command (the last word of the
+previous history entry).
+With a numeric argument, behave exactly like <code>yank-nth-arg</code>.
+Successive calls to <code>yank-last-arg</code> move back through the history
+list, inserting the last word (or the word specified by the argument to
+the first call) of each line in turn.
+Any numeric argument supplied to these successive calls determines
+the direction to move through the history. A negative argument switches
+the direction through the history (back or forward).
+The history expansion facilities are used to extract the last argument,
+as if the &lsquo;<samp>!$</samp>&rsquo; history expansion had been specified.
+</p>
+</dd>
+<dt id='index-operate_002dand_002dget_002dnext-_0028C_002do_0029'><span><code>operate-and-get-next (C-o)</code><a href='#index-operate_002dand_002dget_002dnext-_0028C_002do_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Accept the current line for return to the calling application as if a
+newline had been entered,
+and fetch the next line relative to the current line from the history
+for editing.
+A numeric argument, if supplied, specifies the history entry to use instead
+of the current line.
+</p>
+</dd>
+<dt id='index-fetch_002dhistory-_0028_0029'><span><code>fetch-history ()</code><a href='#index-fetch_002dhistory-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>With a numeric argument, fetch that entry from the history list
+and make it the current line.
+Without an argument, move back to the first entry in the history list.
+</p>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Commands-For-Text">
+<div class="header">
+<p>
+Next: <a href="#Commands-For-Killing" accesskey="n" rel="next">Killing And Yanking</a>, Previous: <a href="#Commands-For-History" accesskey="p" rel="prev">Commands For Manipulating The History</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Commands-For-Changing-Text"></span><h4 class="subsection">1.4.3 Commands For Changing Text</h4>
+
+<dl compact="compact">
+<dt id='index-end_002dof_002dfile-_0028usually-C_002dd_0029'><span><code><i>end-of-file</i> (usually C-d)</code><a href='#index-end_002dof_002dfile-_0028usually-C_002dd_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The character indicating end-of-file as set, for example, by
+<code>stty</code>. If this character is read when there are no characters
+on the line, and point is at the beginning of the line, Readline
+interprets it as the end of input and returns <small>EOF</small>.
+</p>
+</dd>
+<dt id='index-delete_002dchar-_0028C_002dd_0029'><span><code>delete-char (C-d)</code><a href='#index-delete_002dchar-_0028C_002dd_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Delete the character at point. If this function is bound to the
+same character as the tty <small>EOF</small> character, as <kbd>C-d</kbd>
+commonly is, see above for the effects.
+</p>
+</dd>
+<dt id='index-backward_002ddelete_002dchar-_0028Rubout_0029'><span><code>backward-delete-char (Rubout)</code><a href='#index-backward_002ddelete_002dchar-_0028Rubout_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Delete the character behind the cursor. A numeric argument means
+to kill the characters instead of deleting them.
+</p>
+</dd>
+<dt id='index-forward_002dbackward_002ddelete_002dchar-_0028_0029'><span><code>forward-backward-delete-char ()</code><a href='#index-forward_002dbackward_002ddelete_002dchar-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted. By default, this is not bound to a key.
+</p>
+</dd>
+<dt id='index-quoted_002dinsert-_0028C_002dq-or-C_002dv_0029'><span><code>quoted-insert (C-q or C-v)</code><a href='#index-quoted_002dinsert-_0028C_002dq-or-C_002dv_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Add the next character typed to the line verbatim. This is
+how to insert key sequences like <kbd>C-q</kbd>, for example.
+</p>
+</dd>
+<dt id='index-tab_002dinsert-_0028M_002dTAB_0029'><span><code>tab-insert (M-<span class="key">TAB</span>)</code><a href='#index-tab_002dinsert-_0028M_002dTAB_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert a tab character.
+</p>
+</dd>
+<dt id='index-self_002dinsert-_0028a_002c-b_002c-A_002c-1_002c-_0021_002c-_2026_0029'><span><code>self-insert (a, b, A, 1, !, &hellip;)</code><a href='#index-self_002dinsert-_0028a_002c-b_002c-A_002c-1_002c-_0021_002c-_2026_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert yourself.
+</p>
+</dd>
+<dt id='index-bracketed_002dpaste_002dbegin-_0028_0029'><span><code>bracketed-paste-begin ()</code><a href='#index-bracketed_002dpaste_002dbegin-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This function is intended to be bound to the &quot;bracketed paste&quot; escape
+sequence sent by some terminals, and such a binding is assigned by default.
+It allows Readline to insert the pasted text as a single unit without treating
+each character as if it had been read from the keyboard. The characters
+are inserted as if each one was bound to <code>self-insert</code> instead of
+executing any editing commands.
+</p>
+<p>Bracketed paste sets the region (the characters between point and the mark)
+to the inserted text. It uses the concept of an <em>active mark</em>: when the
+mark is active, Readline redisplay uses the terminal&rsquo;s standout mode to
+denote the region.
+</p>
+</dd>
+<dt id='index-transpose_002dchars-_0028C_002dt_0029'><span><code>transpose-chars (C-t)</code><a href='#index-transpose_002dchars-_0028C_002dt_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Drag the character before the cursor forward over
+the character at the cursor, moving the
+cursor forward as well. If the insertion point
+is at the end of the line, then this
+transposes the last two characters of the line.
+Negative arguments have no effect.
+</p>
+</dd>
+<dt id='index-transpose_002dwords-_0028M_002dt_0029'><span><code>transpose-words (M-t)</code><a href='#index-transpose_002dwords-_0028M_002dt_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Drag the word before point past the word after point,
+moving point past that word as well.
+If the insertion point is at the end of the line, this transposes
+the last two words on the line.
+</p>
+</dd>
+<dt id='index-upcase_002dword-_0028M_002du_0029'><span><code>upcase-word (M-u)</code><a href='#index-upcase_002dword-_0028M_002du_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Uppercase the current (or following) word. With a negative argument,
+uppercase the previous word, but do not move the cursor.
+</p>
+</dd>
+<dt id='index-downcase_002dword-_0028M_002dl_0029'><span><code>downcase-word (M-l)</code><a href='#index-downcase_002dword-_0028M_002dl_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Lowercase the current (or following) word. With a negative argument,
+lowercase the previous word, but do not move the cursor.
+</p>
+</dd>
+<dt id='index-capitalize_002dword-_0028M_002dc_0029'><span><code>capitalize-word (M-c)</code><a href='#index-capitalize_002dword-_0028M_002dc_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Capitalize the current (or following) word. With a negative argument,
+capitalize the previous word, but do not move the cursor.
+</p>
+</dd>
+<dt id='index-overwrite_002dmode-_0028_0029'><span><code>overwrite-mode ()</code><a href='#index-overwrite_002dmode-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Toggle overwrite mode. With an explicit positive numeric argument,
+switches to overwrite mode. With an explicit non-positive numeric
+argument, switches to insert mode. This command affects only
+<code>emacs</code> mode; <code>vi</code> mode does overwrite differently.
+Each call to <code>readline()</code> starts in insert mode.
+</p>
+<p>In overwrite mode, characters bound to <code>self-insert</code> replace
+the text at point rather than pushing the text to the right.
+Characters bound to <code>backward-delete-char</code> replace the character
+before point with a space.
+</p>
+<p>By default, this command is unbound.
+</p>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Commands-For-Killing">
+<div class="header">
+<p>
+Next: <a href="#Numeric-Arguments" accesskey="n" rel="next">Specifying Numeric Arguments</a>, Previous: <a href="#Commands-For-Text" accesskey="p" rel="prev">Commands For Changing Text</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Killing-And-Yanking"></span><h4 class="subsection">1.4.4 Killing And Yanking</h4>
+
+<dl compact="compact">
+<dt id='index-kill_002dline-_0028C_002dk_0029'><span><code>kill-line (C-k)</code><a href='#index-kill_002dline-_0028C_002dk_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill the text from point to the end of the line.
+With a negative numeric argument, kill backward from the cursor to the
+beginning of the current line.
+</p>
+</dd>
+<dt id='index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029'><span><code>backward-kill-line (C-x Rubout)</code><a href='#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill backward from the cursor to the beginning of the current line.
+With a negative numeric argument, kill forward from the cursor to the
+end of the current line.
+</p>
+</dd>
+<dt id='index-unix_002dline_002ddiscard-_0028C_002du_0029'><span><code>unix-line-discard (C-u)</code><a href='#index-unix_002dline_002ddiscard-_0028C_002du_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill backward from the cursor to the beginning of the current line.
+</p>
+</dd>
+<dt id='index-kill_002dwhole_002dline-_0028_0029'><span><code>kill-whole-line ()</code><a href='#index-kill_002dwhole_002dline-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill all characters on the current line, no matter where point is.
+By default, this is unbound.
+</p>
+</dd>
+<dt id='index-kill_002dword-_0028M_002dd_0029'><span><code>kill-word (M-d)</code><a href='#index-kill_002dword-_0028M_002dd_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill from point to the end of the current word, or if between
+words, to the end of the next word.
+Word boundaries are the same as <code>forward-word</code>.
+</p>
+</dd>
+<dt id='index-backward_002dkill_002dword-_0028M_002dDEL_0029'><span><code>backward-kill-word (M-<span class="key">DEL</span>)</code><a href='#index-backward_002dkill_002dword-_0028M_002dDEL_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill the word behind point.
+Word boundaries are the same as <code>backward-word</code>.
+</p>
+
+</dd>
+<dt id='index-shell_002dtranspose_002dwords-_0028M_002dC_002dt_0029'><span><code>shell-transpose-words (M-C-t)</code><a href='#index-shell_002dtranspose_002dwords-_0028M_002dC_002dt_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Drag the word before point past the word after point,
+moving point past that word as well.
+If the insertion point is at the end of the line, this transposes
+the last two words on the line.
+Word boundaries are the same as <code>shell-forward-word</code> and
+<code>shell-backward-word</code>.
+</p>
+</dd>
+<dt id='index-unix_002dword_002drubout-_0028C_002dw_0029'><span><code>unix-word-rubout (C-w)</code><a href='#index-unix_002dword_002drubout-_0028C_002dw_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+</p>
+</dd>
+<dt id='index-unix_002dfilename_002drubout-_0028_0029'><span><code>unix-filename-rubout ()</code><a href='#index-unix_002dfilename_002drubout-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill the word behind point, using white space and the slash character
+as the word boundaries.
+The killed text is saved on the kill-ring.
+</p>
+</dd>
+<dt id='index-delete_002dhorizontal_002dspace-_0028_0029'><span><code>delete-horizontal-space ()</code><a href='#index-delete_002dhorizontal_002dspace-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Delete all spaces and tabs around point. By default, this is unbound.
+</p>
+</dd>
+<dt id='index-kill_002dregion-_0028_0029'><span><code>kill-region ()</code><a href='#index-kill_002dregion-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill the text in the current region.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-copy_002dregion_002das_002dkill-_0028_0029'><span><code>copy-region-as-kill ()</code><a href='#index-copy_002dregion_002das_002dkill-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Copy the text in the region to the kill buffer, so it can be yanked
+right away. By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-copy_002dbackward_002dword-_0028_0029'><span><code>copy-backward-word ()</code><a href='#index-copy_002dbackward_002dword-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Copy the word before point to the kill buffer.
+The word boundaries are the same as <code>backward-word</code>.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-copy_002dforward_002dword-_0028_0029'><span><code>copy-forward-word ()</code><a href='#index-copy_002dforward_002dword-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Copy the word following point to the kill buffer.
+The word boundaries are the same as <code>forward-word</code>.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-yank-_0028C_002dy_0029'><span><code>yank (C-y)</code><a href='#index-yank-_0028C_002dy_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Yank the top of the kill ring into the buffer at point.
+</p>
+</dd>
+<dt id='index-yank_002dpop-_0028M_002dy_0029'><span><code>yank-pop (M-y)</code><a href='#index-yank_002dpop-_0028M_002dy_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Rotate the kill-ring, and yank the new top. You can only do this if
+the prior command is <code>yank</code> or <code>yank-pop</code>.
+</p></dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Numeric-Arguments">
+<div class="header">
+<p>
+Next: <a href="#Commands-For-Completion" accesskey="n" rel="next">Letting Readline Type For You</a>, Previous: <a href="#Commands-For-Killing" accesskey="p" rel="prev">Killing And Yanking</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Specifying-Numeric-Arguments"></span><h4 class="subsection">1.4.5 Specifying Numeric Arguments</h4>
+<dl compact="compact">
+<dt id='index-digit_002dargument-_0028M_002d0_002c-M_002d1_002c-_2026-M_002d_002d_0029'><span><code>digit-argument (<kbd>M-0</kbd>, <kbd>M-1</kbd>, &hellip; <kbd>M--</kbd>)</code><a href='#index-digit_002dargument-_0028M_002d0_002c-M_002d1_002c-_2026-M_002d_002d_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Add this digit to the argument already accumulating, or start a new
+argument. <kbd>M--</kbd> starts a negative argument.
+</p>
+</dd>
+<dt id='index-universal_002dargument-_0028_0029'><span><code>universal-argument ()</code><a href='#index-universal_002dargument-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing <code>universal-argument</code>
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit nor minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+By default, this is not bound to a key.
+</p></dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Commands-For-Completion">
+<div class="header">
+<p>
+Next: <a href="#Keyboard-Macros" accesskey="n" rel="next">Keyboard Macros</a>, Previous: <a href="#Numeric-Arguments" accesskey="p" rel="prev">Specifying Numeric Arguments</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Letting-Readline-Type-For-You"></span><h4 class="subsection">1.4.6 Letting Readline Type For You</h4>
+
+<dl compact="compact">
+<dt id='index-complete-_0028TAB_0029'><span><code>complete (<span class="key">TAB</span>)</code><a href='#index-complete-_0028TAB_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Attempt to perform completion on the text before point.
+The actual completion performed is application-specific.
+The default is filename completion.
+</p>
+</dd>
+<dt id='index-possible_002dcompletions-_0028M_002d_003f_0029'><span><code>possible-completions (M-?)</code><a href='#index-possible_002dcompletions-_0028M_002d_003f_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>List the possible completions of the text before point.
+When displaying completions, Readline sets the number of columns used
+for display to the value of <code>completion-display-width</code>, the value of
+the environment variable <code>COLUMNS</code>, or the screen width, in that order.
+</p>
+</dd>
+<dt id='index-insert_002dcompletions-_0028M_002d_002a_0029'><span><code>insert-completions (M-*)</code><a href='#index-insert_002dcompletions-_0028M_002d_002a_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert all completions of the text before point that would have
+been generated by <code>possible-completions</code>.
+</p>
+</dd>
+<dt id='index-menu_002dcomplete-_0028_0029'><span><code>menu-complete ()</code><a href='#index-menu_002dcomplete-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Similar to <code>complete</code>, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of <code>menu-complete</code> steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of <code>bell-style</code>)
+and the original text is restored.
+An argument of <var>n</var> moves <var>n</var> positions forward in the list
+of matches; a negative argument may be used to move backward
+through the list.
+This command is intended to be bound to <tt class="key">TAB</tt>, but is unbound
+by default.
+</p>
+</dd>
+<dt id='index-menu_002dcomplete_002dbackward-_0028_0029'><span><code>menu-complete-backward ()</code><a href='#index-menu_002dcomplete_002dbackward-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Identical to <code>menu-complete</code>, but moves backward through the list
+of possible completions, as if <code>menu-complete</code> had been given a
+negative argument.
+</p>
+</dd>
+<dt id='index-delete_002dchar_002dor_002dlist-_0028_0029'><span><code>delete-char-or-list ()</code><a href='#index-delete_002dchar_002dor_002dlist-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Deletes the character under the cursor if not at the beginning or
+end of the line (like <code>delete-char</code>).
+If at the end of the line, behaves identically to
+<code>possible-completions</code>.
+This command is unbound by default.
+</p>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Keyboard-Macros">
+<div class="header">
+<p>
+Next: <a href="#Miscellaneous-Commands" accesskey="n" rel="next">Some Miscellaneous Commands</a>, Previous: <a href="#Commands-For-Completion" accesskey="p" rel="prev">Letting Readline Type For You</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Keyboard-Macros-1"></span><h4 class="subsection">1.4.7 Keyboard Macros</h4>
+<dl compact="compact">
+<dt id='index-start_002dkbd_002dmacro-_0028C_002dx-_0028_0029'><span><code>start-kbd-macro (C-x ()</code><a href='#index-start_002dkbd_002dmacro-_0028C_002dx-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Begin saving the characters typed into the current keyboard macro.
+</p>
+</dd>
+<dt id='index-end_002dkbd_002dmacro-_0028C_002dx-_0029_0029'><span><code>end-kbd-macro (C-x ))</code><a href='#index-end_002dkbd_002dmacro-_0028C_002dx-_0029_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Stop saving the characters typed into the current keyboard macro
+and save the definition.
+</p>
+</dd>
+<dt id='index-call_002dlast_002dkbd_002dmacro-_0028C_002dx-e_0029'><span><code>call-last-kbd-macro (C-x e)</code><a href='#index-call_002dlast_002dkbd_002dmacro-_0028C_002dx-e_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+</p>
+</dd>
+<dt id='index-print_002dlast_002dkbd_002dmacro-_0028_0029'><span><code>print-last-kbd-macro ()</code><a href='#index-print_002dlast_002dkbd_002dmacro-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Print the last keyboard macro defined in a format suitable for the
+<var>inputrc</var> file.
+</p>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Miscellaneous-Commands">
+<div class="header">
+<p>
+Previous: <a href="#Keyboard-Macros" accesskey="p" rel="prev">Keyboard Macros</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Some-Miscellaneous-Commands"></span><h4 class="subsection">1.4.8 Some Miscellaneous Commands</h4>
+<dl compact="compact">
+<dt id='index-re_002dread_002dinit_002dfile-_0028C_002dx-C_002dr_0029'><span><code>re-read-init-file (C-x C-r)</code><a href='#index-re_002dread_002dinit_002dfile-_0028C_002dx-C_002dr_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Read in the contents of the <var>inputrc</var> file, and incorporate
+any bindings or variable assignments found there.
+</p>
+</dd>
+<dt id='index-abort-_0028C_002dg_0029'><span><code>abort (C-g)</code><a href='#index-abort-_0028C_002dg_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Abort the current editing command and
+ring the terminal&rsquo;s bell (subject to the setting of
+<code>bell-style</code>).
+</p>
+</dd>
+<dt id='index-do_002dlowercase_002dversion-_0028M_002dA_002c-M_002dB_002c-M_002dx_002c-_2026_0029'><span><code>do-lowercase-version (M-A, M-B, M-<var>x</var>, &hellip;)</code><a href='#index-do_002dlowercase_002dversion-_0028M_002dA_002c-M_002dB_002c-M_002dx_002c-_2026_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If the metafied character <var>x</var> is upper case, run the command
+that is bound to the corresponding metafied lower case character.
+The behavior is undefined if <var>x</var> is already lower case.
+</p>
+</dd>
+<dt id='index-prefix_002dmeta-_0028ESC_0029'><span><code>prefix-meta (<span class="key">ESC</span>)</code><a href='#index-prefix_002dmeta-_0028ESC_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Metafy the next character typed. This is for keyboards
+without a meta key. Typing &lsquo;<samp><span class="key">ESC</span> f</samp>&rsquo; is equivalent to typing
+<kbd>M-f</kbd>.
+</p>
+</dd>
+<dt id='index-undo-_0028C_002d_005f-or-C_002dx-C_002du_0029'><span><code>undo (C-_ or C-x C-u)</code><a href='#index-undo-_0028C_002d_005f-or-C_002dx-C_002du_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Incremental undo, separately remembered for each line.
+</p>
+</dd>
+<dt id='index-revert_002dline-_0028M_002dr_0029'><span><code>revert-line (M-r)</code><a href='#index-revert_002dline-_0028M_002dr_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Undo all changes made to this line. This is like executing the <code>undo</code>
+command enough times to get back to the beginning.
+</p>
+</dd>
+<dt id='index-tilde_002dexpand-_0028M_002d_007e_0029'><span><code>tilde-expand (M-~)</code><a href='#index-tilde_002dexpand-_0028M_002d_007e_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Perform tilde expansion on the current word.
+</p>
+</dd>
+<dt id='index-set_002dmark-_0028C_002d_0040_0029'><span><code>set-mark (C-@)</code><a href='#index-set_002dmark-_0028C_002d_0040_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set the mark to the point. If a
+numeric argument is supplied, the mark is set to that position.
+</p>
+</dd>
+<dt id='index-exchange_002dpoint_002dand_002dmark-_0028C_002dx-C_002dx_0029'><span><code>exchange-point-and-mark (C-x C-x)</code><a href='#index-exchange_002dpoint_002dand_002dmark-_0028C_002dx-C_002dx_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Swap the point with the mark. The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+</p>
+</dd>
+<dt id='index-character_002dsearch-_0028C_002d_005d_0029'><span><code>character-search (C-])</code><a href='#index-character_002dsearch-_0028C_002d_005d_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A character is read and point is moved to the next occurrence of that
+character. A negative argument searches for previous occurrences.
+</p>
+</dd>
+<dt id='index-character_002dsearch_002dbackward-_0028M_002dC_002d_005d_0029'><span><code>character-search-backward (M-C-])</code><a href='#index-character_002dsearch_002dbackward-_0028M_002dC_002d_005d_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A character is read and point is moved to the previous occurrence
+of that character. A negative argument searches for subsequent
+occurrences.
+</p>
+</dd>
+<dt id='index-skip_002dcsi_002dsequence-_0028_0029'><span><code>skip-csi-sequence ()</code><a href='#index-skip_002dcsi_002dsequence-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Read enough characters to consume a multi-key sequence such as those
+defined for keys like Home and End. Such sequences begin with a
+Control Sequence Indicator (CSI), usually ESC-[. If this sequence is
+bound to &quot;\e[&quot;, keys producing such sequences will have no effect
+unless explicitly bound to a Readline command, instead of inserting
+stray characters into the editing buffer. This is unbound by default,
+but usually bound to ESC-[.
+</p>
+</dd>
+<dt id='index-insert_002dcomment-_0028M_002d_0023_0029'><span><code>insert-comment (M-#)</code><a href='#index-insert_002dcomment-_0028M_002d_0023_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Without a numeric argument, the value of the <code>comment-begin</code>
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle: if
+the characters at the beginning of the line do not match the value
+of <code>comment-begin</code>, the value is inserted, otherwise
+the characters in <code>comment-begin</code> are deleted from the beginning of
+the line.
+In either case, the line is accepted as if a newline had been typed.
+</p>
+</dd>
+<dt id='index-dump_002dfunctions-_0028_0029'><span><code>dump-functions ()</code><a href='#index-dump_002dfunctions-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Print all of the functions and their key bindings to the
+Readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <var>inputrc</var> file. This command is unbound by default.
+</p>
+</dd>
+<dt id='index-dump_002dvariables-_0028_0029'><span><code>dump-variables ()</code><a href='#index-dump_002dvariables-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Print all of the settable variables and their values to the
+Readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <var>inputrc</var> file. This command is unbound by default.
+</p>
+</dd>
+<dt id='index-dump_002dmacros-_0028_0029'><span><code>dump-macros ()</code><a href='#index-dump_002dmacros-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Print all of the Readline key sequences bound to macros and the
+strings they output. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <var>inputrc</var> file. This command is unbound by default.
+</p>
+
+</dd>
+<dt id='index-emacs_002dediting_002dmode-_0028C_002de_0029'><span><code>emacs-editing-mode (C-e)</code><a href='#index-emacs_002dediting_002dmode-_0028C_002de_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When in <code>vi</code> command mode, this causes a switch to <code>emacs</code>
+editing mode.
+</p>
+</dd>
+<dt id='index-vi_002dediting_002dmode-_0028M_002dC_002dj_0029'><span><code>vi-editing-mode (M-C-j)</code><a href='#index-vi_002dediting_002dmode-_0028M_002dC_002dj_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When in <code>emacs</code> editing mode, this causes a switch to <code>vi</code>
+editing mode.
+</p>
+
+</dd>
+</dl>
+
+<hr>
+</div>
+</div>
+<div class="section" id="Readline-vi-Mode">
+<div class="header">
+<p>
+Previous: <a href="#Bindable-Readline-Commands" accesskey="p" rel="prev">Bindable Readline Commands</a>, Up: <a href="#Command-Line-Editing" accesskey="u" rel="up">Command Line Editing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Readline-vi-Mode-1"></span><h3 class="section">1.5 Readline vi Mode</h3>
+
+<p>While the Readline library does not have a full set of <code>vi</code>
+editing functions, it does contain enough to allow simple editing
+of the line. The Readline <code>vi</code> mode behaves as specified in
+the <small>POSIX</small> standard.
+</p>
+<p>In order to switch interactively between <code>emacs</code> and <code>vi</code>
+editing modes, use the command <kbd>M-C-j</kbd> (bound to emacs-editing-mode
+when in <code>vi</code> mode and to vi-editing-mode in <code>emacs</code> mode).
+The Readline default is <code>emacs</code> mode.
+</p>
+<p>When you enter a line in <code>vi</code> mode, you are already placed in
+&lsquo;insertion&rsquo; mode, as if you had typed an &lsquo;<samp>i</samp>&rsquo;. Pressing <tt class="key">ESC</tt>
+switches you into &lsquo;command&rsquo; mode, where you can edit the text of the
+line with the standard <code>vi</code> movement keys, move to previous
+history lines with &lsquo;<samp>k</samp>&rsquo; and subsequent lines with &lsquo;<samp>j</samp>&rsquo;, and
+so forth.
+</p>
+
+
+<hr>
+</div>
+</div>
+<div class="chapter" id="Programming-with-GNU-Readline">
+<div class="header">
+<p>
+Next: <a href="#GNU-Free-Documentation-License" accesskey="n" rel="next">GNU Free Documentation License</a>, Previous: <a href="#Command-Line-Editing" accesskey="p" rel="prev">Command Line Editing</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU Readline Library</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Programming-with-GNU-Readline-1"></span><h2 class="chapter">2 Programming with GNU Readline</h2>
+
+<p>This chapter describes the interface between the <small>GNU</small> Readline Library and
+other programs. If you are a programmer, and you wish to include the
+features found in <small>GNU</small> Readline
+such as completion, line editing, and interactive history manipulation
+in your own programs, this section is for you.
+</p>
+
+<ul class="section-toc">
+<li><a href="#Basic-Behavior" accesskey="1">Basic Behavior</a></li>
+<li><a href="#Custom-Functions" accesskey="2">Custom Functions</a></li>
+<li><a href="#Readline-Variables" accesskey="3">Readline Variables</a></li>
+<li><a href="#Readline-Convenience-Functions" accesskey="4">Readline Convenience Functions</a></li>
+<li><a href="#Readline-Signal-Handling" accesskey="5">Readline Signal Handling</a></li>
+<li><a href="#Custom-Completers" accesskey="6">Custom Completers</a></li>
+</ul>
+<hr>
+<div class="section" id="Basic-Behavior">
+<div class="header">
+<p>
+Next: <a href="#Custom-Functions" accesskey="n" rel="next">Custom Functions</a>, Up: <a href="#Programming-with-GNU-Readline" accesskey="u" rel="up">Programming with GNU Readline</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Basic-Behavior-1"></span><h3 class="section">2.1 Basic Behavior</h3>
+
+<p>Many programs provide a command line interface, such as <code>mail</code>,
+<code>ftp</code>, and <code>sh</code>. For such programs, the default behaviour of
+Readline is sufficient. This section describes how to use Readline in
+the simplest way possible, perhaps to replace calls in your code to
+<code>gets()</code> or <code>fgets()</code>.
+</p>
+<span id="index-readline"></span>
+<span id="index-readline_002c-function"></span>
+
+<p>The function <code>readline()</code> prints a prompt <var>prompt</var>
+and then reads and returns a single line of text from the user.
+If <var>prompt</var> is <code>NULL</code> or the empty string, no prompt is displayed.
+The line <code>readline</code> returns is allocated with <code>malloc()</code>;
+the caller should <code>free()</code> the line when it has finished with it.
+The declaration for <code>readline</code> in ANSI C is
+</p>
+<div class="example">
+<pre class="example"><code>char *readline (const char *<var>prompt</var>);</code>
+</pre></div>
+
+<p>So, one might say
+</p><div class="example">
+<pre class="example"><code>char *line = readline (&quot;Enter a line: &quot;);</code>
+</pre></div>
+<p>in order to read a line of text from the user.
+The line returned has the final newline removed, so only the
+text remains.
+</p>
+<p>If <code>readline</code> encounters an <code>EOF</code> while reading the line, and the
+line is empty at that point, then <code>(char *)NULL</code> is returned.
+Otherwise, the line is ended just as if a newline had been typed.
+</p>
+<p>Readline performs some expansion on the <var>prompt</var> before it is
+displayed on the screen. See the description of <code>rl_expand_prompt</code>
+(see <a href="#Redisplay">Redisplay</a>) for additional details, especially if <var>prompt</var>
+will contain characters that do not consume physical screen space when
+displayed.
+</p>
+<p>If you want the user to be able to get at the line later, (with
+<tt class="key">C-p</tt> for example), you must call <code>add_history()</code> to save the
+line away in a <em>history</em> list of such lines.
+</p>
+<div class="example">
+<pre class="example"><code>add_history (line)</code>;
+</pre></div>
+
+<p>For full details on the GNU History Library, see the associated manual.
+</p>
+<p>It is preferable to avoid saving empty lines on the history list, since
+users rarely have a burning need to reuse a blank line. Here is
+a function which usefully replaces the standard <code>gets()</code> library
+function, and has the advantage of no static buffer to overflow:
+</p>
+<div class="example">
+<pre class="example">/* A static variable for holding the line. */
+static char *line_read = (char *)NULL;
+
+/* Read a string, and return a pointer to it.
+ Returns NULL on EOF. */
+char *
+rl_gets ()
+{
+ /* If the buffer has already been allocated,
+ return the memory to the free pool. */
+ if (line_read)
+ {
+ free (line_read);
+ line_read = (char *)NULL;
+ }
+
+ /* Get a line from the user. */
+ line_read = readline (&quot;&quot;);
+
+ /* If the line has any text in it,
+ save it on the history. */
+ if (line_read &amp;&amp; *line_read)
+ add_history (line_read);
+
+ return (line_read);
+}
+</pre></div>
+
+<p>This function gives the user the default behaviour of <tt class="key">TAB</tt>
+completion: completion on file names. If you do not want Readline to
+complete on filenames, you can change the binding of the <tt class="key">TAB</tt> key
+with <code>rl_bind_key()</code>.
+</p>
+<div class="example">
+<pre class="example"><code>int rl_bind_key (int <var>key</var>, rl_command_func_t *<var>function</var>);</code>
+</pre></div>
+
+<p><code>rl_bind_key()</code> takes two arguments: <var>key</var> is the character that
+you want to bind, and <var>function</var> is the address of the function to
+call when <var>key</var> is pressed. Binding <tt class="key">TAB</tt> to <code>rl_insert()</code>
+makes <tt class="key">TAB</tt> insert itself.
+<code>rl_bind_key()</code> returns non-zero if <var>key</var> is not a valid
+ASCII character code (between 0 and 255).
+</p>
+<p>Thus, to disable the default <tt class="key">TAB</tt> behavior, the following suffices:
+</p><div class="example">
+<pre class="example"><code>rl_bind_key ('\t', rl_insert);</code>
+</pre></div>
+
+<p>This code should be executed once at the start of your program; you
+might write a function called <code>initialize_readline()</code> which
+performs this and other desired initializations, such as installing
+custom completers (see <a href="#Custom-Completers">Custom Completers</a>).
+</p>
+<hr>
+</div>
+<div class="section" id="Custom-Functions">
+<div class="header">
+<p>
+Next: <a href="#Readline-Variables" accesskey="n" rel="next">Readline Variables</a>, Previous: <a href="#Basic-Behavior" accesskey="p" rel="prev">Basic Behavior</a>, Up: <a href="#Programming-with-GNU-Readline" accesskey="u" rel="up">Programming with GNU Readline</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Custom-Functions-1"></span><h3 class="section">2.2 Custom Functions</h3>
+
+<p>Readline provides many functions for manipulating the text of
+the line, but it isn&rsquo;t possible to anticipate the needs of all
+programs. This section describes the various functions and variables
+defined within the Readline library which allow a user program to add
+customized functionality to Readline.
+</p>
+<p>Before declaring any functions that customize Readline&rsquo;s behavior, or
+using any functionality Readline provides in other code, an
+application writer should include the file <code>&lt;readline/readline.h&gt;</code>
+in any file that uses Readline&rsquo;s features. Since some of the definitions
+in <code>readline.h</code> use the <code>stdio</code> library, the file
+<code>&lt;stdio.h&gt;</code> should be included before <code>readline.h</code>.
+</p>
+<p><code>readline.h</code> defines a C preprocessor variable that should
+be treated as an integer, <code>RL_READLINE_VERSION</code>, which may
+be used to conditionally compile application code depending on
+the installed Readline version. The value is a hexadecimal
+encoding of the major and minor version numbers of the library,
+of the form 0x<var>MMmm</var>. <var>MM</var> is the two-digit major
+version number; <var>mm</var> is the two-digit minor version number.
+For Readline 4.2, for example, the value of
+<code>RL_READLINE_VERSION</code> would be <code>0x0402</code>.
+</p>
+
+<ul class="section-toc">
+<li><a href="#Readline-Typedefs" accesskey="1">Readline Typedefs</a></li>
+<li><a href="#Function-Writing" accesskey="2">Writing a New Function</a></li>
+</ul>
+<hr>
+<div class="subsection" id="Readline-Typedefs">
+<div class="header">
+<p>
+Next: <a href="#Function-Writing" accesskey="n" rel="next">Writing a New Function</a>, Up: <a href="#Custom-Functions" accesskey="u" rel="up">Custom Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Readline-Typedefs-1"></span><h4 class="subsection">2.2.1 Readline Typedefs</h4>
+
+<p>For readability, we declare a number of new object types, all pointers
+to functions.
+</p>
+<p>The reason for declaring these new types is to make it easier to write
+code describing pointers to C functions with appropriately prototyped
+arguments and return values.
+</p>
+<p>For instance, say we want to declare a variable <var>func</var> as a pointer
+to a function which takes two <code>int</code> arguments and returns an
+<code>int</code> (this is the type of all of the Readline bindable functions).
+Instead of the classic C declaration
+</p>
+<p><code>int (*func)();</code>
+</p>
+<p>or the ANSI-C style declaration
+</p>
+<p><code>int (*func)(int, int);</code>
+</p>
+<p>we may write
+</p>
+<p><code>rl_command_func_t *func;</code>
+</p>
+<p>The full list of function pointer types available is
+</p>
+<dl compact="compact">
+<dt><span><code>typedef int rl_command_func_t (int, int);</code></span></dt>
+<dt><span><code>typedef char *rl_compentry_func_t (const char *, int);</code></span></dt>
+<dt><span><code>typedef char **rl_completion_func_t (const char *, int, int);</code></span></dt>
+<dt><span><code>typedef char *rl_quote_func_t (char *, int, char *);</code></span></dt>
+<dt><span><code>typedef char *rl_dequote_func_t (char *, int);</code></span></dt>
+<dt><span><code>typedef int rl_compignore_func_t (char **);</code></span></dt>
+<dt><span><code>typedef void rl_compdisp_func_t (char **, int, int);</code></span></dt>
+<dt><span><code>typedef int rl_hook_func_t (void);</code></span></dt>
+<dt><span><code>typedef int rl_getc_func_t (FILE *);</code></span></dt>
+<dt><span><code>typedef int rl_linebuf_func_t (char *, int);</code></span></dt>
+<dt><span><code>typedef int rl_intfunc_t (int);</code></span></dt>
+<dt><span><code>#define rl_ivoidfunc_t rl_hook_func_t</code></span></dt>
+<dt><span><code>typedef int rl_icpfunc_t (char *);</code></span></dt>
+<dt><span><code>typedef int rl_icppfunc_t (char **);</code></span></dt>
+<dt><span><code>typedef void rl_voidfunc_t (void);</code></span></dt>
+<dt><span><code>typedef void rl_vintfunc_t (int);</code></span></dt>
+<dt><span><code>typedef void rl_vcpfunc_t (char *);</code></span></dt>
+<dt><span><code>typedef void rl_vcppfunc_t (char **);</code></span></dt>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Function-Writing">
+<div class="header">
+<p>
+Previous: <a href="#Readline-Typedefs" accesskey="p" rel="prev">Readline Typedefs</a>, Up: <a href="#Custom-Functions" accesskey="u" rel="up">Custom Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Writing-a-New-Function"></span><h4 class="subsection">2.2.2 Writing a New Function</h4>
+
+<p>In order to write new functions for Readline, you need to know the
+calling conventions for keyboard-invoked functions, and the names of the
+variables that describe the current state of the line read so far.
+</p>
+<p>The calling sequence for a command <code>foo</code> looks like
+</p>
+<div class="example">
+<pre class="example"><code>int foo (int count, int key)</code>
+</pre></div>
+
+<p>where <var>count</var> is the numeric argument (or 1 if defaulted) and
+<var>key</var> is the key that invoked this function.
+</p>
+<p>It is completely up to the function as to what should be done with the
+numeric argument. Some functions use it as a repeat count, some
+as a flag, and others to choose alternate behavior (refreshing the current
+line as opposed to refreshing the screen, for example). Some choose to
+ignore it. In general, if a
+function uses the numeric argument as a repeat count, it should be able
+to do something useful with both negative and positive arguments.
+At the very least, it should be aware that it can be passed a
+negative argument.
+</p>
+<p>A command function should return 0 if its action completes successfully,
+and a value greater than zero if some error occurs.
+This is the convention obeyed by all of the builtin Readline bindable
+command functions.
+</p>
+<hr>
+</div>
+</div>
+<div class="section" id="Readline-Variables">
+<div class="header">
+<p>
+Next: <a href="#Readline-Convenience-Functions" accesskey="n" rel="next">Readline Convenience Functions</a>, Previous: <a href="#Custom-Functions" accesskey="p" rel="prev">Custom Functions</a>, Up: <a href="#Programming-with-GNU-Readline" accesskey="u" rel="up">Programming with GNU Readline</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Readline-Variables-1"></span><h3 class="section">2.3 Readline Variables</h3>
+
+<p>These variables are available to function writers.
+</p>
+<dl class="def">
+<dt id="index-rl_005fline_005fbuffer"><span class="category">Variable: </span><span><em>char *</em> <strong>rl_line_buffer</strong><a href='#index-rl_005fline_005fbuffer' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This is the line gathered so far. You are welcome to modify the
+contents of the line, but see <a href="#Allowing-Undoing">Allowing Undoing</a>. The
+function <code>rl_extend_line_buffer</code> is available to increase
+the memory allocated to <code>rl_line_buffer</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fpoint"><span class="category">Variable: </span><span><em>int</em> <strong>rl_point</strong><a href='#index-rl_005fpoint' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The offset of the current cursor position in <code>rl_line_buffer</code>
+(the <em>point</em>).
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fend"><span class="category">Variable: </span><span><em>int</em> <strong>rl_end</strong><a href='#index-rl_005fend' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The number of characters present in <code>rl_line_buffer</code>. When
+<code>rl_point</code> is at the end of the line, <code>rl_point</code> and
+<code>rl_end</code> are equal.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fmark"><span class="category">Variable: </span><span><em>int</em> <strong>rl_mark</strong><a href='#index-rl_005fmark' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The <var>mark</var> (saved position) in the current line. If set, the mark
+and point define a <em>region</em>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fdone"><span class="category">Variable: </span><span><em>int</em> <strong>rl_done</strong><a href='#index-rl_005fdone' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Setting this to a non-zero value causes Readline to return the current
+line immediately.
+Readline will set this variable when it has read a key sequence bound
+to <code>accept-line</code> and is about to return the line to the caller.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005feof_005ffound"><span class="category">Variable: </span><span><em>int</em> <strong>rl_eof_found</strong><a href='#index-rl_005feof_005ffound' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Readline will set this variable when it has read an EOF character (e.g., the
+stty &lsquo;<samp>EOF</samp>&rsquo; character) on an empty line or encountered a read error and
+is about to return a NULL line to the caller.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fnum_005fchars_005fto_005fread"><span class="category">Variable: </span><span><em>int</em> <strong>rl_num_chars_to_read</strong><a href='#index-rl_005fnum_005fchars_005fto_005fread' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Setting this to a positive value before calling <code>readline()</code> causes
+Readline to return after accepting that many characters, rather
+than reading up to a character bound to <code>accept-line</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fpending_005finput"><span class="category">Variable: </span><span><em>int</em> <strong>rl_pending_input</strong><a href='#index-rl_005fpending_005finput' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Setting this to a value makes it the next keystroke read. This is a
+way to stuff a single character into the input stream.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fdispatching"><span class="category">Variable: </span><span><em>int</em> <strong>rl_dispatching</strong><a href='#index-rl_005fdispatching' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set to a non-zero value if a function is being called from a key binding;
+zero otherwise. Application functions can test this to discover whether
+they were called directly or by Readline&rsquo;s dispatching mechanism.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ferase_005fempty_005fline"><span class="category">Variable: </span><span><em>int</em> <strong>rl_erase_empty_line</strong><a href='#index-rl_005ferase_005fempty_005fline' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Setting this to a non-zero value causes Readline to completely erase
+the current line, including any prompt, any time a newline is typed as
+the only character on an otherwise-empty line. The cursor is moved to
+the beginning of the newly-blank line.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fprompt"><span class="category">Variable: </span><span><em>char *</em> <strong>rl_prompt</strong><a href='#index-rl_005fprompt' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The prompt Readline uses. This is set from the argument to
+<code>readline()</code>, and should not be assigned to directly.
+The <code>rl_set_prompt()</code> function (see <a href="#Redisplay">Redisplay</a>) may
+be used to modify the prompt string after calling <code>readline()</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fdisplay_005fprompt"><span class="category">Variable: </span><span><em>char *</em> <strong>rl_display_prompt</strong><a href='#index-rl_005fdisplay_005fprompt' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The string displayed as the prompt. This is usually identical to
+<var>rl_prompt</var>, but may be changed temporarily by functions that
+use the prompt string as a message area, such as incremental search.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005falready_005fprompted"><span class="category">Variable: </span><span><em>int</em> <strong>rl_already_prompted</strong><a href='#index-rl_005falready_005fprompted' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If an application wishes to display the prompt itself, rather than have
+Readline do it the first time <code>readline()</code> is called, it should set
+this variable to a non-zero value after displaying the prompt.
+The prompt must also be passed as the argument to <code>readline()</code> so
+the redisplay functions can update the display properly.
+The calling application is responsible for managing the value; Readline
+never sets it.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005flibrary_005fversion"><span class="category">Variable: </span><span><em>const char *</em> <strong>rl_library_version</strong><a href='#index-rl_005flibrary_005fversion' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The version number of this revision of the library.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005freadline_005fversion"><span class="category">Variable: </span><span><em>int</em> <strong>rl_readline_version</strong><a href='#index-rl_005freadline_005fversion' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>An integer encoding the current version of the library. The encoding is
+of the form 0x<var>MMmm</var>, where <var>MM</var> is the two-digit major version
+number, and <var>mm</var> is the two-digit minor version number.
+For example, for Readline-4.2, <code>rl_readline_version</code> would have the
+value 0x0402.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fgnu_005freadline_005fp"><span class="category">Variable: </span><span><em>int</em> <strong>rl_gnu_readline_p</strong><a href='#index-rl_005fgnu_005freadline_005fp' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Always set to 1, denoting that this is <small>GNU</small> Readline rather than some
+emulation.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fterminal_005fname"><span class="category">Variable: </span><span><em>const char *</em> <strong>rl_terminal_name</strong><a href='#index-rl_005fterminal_005fname' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The terminal type, used for initialization. If not set by the application,
+Readline sets this to the value of the <code>TERM</code> environment variable
+the first time it is called.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005freadline_005fname"><span class="category">Variable: </span><span><em>const char *</em> <strong>rl_readline_name</strong><a href='#index-rl_005freadline_005fname' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This variable is set to a unique name by each application using Readline.
+The value allows conditional parsing of the inputrc file
+(see <a href="#Conditional-Init-Constructs">Conditional Init Constructs</a>).
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005finstream"><span class="category">Variable: </span><span><em>FILE *</em> <strong>rl_instream</strong><a href='#index-rl_005finstream' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The stdio stream from which Readline reads input.
+If <code>NULL</code>, Readline defaults to <var>stdin</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005foutstream"><span class="category">Variable: </span><span><em>FILE *</em> <strong>rl_outstream</strong><a href='#index-rl_005foutstream' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The stdio stream to which Readline performs output.
+If <code>NULL</code>, Readline defaults to <var>stdout</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fprefer_005fenv_005fwinsize"><span class="category">Variable: </span><span><em>int</em> <strong>rl_prefer_env_winsize</strong><a href='#index-rl_005fprefer_005fenv_005fwinsize' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, Readline gives values found in the <code>LINES</code> and
+<code>COLUMNS</code> environment variables greater precedence than values fetched
+from the kernel when computing the screen dimensions.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005flast_005ffunc"><span class="category">Variable: </span><span><em>rl_command_func_t *</em> <strong>rl_last_func</strong><a href='#index-rl_005flast_005ffunc' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The address of the last command function Readline executed. May be used to
+test whether or not a function is being executed twice in succession, for
+example.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fstartup_005fhook"><span class="category">Variable: </span><span><em>rl_hook_func_t *</em> <strong>rl_startup_hook</strong><a href='#index-rl_005fstartup_005fhook' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, this is the address of a function to call just
+before <code>readline</code> prints the first prompt.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fpre_005finput_005fhook"><span class="category">Variable: </span><span><em>rl_hook_func_t *</em> <strong>rl_pre_input_hook</strong><a href='#index-rl_005fpre_005finput_005fhook' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, this is the address of a function to call after
+the first prompt has been printed and just before <code>readline</code>
+starts reading input characters.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fevent_005fhook"><span class="category">Variable: </span><span><em>rl_hook_func_t *</em> <strong>rl_event_hook</strong><a href='#index-rl_005fevent_005fhook' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, this is the address of a function to call periodically
+when Readline is waiting for terminal input.
+By default, this will be called at most ten times a second if there
+is no keyboard input.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fgetc_005ffunction"><span class="category">Variable: </span><span><em>rl_getc_func_t *</em> <strong>rl_getc_function</strong><a href='#index-rl_005fgetc_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, Readline will call indirectly through this pointer
+to get a character from the input stream. By default, it is set to
+<code>rl_getc</code>, the default Readline character input function
+(see <a href="#Character-Input">Character Input</a>).
+In general, an application that sets <var>rl_getc_function</var> should consider
+setting <var>rl_input_available_hook</var> as well.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fsignal_005fevent_005fhook"><span class="category">Variable: </span><span><em>rl_hook_func_t *</em> <strong>rl_signal_event_hook</strong><a href='#index-rl_005fsignal_005fevent_005fhook' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, this is the address of a function to call if a read system
+call is interrupted when Readline is reading terminal input.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ftimeout_005fevent_005fhook"><span class="category">Variable: </span><span><em>rl_hook_func_t *</em> <strong>rl_timeout_event_hook</strong><a href='#index-rl_005ftimeout_005fevent_005fhook' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, this is the address of a function to call if Readline times
+out while reading input.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005finput_005favailable_005fhook"><span class="category">Variable: </span><span><em>rl_hook_func_t *</em> <strong>rl_input_available_hook</strong><a href='#index-rl_005finput_005favailable_005fhook' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, Readline will use this function&rsquo;s return value when it needs
+to determine whether or not there is available input on the current input
+source.
+The default hook checks <code>rl_instream</code>; if an application is using a
+different input source, it should set the hook appropriately.
+Readline queries for available input when implementing intra-key-sequence
+timeouts during input and incremental searches.
+This may use an application-specific timeout before returning a value;
+Readline uses the value passed to <code>rl_set_keyboard_input_timeout()</code>
+or the value of the user-settable <var>keyseq-timeout</var> variable.
+This is designed for use by applications using Readline&rsquo;s callback interface
+(see <a href="#Alternate-Interface">Alternate Interface</a>), which may not use the traditional
+<code>read(2)</code> and file descriptor interface, or other applications using
+a different input mechanism.
+If an application uses an input mechanism or hook that can potentially exceed
+the value of <var>keyseq-timeout</var>, it should increase the timeout or set
+this hook appropriately even when not using the callback interface.
+In general, an application that sets <var>rl_getc_function</var> should consider
+setting <var>rl_input_available_hook</var> as well.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fredisplay_005ffunction"><span class="category">Variable: </span><span><em>rl_voidfunc_t *</em> <strong>rl_redisplay_function</strong><a href='#index-rl_005fredisplay_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, Readline will call indirectly through this pointer
+to update the display with the current contents of the editing buffer.
+By default, it is set to <code>rl_redisplay</code>, the default Readline
+redisplay function (see <a href="#Redisplay">Redisplay</a>).
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fprep_005fterm_005ffunction"><span class="category">Variable: </span><span><em>rl_vintfunc_t *</em> <strong>rl_prep_term_function</strong><a href='#index-rl_005fprep_005fterm_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, Readline will call indirectly through this pointer
+to initialize the terminal. The function takes a single argument, an
+<code>int</code> flag that says whether or not to use eight-bit characters.
+By default, this is set to <code>rl_prep_terminal</code>
+(see <a href="#Terminal-Management">Terminal Management</a>).
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fdeprep_005fterm_005ffunction"><span class="category">Variable: </span><span><em>rl_voidfunc_t *</em> <strong>rl_deprep_term_function</strong><a href='#index-rl_005fdeprep_005fterm_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, Readline will call indirectly through this pointer
+to reset the terminal. This function should undo the effects of
+<code>rl_prep_term_function</code>.
+By default, this is set to <code>rl_deprep_terminal</code>
+(see <a href="#Terminal-Management">Terminal Management</a>).
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fexecuting_005fkeymap"><span class="category">Variable: </span><span><em>Keymap</em> <strong>rl_executing_keymap</strong><a href='#index-rl_005fexecuting_005fkeymap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This variable is set to the keymap (see <a href="#Keymaps">Selecting a Keymap</a>) in which the
+currently executing Readline function was found.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fbinding_005fkeymap"><span class="category">Variable: </span><span><em>Keymap</em> <strong>rl_binding_keymap</strong><a href='#index-rl_005fbinding_005fkeymap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This variable is set to the keymap (see <a href="#Keymaps">Selecting a Keymap</a>) in which the
+last key binding occurred.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fexecuting_005fmacro"><span class="category">Variable: </span><span><em>char *</em> <strong>rl_executing_macro</strong><a href='#index-rl_005fexecuting_005fmacro' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This variable is set to the text of any currently-executing macro.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fexecuting_005fkey"><span class="category">Variable: </span><span><em>int</em> <strong>rl_executing_key</strong><a href='#index-rl_005fexecuting_005fkey' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The key that caused the dispatch to the currently-executing Readline function.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fexecuting_005fkeyseq"><span class="category">Variable: </span><span><em>char *</em> <strong>rl_executing_keyseq</strong><a href='#index-rl_005fexecuting_005fkeyseq' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The full key sequence that caused the dispatch to the currently-executing
+Readline function.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fkey_005fsequence_005flength"><span class="category">Variable: </span><span><em>int</em> <strong>rl_key_sequence_length</strong><a href='#index-rl_005fkey_005fsequence_005flength' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The number of characters in <var>rl_executing_keyseq</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005freadline_005fstate"><span class="category">Variable: </span><span><em>int</em> <strong>rl_readline_state</strong><a href='#index-rl_005freadline_005fstate' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A variable with bit values that encapsulate the current Readline state.
+A bit is set with the <code>RL_SETSTATE</code> macro, and unset with the
+<code>RL_UNSETSTATE</code> macro. Use the <code>RL_ISSTATE</code> macro to test
+whether a particular state bit is set. Current state bits include:
+</p>
+<dl compact="compact">
+<dt><span><code>RL_STATE_NONE</code></span></dt>
+<dd><p>Readline has not yet been called, nor has it begun to initialize.
+</p></dd>
+<dt><span><code>RL_STATE_INITIALIZING</code></span></dt>
+<dd><p>Readline is initializing its internal data structures.
+</p></dd>
+<dt><span><code>RL_STATE_INITIALIZED</code></span></dt>
+<dd><p>Readline has completed its initialization.
+</p></dd>
+<dt><span><code>RL_STATE_TERMPREPPED</code></span></dt>
+<dd><p>Readline has modified the terminal modes to do its own input and redisplay.
+</p></dd>
+<dt><span><code>RL_STATE_READCMD</code></span></dt>
+<dd><p>Readline is reading a command from the keyboard.
+</p></dd>
+<dt><span><code>RL_STATE_METANEXT</code></span></dt>
+<dd><p>Readline is reading more input after reading the meta-prefix character.
+</p></dd>
+<dt><span><code>RL_STATE_DISPATCHING</code></span></dt>
+<dd><p>Readline is dispatching to a command.
+</p></dd>
+<dt><span><code>RL_STATE_MOREINPUT</code></span></dt>
+<dd><p>Readline is reading more input while executing an editing command.
+</p></dd>
+<dt><span><code>RL_STATE_ISEARCH</code></span></dt>
+<dd><p>Readline is performing an incremental history search.
+</p></dd>
+<dt><span><code>RL_STATE_NSEARCH</code></span></dt>
+<dd><p>Readline is performing a non-incremental history search.
+</p></dd>
+<dt><span><code>RL_STATE_SEARCH</code></span></dt>
+<dd><p>Readline is searching backward or forward through the history for a string.
+</p></dd>
+<dt><span><code>RL_STATE_NUMERICARG</code></span></dt>
+<dd><p>Readline is reading a numeric argument.
+</p></dd>
+<dt><span><code>RL_STATE_MACROINPUT</code></span></dt>
+<dd><p>Readline is currently getting its input from a previously-defined keyboard
+macro.
+</p></dd>
+<dt><span><code>RL_STATE_MACRODEF</code></span></dt>
+<dd><p>Readline is currently reading characters defining a keyboard macro.
+</p></dd>
+<dt><span><code>RL_STATE_OVERWRITE</code></span></dt>
+<dd><p>Readline is in overwrite mode.
+</p></dd>
+<dt><span><code>RL_STATE_COMPLETING</code></span></dt>
+<dd><p>Readline is performing word completion.
+</p></dd>
+<dt><span><code>RL_STATE_SIGHANDLER</code></span></dt>
+<dd><p>Readline is currently executing the readline signal handler.
+</p></dd>
+<dt><span><code>RL_STATE_UNDOING</code></span></dt>
+<dd><p>Readline is performing an undo.
+</p></dd>
+<dt><span><code>RL_STATE_INPUTPENDING</code></span></dt>
+<dd><p>Readline has input pending due to a call to <code>rl_execute_next()</code>.
+</p></dd>
+<dt><span><code>RL_STATE_TTYCSAVED</code></span></dt>
+<dd><p>Readline has saved the values of the terminal&rsquo;s special characters.
+</p></dd>
+<dt><span><code>RL_STATE_CALLBACK</code></span></dt>
+<dd><p>Readline is currently using the alternate (callback) interface
+(see <a href="#Alternate-Interface">Alternate Interface</a>).
+</p></dd>
+<dt><span><code>RL_STATE_VIMOTION</code></span></dt>
+<dd><p>Readline is reading the argument to a vi-mode &quot;motion&quot; command.
+</p></dd>
+<dt><span><code>RL_STATE_MULTIKEY</code></span></dt>
+<dd><p>Readline is reading a multiple-keystroke command.
+</p></dd>
+<dt><span><code>RL_STATE_VICMDONCE</code></span></dt>
+<dd><p>Readline has entered vi command (movement) mode at least one time during
+the current call to <code>readline()</code>.
+</p></dd>
+<dt><span><code>RL_STATE_DONE</code></span></dt>
+<dd><p>Readline has read a key sequence bound to <code>accept-line</code>
+and is about to return the line to the caller.
+</p></dd>
+<dt><span><code>RL_STATE_TIMEOUT</code></span></dt>
+<dd><p>Readline has timed out (it did not receive a line or specified number of
+characters before the timeout duration specified by <code>rl_set_timeout</code>
+elapsed) and is returning that status to the caller.
+</p></dd>
+<dt><span><code>RL_STATE_EOF</code></span></dt>
+<dd><p>Readline has read an EOF character (e.g., the stty &lsquo;<samp>EOF</samp>&rsquo; character)
+or encountered a read error and is about to return a NULL line to the caller.
+</p></dd>
+</dl>
+
+</dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fexplicit_005farg"><span class="category">Variable: </span><span><em>int</em> <strong>rl_explicit_arg</strong><a href='#index-rl_005fexplicit_005farg' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set to a non-zero value if an explicit numeric argument was specified by
+the user. Only valid in a bindable command function.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fnumeric_005farg"><span class="category">Variable: </span><span><em>int</em> <strong>rl_numeric_arg</strong><a href='#index-rl_005fnumeric_005farg' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set to the value of any numeric argument explicitly specified by the user
+before executing the current Readline function. Only valid in a bindable
+command function.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fediting_005fmode"><span class="category">Variable: </span><span><em>int</em> <strong>rl_editing_mode</strong><a href='#index-rl_005fediting_005fmode' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set to a value denoting Readline&rsquo;s current editing mode. A value of
+<var>1</var> means Readline is currently in emacs mode; <var>0</var>
+means that vi mode is active.
+</p></dd></dl>
+
+
+<hr>
+</div>
+<div class="section" id="Readline-Convenience-Functions">
+<div class="header">
+<p>
+Next: <a href="#Readline-Signal-Handling" accesskey="n" rel="next">Readline Signal Handling</a>, Previous: <a href="#Readline-Variables" accesskey="p" rel="prev">Readline Variables</a>, Up: <a href="#Programming-with-GNU-Readline" accesskey="u" rel="up">Programming with GNU Readline</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Readline-Convenience-Functions-1"></span><h3 class="section">2.4 Readline Convenience Functions</h3>
+
+
+<ul class="section-toc">
+<li><a href="#Function-Naming" accesskey="1">Naming a Function</a></li>
+<li><a href="#Keymaps" accesskey="2">Selecting a Keymap</a></li>
+<li><a href="#Binding-Keys" accesskey="3">Binding Keys</a></li>
+<li><a href="#Associating-Function-Names-and-Bindings" accesskey="4">Associating Function Names and Bindings</a></li>
+<li><a href="#Allowing-Undoing" accesskey="5">Allowing Undoing</a></li>
+<li><a href="#Redisplay" accesskey="6">Redisplay</a></li>
+<li><a href="#Modifying-Text" accesskey="7">Modifying Text</a></li>
+<li><a href="#Character-Input" accesskey="8">Character Input</a></li>
+<li><a href="#Terminal-Management" accesskey="9">Terminal Management</a></li>
+<li><a href="#Utility-Functions">Utility Functions</a></li>
+<li><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></li>
+<li><a href="#Alternate-Interface">Alternate Interface</a></li>
+<li><a href="#A-Readline-Example">A Readline Example</a></li>
+<li><a href="#Alternate-Interface-Example">Alternate Interface Example</a></li>
+</ul>
+<hr>
+<div class="subsection" id="Function-Naming">
+<div class="header">
+<p>
+Next: <a href="#Keymaps" accesskey="n" rel="next">Selecting a Keymap</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Naming-a-Function"></span><h4 class="subsection">2.4.1 Naming a Function</h4>
+
+<p>The user can dynamically change the bindings of keys while using
+Readline. This is done by representing the function with a descriptive
+name. The user is able to type the descriptive name when referring to
+the function. Thus, in an init file, one might find
+</p>
+<div class="example">
+<pre class="example">Meta-Rubout: backward-kill-word
+</pre></div>
+
+<p>This binds the keystroke <tt class="key">Meta-Rubout</tt> to the function
+<em>descriptively</em> named <code>backward-kill-word</code>. You, as the
+programmer, should bind the functions you write to descriptive names as
+well. Readline provides a function for doing that:
+</p>
+<dl class="def">
+<dt id="index-rl_005fadd_005fdefun"><span class="category">Function: </span><span><em>int</em> <strong>rl_add_defun</strong> <em>(const char *name, rl_command_func_t *function, int key)</em><a href='#index-rl_005fadd_005fdefun' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Add <var>name</var> to the list of named functions. Make <var>function</var> be
+the function that gets called. If <var>key</var> is not -1, then bind it to
+<var>function</var> using <code>rl_bind_key()</code>.
+</p></dd></dl>
+
+<p>Using this function alone is sufficient for most applications.
+It is the recommended way to add a few functions to the default
+functions that Readline has built in.
+If you need to do something other than adding a function to Readline,
+you may need to use the underlying functions described below.
+</p>
+<hr>
+</div>
+<div class="subsection" id="Keymaps">
+<div class="header">
+<p>
+Next: <a href="#Binding-Keys" accesskey="n" rel="next">Binding Keys</a>, Previous: <a href="#Function-Naming" accesskey="p" rel="prev">Naming a Function</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Selecting-a-Keymap"></span><h4 class="subsection">2.4.2 Selecting a Keymap</h4>
+
+<p>Key bindings take place on a <em>keymap</em>. The keymap is the
+association between the keys that the user types and the functions that
+get run. You can make your own keymaps, copy existing keymaps, and tell
+Readline which keymap to use.
+</p>
+<dl class="def">
+<dt id="index-rl_005fmake_005fbare_005fkeymap"><span class="category">Function: </span><span><em>Keymap</em> <strong>rl_make_bare_keymap</strong> <em>(void)</em><a href='#index-rl_005fmake_005fbare_005fkeymap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Returns a new, empty keymap. The space for the keymap is allocated with
+<code>malloc()</code>; the caller should free it by calling
+<code>rl_free_keymap()</code> when done.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcopy_005fkeymap"><span class="category">Function: </span><span><em>Keymap</em> <strong>rl_copy_keymap</strong> <em>(Keymap map)</em><a href='#index-rl_005fcopy_005fkeymap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return a new keymap which is a copy of <var>map</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fmake_005fkeymap"><span class="category">Function: </span><span><em>Keymap</em> <strong>rl_make_keymap</strong> <em>(void)</em><a href='#index-rl_005fmake_005fkeymap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return a new keymap with the printing characters bound to rl_insert,
+the lowercase Meta characters bound to run their equivalents, and
+the Meta digits bound to produce numeric arguments.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fdiscard_005fkeymap"><span class="category">Function: </span><span><em>void</em> <strong>rl_discard_keymap</strong> <em>(Keymap keymap)</em><a href='#index-rl_005fdiscard_005fkeymap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Free the storage associated with the data in <var>keymap</var>.
+The caller should free <var>keymap</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffree_005fkeymap"><span class="category">Function: </span><span><em>void</em> <strong>rl_free_keymap</strong> <em>(Keymap keymap)</em><a href='#index-rl_005ffree_005fkeymap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Free all storage associated with <var>keymap</var>. This calls
+<code>rl_discard_keymap</code> to free subordindate keymaps and macros.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fempty_005fkeymap"><span class="category">Function: </span><span><em>int</em> <strong>rl_empty_keymap</strong> <em>(Keymap keymap)</em><a href='#index-rl_005fempty_005fkeymap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return non-zero if there are no keys bound to functions in <var>keymap</var>;
+zero if there are any keys bound.
+</p></dd></dl>
+
+<p>Readline has several internal keymaps. These functions allow you to
+change which keymap is active.
+</p>
+<dl class="def">
+<dt id="index-rl_005fget_005fkeymap"><span class="category">Function: </span><span><em>Keymap</em> <strong>rl_get_keymap</strong> <em>(void)</em><a href='#index-rl_005fget_005fkeymap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Returns the currently active keymap.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fset_005fkeymap"><span class="category">Function: </span><span><em>void</em> <strong>rl_set_keymap</strong> <em>(Keymap keymap)</em><a href='#index-rl_005fset_005fkeymap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Makes <var>keymap</var> the currently active keymap.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fget_005fkeymap_005fby_005fname"><span class="category">Function: </span><span><em>Keymap</em> <strong>rl_get_keymap_by_name</strong> <em>(const char *name)</em><a href='#index-rl_005fget_005fkeymap_005fby_005fname' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the keymap matching <var>name</var>. <var>name</var> is one which would
+be supplied in a <code>set keymap</code> inputrc line (see <a href="#Readline-Init-File">Readline Init File</a>).
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fget_005fkeymap_005fname"><span class="category">Function: </span><span><em>char *</em> <strong>rl_get_keymap_name</strong> <em>(Keymap keymap)</em><a href='#index-rl_005fget_005fkeymap_005fname' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the name matching <var>keymap</var>. <var>name</var> is one which would
+be supplied in a <code>set keymap</code> inputrc line (see <a href="#Readline-Init-File">Readline Init File</a>).
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fset_005fkeymap_005fname"><span class="category">Function: </span><span><em>int</em> <strong>rl_set_keymap_name</strong> <em>(const char *name, Keymap keymap)</em><a href='#index-rl_005fset_005fkeymap_005fname' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set the name of <var>keymap</var>. This name will then be &quot;registered&quot; and
+available for use in a <code>set keymap</code> inputrc directive
+see <a href="#Readline-Init-File">Readline Init File</a>).
+The <var>name</var> may not be one of Readline&rsquo;s builtin keymap names;
+you may not add a different name for one of Readline&rsquo;s builtin keymaps.
+You may replace the name associated with a given keymap by calling this
+function more than once with the same <var>keymap</var> argument.
+You may associate a registered <var>name</var> with a new keymap by calling this
+function more than once with the same <var>name</var> argument.
+There is no way to remove a named keymap once the name has been
+registered.
+Readline will make a copy of <var>name</var>.
+The return value is greater than zero unless <var>name</var> is one of
+Readline&rsquo;s builtin keymap names or <var>keymap</var> is one of Readline&rsquo;s
+builtin keymaps.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Binding-Keys">
+<div class="header">
+<p>
+Next: <a href="#Associating-Function-Names-and-Bindings" accesskey="n" rel="next">Associating Function Names and Bindings</a>, Previous: <a href="#Keymaps" accesskey="p" rel="prev">Selecting a Keymap</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Binding-Keys-1"></span><h4 class="subsection">2.4.3 Binding Keys</h4>
+
+<p>Key sequences are associate with functions through the keymap.
+Readline has several internal keymaps: <code>emacs_standard_keymap</code>,
+<code>emacs_meta_keymap</code>, <code>emacs_ctlx_keymap</code>,
+<code>vi_movement_keymap</code>, and <code>vi_insertion_keymap</code>.
+<code>emacs_standard_keymap</code> is the default, and the examples in
+this manual assume that.
+</p>
+<p>Since <code>readline()</code> installs a set of default key bindings the first
+time it is called, there is always the danger that a custom binding
+installed before the first call to <code>readline()</code> will be overridden.
+An alternate mechanism is to install custom key bindings in an
+initialization function assigned to the <code>rl_startup_hook</code> variable
+(see <a href="#Readline-Variables">Readline Variables</a>).
+</p>
+<p>These functions manage key bindings.
+</p>
+<dl class="def">
+<dt id="index-rl_005fbind_005fkey"><span class="category">Function: </span><span><em>int</em> <strong>rl_bind_key</strong> <em>(int key, rl_command_func_t *function)</em><a href='#index-rl_005fbind_005fkey' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Binds <var>key</var> to <var>function</var> in the currently active keymap.
+Returns non-zero in the case of an invalid <var>key</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fbind_005fkey_005fin_005fmap"><span class="category">Function: </span><span><em>int</em> <strong>rl_bind_key_in_map</strong> <em>(int key, rl_command_func_t *function, Keymap map)</em><a href='#index-rl_005fbind_005fkey_005fin_005fmap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Bind <var>key</var> to <var>function</var> in <var>map</var>.
+Returns non-zero in the case of an invalid <var>key</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fbind_005fkey_005fif_005funbound"><span class="category">Function: </span><span><em>int</em> <strong>rl_bind_key_if_unbound</strong> <em>(int key, rl_command_func_t *function)</em><a href='#index-rl_005fbind_005fkey_005fif_005funbound' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Binds <var>key</var> to <var>function</var> if it is not already bound in the
+currently active keymap.
+Returns non-zero in the case of an invalid <var>key</var> or if <var>key</var> is
+already bound.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fbind_005fkey_005fif_005funbound_005fin_005fmap"><span class="category">Function: </span><span><em>int</em> <strong>rl_bind_key_if_unbound_in_map</strong> <em>(int key, rl_command_func_t *function, Keymap map)</em><a href='#index-rl_005fbind_005fkey_005fif_005funbound_005fin_005fmap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Binds <var>key</var> to <var>function</var> if it is not already bound in <var>map</var>.
+Returns non-zero in the case of an invalid <var>key</var> or if <var>key</var> is
+already bound.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005funbind_005fkey"><span class="category">Function: </span><span><em>int</em> <strong>rl_unbind_key</strong> <em>(int key)</em><a href='#index-rl_005funbind_005fkey' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Bind <var>key</var> to the null function in the currently active keymap.
+Returns non-zero in case of error.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005funbind_005fkey_005fin_005fmap"><span class="category">Function: </span><span><em>int</em> <strong>rl_unbind_key_in_map</strong> <em>(int key, Keymap map)</em><a href='#index-rl_005funbind_005fkey_005fin_005fmap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Bind <var>key</var> to the null function in <var>map</var>.
+Returns non-zero in case of error.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005funbind_005ffunction_005fin_005fmap"><span class="category">Function: </span><span><em>int</em> <strong>rl_unbind_function_in_map</strong> <em>(rl_command_func_t *function, Keymap map)</em><a href='#index-rl_005funbind_005ffunction_005fin_005fmap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Unbind all keys that execute <var>function</var> in <var>map</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005funbind_005fcommand_005fin_005fmap"><span class="category">Function: </span><span><em>int</em> <strong>rl_unbind_command_in_map</strong> <em>(const char *command, Keymap map)</em><a href='#index-rl_005funbind_005fcommand_005fin_005fmap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Unbind all keys that are bound to <var>command</var> in <var>map</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fbind_005fkeyseq"><span class="category">Function: </span><span><em>int</em> <strong>rl_bind_keyseq</strong> <em>(const char *keyseq, rl_command_func_t *function)</em><a href='#index-rl_005fbind_005fkeyseq' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Bind the key sequence represented by the string <var>keyseq</var> to the function
+<var>function</var>, beginning in the current keymap.
+This makes new keymaps as necessary.
+The return value is non-zero if <var>keyseq</var> is invalid.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fbind_005fkeyseq_005fin_005fmap"><span class="category">Function: </span><span><em>int</em> <strong>rl_bind_keyseq_in_map</strong> <em>(const char *keyseq, rl_command_func_t *function, Keymap map)</em><a href='#index-rl_005fbind_005fkeyseq_005fin_005fmap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Bind the key sequence represented by the string <var>keyseq</var> to the function
+<var>function</var>. This makes new keymaps as necessary.
+Initial bindings are performed in <var>map</var>.
+The return value is non-zero if <var>keyseq</var> is invalid.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fset_005fkey"><span class="category">Function: </span><span><em>int</em> <strong>rl_set_key</strong> <em>(const char *keyseq, rl_command_func_t *function, Keymap map)</em><a href='#index-rl_005fset_005fkey' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Equivalent to <code>rl_bind_keyseq_in_map</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fbind_005fkeyseq_005fif_005funbound"><span class="category">Function: </span><span><em>int</em> <strong>rl_bind_keyseq_if_unbound</strong> <em>(const char *keyseq, rl_command_func_t *function)</em><a href='#index-rl_005fbind_005fkeyseq_005fif_005funbound' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Binds <var>keyseq</var> to <var>function</var> if it is not already bound in the
+currently active keymap.
+Returns non-zero in the case of an invalid <var>keyseq</var> or if <var>keyseq</var> is
+already bound.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fbind_005fkeyseq_005fif_005funbound_005fin_005fmap"><span class="category">Function: </span><span><em>int</em> <strong>rl_bind_keyseq_if_unbound_in_map</strong> <em>(const char *keyseq, rl_command_func_t *function, Keymap map)</em><a href='#index-rl_005fbind_005fkeyseq_005fif_005funbound_005fin_005fmap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Binds <var>keyseq</var> to <var>function</var> if it is not already bound in <var>map</var>.
+Returns non-zero in the case of an invalid <var>keyseq</var> or if <var>keyseq</var> is
+already bound.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fgeneric_005fbind"><span class="category">Function: </span><span><em>int</em> <strong>rl_generic_bind</strong> <em>(int type, const char *keyseq, char *data, Keymap map)</em><a href='#index-rl_005fgeneric_005fbind' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Bind the key sequence represented by the string <var>keyseq</var> to the arbitrary
+pointer <var>data</var>. <var>type</var> says what kind of data is pointed to by
+<var>data</var>; this can be a function (<code>ISFUNC</code>), a macro
+(<code>ISMACR</code>), or a keymap (<code>ISKMAP</code>). This makes new keymaps as
+necessary. The initial keymap in which to do bindings is <var>map</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fparse_005fand_005fbind"><span class="category">Function: </span><span><em>int</em> <strong>rl_parse_and_bind</strong> <em>(char *line)</em><a href='#index-rl_005fparse_005fand_005fbind' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Parse <var>line</var> as if it had been read from the <code>inputrc</code> file and
+perform any key bindings and variable assignments found
+(see <a href="#Readline-Init-File">Readline Init File</a>).
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fread_005finit_005ffile"><span class="category">Function: </span><span><em>int</em> <strong>rl_read_init_file</strong> <em>(const char *filename)</em><a href='#index-rl_005fread_005finit_005ffile' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Read keybindings and variable assignments from <var>filename</var>
+(see <a href="#Readline-Init-File">Readline Init File</a>).
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Associating-Function-Names-and-Bindings">
+<div class="header">
+<p>
+Next: <a href="#Allowing-Undoing" accesskey="n" rel="next">Allowing Undoing</a>, Previous: <a href="#Binding-Keys" accesskey="p" rel="prev">Binding Keys</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Associating-Function-Names-and-Bindings-1"></span><h4 class="subsection">2.4.4 Associating Function Names and Bindings</h4>
+
+<p>These functions allow you to find out what keys invoke named functions
+and the functions invoked by a particular key sequence. You may also
+associate a new function name with an arbitrary function.
+</p>
+<dl class="def">
+<dt id="index-rl_005fnamed_005ffunction"><span class="category">Function: </span><span><em>rl_command_func_t *</em> <strong>rl_named_function</strong> <em>(const char *name)</em><a href='#index-rl_005fnamed_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the function with name <var>name</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffunction_005fof_005fkeyseq"><span class="category">Function: </span><span><em>rl_command_func_t *</em> <strong>rl_function_of_keyseq</strong> <em>(const char *keyseq, Keymap map, int *type)</em><a href='#index-rl_005ffunction_005fof_005fkeyseq' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the function invoked by <var>keyseq</var> in keymap <var>map</var>.
+If <var>map</var> is <code>NULL</code>, the current keymap is used. If <var>type</var> is
+not <code>NULL</code>, the type of the object is returned in the <code>int</code> variable
+it points to (one of <code>ISFUNC</code>, <code>ISKMAP</code>, or <code>ISMACR</code>).
+It takes a &quot;translated&quot; key sequence and should not be used if the key sequence
+can include NUL.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffunction_005fof_005fkeyseq_005flen"><span class="category">Function: </span><span><em>rl_command_func_t *</em> <strong>rl_function_of_keyseq_len</strong> <em>(const char *keyseq, size_t len, Keymap map, int *type)</em><a href='#index-rl_005ffunction_005fof_005fkeyseq_005flen' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the function invoked by <var>keyseq</var> of length <var>len</var>
+in keymap <var>map</var>. Equivalent to <code>rl_function_of_keyseq</code> with the
+addition of the <var>len</var> parameter.
+It takes a &quot;translated&quot; key sequence and should be used if the key sequence
+can include NUL.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ftrim_005farg_005ffrom_005fkeyseq"><span class="category">Function: </span><span><em>int</em> <strong>rl_trim_arg_from_keyseq</strong> <em>(const char *keyseq, size_t len, Keymap map)</em><a href='#index-rl_005ftrim_005farg_005ffrom_005fkeyseq' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If there is a numeric argument at the beginning of <var>keyseq</var>, possibly
+including digits, return the index of the first character in <var>keyseq</var>
+following the numeric argument.
+This can be used to skip over the numeric argument (which is available as
+<code>rl_numeric_arg</code> while traversing the key sequence that invoked the
+current command.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005finvoking_005fkeyseqs"><span class="category">Function: </span><span><em>char **</em> <strong>rl_invoking_keyseqs</strong> <em>(rl_command_func_t *function)</em><a href='#index-rl_005finvoking_005fkeyseqs' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return an array of strings representing the key sequences used to
+invoke <var>function</var> in the current keymap.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005finvoking_005fkeyseqs_005fin_005fmap"><span class="category">Function: </span><span><em>char **</em> <strong>rl_invoking_keyseqs_in_map</strong> <em>(rl_command_func_t *function, Keymap map)</em><a href='#index-rl_005finvoking_005fkeyseqs_005fin_005fmap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return an array of strings representing the key sequences used to
+invoke <var>function</var> in the keymap <var>map</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffunction_005fdumper"><span class="category">Function: </span><span><em>void</em> <strong>rl_function_dumper</strong> <em>(int readable)</em><a href='#index-rl_005ffunction_005fdumper' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Print the Readline function names and the key sequences currently
+bound to them to <code>rl_outstream</code>. If <var>readable</var> is non-zero,
+the list is formatted in such a way that it can be made part of an
+<code>inputrc</code> file and re-read.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005flist_005ffunmap_005fnames"><span class="category">Function: </span><span><em>void</em> <strong>rl_list_funmap_names</strong> <em>(void)</em><a href='#index-rl_005flist_005ffunmap_005fnames' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Print the names of all bindable Readline functions to <code>rl_outstream</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffunmap_005fnames"><span class="category">Function: </span><span><em>const char **</em> <strong>rl_funmap_names</strong> <em>(void)</em><a href='#index-rl_005ffunmap_005fnames' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return a NULL terminated array of known function names. The array is
+sorted. The array itself is allocated, but not the strings inside. You
+should free the array, but not the pointers, using <code>free</code> or
+<code>rl_free</code> when you are done.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fadd_005ffunmap_005fentry"><span class="category">Function: </span><span><em>int</em> <strong>rl_add_funmap_entry</strong> <em>(const char *name, rl_command_func_t *function)</em><a href='#index-rl_005fadd_005ffunmap_005fentry' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Add <var>name</var> to the list of bindable Readline command names, and make
+<var>function</var> the function to be called when <var>name</var> is invoked.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Allowing-Undoing">
+<div class="header">
+<p>
+Next: <a href="#Redisplay" accesskey="n" rel="next">Redisplay</a>, Previous: <a href="#Associating-Function-Names-and-Bindings" accesskey="p" rel="prev">Associating Function Names and Bindings</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Allowing-Undoing-1"></span><h4 class="subsection">2.4.5 Allowing Undoing</h4>
+
+<p>Supporting the undo command is a painless thing, and makes your
+functions much more useful. It is certainly easy to try
+something if you know you can undo it.
+</p>
+<p>If your function simply inserts text once, or deletes text once, and
+uses <code>rl_insert_text()</code> or <code>rl_delete_text()</code> to do it, then
+undoing is already done for you automatically.
+</p>
+<p>If you do multiple insertions or multiple deletions, or any combination
+of these operations, you should group them together into one operation.
+This is done with <code>rl_begin_undo_group()</code> and
+<code>rl_end_undo_group()</code>.
+</p>
+<p>The types of events that can be undone are:
+</p>
+<div class="example">
+<pre class="example">enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END };
+</pre></div>
+
+<p>Notice that <code>UNDO_DELETE</code> means to insert some text, and
+<code>UNDO_INSERT</code> means to delete some text. That is, the undo code
+tells what to undo, not how to undo it. <code>UNDO_BEGIN</code> and
+<code>UNDO_END</code> are tags added by <code>rl_begin_undo_group()</code> and
+<code>rl_end_undo_group()</code>.
+</p>
+<dl class="def">
+<dt id="index-rl_005fbegin_005fundo_005fgroup"><span class="category">Function: </span><span><em>int</em> <strong>rl_begin_undo_group</strong> <em>(void)</em><a href='#index-rl_005fbegin_005fundo_005fgroup' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Begins saving undo information in a group construct. The undo
+information usually comes from calls to <code>rl_insert_text()</code> and
+<code>rl_delete_text()</code>, but could be the result of calls to
+<code>rl_add_undo()</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fend_005fundo_005fgroup"><span class="category">Function: </span><span><em>int</em> <strong>rl_end_undo_group</strong> <em>(void)</em><a href='#index-rl_005fend_005fundo_005fgroup' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Closes the current undo group started with <code>rl_begin_undo_group
+()</code>. There should be one call to <code>rl_end_undo_group()</code>
+for each call to <code>rl_begin_undo_group()</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fadd_005fundo"><span class="category">Function: </span><span><em>void</em> <strong>rl_add_undo</strong> <em>(enum undo_code what, int start, int end, char *text)</em><a href='#index-rl_005fadd_005fundo' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Remember how to undo an event (according to <var>what</var>). The affected
+text runs from <var>start</var> to <var>end</var>, and encompasses <var>text</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffree_005fundo_005flist"><span class="category">Function: </span><span><em>void</em> <strong>rl_free_undo_list</strong> <em>(void)</em><a href='#index-rl_005ffree_005fundo_005flist' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Free the existing undo list.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fdo_005fundo"><span class="category">Function: </span><span><em>int</em> <strong>rl_do_undo</strong> <em>(void)</em><a href='#index-rl_005fdo_005fundo' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Undo the first thing on the undo list. Returns <code>0</code> if there was
+nothing to undo, non-zero if something was undone.
+</p></dd></dl>
+
+<p>Finally, if you neither insert nor delete text, but directly modify the
+existing text (e.g., change its case), call <code>rl_modifying()</code>
+once, just before you modify the text. You must supply the indices of
+the text range that you are going to modify.
+</p>
+<dl class="def">
+<dt id="index-rl_005fmodifying"><span class="category">Function: </span><span><em>int</em> <strong>rl_modifying</strong> <em>(int start, int end)</em><a href='#index-rl_005fmodifying' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Tell Readline to save the text between <var>start</var> and <var>end</var> as a
+single undo unit. It is assumed that you will subsequently modify
+that text.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Redisplay">
+<div class="header">
+<p>
+Next: <a href="#Modifying-Text" accesskey="n" rel="next">Modifying Text</a>, Previous: <a href="#Allowing-Undoing" accesskey="p" rel="prev">Allowing Undoing</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Redisplay-1"></span><h4 class="subsection">2.4.6 Redisplay</h4>
+
+<dl class="def">
+<dt id="index-rl_005fredisplay"><span class="category">Function: </span><span><em>void</em> <strong>rl_redisplay</strong> <em>(void)</em><a href='#index-rl_005fredisplay' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Change what&rsquo;s displayed on the screen to reflect the current contents
+of <code>rl_line_buffer</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fforced_005fupdate_005fdisplay"><span class="category">Function: </span><span><em>int</em> <strong>rl_forced_update_display</strong> <em>(void)</em><a href='#index-rl_005fforced_005fupdate_005fdisplay' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Force the line to be updated and redisplayed, whether or not
+Readline thinks the screen display is correct.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fon_005fnew_005fline"><span class="category">Function: </span><span><em>int</em> <strong>rl_on_new_line</strong> <em>(void)</em><a href='#index-rl_005fon_005fnew_005fline' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Tell the update functions that we have moved onto a new (empty) line,
+usually after outputting a newline.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fon_005fnew_005fline_005fwith_005fprompt"><span class="category">Function: </span><span><em>int</em> <strong>rl_on_new_line_with_prompt</strong> <em>(void)</em><a href='#index-rl_005fon_005fnew_005fline_005fwith_005fprompt' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Tell the update functions that we have moved onto a new line, with
+<var>rl_prompt</var> already displayed.
+This could be used by applications that want to output the prompt string
+themselves, but still need Readline to know the prompt string length for
+redisplay.
+It should be used after setting <var>rl_already_prompted</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fclear_005fvisible_005fline"><span class="category">Function: </span><span><em>int</em> <strong>rl_clear_visible_line</strong> <em>(void)</em><a href='#index-rl_005fclear_005fvisible_005fline' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Clear the screen lines corresponding to the current line&rsquo;s contents.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005freset_005fline_005fstate"><span class="category">Function: </span><span><em>int</em> <strong>rl_reset_line_state</strong> <em>(void)</em><a href='#index-rl_005freset_005fline_005fstate' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Reset the display state to a clean state and redisplay the current line
+starting on a new line.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcrlf"><span class="category">Function: </span><span><em>int</em> <strong>rl_crlf</strong> <em>(void)</em><a href='#index-rl_005fcrlf' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move the cursor to the start of the next screen line.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fshow_005fchar"><span class="category">Function: </span><span><em>int</em> <strong>rl_show_char</strong> <em>(int c)</em><a href='#index-rl_005fshow_005fchar' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Display character <var>c</var> on <code>rl_outstream</code>.
+If Readline has not been set to display meta characters directly, this
+will convert meta characters to a meta-prefixed key sequence.
+This is intended for use by applications which wish to do their own
+redisplay.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fmessage"><span class="category">Function: </span><span><em>int</em> <strong>rl_message</strong> <em>(const char *, &hellip;)</em><a href='#index-rl_005fmessage' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The arguments are a format string as would be supplied to <code>printf</code>,
+possibly containing conversion specifications such as &lsquo;<samp>%d</samp>&rsquo;, and
+any additional arguments necessary to satisfy the conversion specifications.
+The resulting string is displayed in the <em>echo area</em>. The echo area
+is also used to display numeric arguments and search strings.
+You should call <code>rl_save_prompt</code> to save the prompt information
+before calling this function.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fclear_005fmessage"><span class="category">Function: </span><span><em>int</em> <strong>rl_clear_message</strong> <em>(void)</em><a href='#index-rl_005fclear_005fmessage' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Clear the message in the echo area. If the prompt was saved with a call to
+<code>rl_save_prompt</code> before the last call to <code>rl_message</code>,
+call <code>rl_restore_prompt</code> before calling this function.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fsave_005fprompt"><span class="category">Function: </span><span><em>void</em> <strong>rl_save_prompt</strong> <em>(void)</em><a href='#index-rl_005fsave_005fprompt' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Save the local Readline prompt display state in preparation for
+displaying a new message in the message area with <code>rl_message()</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005frestore_005fprompt"><span class="category">Function: </span><span><em>void</em> <strong>rl_restore_prompt</strong> <em>(void)</em><a href='#index-rl_005frestore_005fprompt' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Restore the local Readline prompt display state saved by the most
+recent call to <code>rl_save_prompt</code>.
+if <code>rl_save_prompt</code> was called to save the prompt before a call
+to <code>rl_message</code>, this function should be called before the
+corresponding call to <code>rl_clear_message</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fexpand_005fprompt"><span class="category">Function: </span><span><em>int</em> <strong>rl_expand_prompt</strong> <em>(char *prompt)</em><a href='#index-rl_005fexpand_005fprompt' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Expand any special character sequences in <var>prompt</var> and set up the
+local Readline prompt redisplay variables.
+This function is called by <code>readline()</code>. It may also be called to
+expand the primary prompt if the <code>rl_on_new_line_with_prompt()</code>
+function or <code>rl_already_prompted</code> variable is used.
+It returns the number of visible characters on the last line of the
+(possibly multi-line) prompt.
+Applications may indicate that the prompt contains characters that take
+up no physical screen space when displayed by bracketing a sequence of
+such characters with the special markers <code>RL_PROMPT_START_IGNORE</code>
+and <code>RL_PROMPT_END_IGNORE</code> (declared in <samp>readline.h</samp> as
+&lsquo;<samp>\001</samp>&rsquo; and &lsquo;<samp>\002</samp>&rsquo;, respectively).
+This may be used to embed terminal-specific escape sequences in prompts.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fset_005fprompt"><span class="category">Function: </span><span><em>int</em> <strong>rl_set_prompt</strong> <em>(const char *prompt)</em><a href='#index-rl_005fset_005fprompt' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Make Readline use <var>prompt</var> for subsequent redisplay. This calls
+<code>rl_expand_prompt()</code> to expand the prompt and sets <code>rl_prompt</code>
+to the result.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Modifying-Text">
+<div class="header">
+<p>
+Next: <a href="#Character-Input" accesskey="n" rel="next">Character Input</a>, Previous: <a href="#Redisplay" accesskey="p" rel="prev">Redisplay</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Modifying-Text-1"></span><h4 class="subsection">2.4.7 Modifying Text</h4>
+
+<dl class="def">
+<dt id="index-rl_005finsert_005ftext"><span class="category">Function: </span><span><em>int</em> <strong>rl_insert_text</strong> <em>(const char *text)</em><a href='#index-rl_005finsert_005ftext' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert <var>text</var> into the line at the current cursor position.
+Returns the number of characters inserted.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fdelete_005ftext"><span class="category">Function: </span><span><em>int</em> <strong>rl_delete_text</strong> <em>(int start, int end)</em><a href='#index-rl_005fdelete_005ftext' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Delete the text between <var>start</var> and <var>end</var> in the current line.
+Returns the number of characters deleted.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcopy_005ftext"><span class="category">Function: </span><span><em>char *</em> <strong>rl_copy_text</strong> <em>(int start, int end)</em><a href='#index-rl_005fcopy_005ftext' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return a copy of the text between <var>start</var> and <var>end</var> in
+the current line.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fkill_005ftext"><span class="category">Function: </span><span><em>int</em> <strong>rl_kill_text</strong> <em>(int start, int end)</em><a href='#index-rl_005fkill_005ftext' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Copy the text between <var>start</var> and <var>end</var> in the current line
+to the kill ring, appending or prepending to the last kill if the
+last command was a kill command. The text is deleted.
+If <var>start</var> is less than <var>end</var>,
+the text is appended, otherwise prepended. If the last command was
+not a kill, a new kill ring slot is used.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fpush_005fmacro_005finput"><span class="category">Function: </span><span><em>int</em> <strong>rl_push_macro_input</strong> <em>(char *macro)</em><a href='#index-rl_005fpush_005fmacro_005finput' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Cause <var>macro</var> to be inserted into the line, as if it had been invoked
+by a key bound to a macro. Not especially useful; use
+<code>rl_insert_text()</code> instead.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Character-Input">
+<div class="header">
+<p>
+Next: <a href="#Terminal-Management" accesskey="n" rel="next">Terminal Management</a>, Previous: <a href="#Modifying-Text" accesskey="p" rel="prev">Modifying Text</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Character-Input-1"></span><h4 class="subsection">2.4.8 Character Input</h4>
+
+<dl class="def">
+<dt id="index-rl_005fread_005fkey"><span class="category">Function: </span><span><em>int</em> <strong>rl_read_key</strong> <em>(void)</em><a href='#index-rl_005fread_005fkey' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the next character available from Readline&rsquo;s current input stream.
+This handles input inserted into
+the input stream via <var>rl_pending_input</var> (see <a href="#Readline-Variables">Readline Variables</a>)
+and <code>rl_stuff_char()</code>, macros, and characters read from the keyboard.
+While waiting for input, this function will call any function assigned to
+the <code>rl_event_hook</code> variable.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fgetc"><span class="category">Function: </span><span><em>int</em> <strong>rl_getc</strong> <em>(FILE *stream)</em><a href='#index-rl_005fgetc' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the next character available from <var>stream</var>, which is assumed to
+be the keyboard.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fstuff_005fchar"><span class="category">Function: </span><span><em>int</em> <strong>rl_stuff_char</strong> <em>(int c)</em><a href='#index-rl_005fstuff_005fchar' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert <var>c</var> into the Readline input stream. It will be &quot;read&quot;
+before Readline attempts to read characters from the terminal with
+<code>rl_read_key()</code>. Up to 512 characters may be pushed back.
+<code>rl_stuff_char</code> returns 1 if the character was successfully inserted;
+0 otherwise.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fexecute_005fnext"><span class="category">Function: </span><span><em>int</em> <strong>rl_execute_next</strong> <em>(int c)</em><a href='#index-rl_005fexecute_005fnext' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Make <var>c</var> be the next command to be executed when <code>rl_read_key()</code>
+is called. This sets <var>rl_pending_input</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fclear_005fpending_005finput"><span class="category">Function: </span><span><em>int</em> <strong>rl_clear_pending_input</strong> <em>(void)</em><a href='#index-rl_005fclear_005fpending_005finput' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Unset <var>rl_pending_input</var>, effectively negating the effect of any
+previous call to <code>rl_execute_next()</code>. This works only if the
+pending input has not already been read with <code>rl_read_key()</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fset_005fkeyboard_005finput_005ftimeout"><span class="category">Function: </span><span><em>int</em> <strong>rl_set_keyboard_input_timeout</strong> <em>(int u)</em><a href='#index-rl_005fset_005fkeyboard_005finput_005ftimeout' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>While waiting for keyboard input in <code>rl_read_key()</code>, Readline will
+wait for <var>u</var> microseconds for input before calling any function
+assigned to <code>rl_event_hook</code>. <var>u</var> must be greater than or equal
+to zero (a zero-length timeout is equivalent to a poll).
+The default waiting period is one-tenth of a second.
+Returns the old timeout value.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fset_005ftimeout"><span class="category">Function: </span><span><em>int</em> <strong>rl_set_timeout</strong> <em>(unsigned int secs, unsigned int usecs)</em><a href='#index-rl_005fset_005ftimeout' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set a timeout for subsequent calls to <code>readline()</code>. If Readline does
+not read a complete line, or the number of characters specified by
+<code>rl_num_chars_to_read</code>, before the duration specified by <var>secs</var>
+(in seconds) and <var>usecs</var> (microseconds), it returns and sets
+<code>RL_STATE_TIMEOUT</code> in <code>rl_readline_state</code>.
+Passing 0 for <code>secs</code> and <code>usecs</code> cancels any previously set
+timeout; the convenience macro <code>rl_clear_timeout()</code> is shorthand
+for this.
+Returns 0 if the timeout is set successfully.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ftimeout_005fremaining"><span class="category">Function: </span><span><em>int</em> <strong>rl_timeout_remaining</strong> <em>(unsigned int *secs, unsigned int *usecs)</em><a href='#index-rl_005ftimeout_005fremaining' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the number of seconds and microseconds remaining in the current
+timeout duration in <var>*secs</var> and <var>*usecs</var>, respectively.
+Both <var>*secs</var> and <var>*usecs</var> must be non-NULL to return any values.
+The return value is -1 on error or when there is no timeout set,
+0 when the timeout has expired (leaving <var>*secs</var> and <var>*usecs</var>
+unchanged),
+and 1 if the timeout has not expired.
+If either of <var>secs</var> and <var>usecs</var> is <code>NULL</code>,
+the return value indicates whether the timeout has expired.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Terminal-Management">
+<div class="header">
+<p>
+Next: <a href="#Utility-Functions" accesskey="n" rel="next">Utility Functions</a>, Previous: <a href="#Character-Input" accesskey="p" rel="prev">Character Input</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Terminal-Management-1"></span><h4 class="subsection">2.4.9 Terminal Management</h4>
+
+<dl class="def">
+<dt id="index-rl_005fprep_005fterminal"><span class="category">Function: </span><span><em>void</em> <strong>rl_prep_terminal</strong> <em>(int meta_flag)</em><a href='#index-rl_005fprep_005fterminal' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Modify the terminal settings for Readline&rsquo;s use, so <code>readline()</code>
+can read a single character at a time from the keyboard.
+The <var>meta_flag</var> argument should be non-zero if Readline should
+read eight-bit input.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fdeprep_005fterminal"><span class="category">Function: </span><span><em>void</em> <strong>rl_deprep_terminal</strong> <em>(void)</em><a href='#index-rl_005fdeprep_005fterminal' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Undo the effects of <code>rl_prep_terminal()</code>, leaving the terminal in
+the state in which it was before the most recent call to
+<code>rl_prep_terminal()</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ftty_005fset_005fdefault_005fbindings"><span class="category">Function: </span><span><em>void</em> <strong>rl_tty_set_default_bindings</strong> <em>(Keymap kmap)</em><a href='#index-rl_005ftty_005fset_005fdefault_005fbindings' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Read the operating system&rsquo;s terminal editing characters (as would be
+displayed by <code>stty</code>) to their Readline equivalents.
+The bindings are performed in <var>kmap</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ftty_005funset_005fdefault_005fbindings"><span class="category">Function: </span><span><em>void</em> <strong>rl_tty_unset_default_bindings</strong> <em>(Keymap kmap)</em><a href='#index-rl_005ftty_005funset_005fdefault_005fbindings' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Reset the bindings manipulated by <code>rl_tty_set_default_bindings</code> so
+that the terminal editing characters are bound to <code>rl_insert</code>.
+The bindings are performed in <var>kmap</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ftty_005fset_005fechoing"><span class="category">Function: </span><span><em>int</em> <strong>rl_tty_set_echoing</strong> <em>(int value)</em><a href='#index-rl_005ftty_005fset_005fechoing' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set Readline&rsquo;s idea of whether or not it is echoing output to its output
+stream (<var>rl_outstream</var>). If <var>value</var> is 0, Readline does not display
+output to <var>rl_outstream</var>; any other value enables output. The initial
+value is set when Readline initializes the terminal settings.
+This function returns the previous value.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005freset_005fterminal"><span class="category">Function: </span><span><em>int</em> <strong>rl_reset_terminal</strong> <em>(const char *terminal_name)</em><a href='#index-rl_005freset_005fterminal' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Reinitialize Readline&rsquo;s idea of the terminal settings using
+<var>terminal_name</var> as the terminal type (e.g., <code>vt100</code>).
+If <var>terminal_name</var> is <code>NULL</code>, the value of the <code>TERM</code>
+environment variable is used.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Utility-Functions">
+<div class="header">
+<p>
+Next: <a href="#Miscellaneous-Functions" accesskey="n" rel="next">Miscellaneous Functions</a>, Previous: <a href="#Terminal-Management" accesskey="p" rel="prev">Terminal Management</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Utility-Functions-1"></span><h4 class="subsection">2.4.10 Utility Functions</h4>
+
+<dl class="def">
+<dt id="index-rl_005fsave_005fstate"><span class="category">Function: </span><span><em>int</em> <strong>rl_save_state</strong> <em>(struct readline_state *sp)</em><a href='#index-rl_005fsave_005fstate' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Save a snapshot of Readline&rsquo;s internal state to <var>sp</var>.
+The contents of the <var>readline_state</var> structure are documented
+in <samp>readline.h</samp>.
+The caller is responsible for allocating the structure.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005frestore_005fstate"><span class="category">Function: </span><span><em>int</em> <strong>rl_restore_state</strong> <em>(struct readline_state *sp)</em><a href='#index-rl_005frestore_005fstate' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Restore Readline&rsquo;s internal state to that stored in <var>sp</var>, which must
+have been saved by a call to <code>rl_save_state</code>.
+The contents of the <var>readline_state</var> structure are documented
+in <samp>readline.h</samp>.
+The caller is responsible for freeing the structure.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffree"><span class="category">Function: </span><span><em>void</em> <strong>rl_free</strong> <em>(void *mem)</em><a href='#index-rl_005ffree' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Deallocate the memory pointed to by <var>mem</var>. <var>mem</var> must have been
+allocated by <code>malloc</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005freplace_005fline"><span class="category">Function: </span><span><em>void</em> <strong>rl_replace_line</strong> <em>(const char *text, int clear_undo)</em><a href='#index-rl_005freplace_005fline' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Replace the contents of <code>rl_line_buffer</code> with <var>text</var>.
+The point and mark are preserved, if possible.
+If <var>clear_undo</var> is non-zero, the undo list associated with the
+current line is cleared.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fextend_005fline_005fbuffer"><span class="category">Function: </span><span><em>void</em> <strong>rl_extend_line_buffer</strong> <em>(int len)</em><a href='#index-rl_005fextend_005fline_005fbuffer' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Ensure that <code>rl_line_buffer</code> has enough space to hold <var>len</var>
+characters, possibly reallocating it if necessary.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005finitialize"><span class="category">Function: </span><span><em>int</em> <strong>rl_initialize</strong> <em>(void)</em><a href='#index-rl_005finitialize' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Initialize or re-initialize Readline&rsquo;s internal state.
+It&rsquo;s not strictly necessary to call this; <code>readline()</code> calls it before
+reading any input.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fding"><span class="category">Function: </span><span><em>int</em> <strong>rl_ding</strong> <em>(void)</em><a href='#index-rl_005fding' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Ring the terminal bell, obeying the setting of <code>bell-style</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005falphabetic"><span class="category">Function: </span><span><em>int</em> <strong>rl_alphabetic</strong> <em>(int c)</em><a href='#index-rl_005falphabetic' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return 1 if <var>c</var> is an alphabetic character.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fdisplay_005fmatch_005flist"><span class="category">Function: </span><span><em>void</em> <strong>rl_display_match_list</strong> <em>(char **matches, int len, int max)</em><a href='#index-rl_005fdisplay_005fmatch_005flist' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A convenience function for displaying a list of strings in
+columnar format on Readline&rsquo;s output stream. <code>matches</code> is the list
+of strings, in argv format, such as a list of completion matches.
+<code>len</code> is the number of strings in <code>matches</code>, and <code>max</code>
+is the length of the longest string in <code>matches</code>. This function uses
+the setting of <code>print-completions-horizontally</code> to select how the
+matches are displayed (see <a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a>).
+When displaying completions, this function sets the number of columns used
+for display to the value of <code>completion-display-width</code>, the value of
+the environment variable <code>COLUMNS</code>, or the screen width, in that order.
+</p></dd></dl>
+
+<p>The following are implemented as macros, defined in <code>chardefs.h</code>.
+Applications should refrain from using them.
+</p>
+<dl class="def">
+<dt id="index-_005frl_005fuppercase_005fp"><span class="category">Function: </span><span><em>int</em> <strong>_rl_uppercase_p</strong> <em>(int c)</em><a href='#index-_005frl_005fuppercase_005fp' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return 1 if <var>c</var> is an uppercase alphabetic character.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-_005frl_005flowercase_005fp"><span class="category">Function: </span><span><em>int</em> <strong>_rl_lowercase_p</strong> <em>(int c)</em><a href='#index-_005frl_005flowercase_005fp' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return 1 if <var>c</var> is a lowercase alphabetic character.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-_005frl_005fdigit_005fp"><span class="category">Function: </span><span><em>int</em> <strong>_rl_digit_p</strong> <em>(int c)</em><a href='#index-_005frl_005fdigit_005fp' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return 1 if <var>c</var> is a numeric character.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-_005frl_005fto_005fupper"><span class="category">Function: </span><span><em>int</em> <strong>_rl_to_upper</strong> <em>(int c)</em><a href='#index-_005frl_005fto_005fupper' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If <var>c</var> is a lowercase alphabetic character, return the corresponding
+uppercase character.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-_005frl_005fto_005flower"><span class="category">Function: </span><span><em>int</em> <strong>_rl_to_lower</strong> <em>(int c)</em><a href='#index-_005frl_005fto_005flower' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If <var>c</var> is an uppercase alphabetic character, return the corresponding
+lowercase character.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-_005frl_005fdigit_005fvalue"><span class="category">Function: </span><span><em>int</em> <strong>_rl_digit_value</strong> <em>(int c)</em><a href='#index-_005frl_005fdigit_005fvalue' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If <var>c</var> is a number, return the value it represents.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Miscellaneous-Functions">
+<div class="header">
+<p>
+Next: <a href="#Alternate-Interface" accesskey="n" rel="next">Alternate Interface</a>, Previous: <a href="#Utility-Functions" accesskey="p" rel="prev">Utility Functions</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Miscellaneous-Functions-1"></span><h4 class="subsection">2.4.11 Miscellaneous Functions</h4>
+
+<dl class="def">
+<dt id="index-rl_005fmacro_005fbind"><span class="category">Function: </span><span><em>int</em> <strong>rl_macro_bind</strong> <em>(const char *keyseq, const char *macro, Keymap map)</em><a href='#index-rl_005fmacro_005fbind' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Bind the key sequence <var>keyseq</var> to invoke the macro <var>macro</var>.
+The binding is performed in <var>map</var>. When <var>keyseq</var> is invoked, the
+<var>macro</var> will be inserted into the line. This function is deprecated;
+use <code>rl_generic_bind()</code> instead.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fmacro_005fdumper"><span class="category">Function: </span><span><em>void</em> <strong>rl_macro_dumper</strong> <em>(int readable)</em><a href='#index-rl_005fmacro_005fdumper' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Print the key sequences bound to macros and their values, using
+the current keymap, to <code>rl_outstream</code>.
+If <var>readable</var> is non-zero, the list is formatted in such a way
+that it can be made part of an <code>inputrc</code> file and re-read.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fvariable_005fbind"><span class="category">Function: </span><span><em>int</em> <strong>rl_variable_bind</strong> <em>(const char *variable, const char *value)</em><a href='#index-rl_005fvariable_005fbind' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Make the Readline variable <var>variable</var> have <var>value</var>.
+This behaves as if the Readline command
+&lsquo;<samp>set <var>variable</var> <var>value</var></samp>&rsquo; had been executed in an <code>inputrc</code>
+file (see <a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a>).
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fvariable_005fvalue"><span class="category">Function: </span><span><em>char *</em> <strong>rl_variable_value</strong> <em>(const char *variable)</em><a href='#index-rl_005fvariable_005fvalue' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return a string representing the value of the Readline variable <var>variable</var>.
+For boolean variables, this string is either &lsquo;<samp>on</samp>&rsquo; or &lsquo;<samp>off</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fvariable_005fdumper"><span class="category">Function: </span><span><em>void</em> <strong>rl_variable_dumper</strong> <em>(int readable)</em><a href='#index-rl_005fvariable_005fdumper' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Print the Readline variable names and their current values
+to <code>rl_outstream</code>.
+If <var>readable</var> is non-zero, the list is formatted in such a way
+that it can be made part of an <code>inputrc</code> file and re-read.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fset_005fparen_005fblink_005ftimeout"><span class="category">Function: </span><span><em>int</em> <strong>rl_set_paren_blink_timeout</strong> <em>(int u)</em><a href='#index-rl_005fset_005fparen_005fblink_005ftimeout' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set the time interval (in microseconds) that Readline waits when showing
+a balancing character when <code>blink-matching-paren</code> has been enabled.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fget_005ftermcap"><span class="category">Function: </span><span><em>char *</em> <strong>rl_get_termcap</strong> <em>(const char *cap)</em><a href='#index-rl_005fget_005ftermcap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Retrieve the string value of the termcap capability <var>cap</var>.
+Readline fetches the termcap entry for the current terminal name and
+uses those capabilities to move around the screen line and perform other
+terminal-specific operations, like erasing a line. Readline does not
+use all of a terminal&rsquo;s capabilities, and this function will return
+values for only those capabilities Readline uses.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fclear_005fhistory"><span class="category">Function: </span><span><em>void</em> <strong>rl_clear_history</strong> <em>(void)</em><a href='#index-rl_005fclear_005fhistory' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Clear the history list by deleting all of the entries, in the same manner
+as the History library&rsquo;s <code>clear_history()</code> function.
+This differs from <code>clear_history</code> because it frees private data
+Readline saves in the history list.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005factivate_005fmark"><span class="category">Function: </span><span><em>void</em> <strong>rl_activate_mark</strong> <em>(void)</em><a href='#index-rl_005factivate_005fmark' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Enable an <em>active</em> mark.
+When this is enabled, the text between point and mark (the <var>region</var>) is
+displayed in the terminal&rsquo;s standout mode (a <var>face</var>).
+This is called by various Readline functions that set the mark and insert
+text, and is available for applications to call.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fdeactivate_005fmark"><span class="category">Function: </span><span><em>void</em> <strong>rl_deactivate_mark</strong> <em>(void)</em><a href='#index-rl_005fdeactivate_005fmark' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Turn off the active mark.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fkeep_005fmark_005factive"><span class="category">Function: </span><span><em>void</em> <strong>rl_keep_mark_active</strong> <em>(void)</em><a href='#index-rl_005fkeep_005fmark_005factive' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Indicate that the mark should remain active when the current Readline
+function completes and after redisplay occurs.
+In most cases, the mark remains active for only the duration of a single
+bindable Readline function.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fmark_005factive_005fp"><span class="category">Function: </span><span><em>int</em> <strong>rl_mark_active_p</strong> <em>(void)</em><a href='#index-rl_005fmark_005factive_005fp' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return a non-zero value if the mark is currently active; zero otherwise.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Alternate-Interface">
+<div class="header">
+<p>
+Next: <a href="#A-Readline-Example" accesskey="n" rel="next">A Readline Example</a>, Previous: <a href="#Miscellaneous-Functions" accesskey="p" rel="prev">Miscellaneous Functions</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Alternate-Interface-1"></span><h4 class="subsection">2.4.12 Alternate Interface</h4>
+
+<p>An alternate interface is available to plain <code>readline()</code>. Some
+applications need to interleave keyboard I/O with file, device, or
+window system I/O, typically by using a main loop to <code>select()</code>
+on various file descriptors. To accommodate this need, Readline can
+also be invoked as a &lsquo;callback&rsquo; function from an event loop. There
+are functions available to make this easy.
+</p>
+<dl class="def">
+<dt id="index-rl_005fcallback_005fhandler_005finstall"><span class="category">Function: </span><span><em>void</em> <strong>rl_callback_handler_install</strong> <em>(const char *prompt, rl_vcpfunc_t *lhandler)</em><a href='#index-rl_005fcallback_005fhandler_005finstall' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set up the terminal for Readline I/O and display the initial
+expanded value of <var>prompt</var>. Save the value of <var>lhandler</var> to
+use as a handler function to call when a complete line of input has been
+entered.
+The handler function receives the text of the line as an argument.
+As with <code>readline()</code>, the handler function should <code>free</code> the
+line when it it finished with it.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcallback_005fread_005fchar"><span class="category">Function: </span><span><em>void</em> <strong>rl_callback_read_char</strong> <em>(void)</em><a href='#index-rl_005fcallback_005fread_005fchar' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Whenever an application determines that keyboard input is available, it
+should call <code>rl_callback_read_char()</code>, which will read the next
+character from the current input source.
+If that character completes the line, <code>rl_callback_read_char</code> will
+invoke the <var>lhandler</var> function installed by
+<code>rl_callback_handler_install</code> to process the line.
+Before calling the <var>lhandler</var> function, the terminal settings are
+reset to the values they had before calling
+<code>rl_callback_handler_install</code>.
+If the <var>lhandler</var> function returns,
+and the line handler remains installed,
+the terminal settings are modified for Readline&rsquo;s use again.
+<code>EOF</code> is indicated by calling <var>lhandler</var> with a
+<code>NULL</code> line.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcallback_005fsigcleanup"><span class="category">Function: </span><span><em>void</em> <strong>rl_callback_sigcleanup</strong> <em>(void)</em><a href='#index-rl_005fcallback_005fsigcleanup' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Clean up any internal state the callback interface uses to maintain state
+between calls to rl_callback_read_char (e.g., the state of any active
+incremental searches). This is intended to be used by applications that
+wish to perform their own signal handling; Readline&rsquo;s internal signal handler
+calls this when appropriate.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcallback_005fhandler_005fremove"><span class="category">Function: </span><span><em>void</em> <strong>rl_callback_handler_remove</strong> <em>(void)</em><a href='#index-rl_005fcallback_005fhandler_005fremove' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Restore the terminal to its initial state and remove the line handler.
+You may call this function from within a callback as well as independently.
+If the <var>lhandler</var> installed by <code>rl_callback_handler_install</code>
+does not exit the program, either this function or the function referred
+to by the value of <code>rl_deprep_term_function</code> should be called before
+the program exits to reset the terminal settings.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="A-Readline-Example">
+<div class="header">
+<p>
+Next: <a href="#Alternate-Interface-Example" accesskey="n" rel="next">Alternate Interface Example</a>, Previous: <a href="#Alternate-Interface" accesskey="p" rel="prev">Alternate Interface</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="A-Readline-Example-1"></span><h4 class="subsection">2.4.13 A Readline Example</h4>
+
+<p>Here is a function which changes lowercase characters to their uppercase
+equivalents, and uppercase characters to lowercase. If
+this function was bound to &lsquo;<samp>M-c</samp>&rsquo;, then typing &lsquo;<samp>M-c</samp>&rsquo; would
+change the case of the character under point. Typing &lsquo;<samp>M-1 0 M-c</samp>&rsquo;
+would change the case of the following 10 characters, leaving the cursor on
+the last character changed.
+</p>
+<div class="example">
+<pre class="example">/* Invert the case of the COUNT following characters. */
+int
+invert_case_line (count, key)
+ int count, key;
+{
+ register int start, end, i;
+
+ start = rl_point;
+
+ if (rl_point &gt;= rl_end)
+ return (0);
+
+ if (count &lt; 0)
+ {
+ direction = -1;
+ count = -count;
+ }
+ else
+ direction = 1;
+
+ /* Find the end of the range to modify. */
+ end = start + (count * direction);
+
+ /* Force it to be within range. */
+ if (end &gt; rl_end)
+ end = rl_end;
+ else if (end &lt; 0)
+ end = 0;
+
+ if (start == end)
+ return (0);
+
+ if (start &gt; end)
+ {
+ int temp = start;
+ start = end;
+ end = temp;
+ }
+
+ /* Tell readline that we are modifying the line,
+ so it will save the undo information. */
+ rl_modifying (start, end);
+
+ for (i = start; i != end; i++)
+ {
+ if (_rl_uppercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]);
+ else if (_rl_lowercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]);
+ }
+ /* Move point to on top of the last character changed. */
+ rl_point = (direction == 1) ? end - 1 : start;
+ return (0);
+}
+</pre></div>
+
+<hr>
+</div>
+<div class="subsection" id="Alternate-Interface-Example">
+<div class="header">
+<p>
+Previous: <a href="#A-Readline-Example" accesskey="p" rel="prev">A Readline Example</a>, Up: <a href="#Readline-Convenience-Functions" accesskey="u" rel="up">Readline Convenience Functions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Alternate-Interface-Example-1"></span><h4 class="subsection">2.4.14 Alternate Interface Example</h4>
+
+<p>Here is a complete program that illustrates Readline&rsquo;s alternate interface.
+It reads lines from the terminal and displays them, providing the
+standard history and TAB completion functions.
+It understands the EOF character or &quot;exit&quot; to exit the program.
+</p>
+<div class="example">
+<pre class="example">/* Standard include files. stdio.h is required. */
+#include &lt;stdlib.h&gt;
+#include &lt;string.h&gt;
+#include &lt;unistd.h&gt;
+#include &lt;locale.h&gt;
+
+/* Used for select(2) */
+#include &lt;sys/types.h&gt;
+#include &lt;sys/select.h&gt;
+
+#include &lt;signal.h&gt;
+
+#include &lt;stdio.h&gt;
+
+/* Standard readline include files. */
+#include &lt;readline/readline.h&gt;
+#include &lt;readline/history.h&gt;
+
+static void cb_linehandler (char *);
+static void sighandler (int);
+
+int running;
+int sigwinch_received;
+const char *prompt = &quot;rltest$ &quot;;
+
+/* Handle SIGWINCH and window size changes when readline is not active and
+ reading a character. */
+static void
+sighandler (int sig)
+{
+ sigwinch_received = 1;
+}
+
+/* Callback function called for each line when accept-line executed, EOF
+ seen, or EOF character read. This sets a flag and returns; it could
+ also call exit(3). */
+static void
+cb_linehandler (char *line)
+{
+ /* Can use ^D (stty eof) or `exit' to exit. */
+ if (line == NULL || strcmp (line, &quot;exit&quot;) == 0)
+ {
+ if (line == 0)
+ printf (&quot;\n&quot;);
+ printf (&quot;exit\n&quot;);
+ /* This function needs to be called to reset the terminal settings,
+ and calling it from the line handler keeps one extra prompt from
+ being displayed. */
+ rl_callback_handler_remove ();
+
+ running = 0;
+ }
+ else
+ {
+ if (*line)
+ add_history (line);
+ printf (&quot;input line: %s\n&quot;, line);
+ free (line);
+ }
+}
+
+int
+main (int c, char **v)
+{
+ fd_set fds;
+ int r;
+
+ /* Set the default locale values according to environment variables. */
+ setlocale (LC_ALL, &quot;&quot;);
+
+ /* Handle window size changes when readline is not active and reading
+ characters. */
+ signal (SIGWINCH, sighandler);
+
+ /* Install the line handler. */
+ rl_callback_handler_install (prompt, cb_linehandler);
+
+ /* Enter a simple event loop. This waits until something is available
+ to read on readline's input stream (defaults to standard input) and
+ calls the builtin character read callback to read it. It does not
+ have to modify the user's terminal settings. */
+ running = 1;
+ while (running)
+ {
+ FD_ZERO (&amp;fds);
+ FD_SET (fileno (rl_instream), &amp;fds);
+
+ r = select (FD_SETSIZE, &amp;fds, NULL, NULL, NULL);
+ if (r &lt; 0 &amp;&amp; errno != EINTR)
+ {
+ perror (&quot;rltest: select&quot;);
+ rl_callback_handler_remove ();
+ break;
+ }
+ if (sigwinch_received)
+ {
+ rl_resize_terminal ();
+ sigwinch_received = 0;
+ }
+ if (r &lt; 0)
+ continue;
+
+ if (FD_ISSET (fileno (rl_instream), &amp;fds))
+ rl_callback_read_char ();
+ }
+
+ printf (&quot;rltest: Event loop has exited\n&quot;);
+ return 0;
+}
+</pre></div>
+
+<hr>
+</div>
+</div>
+<div class="section" id="Readline-Signal-Handling">
+<div class="header">
+<p>
+Next: <a href="#Custom-Completers" accesskey="n" rel="next">Custom Completers</a>, Previous: <a href="#Readline-Convenience-Functions" accesskey="p" rel="prev">Readline Convenience Functions</a>, Up: <a href="#Programming-with-GNU-Readline" accesskey="u" rel="up">Programming with GNU Readline</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Readline-Signal-Handling-1"></span><h3 class="section">2.5 Readline Signal Handling</h3>
+
+<p>Signals are asynchronous events sent to a process by the Unix kernel,
+sometimes on behalf of another process. They are intended to indicate
+exceptional events, like a user pressing the terminal&rsquo;s interrupt key,
+or a network connection being broken. There is a class of signals that can
+be sent to the process currently reading input from the keyboard. Since
+Readline changes the terminal attributes when it is called, it needs to
+perform special processing when such a signal is received in order to
+restore the terminal to a sane state, or provide application writers with
+functions to do so manually.
+</p>
+<p>Readline contains an internal signal handler that is installed for a
+number of signals (<code>SIGINT</code>, <code>SIGQUIT</code>, <code>SIGTERM</code>,
+<code>SIGHUP</code>,
+<code>SIGALRM</code>, <code>SIGTSTP</code>, <code>SIGTTIN</code>, and <code>SIGTTOU</code>).
+When one of these signals is received, the signal handler
+will reset the terminal attributes to those that were in effect before
+<code>readline()</code> was called, reset the signal handling to what it was
+before <code>readline()</code> was called, and resend the signal to the calling
+application.
+If and when the calling application&rsquo;s signal handler returns, Readline
+will reinitialize the terminal and continue to accept input.
+When a <code>SIGINT</code> is received, the Readline signal handler performs
+some additional work, which will cause any partially-entered line to be
+aborted (see the description of <code>rl_free_line_state()</code> below).
+</p>
+<p>There is an additional Readline signal handler, for <code>SIGWINCH</code>, which
+the kernel sends to a process whenever the terminal&rsquo;s size changes (for
+example, if a user resizes an <code>xterm</code>). The Readline <code>SIGWINCH</code>
+handler updates Readline&rsquo;s internal screen size information, and then calls
+any <code>SIGWINCH</code> signal handler the calling application has installed.
+Readline calls the application&rsquo;s <code>SIGWINCH</code> signal handler without
+resetting the terminal to its original state. If the application&rsquo;s signal
+handler does more than update its idea of the terminal size and return (for
+example, a <code>longjmp</code> back to a main processing loop), it <em>must</em>
+call <code>rl_cleanup_after_signal()</code> (described below), to restore the
+terminal state.
+</p>
+<p>When an application is using the callback interface
+(see <a href="#Alternate-Interface">Alternate Interface</a>), Readline installs signal handlers only for
+the duration of the call to <code>rl_callback_read_char</code>. Applications
+using the callback interface should be prepared to clean up Readline&rsquo;s
+state if they wish to handle the signal before the line handler completes
+and restores the terminal state.
+</p>
+<p>If an application using the callback interface wishes to have Readline
+install its signal handlers at the time the application calls
+<code>rl_callback_handler_install</code> and remove them only when a complete
+line of input has been read, it should set the
+<code>rl_persistent_signal_handlers</code> variable to a non-zero value.
+This allows an application to defer all of the handling of the signals
+Readline catches to Readline.
+Applications should use this variable with care; it can result in Readline
+catching signals and not acting on them (or allowing the application to react
+to them) until the application calls <code>rl_callback_read_char</code>. This
+can result in an application becoming less responsive to keyboard signals
+like SIGINT.
+If an application does not want or need to perform any signal handling, or
+does not need to do any processing between calls to <code>rl_callback_read_char</code>,
+setting this variable may be desirable.
+</p>
+<p>Readline provides two variables that allow application writers to
+control whether or not it will catch certain signals and act on them
+when they are received. It is important that applications change the
+values of these variables only when calling <code>readline()</code>, not in
+a signal handler, so Readline&rsquo;s internal signal state is not corrupted.
+</p>
+<dl class="def">
+<dt id="index-rl_005fcatch_005fsignals"><span class="category">Variable: </span><span><em>int</em> <strong>rl_catch_signals</strong><a href='#index-rl_005fcatch_005fsignals' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If this variable is non-zero, Readline will install signal handlers for
+<code>SIGINT</code>, <code>SIGQUIT</code>, <code>SIGTERM</code>, <code>SIGHUP</code>, <code>SIGALRM</code>,
+<code>SIGTSTP</code>, <code>SIGTTIN</code>, and <code>SIGTTOU</code>.
+</p>
+<p>The default value of <code>rl_catch_signals</code> is 1.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcatch_005fsigwinch"><span class="category">Variable: </span><span><em>int</em> <strong>rl_catch_sigwinch</strong><a href='#index-rl_005fcatch_005fsigwinch' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If this variable is set to a non-zero value,
+Readline will install a signal handler for <code>SIGWINCH</code>.
+</p>
+<p>The default value of <code>rl_catch_sigwinch</code> is 1.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fpersistent_005fsignal_005fhandlers"><span class="category">Variable: </span><span><em>int</em> <strong>rl_persistent_signal_handlers</strong><a href='#index-rl_005fpersistent_005fsignal_005fhandlers' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If an application using the callback interface wishes Readline&rsquo;s signal
+handlers to be installed and active during the set of calls to
+<code>rl_callback_read_char</code> that constitutes an entire single line,
+it should set this variable to a non-zero value.
+</p>
+<p>The default value of <code>rl_persistent_signal_handlers</code> is 0.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fchange_005fenvironment"><span class="category">Variable: </span><span><em>int</em> <strong>rl_change_environment</strong><a href='#index-rl_005fchange_005fenvironment' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If this variable is set to a non-zero value,
+and Readline is handling <code>SIGWINCH</code>, Readline will modify the
+<var>LINES</var> and <var>COLUMNS</var> environment variables upon receipt of a
+<code>SIGWINCH</code>
+</p>
+<p>The default value of <code>rl_change_environment</code> is 1.
+</p></dd></dl>
+
+<p>If an application does not wish to have Readline catch any signals, or
+to handle signals other than those Readline catches (<code>SIGHUP</code>,
+for example),
+Readline provides convenience functions to do the necessary terminal
+and internal state cleanup upon receipt of a signal.
+</p>
+<dl class="def">
+<dt id="index-rl_005fpending_005fsignal"><span class="category">Function: </span><span><em>int</em> <strong>rl_pending_signal</strong> <em>(void)</em><a href='#index-rl_005fpending_005fsignal' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return the signal number of the most recent signal Readline received but
+has not yet handled, or 0 if there is no pending signal.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcleanup_005fafter_005fsignal"><span class="category">Function: </span><span><em>void</em> <strong>rl_cleanup_after_signal</strong> <em>(void)</em><a href='#index-rl_005fcleanup_005fafter_005fsignal' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This function will reset the state of the terminal to what it was before
+<code>readline()</code> was called, and remove the Readline signal handlers for
+all signals, depending on the values of <code>rl_catch_signals</code> and
+<code>rl_catch_sigwinch</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffree_005fline_005fstate"><span class="category">Function: </span><span><em>void</em> <strong>rl_free_line_state</strong> <em>(void)</em><a href='#index-rl_005ffree_005fline_005fstate' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This will free any partial state associated with the current input line
+(undo information, any partial history entry, any partially-entered
+keyboard macro, and any partially-entered numeric argument). This
+should be called before <code>rl_cleanup_after_signal()</code>. The
+Readline signal handler for <code>SIGINT</code> calls this to abort the
+current input line.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005freset_005fafter_005fsignal"><span class="category">Function: </span><span><em>void</em> <strong>rl_reset_after_signal</strong> <em>(void)</em><a href='#index-rl_005freset_005fafter_005fsignal' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This will reinitialize the terminal and reinstall any Readline signal
+handlers, depending on the values of <code>rl_catch_signals</code> and
+<code>rl_catch_sigwinch</code>.
+</p></dd></dl>
+
+<p>If an application wants to force Readline to handle any signals that
+have arrived while it has been executing, <code>rl_check_signals()</code>
+will call Readline&rsquo;s internal signal handler if there are any pending
+signals. This is primarily intended for those applications that use
+a custom <code>rl_getc_function</code> (see <a href="#Readline-Variables">Readline Variables</a>) and wish
+to handle signals received while waiting for input.
+</p>
+<dl class="def">
+<dt id="index-rl_005fcheck_005fsignals"><span class="category">Function: </span><span><em>void</em> <strong>rl_check_signals</strong> <em>(void)</em><a href='#index-rl_005fcheck_005fsignals' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If there are any pending signals, call Readline&rsquo;s internal signal handling
+functions to process them. <code>rl_pending_signal()</code> can be used independently
+to determine whether or not there are any pending signals.
+</p></dd></dl>
+
+<p>If an application does not wish Readline to catch <code>SIGWINCH</code>, it may
+call <code>rl_resize_terminal()</code> or <code>rl_set_screen_size()</code> to force
+Readline to update its idea of the terminal size when it receives
+a <code>SIGWINCH</code>.
+</p>
+<dl class="def">
+<dt id="index-rl_005fecho_005fsignal_005fchar"><span class="category">Function: </span><span><em>void</em> <strong>rl_echo_signal_char</strong> <em>(int sig)</em><a href='#index-rl_005fecho_005fsignal_005fchar' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If an application wishes to install its own signal handlers, but still
+have Readline display characters that generate signals, calling this
+function with <var>sig</var> set to <code>SIGINT</code>, <code>SIGQUIT</code>, or
+<code>SIGTSTP</code> will display the character generating that signal.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fresize_005fterminal"><span class="category">Function: </span><span><em>void</em> <strong>rl_resize_terminal</strong> <em>(void)</em><a href='#index-rl_005fresize_005fterminal' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Update Readline&rsquo;s internal screen size by reading values from the kernel.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fset_005fscreen_005fsize"><span class="category">Function: </span><span><em>void</em> <strong>rl_set_screen_size</strong> <em>(int rows, int cols)</em><a href='#index-rl_005fset_005fscreen_005fsize' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set Readline&rsquo;s idea of the terminal size to <var>rows</var> rows and
+<var>cols</var> columns. If either <var>rows</var> or <var>columns</var> is less than
+or equal to 0, Readline&rsquo;s idea of that terminal dimension is unchanged.
+This is intended to tell Readline the physical dimensions of the terminal,
+and is used internally to calculate the maximum number of characters that
+may appear on a single line and on the screen.
+</p></dd></dl>
+
+<p>If an application does not want to install a <code>SIGWINCH</code> handler, but
+is still interested in the screen dimensions, it may query Readline&rsquo;s idea
+of the screen size.
+</p>
+<dl class="def">
+<dt id="index-rl_005fget_005fscreen_005fsize"><span class="category">Function: </span><span><em>void</em> <strong>rl_get_screen_size</strong> <em>(int *rows, int *cols)</em><a href='#index-rl_005fget_005fscreen_005fsize' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Return Readline&rsquo;s idea of the terminal&rsquo;s size in the
+variables pointed to by the arguments.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005freset_005fscreen_005fsize"><span class="category">Function: </span><span><em>void</em> <strong>rl_reset_screen_size</strong> <em>(void)</em><a href='#index-rl_005freset_005fscreen_005fsize' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Cause Readline to reobtain the screen size and recalculate its dimensions.
+</p></dd></dl>
+
+<p>The following functions install and remove Readline&rsquo;s signal handlers.
+</p>
+<dl class="def">
+<dt id="index-rl_005fset_005fsignals"><span class="category">Function: </span><span><em>int</em> <strong>rl_set_signals</strong> <em>(void)</em><a href='#index-rl_005fset_005fsignals' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Install Readline&rsquo;s signal handler for <code>SIGINT</code>, <code>SIGQUIT</code>,
+<code>SIGTERM</code>, <code>SIGHUP</code>, <code>SIGALRM</code>, <code>SIGTSTP</code>, <code>SIGTTIN</code>,
+<code>SIGTTOU</code>, and <code>SIGWINCH</code>, depending on the values of
+<code>rl_catch_signals</code> and <code>rl_catch_sigwinch</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fclear_005fsignals"><span class="category">Function: </span><span><em>int</em> <strong>rl_clear_signals</strong> <em>(void)</em><a href='#index-rl_005fclear_005fsignals' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Remove all of the Readline signal handlers installed by
+<code>rl_set_signals()</code>.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="section" id="Custom-Completers">
+<div class="header">
+<p>
+Previous: <a href="#Readline-Signal-Handling" accesskey="p" rel="prev">Readline Signal Handling</a>, Up: <a href="#Programming-with-GNU-Readline" accesskey="u" rel="up">Programming with GNU Readline</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Custom-Completers-1"></span><h3 class="section">2.6 Custom Completers</h3>
+<span id="index-application_002dspecific-completion-functions"></span>
+
+<p>Typically, a program that reads commands from the user has a way of
+disambiguating commands and data. If your program is one of these, then
+it can provide completion for commands, data, or both.
+The following sections describe how your program and Readline
+cooperate to provide this service.
+</p>
+
+<ul class="section-toc">
+<li><a href="#How-Completing-Works" accesskey="1">How Completing Works</a></li>
+<li><a href="#Completion-Functions" accesskey="2">Completion Functions</a></li>
+<li><a href="#Completion-Variables" accesskey="3">Completion Variables</a></li>
+<li><a href="#A-Short-Completion-Example" accesskey="4">A Short Completion Example</a></li>
+</ul>
+<hr>
+<div class="subsection" id="How-Completing-Works">
+<div class="header">
+<p>
+Next: <a href="#Completion-Functions" accesskey="n" rel="next">Completion Functions</a>, Up: <a href="#Custom-Completers" accesskey="u" rel="up">Custom Completers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="How-Completing-Works-1"></span><h4 class="subsection">2.6.1 How Completing Works</h4>
+
+<p>In order to complete some text, the full list of possible completions
+must be available. That is, it is not possible to accurately
+expand a partial word without knowing all of the possible words
+which make sense in that context. The Readline library provides
+the user interface to completion, and two of the most common
+completion functions: filename and username. For completing other types
+of text, you must write your own completion function. This section
+describes exactly what such functions must do, and provides an example.
+</p>
+<p>There are three major functions used to perform completion:
+</p>
+<ol>
+<li> The user-interface function <code>rl_complete()</code>. This function is
+called with the same arguments as other bindable Readline functions:
+<var>count</var> and <var>invoking_key</var>.
+It isolates the word to be completed and calls
+<code>rl_completion_matches()</code> to generate a list of possible completions.
+It then either lists the possible completions, inserts the possible
+completions, or actually performs the
+completion, depending on which behavior is desired.
+
+</li><li> The internal function <code>rl_completion_matches()</code> uses an
+application-supplied <em>generator</em> function to generate the list of
+possible matches, and then returns the array of these matches.
+The caller should place the address of its generator function in
+<code>rl_completion_entry_function</code>.
+
+</li><li> The generator function is called repeatedly from
+<code>rl_completion_matches()</code>, returning a string each time. The
+arguments to the generator function are <var>text</var> and <var>state</var>.
+<var>text</var> is the partial word to be completed. <var>state</var> is zero the
+first time the function is called, allowing the generator to perform
+any necessary initialization, and a positive non-zero integer for
+each subsequent call. The generator function returns
+<code>(char *)NULL</code> to inform <code>rl_completion_matches()</code> that there are
+no more possibilities left. Usually the generator function computes the
+list of possible completions when <var>state</var> is zero, and returns them
+one at a time on subsequent calls. Each string the generator function
+returns as a match must be allocated with <code>malloc()</code>; Readline
+frees the strings when it has finished with them.
+Such a generator function is referred to as an
+<em>application-specific completion function</em>.
+
+</li></ol>
+
+<dl class="def">
+<dt id="index-rl_005fcomplete"><span class="category">Function: </span><span><em>int</em> <strong>rl_complete</strong> <em>(int ignore, int invoking_key)</em><a href='#index-rl_005fcomplete' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Complete the word at or before point. You have supplied the function
+that does the initial simple matching selection algorithm (see
+<code>rl_completion_matches()</code>). The default is to do filename completion.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005fentry_005ffunction"><span class="category">Variable: </span><span><em>rl_compentry_func_t *</em> <strong>rl_completion_entry_function</strong><a href='#index-rl_005fcompletion_005fentry_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This is a pointer to the generator function for
+<code>rl_completion_matches()</code>.
+If the value of <code>rl_completion_entry_function</code> is
+<code>NULL</code> then the default filename generator
+function, <code>rl_filename_completion_function()</code>, is used.
+An <em>application-specific completion function</em> is a function whose
+address is assigned to <code>rl_completion_entry_function</code> and whose
+return values are used to generate possible completions.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Completion-Functions">
+<div class="header">
+<p>
+Next: <a href="#Completion-Variables" accesskey="n" rel="next">Completion Variables</a>, Previous: <a href="#How-Completing-Works" accesskey="p" rel="prev">How Completing Works</a>, Up: <a href="#Custom-Completers" accesskey="u" rel="up">Custom Completers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Completion-Functions-1"></span><h4 class="subsection">2.6.2 Completion Functions</h4>
+
+<p>Here is the complete list of callable completion functions present in
+Readline.
+</p>
+<dl class="def">
+<dt id="index-rl_005fcomplete_005finternal"><span class="category">Function: </span><span><em>int</em> <strong>rl_complete_internal</strong> <em>(int what_to_do)</em><a href='#index-rl_005fcomplete_005finternal' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Complete the word at or before point. <var>what_to_do</var> says what to do
+with the completion. A value of &lsquo;<samp>?</samp>&rsquo; means list the possible
+completions. &lsquo;<samp>TAB</samp>&rsquo; means do standard completion. &lsquo;<samp>*</samp>&rsquo; means
+insert all of the possible completions. &lsquo;<samp>!</samp>&rsquo; means to display
+all of the possible completions, if there is more than one, as well as
+performing partial completion. &lsquo;<samp>@</samp>&rsquo; is similar to &lsquo;<samp>!</samp>&rsquo;, but
+possible completions are not listed if the possible completions share
+a common prefix.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcomplete-1"><span class="category">Function: </span><span><em>int</em> <strong>rl_complete</strong> <em>(int ignore, int invoking_key)</em><a href='#index-rl_005fcomplete-1' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Complete the word at or before point. You have supplied the function
+that does the initial simple matching selection algorithm (see
+<code>rl_completion_matches()</code> and <code>rl_completion_entry_function</code>).
+The default is to do filename
+completion. This calls <code>rl_complete_internal()</code> with an
+argument depending on <var>invoking_key</var>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fpossible_005fcompletions"><span class="category">Function: </span><span><em>int</em> <strong>rl_possible_completions</strong> <em>(int count, int invoking_key)</em><a href='#index-rl_005fpossible_005fcompletions' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>List the possible completions. See description of <code>rl_complete
+()</code>. This calls <code>rl_complete_internal()</code> with an argument of
+&lsquo;<samp>?</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005finsert_005fcompletions"><span class="category">Function: </span><span><em>int</em> <strong>rl_insert_completions</strong> <em>(int count, int invoking_key)</em><a href='#index-rl_005finsert_005fcompletions' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert the list of possible completions into the line, deleting the
+partially-completed word. See description of <code>rl_complete()</code>.
+This calls <code>rl_complete_internal()</code> with an argument of &lsquo;<samp>*</samp>&rsquo;.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005fmode"><span class="category">Function: </span><span><em>int</em> <strong>rl_completion_mode</strong> <em>(rl_command_func_t *cfunc)</em><a href='#index-rl_005fcompletion_005fmode' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Returns the appropriate value to pass to <code>rl_complete_internal()</code>
+depending on whether <var>cfunc</var> was called twice in succession and
+the values of the <code>show-all-if-ambiguous</code> and
+<code>show-all-if-unmodified</code> variables.
+Application-specific completion functions may use this function to present
+the same interface as <code>rl_complete()</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005fmatches"><span class="category">Function: </span><span><em>char **</em> <strong>rl_completion_matches</strong> <em>(const char *text, rl_compentry_func_t *entry_func)</em><a href='#index-rl_005fcompletion_005fmatches' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Returns an array of strings which is a list of completions for
+<var>text</var>. If there are no completions, returns <code>NULL</code>.
+The first entry in the returned array is the substitution for <var>text</var>.
+The remaining entries are the possible completions. The array is
+terminated with a <code>NULL</code> pointer.
+</p>
+<p><var>entry_func</var> is a function of two args, and returns a
+<code>char *</code>. The first argument is <var>text</var>. The second is a
+state argument; it is zero on the first call, and non-zero on subsequent
+calls. <var>entry_func</var> returns a <code>NULL</code> pointer to the caller
+when there are no more matches.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffilename_005fcompletion_005ffunction"><span class="category">Function: </span><span><em>char *</em> <strong>rl_filename_completion_function</strong> <em>(const char *text, int state)</em><a href='#index-rl_005ffilename_005fcompletion_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A generator function for filename completion in the general case.
+<var>text</var> is a partial filename.
+The Bash source is a useful reference for writing application-specific
+completion functions (the Bash completion functions call this and other
+Readline functions).
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fusername_005fcompletion_005ffunction"><span class="category">Function: </span><span><em>char *</em> <strong>rl_username_completion_function</strong> <em>(const char *text, int state)</em><a href='#index-rl_005fusername_005fcompletion_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A completion generator for usernames. <var>text</var> contains a partial
+username preceded by a random character (usually &lsquo;<samp>~</samp>&rsquo;). As with all
+completion generators, <var>state</var> is zero on the first call and non-zero
+for subsequent calls.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="Completion-Variables">
+<div class="header">
+<p>
+Next: <a href="#A-Short-Completion-Example" accesskey="n" rel="next">A Short Completion Example</a>, Previous: <a href="#Completion-Functions" accesskey="p" rel="prev">Completion Functions</a>, Up: <a href="#Custom-Completers" accesskey="u" rel="up">Custom Completers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Completion-Variables-1"></span><h4 class="subsection">2.6.3 Completion Variables</h4>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005fentry_005ffunction-1"><span class="category">Variable: </span><span><em>rl_compentry_func_t *</em> <strong>rl_completion_entry_function</strong><a href='#index-rl_005fcompletion_005fentry_005ffunction-1' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A pointer to the generator function for <code>rl_completion_matches()</code>.
+<code>NULL</code> means to use <code>rl_filename_completion_function()</code>,
+the default filename completer.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fattempted_005fcompletion_005ffunction"><span class="category">Variable: </span><span><em>rl_completion_func_t *</em> <strong>rl_attempted_completion_function</strong><a href='#index-rl_005fattempted_005fcompletion_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A pointer to an alternative function to create matches.
+The function is called with <var>text</var>, <var>start</var>, and <var>end</var>.
+<var>start</var> and <var>end</var> are indices in <code>rl_line_buffer</code> defining
+the boundaries of <var>text</var>, which is a character string.
+If this function exists and returns <code>NULL</code>, or if this variable is
+set to <code>NULL</code>, then <code>rl_complete()</code> will call the value of
+<code>rl_completion_entry_function</code> to generate matches, otherwise the
+array of strings returned will be used.
+If this function sets the <code>rl_attempted_completion_over</code>
+variable to a non-zero value, Readline will not perform its default
+completion even if this function returns no matches.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffilename_005fquoting_005ffunction"><span class="category">Variable: </span><span><em>rl_quote_func_t *</em> <strong>rl_filename_quoting_function</strong><a href='#index-rl_005ffilename_005fquoting_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A pointer to a function that will quote a filename in an
+application-specific fashion. This is called if filename completion is being
+attempted and one of the characters in <code>rl_filename_quote_characters</code>
+appears in a completed filename. The function is called with
+<var>text</var>, <var>match_type</var>, and <var>quote_pointer</var>. The <var>text</var>
+is the filename to be quoted. The <var>match_type</var> is either
+<code>SINGLE_MATCH</code>, if there is only one completion match, or
+<code>MULT_MATCH</code>. Some functions use this to decide whether or not to
+insert a closing quote character. The <var>quote_pointer</var> is a pointer
+to any opening quote character the user typed. Some functions choose
+to reset this character.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffilename_005fdequoting_005ffunction"><span class="category">Variable: </span><span><em>rl_dequote_func_t *</em> <strong>rl_filename_dequoting_function</strong><a href='#index-rl_005ffilename_005fdequoting_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A pointer to a function that will remove application-specific quoting
+characters from a filename before completion is attempted, so those
+characters do not interfere with matching the text against names in
+the filesystem. It is called with <var>text</var>, the text of the word
+to be dequoted, and <var>quote_char</var>, which is the quoting character
+that delimits the filename (usually &lsquo;<samp>'</samp>&rsquo; or &lsquo;<samp>&quot;</samp>&rsquo;). If
+<var>quote_char</var> is zero, the filename was not in an embedded string.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fchar_005fis_005fquoted_005fp"><span class="category">Variable: </span><span><em>rl_linebuf_func_t *</em> <strong>rl_char_is_quoted_p</strong><a href='#index-rl_005fchar_005fis_005fquoted_005fp' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A pointer to a function to call that determines whether or not a specific
+character in the line buffer is quoted, according to whatever quoting
+mechanism the program calling Readline uses. The function is called with
+two arguments: <var>text</var>, the text of the line, and <var>index</var>, the
+index of the character in the line. It is used to decide whether a
+character found in <code>rl_completer_word_break_characters</code> should be
+used to break words for the completer.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fignore_005fsome_005fcompletions_005ffunction"><span class="category">Variable: </span><span><em>rl_compignore_func_t *</em> <strong>rl_ignore_some_completions_function</strong><a href='#index-rl_005fignore_005fsome_005fcompletions_005ffunction' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This function, if defined, is called by the completer when real filename
+completion is done, after all the matching names have been generated.
+It is passed a <code>NULL</code> terminated array of matches.
+The first element (<code>matches[0]</code>) is the
+maximal substring common to all matches. This function can
+re-arrange the list of matches as required, but each element deleted
+from the array must be freed.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fdirectory_005fcompletion_005fhook"><span class="category">Variable: </span><span><em>rl_icppfunc_t *</em> <strong>rl_directory_completion_hook</strong><a href='#index-rl_005fdirectory_005fcompletion_005fhook' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This function, if defined, is allowed to modify the directory portion
+of filenames Readline completes.
+It could be used to expand symbolic links or shell variables in pathnames.
+It is called with the address of a string (the current directory name) as an
+argument, and may modify that string.
+If the string is replaced with a new string, the old value should be freed.
+Any modified directory name should have a trailing slash.
+The modified value will be used as part of the completion, replacing
+the directory portion of the pathname the user typed.
+At the least, even if no other expansion is performed, this function should
+remove any quote characters from the directory name, because its result will
+be passed directly to <code>opendir()</code>.
+</p>
+<p>The directory completion hook returns an integer that should be non-zero if
+the function modifies its directory argument.
+The function should not modify the directory argument if it returns 0.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fdirectory_005frewrite_005fhook_003b"><span class="category">Variable: </span><span><em>rl_icppfunc_t *</em> <strong>rl_directory_rewrite_hook;</strong><a href='#index-rl_005fdirectory_005frewrite_005fhook_003b' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, this is the address of a function to call when completing
+a directory name. This function takes the address of the directory name
+to be modified as an argument. Unlike <code>rl_directory_completion_hook</code>,
+it only modifies the directory name used in <code>opendir</code>, not what is
+displayed when the possible completions are printed or inserted. It is
+called before rl_directory_completion_hook.
+At the least, even if no other expansion is performed, this function should
+remove any quote characters from the directory name, because its result will
+be passed directly to <code>opendir()</code>.
+</p>
+<p>The directory rewrite hook returns an integer that should be non-zero if
+the function modifies its directory argument.
+The function should not modify the directory argument if it returns 0.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffilename_005fstat_005fhook"><span class="category">Variable: </span><span><em>rl_icppfunc_t *</em> <strong>rl_filename_stat_hook</strong><a href='#index-rl_005ffilename_005fstat_005fhook' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, this is the address of a function for the completer to
+call before deciding which character to append to a completed name.
+This function modifies its filename name argument, and the modified value
+is passed to <code>stat()</code> to determine the file&rsquo;s type and characteristics.
+This function does not need to remove quote characters from the filename.
+</p>
+<p>The stat hook returns an integer that should be non-zero if
+the function modifies its directory argument.
+The function should not modify the directory argument if it returns 0.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffilename_005frewrite_005fhook"><span class="category">Variable: </span><span><em>rl_dequote_func_t *</em> <strong>rl_filename_rewrite_hook</strong><a href='#index-rl_005ffilename_005frewrite_005fhook' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, this is the address of a function called when reading
+directory entries from the filesystem for completion and comparing
+them to the partial word to be completed. The function should
+perform any necessary application or system-specific conversion on
+the filename, such as converting between character sets or converting
+from a filesystem format to a character input format.
+The function takes two arguments: <var>fname</var>, the filename to be converted,
+and <var>fnlen</var>, its length in bytes.
+It must either return its first argument (if no conversion takes place)
+or the converted filename in newly-allocated memory. The converted
+form is used to compare against the word to be completed, and, if it
+matches, is added to the list of matches. Readline will free the
+allocated string.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005fdisplay_005fmatches_005fhook"><span class="category">Variable: </span><span><em>rl_compdisp_func_t *</em> <strong>rl_completion_display_matches_hook</strong><a href='#index-rl_005fcompletion_005fdisplay_005fmatches_005fhook' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, then this is the address of a function to call when
+completing a word would normally display the list of possible matches.
+This function is called in lieu of Readline displaying the list.
+It takes three arguments:
+(<code>char **</code><var>matches</var>, <code>int</code> <var>num_matches</var>, <code>int</code> <var>max_length</var>)
+where <var>matches</var> is the array of matching strings,
+<var>num_matches</var> is the number of strings in that array, and
+<var>max_length</var> is the length of the longest string in that array.
+Readline provides a convenience function, <code>rl_display_match_list</code>,
+that takes care of doing the display to Readline&rsquo;s output stream.
+You may call that function from this hook.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fbasic_005fword_005fbreak_005fcharacters"><span class="category">Variable: </span><span><em>const char *</em> <strong>rl_basic_word_break_characters</strong><a href='#index-rl_005fbasic_005fword_005fbreak_005fcharacters' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The basic list of characters that signal a break between words for the
+completer routine. The default value of this variable is the characters
+which break words for completion in Bash:
+<code>&quot; \t\n\&quot;\\'`@$&gt;&lt;=;|&amp;{(&quot;</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fbasic_005fquote_005fcharacters"><span class="category">Variable: </span><span><em>const char *</em> <strong>rl_basic_quote_characters</strong><a href='#index-rl_005fbasic_005fquote_005fcharacters' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A list of quote characters which can cause a word break.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompleter_005fword_005fbreak_005fcharacters"><span class="category">Variable: </span><span><em>const char *</em> <strong>rl_completer_word_break_characters</strong><a href='#index-rl_005fcompleter_005fword_005fbreak_005fcharacters' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The list of characters that signal a break between words for
+<code>rl_complete_internal()</code>. The default list is the value of
+<code>rl_basic_word_break_characters</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005fword_005fbreak_005fhook"><span class="category">Variable: </span><span><em>rl_cpvfunc_t *</em> <strong>rl_completion_word_break_hook</strong><a href='#index-rl_005fcompletion_005fword_005fbreak_005fhook' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, this is the address of a function to call when Readline is
+deciding where to separate words for word completion. It should return
+a character string like <code>rl_completer_word_break_characters</code> to be
+used to perform the current completion. The function may choose to set
+<code>rl_completer_word_break_characters</code> itself. If the function
+returns <code>NULL</code>, <code>rl_completer_word_break_characters</code> is used.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompleter_005fquote_005fcharacters"><span class="category">Variable: </span><span><em>const char *</em> <strong>rl_completer_quote_characters</strong><a href='#index-rl_005fcompleter_005fquote_005fcharacters' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A list of characters which can be used to quote a substring of the line.
+Completion occurs on the entire substring, and within the substring
+<code>rl_completer_word_break_characters</code> are treated as any other character,
+unless they also appear within this list.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffilename_005fquote_005fcharacters"><span class="category">Variable: </span><span><em>const char *</em> <strong>rl_filename_quote_characters</strong><a href='#index-rl_005ffilename_005fquote_005fcharacters' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A list of characters that cause a filename to be quoted by the completer
+when they appear in a completed filename. The default is the null string.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fspecial_005fprefixes"><span class="category">Variable: </span><span><em>const char *</em> <strong>rl_special_prefixes</strong><a href='#index-rl_005fspecial_005fprefixes' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The list of characters that are word break characters, but should be
+left in <var>text</var> when it is passed to the completion function.
+Programs can use this to help determine what kind of completing to do.
+For instance, Bash sets this variable to &quot;$@&quot; so that it can complete
+shell variables and hostnames.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005fquery_005fitems"><span class="category">Variable: </span><span><em>int</em> <strong>rl_completion_query_items</strong><a href='#index-rl_005fcompletion_005fquery_005fitems' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Up to this many items will be displayed in response to a
+possible-completions call. After that, Readline asks the user for
+confirmation before displaying them.
+The default value is 100. A negative value
+indicates that Readline should never ask for confirmation.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005fappend_005fcharacter"><span class="category">Variable: </span><span><em>int</em> <strong>rl_completion_append_character</strong><a href='#index-rl_005fcompletion_005fappend_005fcharacter' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When a single completion alternative matches at the end of the command
+line, this character is appended to the inserted completion text. The
+default is a space character (&lsquo;<samp> </samp>&rsquo;). Setting this to the null
+character (&lsquo;<samp>\0</samp>&rsquo;) prevents anything being appended automatically.
+This can be changed in application-specific completion functions to
+provide the &ldquo;most sensible word separator character&rdquo; according to
+an application-specific command line syntax specification.
+It is set to the default before any application-specific completion function
+is called, and may only be changed within such a function.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005fsuppress_005fappend"><span class="category">Variable: </span><span><em>int</em> <strong>rl_completion_suppress_append</strong><a href='#index-rl_005fcompletion_005fsuppress_005fappend' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, <var>rl_completion_append_character</var> is not appended to
+matches at the end of the command line, as described above.
+It is set to 0 before any application-specific completion function
+is called, and may only be changed within such a function.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005fquote_005fcharacter"><span class="category">Variable: </span><span><em>int</em> <strong>rl_completion_quote_character</strong><a href='#index-rl_005fcompletion_005fquote_005fcharacter' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When Readline is completing quoted text, as delimited by one of the
+characters in <var>rl_completer_quote_characters</var>, it sets this variable
+to the quoting character found.
+This is set before any application-specific completion function is called.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005fsuppress_005fquote"><span class="category">Variable: </span><span><em>int</em> <strong>rl_completion_suppress_quote</strong><a href='#index-rl_005fcompletion_005fsuppress_005fquote' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, Readline does not append a matching quote character when
+performing completion on a quoted string.
+It is set to 0 before any application-specific completion function
+is called, and may only be changed within such a function.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005ffound_005fquote"><span class="category">Variable: </span><span><em>int</em> <strong>rl_completion_found_quote</strong><a href='#index-rl_005fcompletion_005ffound_005fquote' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When Readline is completing quoted text, it sets this variable
+to a non-zero value if the word being completed contains or is delimited
+by any quoting characters, including backslashes.
+This is set before any application-specific completion function is called.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005fmark_005fsymlink_005fdirs"><span class="category">Variable: </span><span><em>int</em> <strong>rl_completion_mark_symlink_dirs</strong><a href='#index-rl_005fcompletion_005fmark_005fsymlink_005fdirs' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, a slash will be appended to completed filenames that are
+symbolic links to directory names, subject to the value of the
+user-settable <var>mark-directories</var> variable.
+This variable exists so that application-specific completion functions
+can override the user&rsquo;s global preference (set via the
+<var>mark-symlinked-directories</var> Readline variable) if appropriate.
+This variable is set to the user&rsquo;s preference before any
+application-specific completion function is called, so unless that
+function modifies the value, the user&rsquo;s preferences are honored.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fignore_005fcompletion_005fduplicates"><span class="category">Variable: </span><span><em>int</em> <strong>rl_ignore_completion_duplicates</strong><a href='#index-rl_005fignore_005fcompletion_005fduplicates' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If non-zero, then duplicates in the matches are removed.
+The default is 1.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffilename_005fcompletion_005fdesired"><span class="category">Variable: </span><span><em>int</em> <strong>rl_filename_completion_desired</strong><a href='#index-rl_005ffilename_005fcompletion_005fdesired' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Non-zero means that the results of the matches are to be treated as
+filenames. This is <em>always</em> zero when completion is attempted,
+and can only be changed
+within an application-specific completion function. If it is set to a
+non-zero value by such a function, directory names have a slash appended
+and Readline attempts to quote completed filenames if they contain any
+characters in <code>rl_filename_quote_characters</code> and
+<code>rl_filename_quoting_desired</code> is set to a non-zero value.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005ffilename_005fquoting_005fdesired"><span class="category">Variable: </span><span><em>int</em> <strong>rl_filename_quoting_desired</strong><a href='#index-rl_005ffilename_005fquoting_005fdesired' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Non-zero means that the results of the matches are to be quoted using
+double quotes (or an application-specific quoting mechanism) if the
+completed filename contains any characters in
+<code>rl_filename_quote_chars</code>. This is <em>always</em> non-zero
+when completion is attempted, and can only be changed within an
+application-specific completion function.
+The quoting is effected via a call to the function pointed to
+by <code>rl_filename_quoting_function</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fattempted_005fcompletion_005fover"><span class="category">Variable: </span><span><em>int</em> <strong>rl_attempted_completion_over</strong><a href='#index-rl_005fattempted_005fcompletion_005fover' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If an application-specific completion function assigned to
+<code>rl_attempted_completion_function</code> sets this variable to a non-zero
+value, Readline will not perform its default filename completion even
+if the application&rsquo;s completion function returns no matches.
+It should be set only by an application&rsquo;s completion function.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fsort_005fcompletion_005fmatches"><span class="category">Variable: </span><span><em>int</em> <strong>rl_sort_completion_matches</strong><a href='#index-rl_005fsort_005fcompletion_005fmatches' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If an application sets this variable to 0, Readline will not sort the
+list of completions (which implies that it cannot remove any duplicate
+completions). The default value is 1, which means that Readline will
+sort the completions and, depending on the value of
+<code>rl_ignore_completion_duplicates</code>, will attempt to remove duplicate
+matches.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005ftype"><span class="category">Variable: </span><span><em>int</em> <strong>rl_completion_type</strong><a href='#index-rl_005fcompletion_005ftype' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set to a character describing the type of completion Readline is currently
+attempting; see the description of <code>rl_complete_internal()</code>
+(see <a href="#Completion-Functions">Completion Functions</a>) for the list of characters.
+This is set to the appropriate value before any application-specific
+completion function is called, allowing such functions to present
+the same interface as <code>rl_complete()</code>.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005fcompletion_005finvoking_005fkey"><span class="category">Variable: </span><span><em>int</em> <strong>rl_completion_invoking_key</strong><a href='#index-rl_005fcompletion_005finvoking_005fkey' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set to the final character in the key sequence that invoked one of the
+completion functions that call <code>rl_complete_internal()</code>. This is
+set to the appropriate value before any application-specific completion
+function is called.
+</p></dd></dl>
+
+<dl class="def">
+<dt id="index-rl_005finhibit_005fcompletion"><span class="category">Variable: </span><span><em>int</em> <strong>rl_inhibit_completion</strong><a href='#index-rl_005finhibit_005fcompletion' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If this variable is non-zero, completion is inhibited. The completion
+character will be inserted as any other bound to <code>self-insert</code>.
+</p></dd></dl>
+
+<hr>
+</div>
+<div class="subsection" id="A-Short-Completion-Example">
+<div class="header">
+<p>
+Previous: <a href="#Completion-Variables" accesskey="p" rel="prev">Completion Variables</a>, Up: <a href="#Custom-Completers" accesskey="u" rel="up">Custom Completers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="A-Short-Completion-Example-1"></span><h4 class="subsection">2.6.4 A Short Completion Example</h4>
+
+<p>Here is a small application demonstrating the use of the GNU Readline
+library. It is called <code>fileman</code>, and the source code resides in
+<samp>examples/fileman.c</samp>. This sample application provides
+completion of command names, line editing features, and access to the
+history list.
+</p>
+<div class="example">
+<pre class="example">/* fileman.c -- A tiny application which demonstrates how to use the
+ GNU Readline library. This application interactively allows users
+ to manipulate files and their modes. */
+
+#ifdef HAVE_CONFIG_H
+# include &lt;config.h&gt;
+#endif
+
+#include &lt;sys/types.h&gt;
+#ifdef HAVE_SYS_FILE_H
+# include &lt;sys/file.h&gt;
+#endif
+#include &lt;sys/stat.h&gt;
+
+#ifdef HAVE_UNISTD_H
+# include &lt;unistd.h&gt;
+#endif
+
+#include &lt;fcntl.h&gt;
+#include &lt;stdio.h&gt;
+#include &lt;errno.h&gt;
+#include &lt;locale.h&gt;
+
+#if defined (HAVE_STRING_H)
+# include &lt;string.h&gt;
+#else /* !HAVE_STRING_H */
+# include &lt;strings.h&gt;
+#endif /* !HAVE_STRING_H */
+
+#ifdef HAVE_STDLIB_H
+# include &lt;stdlib.h&gt;
+#endif
+
+#include &lt;time.h&gt;
+
+#include &lt;readline/readline.h&gt;
+#include &lt;readline/history.h&gt;
+
+extern char *xmalloc PARAMS((size_t));
+
+/* The names of functions that actually do the manipulation. */
+int com_list PARAMS((char *));
+int com_view PARAMS((char *));
+int com_rename PARAMS((char *));
+int com_stat PARAMS((char *));
+int com_pwd PARAMS((char *));
+int com_delete PARAMS((char *));
+int com_help PARAMS((char *));
+int com_cd PARAMS((char *));
+int com_quit PARAMS((char *));
+
+/* A structure which contains information on the commands this program
+ can understand. */
+
+typedef struct {
+ char *name; /* User printable name of the function. */
+ rl_icpfunc_t *func; /* Function to call to do the job. */
+ char *doc; /* Documentation for this function. */
+} COMMAND;
+
+COMMAND commands[] = {
+ { &quot;cd&quot;, com_cd, &quot;Change to directory DIR&quot; },
+ { &quot;delete&quot;, com_delete, &quot;Delete FILE&quot; },
+ { &quot;help&quot;, com_help, &quot;Display this text&quot; },
+ { &quot;?&quot;, com_help, &quot;Synonym for `help'&quot; },
+ { &quot;list&quot;, com_list, &quot;List files in DIR&quot; },
+ { &quot;ls&quot;, com_list, &quot;Synonym for `list'&quot; },
+ { &quot;pwd&quot;, com_pwd, &quot;Print the current working directory&quot; },
+ { &quot;quit&quot;, com_quit, &quot;Quit using Fileman&quot; },
+ { &quot;rename&quot;, com_rename, &quot;Rename FILE to NEWNAME&quot; },
+ { &quot;stat&quot;, com_stat, &quot;Print out statistics on FILE&quot; },
+ { &quot;view&quot;, com_view, &quot;View the contents of FILE&quot; },
+ { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
+};
+
+/* Forward declarations. */
+char *stripwhite ();
+COMMAND *find_command ();
+
+/* The name of this program, as taken from argv[0]. */
+char *progname;
+
+/* When non-zero, this global means the user is done using this program. */
+int done;
+
+char *
+dupstr (s)
+ char *s;
+{
+ char *r;
+
+ r = xmalloc (strlen (s) + 1);
+ strcpy (r, s);
+ return (r);
+}
+
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *line, *s;
+
+ setlocale (LC_ALL, &quot;&quot;);
+
+ progname = argv[0];
+
+ initialize_readline (); /* Bind our completer. */
+
+ /* Loop reading and executing lines until the user quits. */
+ for ( ; done == 0; )
+ {
+ line = readline (&quot;FileMan: &quot;);
+
+ if (!line)
+ break;
+
+ /* Remove leading and trailing whitespace from the line.
+ Then, if there is anything left, add it to the history list
+ and execute it. */
+ s = stripwhite (line);
+
+ if (*s)
+ {
+ add_history (s);
+ execute_line (s);
+ }
+
+ free (line);
+ }
+ exit (0);
+}
+
+/* Execute a command line. */
+int
+execute_line (line)
+ char *line;
+{
+ register int i;
+ COMMAND *command;
+ char *word;
+
+ /* Isolate the command word. */
+ i = 0;
+ while (line[i] &amp;&amp; whitespace (line[i]))
+ i++;
+ word = line + i;
+
+ while (line[i] &amp;&amp; !whitespace (line[i]))
+ i++;
+
+ if (line[i])
+ line[i++] = '\0';
+
+ command = find_command (word);
+
+ if (!command)
+ {
+ fprintf (stderr, &quot;%s: No such command for FileMan.\n&quot;, word);
+ return (-1);
+ }
+
+ /* Get argument to command, if any. */
+ while (whitespace (line[i]))
+ i++;
+
+ word = line + i;
+
+ /* Call the function. */
+ return ((*(command-&gt;func)) (word));
+}
+
+/* Look up NAME as the name of a command, and return a pointer to that
+ command. Return a NULL pointer if NAME isn't a command name. */
+COMMAND *
+find_command (name)
+ char *name;
+{
+ register int i;
+
+ for (i = 0; commands[i].name; i++)
+ if (strcmp (name, commands[i].name) == 0)
+ return (&amp;commands[i]);
+
+ return ((COMMAND *)NULL);
+}
+
+/* Strip whitespace from the start and end of STRING. Return a pointer
+ into STRING. */
+char *
+stripwhite (string)
+ char *string;
+{
+ register char *s, *t;
+
+ for (s = string; whitespace (*s); s++)
+ ;
+
+ if (*s == 0)
+ return (s);
+
+ t = s + strlen (s) - 1;
+ while (t &gt; s &amp;&amp; whitespace (*t))
+ t--;
+ *++t = '\0';
+
+ return s;
+}
+
+/* **************************************************************** */
+/* */
+/* Interface to Readline Completion */
+/* */
+/* **************************************************************** */
+
+char *command_generator PARAMS((const char *, int));
+char **fileman_completion PARAMS((const char *, int, int));
+
+/* Tell the GNU Readline library how to complete. We want to try to complete
+ on command names if this is the first word in the line, or on filenames
+ if not. */
+initialize_readline ()
+{
+ /* Allow conditional parsing of the ~/.inputrc file. */
+ rl_readline_name = &quot;FileMan&quot;;
+
+ /* Tell the completer that we want a crack first. */
+ rl_attempted_completion_function = fileman_completion;
+}
+
+/* Attempt to complete on the contents of TEXT. START and END bound the
+ region of rl_line_buffer that contains the word to complete. TEXT is
+ the word to complete. We can use the entire contents of rl_line_buffer
+ in case we want to do some simple parsing. Return the array of matches,
+ or NULL if there aren't any. */
+char **
+fileman_completion (text, start, end)
+ const char *text;
+ int start, end;
+{
+ char **matches;
+
+ matches = (char **)NULL;
+
+ /* If this word is at the start of the line, then it is a command
+ to complete. Otherwise it is the name of a file in the current
+ directory. */
+ if (start == 0)
+ matches = rl_completion_matches (text, command_generator);
+
+ return (matches);
+}
+
+/* Generator function for command completion. STATE lets us know whether
+ to start from scratch; without any state (i.e. STATE == 0), then we
+ start at the top of the list. */
+char *
+command_generator (text, state)
+ const char *text;
+ int state;
+{
+ static int list_index, len;
+ char *name;
+
+ /* If this is a new word to complete, initialize now. This includes
+ saving the length of TEXT for efficiency, and initializing the index
+ variable to 0. */
+ if (!state)
+ {
+ list_index = 0;
+ len = strlen (text);
+ }
+
+ /* Return the next name which partially matches from the command list. */
+ while (name = commands[list_index].name)
+ {
+ list_index++;
+
+ if (strncmp (name, text, len) == 0)
+ return (dupstr(name));
+ }
+
+ /* If no names matched, then return NULL. */
+ return ((char *)NULL);
+}
+
+/* **************************************************************** */
+/* */
+/* FileMan Commands */
+/* */
+/* **************************************************************** */
+
+/* String to pass to system (). This is for the LIST, VIEW and RENAME
+ commands. */
+static char syscom[1024];
+
+/* List the file(s) named in arg. */
+com_list (arg)
+ char *arg;
+{
+ if (!arg)
+ arg = &quot;&quot;;
+
+ sprintf (syscom, &quot;ls -FClg %s&quot;, arg);
+ return (system (syscom));
+}
+
+com_view (arg)
+ char *arg;
+{
+ if (!valid_argument (&quot;view&quot;, arg))
+ return 1;
+
+#if defined (__MSDOS__)
+ /* more.com doesn't grok slashes in pathnames */
+ sprintf (syscom, &quot;less %s&quot;, arg);
+#else
+ sprintf (syscom, &quot;more %s&quot;, arg);
+#endif
+ return (system (syscom));
+}
+
+com_rename (arg)
+ char *arg;
+{
+ too_dangerous (&quot;rename&quot;);
+ return (1);
+}
+
+com_stat (arg)
+ char *arg;
+{
+ struct stat finfo;
+
+ if (!valid_argument (&quot;stat&quot;, arg))
+ return (1);
+
+ if (stat (arg, &amp;finfo) == -1)
+ {
+ perror (arg);
+ return (1);
+ }
+
+ printf (&quot;Statistics for `%s':\n&quot;, arg);
+
+ printf (&quot;%s has %d link%s, and is %d byte%s in length.\n&quot;,
+ arg,
+ finfo.st_nlink,
+ (finfo.st_nlink == 1) ? &quot;&quot; : &quot;s&quot;,
+ finfo.st_size,
+ (finfo.st_size == 1) ? &quot;&quot; : &quot;s&quot;);
+ printf (&quot;Inode Last Change at: %s&quot;, ctime (&amp;finfo.st_ctime));
+ printf (&quot; Last access at: %s&quot;, ctime (&amp;finfo.st_atime));
+ printf (&quot; Last modified at: %s&quot;, ctime (&amp;finfo.st_mtime));
+ return (0);
+}
+
+com_delete (arg)
+ char *arg;
+{
+ too_dangerous (&quot;delete&quot;);
+ return (1);
+}
+
+/* Print out help for ARG, or for all of the commands if ARG is
+ not present. */
+com_help (arg)
+ char *arg;
+{
+ register int i;
+ int printed = 0;
+
+ for (i = 0; commands[i].name; i++)
+ {
+ if (!*arg || (strcmp (arg, commands[i].name) == 0))
+ {
+ printf (&quot;%s\t\t%s.\n&quot;, commands[i].name, commands[i].doc);
+ printed++;
+ }
+ }
+
+ if (!printed)
+ {
+ printf (&quot;No commands match `%s'. Possibilities are:\n&quot;, arg);
+
+ for (i = 0; commands[i].name; i++)
+ {
+ /* Print in six columns. */
+ if (printed == 6)
+ {
+ printed = 0;
+ printf (&quot;\n&quot;);
+ }
+
+ printf (&quot;%s\t&quot;, commands[i].name);
+ printed++;
+ }
+
+ if (printed)
+ printf (&quot;\n&quot;);
+ }
+ return (0);
+}
+
+/* Change to the directory ARG. */
+com_cd (arg)
+ char *arg;
+{
+ if (chdir (arg) == -1)
+ {
+ perror (arg);
+ return 1;
+ }
+
+ com_pwd (&quot;&quot;);
+ return (0);
+}
+
+/* Print out the current working directory. */
+com_pwd (ignore)
+ char *ignore;
+{
+ char dir[1024], *s;
+
+ s = getcwd (dir, sizeof(dir) - 1);
+ if (s == 0)
+ {
+ printf (&quot;Error getting pwd: %s\n&quot;, dir);
+ return 1;
+ }
+
+ printf (&quot;Current directory is %s\n&quot;, dir);
+ return 0;
+}
+
+/* The user wishes to quit using this program. Just set DONE non-zero. */
+com_quit (arg)
+ char *arg;
+{
+ done = 1;
+ return (0);
+}
+
+/* Function which tells you that you can't do this. */
+too_dangerous (caller)
+ char *caller;
+{
+ fprintf (stderr,
+ &quot;%s: Too dangerous for me to distribute. Write it yourself.\n&quot;,
+ caller);
+}
+
+/* Return non-zero if ARG is a valid argument for CALLER, else print
+ an error message and return zero. */
+int
+valid_argument (caller, arg)
+ char *caller, *arg;
+{
+ if (!arg || !*arg)
+ {
+ fprintf (stderr, &quot;%s: Argument required.\n&quot;, caller);
+ return (0);
+ }
+
+ return (1);
+}
+</pre></div>
+
+<hr>
+</div>
+</div>
+</div>
+<div class="appendix" id="GNU-Free-Documentation-License">
+<div class="header">
+<p>
+Next: <a href="#Concept-Index" accesskey="n" rel="next">Concept Index</a>, Previous: <a href="#Programming-with-GNU-Readline" accesskey="p" rel="prev">Programming with GNU Readline</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU Readline Library</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="GNU-Free-Documentation-License-1"></span><h2 class="appendix">Appendix A GNU Free Documentation License</h2>
+
+<div align="center">Version 1.3, 3 November 2008
+</div>
+
+<div class="display">
+<pre class="display">Copyright &copy; 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+<a href="http://fsf.org/">http://fsf.org/</a>
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></div>
+
+<ol start="0">
+<li> PREAMBLE
+
+<p>The purpose of this License is to make a manual, textbook, or other
+functional and useful document <em>free</em> in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+</p>
+<p>This License is a kind of &ldquo;copyleft&rdquo;, which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+</p>
+<p>We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+</p>
+</li><li> APPLICABILITY AND DEFINITIONS
+
+<p>This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The &ldquo;Document&rdquo;, below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as &ldquo;you&rdquo;. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</p>
+<p>A &ldquo;Modified Version&rdquo; of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+</p>
+<p>A &ldquo;Secondary Section&rdquo; is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document&rsquo;s overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+</p>
+<p>The &ldquo;Invariant Sections&rdquo; are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+</p>
+<p>The &ldquo;Cover Texts&rdquo; are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+</p>
+<p>A &ldquo;Transparent&rdquo; copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not &ldquo;Transparent&rdquo; is called &ldquo;Opaque&rdquo;.
+</p>
+<p>Examples of suitable formats for Transparent copies include plain
+<small>ASCII</small> without markup, Texinfo input format, LaTeX input
+format, <acronym>SGML</acronym> or <acronym>XML</acronym> using a publicly available
+<acronym>DTD</acronym>, and standard-conforming simple <acronym>HTML</acronym>,
+PostScript or <acronym>PDF</acronym> designed for human modification. Examples
+of transparent image formats include <acronym>PNG</acronym>, <acronym>XCF</acronym> and
+<acronym>JPG</acronym>. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, <acronym>SGML</acronym> or
+<acronym>XML</acronym> for which the <acronym>DTD</acronym> and/or processing tools are
+not generally available, and the machine-generated <acronym>HTML</acronym>,
+PostScript or <acronym>PDF</acronym> produced by some word processors for
+output purposes only.
+</p>
+<p>The &ldquo;Title Page&rdquo; means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, &ldquo;Title Page&rdquo; means
+the text near the most prominent appearance of the work&rsquo;s title,
+preceding the beginning of the body of the text.
+</p>
+<p>The &ldquo;publisher&rdquo; means any person or entity that distributes copies
+of the Document to the public.
+</p>
+<p>A section &ldquo;Entitled XYZ&rdquo; means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as &ldquo;Acknowledgements&rdquo;,
+&ldquo;Dedications&rdquo;, &ldquo;Endorsements&rdquo;, or &ldquo;History&rdquo;.) To &ldquo;Preserve the Title&rdquo;
+of such a section when you modify the Document means that it remains a
+section &ldquo;Entitled XYZ&rdquo; according to this definition.
+</p>
+<p>The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+</p>
+</li><li> VERBATIM COPYING
+
+<p>You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+</p>
+<p>You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</p>
+</li><li> COPYING IN QUANTITY
+
+<p>If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document&rsquo;s license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+</p>
+<p>If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+</p>
+<p>If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+</p>
+<p>It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+</p>
+</li><li> MODIFICATIONS
+
+<p>You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+</p>
+<ol type="A" start="1">
+<li> Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+</li><li> List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+</li><li> State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+</li><li> Preserve all the copyright notices of the Document.
+
+</li><li> Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+</li><li> Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+</li><li> Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document&rsquo;s license notice.
+
+</li><li> Include an unaltered copy of this License.
+
+</li><li> Preserve the section Entitled &ldquo;History&rdquo;, Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled &ldquo;History&rdquo; in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+</li><li> Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the &ldquo;History&rdquo; section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+</li><li> For any section Entitled &ldquo;Acknowledgements&rdquo; or &ldquo;Dedications&rdquo;, Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+</li><li> Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+</li><li> Delete any section Entitled &ldquo;Endorsements&rdquo;. Such a section
+may not be included in the Modified Version.
+
+</li><li> Do not retitle any existing section to be Entitled &ldquo;Endorsements&rdquo; or
+to conflict in title with any Invariant Section.
+
+</li><li> Preserve any Warranty Disclaimers.
+</li></ol>
+
+<p>If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version&rsquo;s license notice.
+These titles must be distinct from any other section titles.
+</p>
+<p>You may add a section Entitled &ldquo;Endorsements&rdquo;, provided it contains
+nothing but endorsements of your Modified Version by various
+parties&mdash;for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</p>
+<p>You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+</p>
+<p>The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+</p>
+</li><li> COMBINING DOCUMENTS
+
+<p>You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+</p>
+<p>The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+</p>
+<p>In the combination, you must combine any sections Entitled &ldquo;History&rdquo;
+in the various original documents, forming one section Entitled
+&ldquo;History&rdquo;; likewise combine any sections Entitled &ldquo;Acknowledgements&rdquo;,
+and any sections Entitled &ldquo;Dedications&rdquo;. You must delete all
+sections Entitled &ldquo;Endorsements.&rdquo;
+</p>
+</li><li> COLLECTIONS OF DOCUMENTS
+
+<p>You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+</p>
+<p>You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+</p>
+</li><li> AGGREGATION WITH INDEPENDENT WORKS
+
+<p>A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an &ldquo;aggregate&rdquo; if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation&rsquo;s users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+</p>
+<p>If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document&rsquo;s Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+</p>
+</li><li> TRANSLATION
+
+<p>Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+</p>
+<p>If a section in the Document is Entitled &ldquo;Acknowledgements&rdquo;,
+&ldquo;Dedications&rdquo;, or &ldquo;History&rdquo;, the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</p>
+</li><li> TERMINATION
+
+<p>You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+</p>
+<p>However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+</p>
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+</p>
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+</p>
+</li><li> FUTURE REVISIONS OF THIS LICENSE
+
+<p>The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+<a href="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</a>.
+</p>
+<p>Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License &ldquo;or any later version&rdquo; applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy&rsquo;s public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+</p>
+</li><li> RELICENSING
+
+<p>&ldquo;Massive Multiauthor Collaboration Site&rdquo; (or &ldquo;MMC Site&rdquo;) means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+&ldquo;Massive Multiauthor Collaboration&rdquo; (or &ldquo;MMC&rdquo;) contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+</p>
+<p>&ldquo;CC-BY-SA&rdquo; means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+</p>
+<p>&ldquo;Incorporate&rdquo; means to publish or republish a Document, in whole or
+in part, as part of another Document.
+</p>
+<p>An MMC is &ldquo;eligible for relicensing&rdquo; if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+</p>
+<p>The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+</p>
+</li></ol>
+
+<span id="ADDENDUM_003a-How-to-use-this-License-for-your-documents"></span><h3 class="heading">ADDENDUM: How to use this License for your documents</h3>
+
+<p>To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+</p>
+<div class="example">
+<pre class="example"> Copyright (C) <var>year</var> <var>your name</var>.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+</pre></div>
+
+<p>If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the &ldquo;with&hellip;Texts.&rdquo; line with this:
+</p>
+<div class="example">
+<pre class="example"> with the Invariant Sections being <var>list their titles</var>, with
+ the Front-Cover Texts being <var>list</var>, and with the Back-Cover Texts
+ being <var>list</var>.
+</pre></div>
+
+<p>If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</p>
+<p>If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+</p>
+
+
+<hr>
+</div>
+<div class="unnumbered" id="Concept-Index">
+<div class="header">
+<p>
+Next: <a href="#Function-and-Variable-Index" accesskey="n" rel="next">Function and Variable Index</a>, Previous: <a href="#GNU-Free-Documentation-License" accesskey="p" rel="prev">GNU Free Documentation License</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU Readline Library</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Concept-Index-1"></span><h2 class="unnumbered">Concept Index</h2>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Concept-Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-Y"><b>Y</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="index-cp" border="0">
+<tr><td></td><th align="left">Index Entry</th><td>&nbsp;</td><th align="left"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-application_002dspecific-completion-functions">application-specific completion functions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Custom-Completers">Custom Completers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-command-editing">command editing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Bare-Essentials">Readline Bare Essentials</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-editing-command-lines">editing command lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Bare-Essentials">Readline Bare Essentials</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-initialization-file_002c-readline">initialization file, readline</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File">Readline Init File</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-interaction_002c-readline">interaction, readline</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Interaction">Readline Interaction</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kill-ring">kill ring</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Killing-Commands">Readline Killing Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-killing-text">killing text</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Killing-Commands">Readline Killing Commands</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-notation_002c-readline">notation, readline</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Bare-Essentials">Readline Bare Essentials</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-readline_002c-function">readline, function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Basic-Behavior">Basic Behavior</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-variables_002c-readline">variables, readline</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-Index_cp_letter-Y">Y</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-yanking-text">yanking text</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Killing-Commands">Readline Killing Commands</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Concept-Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-Index_cp_letter-Y"><b>Y</b></a>
+ &nbsp;
+</td></tr></table>
+
+<hr>
+</div>
+<div class="unnumbered" id="Function-and-Variable-Index">
+<div class="header">
+<p>
+Previous: <a href="#Concept-Index" accesskey="p" rel="prev">Concept Index</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU Readline Library</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Concept-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Function-and-Variable-Index-1"></span><h2 class="unnumbered">Function and Variable Index</h2>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Function-and-Variable-Index_fn_symbol-1"><b>_</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-Y"><b>Y</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="index-fn" border="0">
+<tr><td></td><th align="left">Index Entry</th><td>&nbsp;</td><th align="left"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_symbol-1">_</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005frl_005fdigit_005fp"><code>_rl_digit_p</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005frl_005fdigit_005fvalue"><code>_rl_digit_value</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005frl_005flowercase_005fp"><code>_rl_lowercase_p</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005frl_005fto_005flower"><code>_rl_to_lower</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005frl_005fto_005fupper"><code>_rl_to_upper</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005frl_005fuppercase_005fp"><code>_rl_uppercase_p</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-abort-_0028C_002dg_0029"><code>abort (C-g)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-accept_002dline-_0028Newline-or-Return_0029"><code>accept-line (Newline or Return)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-active_002dregion_002dend_002dcolor">active-region-end-color</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-active_002dregion_002dstart_002dcolor">active-region-start-color</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-backward_002dchar-_0028C_002db_0029"><code>backward-char (C-b)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Moving">Commands For Moving</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-backward_002ddelete_002dchar-_0028Rubout_0029"><code>backward-delete-char (Rubout)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029"><code>backward-kill-line (C-x Rubout)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-backward_002dkill_002dword-_0028M_002dDEL_0029"><code>backward-kill-word (M-<span class="key">DEL</span>)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-backward_002dword-_0028M_002db_0029"><code>backward-word (M-b)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Moving">Commands For Moving</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-beginning_002dof_002dhistory-_0028M_002d_003c_0029"><code>beginning-of-history (M-&lt;)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-beginning_002dof_002dline-_0028C_002da_0029"><code>beginning-of-line (C-a)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Moving">Commands For Moving</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bell_002dstyle">bell-style</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bind_002dtty_002dspecial_002dchars">bind-tty-special-chars</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-blink_002dmatching_002dparen">blink-matching-paren</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bracketed_002dpaste_002dbegin-_0028_0029"><code>bracketed-paste-begin ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-call_002dlast_002dkbd_002dmacro-_0028C_002dx-e_0029"><code>call-last-kbd-macro (C-x e)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Macros">Keyboard Macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-capitalize_002dword-_0028M_002dc_0029"><code>capitalize-word (M-c)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-character_002dsearch-_0028C_002d_005d_0029"><code>character-search (C-])</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-character_002dsearch_002dbackward-_0028M_002dC_002d_005d_0029"><code>character-search-backward (M-C-])</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-clear_002ddisplay-_0028M_002dC_002dl_0029"><code>clear-display (M-C-l)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Moving">Commands For Moving</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-clear_002dscreen-_0028C_002dl_0029"><code>clear-screen (C-l)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Moving">Commands For Moving</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-colored_002dcompletion_002dprefix">colored-completion-prefix</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-colored_002dstats">colored-stats</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-comment_002dbegin">comment-begin</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-complete-_0028TAB_0029"><code>complete (<span class="key">TAB</span>)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Completion">Commands For Completion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-completion_002ddisplay_002dwidth">completion-display-width</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-completion_002dignore_002dcase">completion-ignore-case</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-completion_002dmap_002dcase">completion-map-case</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-completion_002dprefix_002ddisplay_002dlength">completion-prefix-display-length</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-completion_002dquery_002ditems">completion-query-items</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-convert_002dmeta">convert-meta</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-copy_002dbackward_002dword-_0028_0029"><code>copy-backward-word ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-copy_002dforward_002dword-_0028_0029"><code>copy-forward-word ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-copy_002dregion_002das_002dkill-_0028_0029"><code>copy-region-as-kill ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-delete_002dchar-_0028C_002dd_0029"><code>delete-char (C-d)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-delete_002dchar_002dor_002dlist-_0028_0029"><code>delete-char-or-list ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Completion">Commands For Completion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-delete_002dhorizontal_002dspace-_0028_0029"><code>delete-horizontal-space ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-digit_002dargument-_0028M_002d0_002c-M_002d1_002c-_2026-M_002d_002d_0029"><code>digit-argument (<kbd>M-0</kbd>, <kbd>M-1</kbd>, &hellip; <kbd>M--</kbd>)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Numeric-Arguments">Numeric Arguments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-disable_002dcompletion">disable-completion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-do_002dlowercase_002dversion-_0028M_002dA_002c-M_002dB_002c-M_002dx_002c-_2026_0029"><code>do-lowercase-version (M-A, M-B, M-<var>x</var>, &hellip;)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-downcase_002dword-_0028M_002dl_0029"><code>downcase-word (M-l)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dump_002dfunctions-_0028_0029"><code>dump-functions ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dump_002dmacros-_0028_0029"><code>dump-macros ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dump_002dvariables-_0028_0029"><code>dump-variables ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-echo_002dcontrol_002dcharacters">echo-control-characters</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-editing_002dmode">editing-mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-emacs_002dediting_002dmode-_0028C_002de_0029"><code>emacs-editing-mode (C-e)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-emacs_002dmode_002dstring">emacs-mode-string</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-enable_002dactive_002dregion">enable-active-region</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-enable_002dbracketed_002dpaste">enable-bracketed-paste</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-enable_002dkeypad">enable-keypad</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-end_002dkbd_002dmacro-_0028C_002dx-_0029_0029"><code>end-kbd-macro (C-x ))</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Macros">Keyboard Macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-end_002dof_002dfile-_0028usually-C_002dd_0029"><code><i>end-of-file</i> (usually C-d)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-end_002dof_002dhistory-_0028M_002d_003e_0029"><code>end-of-history (M-&gt;)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-end_002dof_002dline-_0028C_002de_0029"><code>end-of-line (C-e)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Moving">Commands For Moving</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-exchange_002dpoint_002dand_002dmark-_0028C_002dx-C_002dx_0029"><code>exchange-point-and-mark (C-x C-x)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expand_002dtilde">expand-tilde</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fetch_002dhistory-_0028_0029"><code>fetch-history ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-forward_002dbackward_002ddelete_002dchar-_0028_0029"><code>forward-backward-delete-char ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-forward_002dchar-_0028C_002df_0029"><code>forward-char (C-f)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Moving">Commands For Moving</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-forward_002dsearch_002dhistory-_0028C_002ds_0029"><code>forward-search-history (C-s)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-forward_002dword-_0028M_002df_0029"><code>forward-word (M-f)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Moving">Commands For Moving</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_002dpreserve_002dpoint">history-preserve-point</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_002dsearch_002dbackward-_0028_0029"><code>history-search-backward ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_002dsearch_002dforward-_0028_0029"><code>history-search-forward ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_002dsize">history-size</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_002dsubstring_002dsearch_002dbackward-_0028_0029"><code>history-substring-search-backward ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history_002dsubstring_002dsearch_002dforward-_0028_0029"><code>history-substring-search-forward ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-horizontal_002dscroll_002dmode">horizontal-scroll-mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-input_002dmeta">input-meta</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-insert_002dcomment-_0028M_002d_0023_0029"><code>insert-comment (M-#)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-insert_002dcompletions-_0028M_002d_002a_0029"><code>insert-completions (M-*)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Completion">Commands For Completion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-isearch_002dterminators">isearch-terminators</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-keymap">keymap</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kill_002dline-_0028C_002dk_0029"><code>kill-line (C-k)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kill_002dregion-_0028_0029"><code>kill-region ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kill_002dwhole_002dline-_0028_0029"><code>kill-whole-line ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kill_002dword-_0028M_002dd_0029"><code>kill-word (M-d)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mark_002dmodified_002dlines">mark-modified-lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mark_002dsymlinked_002ddirectories">mark-symlinked-directories</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-match_002dhidden_002dfiles">match-hidden-files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-menu_002dcomplete-_0028_0029"><code>menu-complete ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Completion">Commands For Completion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-menu_002dcomplete_002dbackward-_0028_0029"><code>menu-complete-backward ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Completion">Commands For Completion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-menu_002dcomplete_002ddisplay_002dprefix">menu-complete-display-prefix</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-meta_002dflag">meta-flag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-next_002dhistory-_0028C_002dn_0029"><code>next-history (C-n)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-next_002dscreen_002dline-_0028_0029"><code>next-screen-line ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Moving">Commands For Moving</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-non_002dincremental_002dforward_002dsearch_002dhistory-_0028M_002dn_0029"><code>non-incremental-forward-search-history (M-n)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-non_002dincremental_002dreverse_002dsearch_002dhistory-_0028M_002dp_0029"><code>non-incremental-reverse-search-history (M-p)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-operate_002dand_002dget_002dnext-_0028C_002do_0029"><code>operate-and-get-next (C-o)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-output_002dmeta">output-meta</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-overwrite_002dmode-_0028_0029"><code>overwrite-mode ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page_002dcompletions">page-completions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-possible_002dcompletions-_0028M_002d_003f_0029"><code>possible-completions (M-?)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Completion">Commands For Completion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-prefix_002dmeta-_0028ESC_0029"><code>prefix-meta (<span class="key">ESC</span>)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-previous_002dhistory-_0028C_002dp_0029"><code>previous-history (C-p)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-previous_002dscreen_002dline-_0028_0029"><code>previous-screen-line ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Moving">Commands For Moving</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-print_002dlast_002dkbd_002dmacro-_0028_0029"><code>print-last-kbd-macro ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Macros">Keyboard Macros</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-quoted_002dinsert-_0028C_002dq-or-C_002dv_0029"><code>quoted-insert (C-q or C-v)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-re_002dread_002dinit_002dfile-_0028C_002dx-C_002dr_0029"><code>re-read-init-file (C-x C-r)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-readline"><code>readline</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Basic-Behavior">Basic Behavior</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-redraw_002dcurrent_002dline-_0028_0029"><code>redraw-current-line ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Moving">Commands For Moving</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-reverse_002dsearch_002dhistory-_0028C_002dr_0029"><code>reverse-search-history (C-r)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-revert_002dall_002dat_002dnewline">revert-all-at-newline</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-revert_002dline-_0028M_002dr_0029"><code>revert-line (M-r)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005factivate_005fmark"><code>rl_activate_mark</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fadd_005fdefun"><code>rl_add_defun</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Function-Naming">Function Naming</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fadd_005ffunmap_005fentry"><code>rl_add_funmap_entry</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Associating-Function-Names-and-Bindings">Associating Function Names and Bindings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fadd_005fundo"><code>rl_add_undo</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allowing-Undoing">Allowing Undoing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005falphabetic"><code>rl_alphabetic</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005falready_005fprompted">rl_already_prompted</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fattempted_005fcompletion_005ffunction">rl_attempted_completion_function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fattempted_005fcompletion_005fover">rl_attempted_completion_over</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fbasic_005fquote_005fcharacters">rl_basic_quote_characters</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fbasic_005fword_005fbreak_005fcharacters">rl_basic_word_break_characters</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fbegin_005fundo_005fgroup"><code>rl_begin_undo_group</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allowing-Undoing">Allowing Undoing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fbinding_005fkeymap">rl_binding_keymap</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fbind_005fkey"><code>rl_bind_key</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fbind_005fkeyseq"><code>rl_bind_keyseq</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fbind_005fkeyseq_005fif_005funbound"><code>rl_bind_keyseq_if_unbound</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fbind_005fkeyseq_005fif_005funbound_005fin_005fmap"><code>rl_bind_keyseq_if_unbound_in_map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fbind_005fkeyseq_005fin_005fmap"><code>rl_bind_keyseq_in_map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fbind_005fkey_005fif_005funbound"><code>rl_bind_key_if_unbound</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fbind_005fkey_005fif_005funbound_005fin_005fmap"><code>rl_bind_key_if_unbound_in_map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fbind_005fkey_005fin_005fmap"><code>rl_bind_key_in_map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcallback_005fhandler_005finstall"><code>rl_callback_handler_install</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Alternate-Interface">Alternate Interface</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcallback_005fhandler_005fremove"><code>rl_callback_handler_remove</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Alternate-Interface">Alternate Interface</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcallback_005fread_005fchar"><code>rl_callback_read_char</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Alternate-Interface">Alternate Interface</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcallback_005fsigcleanup"><code>rl_callback_sigcleanup</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Alternate-Interface">Alternate Interface</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcatch_005fsignals">rl_catch_signals</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcatch_005fsigwinch">rl_catch_sigwinch</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fchange_005fenvironment">rl_change_environment</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fchar_005fis_005fquoted_005fp">rl_char_is_quoted_p</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcheck_005fsignals"><code>rl_check_signals</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcleanup_005fafter_005fsignal"><code>rl_cleanup_after_signal</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fclear_005fhistory"><code>rl_clear_history</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fclear_005fmessage"><code>rl_clear_message</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fclear_005fpending_005finput"><code>rl_clear_pending_input</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Character-Input">Character Input</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fclear_005fsignals"><code>rl_clear_signals</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fclear_005fvisible_005fline"><code>rl_clear_visible_line</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcomplete"><code>rl_complete</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#How-Completing-Works">How Completing Works</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcomplete-1"><code>rl_complete</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Functions">Completion Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompleter_005fquote_005fcharacters">rl_completer_quote_characters</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompleter_005fword_005fbreak_005fcharacters">rl_completer_word_break_characters</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcomplete_005finternal"><code>rl_complete_internal</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Functions">Completion Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005fappend_005fcharacter">rl_completion_append_character</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005fdisplay_005fmatches_005fhook">rl_completion_display_matches_hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005fentry_005ffunction">rl_completion_entry_function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#How-Completing-Works">How Completing Works</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005fentry_005ffunction-1">rl_completion_entry_function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005ffound_005fquote">rl_completion_found_quote</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005finvoking_005fkey">rl_completion_invoking_key</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005fmark_005fsymlink_005fdirs">rl_completion_mark_symlink_dirs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005fmatches"><code>rl_completion_matches</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Functions">Completion Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005fmode"><code>rl_completion_mode</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Functions">Completion Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005fquery_005fitems">rl_completion_query_items</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005fquote_005fcharacter">rl_completion_quote_character</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005fsuppress_005fappend">rl_completion_suppress_append</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005fsuppress_005fquote">rl_completion_suppress_quote</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005ftype">rl_completion_type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcompletion_005fword_005fbreak_005fhook">rl_completion_word_break_hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcopy_005fkeymap"><code>rl_copy_keymap</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keymaps">Keymaps</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcopy_005ftext"><code>rl_copy_text</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-Text">Modifying Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fcrlf"><code>rl_crlf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fdeactivate_005fmark"><code>rl_deactivate_mark</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fdelete_005ftext"><code>rl_delete_text</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-Text">Modifying Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fdeprep_005fterminal"><code>rl_deprep_terminal</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Terminal-Management">Terminal Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fdeprep_005fterm_005ffunction">rl_deprep_term_function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fding"><code>rl_ding</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fdirectory_005fcompletion_005fhook">rl_directory_completion_hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fdirectory_005frewrite_005fhook_003b">rl_directory_rewrite_hook;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fdiscard_005fkeymap"><code>rl_discard_keymap</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keymaps">Keymaps</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fdispatching">rl_dispatching</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fdisplay_005fmatch_005flist"><code>rl_display_match_list</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fdisplay_005fprompt">rl_display_prompt</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fdone">rl_done</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fdo_005fundo"><code>rl_do_undo</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allowing-Undoing">Allowing Undoing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fecho_005fsignal_005fchar"><code>rl_echo_signal_char</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fediting_005fmode">rl_editing_mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fempty_005fkeymap"><code>rl_empty_keymap</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keymaps">Keymaps</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fend">rl_end</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fend_005fundo_005fgroup"><code>rl_end_undo_group</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allowing-Undoing">Allowing Undoing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005feof_005ffound">rl_eof_found</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ferase_005fempty_005fline">rl_erase_empty_line</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fevent_005fhook">rl_event_hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fexecute_005fnext"><code>rl_execute_next</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Character-Input">Character Input</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fexecuting_005fkey">rl_executing_key</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fexecuting_005fkeymap">rl_executing_keymap</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fexecuting_005fkeyseq">rl_executing_keyseq</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fexecuting_005fmacro">rl_executing_macro</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fexpand_005fprompt"><code>rl_expand_prompt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fexplicit_005farg">rl_explicit_arg</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fextend_005fline_005fbuffer"><code>rl_extend_line_buffer</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffilename_005fcompletion_005fdesired">rl_filename_completion_desired</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffilename_005fcompletion_005ffunction"><code>rl_filename_completion_function</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Functions">Completion Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffilename_005fdequoting_005ffunction">rl_filename_dequoting_function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffilename_005fquote_005fcharacters">rl_filename_quote_characters</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffilename_005fquoting_005fdesired">rl_filename_quoting_desired</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffilename_005fquoting_005ffunction">rl_filename_quoting_function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffilename_005frewrite_005fhook">rl_filename_rewrite_hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffilename_005fstat_005fhook">rl_filename_stat_hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fforced_005fupdate_005fdisplay"><code>rl_forced_update_display</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffree"><code>rl_free</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffree_005fkeymap"><code>rl_free_keymap</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keymaps">Keymaps</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffree_005fline_005fstate"><code>rl_free_line_state</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffree_005fundo_005flist"><code>rl_free_undo_list</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allowing-Undoing">Allowing Undoing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffunction_005fdumper"><code>rl_function_dumper</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Associating-Function-Names-and-Bindings">Associating Function Names and Bindings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffunction_005fof_005fkeyseq"><code>rl_function_of_keyseq</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Associating-Function-Names-and-Bindings">Associating Function Names and Bindings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffunction_005fof_005fkeyseq_005flen"><code>rl_function_of_keyseq_len</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Associating-Function-Names-and-Bindings">Associating Function Names and Bindings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ffunmap_005fnames"><code>rl_funmap_names</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Associating-Function-Names-and-Bindings">Associating Function Names and Bindings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fgeneric_005fbind"><code>rl_generic_bind</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fgetc"><code>rl_getc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Character-Input">Character Input</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fgetc_005ffunction">rl_getc_function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fget_005fkeymap"><code>rl_get_keymap</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keymaps">Keymaps</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fget_005fkeymap_005fby_005fname"><code>rl_get_keymap_by_name</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keymaps">Keymaps</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fget_005fkeymap_005fname"><code>rl_get_keymap_name</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keymaps">Keymaps</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fget_005fscreen_005fsize"><code>rl_get_screen_size</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fget_005ftermcap"><code>rl_get_termcap</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fgnu_005freadline_005fp">rl_gnu_readline_p</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fignore_005fcompletion_005fduplicates">rl_ignore_completion_duplicates</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fignore_005fsome_005fcompletions_005ffunction">rl_ignore_some_completions_function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005finhibit_005fcompletion">rl_inhibit_completion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005finitialize"><code>rl_initialize</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005finput_005favailable_005fhook">rl_input_available_hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005finsert_005fcompletions"><code>rl_insert_completions</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Functions">Completion Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005finsert_005ftext"><code>rl_insert_text</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-Text">Modifying Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005finstream">rl_instream</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005finvoking_005fkeyseqs"><code>rl_invoking_keyseqs</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Associating-Function-Names-and-Bindings">Associating Function Names and Bindings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005finvoking_005fkeyseqs_005fin_005fmap"><code>rl_invoking_keyseqs_in_map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Associating-Function-Names-and-Bindings">Associating Function Names and Bindings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fkeep_005fmark_005factive"><code>rl_keep_mark_active</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fkey_005fsequence_005flength">rl_key_sequence_length</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fkill_005ftext"><code>rl_kill_text</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-Text">Modifying Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005flast_005ffunc">rl_last_func</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005flibrary_005fversion">rl_library_version</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fline_005fbuffer">rl_line_buffer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005flist_005ffunmap_005fnames"><code>rl_list_funmap_names</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Associating-Function-Names-and-Bindings">Associating Function Names and Bindings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fmacro_005fbind"><code>rl_macro_bind</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fmacro_005fdumper"><code>rl_macro_dumper</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fmake_005fbare_005fkeymap"><code>rl_make_bare_keymap</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keymaps">Keymaps</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fmake_005fkeymap"><code>rl_make_keymap</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keymaps">Keymaps</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fmark">rl_mark</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fmark_005factive_005fp"><code>rl_mark_active_p</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fmessage"><code>rl_message</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fmodifying"><code>rl_modifying</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allowing-Undoing">Allowing Undoing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fnamed_005ffunction"><code>rl_named_function</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Associating-Function-Names-and-Bindings">Associating Function Names and Bindings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fnumeric_005farg">rl_numeric_arg</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fnum_005fchars_005fto_005fread">rl_num_chars_to_read</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fon_005fnew_005fline"><code>rl_on_new_line</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fon_005fnew_005fline_005fwith_005fprompt"><code>rl_on_new_line_with_prompt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005foutstream">rl_outstream</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fparse_005fand_005fbind"><code>rl_parse_and_bind</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fpending_005finput">rl_pending_input</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fpending_005fsignal"><code>rl_pending_signal</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fpersistent_005fsignal_005fhandlers">rl_persistent_signal_handlers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fpoint">rl_point</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fpossible_005fcompletions"><code>rl_possible_completions</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Functions">Completion Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fprefer_005fenv_005fwinsize">rl_prefer_env_winsize</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fprep_005fterminal"><code>rl_prep_terminal</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Terminal-Management">Terminal Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fprep_005fterm_005ffunction">rl_prep_term_function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fpre_005finput_005fhook">rl_pre_input_hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fprompt">rl_prompt</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fpush_005fmacro_005finput"><code>rl_push_macro_input</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-Text">Modifying Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005freadline_005fname">rl_readline_name</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005freadline_005fstate">rl_readline_state</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005freadline_005fversion">rl_readline_version</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fread_005finit_005ffile"><code>rl_read_init_file</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fread_005fkey"><code>rl_read_key</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Character-Input">Character Input</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fredisplay"><code>rl_redisplay</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fredisplay_005ffunction">rl_redisplay_function</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005freplace_005fline"><code>rl_replace_line</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005freset_005fafter_005fsignal"><code>rl_reset_after_signal</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005freset_005fline_005fstate"><code>rl_reset_line_state</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005freset_005fscreen_005fsize"><code>rl_reset_screen_size</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005freset_005fterminal"><code>rl_reset_terminal</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Terminal-Management">Terminal Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fresize_005fterminal"><code>rl_resize_terminal</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005frestore_005fprompt"><code>rl_restore_prompt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005frestore_005fstate"><code>rl_restore_state</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fsave_005fprompt"><code>rl_save_prompt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fsave_005fstate"><code>rl_save_state</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Utility-Functions">Utility Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fset_005fkey"><code>rl_set_key</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fset_005fkeyboard_005finput_005ftimeout"><code>rl_set_keyboard_input_timeout</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Character-Input">Character Input</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fset_005fkeymap"><code>rl_set_keymap</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keymaps">Keymaps</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fset_005fkeymap_005fname"><code>rl_set_keymap_name</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keymaps">Keymaps</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fset_005fparen_005fblink_005ftimeout"><code>rl_set_paren_blink_timeout</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fset_005fprompt"><code>rl_set_prompt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fset_005fscreen_005fsize"><code>rl_set_screen_size</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fset_005fsignals"><code>rl_set_signals</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Signal-Handling">Readline Signal Handling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fset_005ftimeout"><code>rl_set_timeout</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Character-Input">Character Input</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fshow_005fchar"><code>rl_show_char</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Redisplay">Redisplay</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fsignal_005fevent_005fhook">rl_signal_event_hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fsort_005fcompletion_005fmatches">rl_sort_completion_matches</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fspecial_005fprefixes">rl_special_prefixes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Variables">Completion Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fstartup_005fhook">rl_startup_hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fstuff_005fchar"><code>rl_stuff_char</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Character-Input">Character Input</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fterminal_005fname">rl_terminal_name</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ftimeout_005fevent_005fhook">rl_timeout_event_hook</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Variables">Readline Variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ftimeout_005fremaining"><code>rl_timeout_remaining</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Character-Input">Character Input</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ftrim_005farg_005ffrom_005fkeyseq"><code>rl_trim_arg_from_keyseq</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Associating-Function-Names-and-Bindings">Associating Function Names and Bindings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ftty_005fset_005fdefault_005fbindings"><code>rl_tty_set_default_bindings</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Terminal-Management">Terminal Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ftty_005fset_005fechoing"><code>rl_tty_set_echoing</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Terminal-Management">Terminal Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005ftty_005funset_005fdefault_005fbindings"><code>rl_tty_unset_default_bindings</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Terminal-Management">Terminal Management</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005funbind_005fcommand_005fin_005fmap"><code>rl_unbind_command_in_map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005funbind_005ffunction_005fin_005fmap"><code>rl_unbind_function_in_map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005funbind_005fkey"><code>rl_unbind_key</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005funbind_005fkey_005fin_005fmap"><code>rl_unbind_key_in_map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binding-Keys">Binding Keys</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fusername_005fcompletion_005ffunction"><code>rl_username_completion_function</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Completion-Functions">Completion Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fvariable_005fbind"><code>rl_variable_bind</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fvariable_005fdumper"><code>rl_variable_dumper</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rl_005fvariable_005fvalue"><code>rl_variable_value</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Functions">Miscellaneous Functions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-self_002dinsert-_0028a_002c-b_002c-A_002c-1_002c-_0021_002c-_2026_0029"><code>self-insert (a, b, A, 1, !, &hellip;)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-set_002dmark-_0028C_002d_0040_0029"><code>set-mark (C-@)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-shell_002dtranspose_002dwords-_0028M_002dC_002dt_0029"><code>shell-transpose-words (M-C-t)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-show_002dall_002dif_002dambiguous">show-all-if-ambiguous</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-show_002dall_002dif_002dunmodified">show-all-if-unmodified</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-show_002dmode_002din_002dprompt">show-mode-in-prompt</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-skip_002dcompleted_002dtext">skip-completed-text</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-skip_002dcsi_002dsequence-_0028_0029"><code>skip-csi-sequence ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-start_002dkbd_002dmacro-_0028C_002dx-_0028_0029"><code>start-kbd-macro (C-x ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Keyboard-Macros">Keyboard Macros</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tab_002dinsert-_0028M_002dTAB_0029"><code>tab-insert (M-<span class="key">TAB</span>)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tilde_002dexpand-_0028M_002d_007e_0029"><code>tilde-expand (M-~)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-transpose_002dchars-_0028C_002dt_0029"><code>transpose-chars (C-t)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-transpose_002dwords-_0028M_002dt_0029"><code>transpose-words (M-t)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-undo-_0028C_002d_005f-or-C_002dx-C_002du_0029"><code>undo (C-_ or C-x C-u)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-universal_002dargument-_0028_0029"><code>universal-argument ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Numeric-Arguments">Numeric Arguments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unix_002dfilename_002drubout-_0028_0029"><code>unix-filename-rubout ()</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unix_002dline_002ddiscard-_0028C_002du_0029"><code>unix-line-discard (C-u)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unix_002dword_002drubout-_0028C_002dw_0029"><code>unix-word-rubout (C-w)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-upcase_002dword-_0028M_002du_0029"><code>upcase-word (M-u)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Text">Commands For Text</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vi_002dcmd_002dmode_002dstring">vi-cmd-mode-string</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vi_002dediting_002dmode-_0028M_002dC_002dj_0029"><code>vi-editing-mode (M-C-j)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Miscellaneous-Commands">Miscellaneous Commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vi_002dins_002dmode_002dstring">vi-ins-mode-string</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-visible_002dstats">visible-stats</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Readline-Init-File-Syntax">Readline Init File Syntax</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Function-and-Variable-Index_fn_letter-Y">Y</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-yank-_0028C_002dy_0029"><code>yank (C-y)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-yank_002dlast_002darg-_0028M_002d_002e-or-M_002d_005f_0029"><code>yank-last-arg (M-. or M-_)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-yank_002dnth_002darg-_0028M_002dC_002dy_0029"><code>yank-nth-arg (M-C-y)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-History">Commands For History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-yank_002dpop-_0028M_002dy_0029"><code>yank-pop (M-y)</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-For-Killing">Commands For Killing</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Function-and-Variable-Index_fn_symbol-1"><b>_</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Function-and-Variable-Index_fn_letter-Y"><b>Y</b></a>
+ &nbsp;
+</td></tr></table>
+
+</div>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/readline.info b/doc/readline.info
new file mode 100644
index 0000000..4ea6b8c
--- /dev/null
+++ b/doc/readline.info
@@ -0,0 +1,5320 @@
+This is readline.info, produced by makeinfo version 6.8 from rlman.texi.
+
+This manual describes the GNU Readline Library (version 8.2, 19
+September 2022), a library which aids in the consistency of user
+interface across discrete programs which provide a command line
+interface.
+
+ Copyright (C) 1988-2022 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.3 or any later version published by the Free Software
+ Foundation; with no Invariant Sections, no Front-Cover Texts, and
+ no Back-Cover Texts. A copy of the license is included in the
+ section entitled "GNU Free Documentation License".
+
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* Readline: (readline). The GNU readline library API.
+END-INFO-DIR-ENTRY
+
+
+File: readline.info, Node: Top, Next: Command Line Editing, Up: (dir)
+
+GNU Readline Library
+********************
+
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs which
+provide a command line interface. The Readline home page is
+<http://www.gnu.org/software/readline/>.
+
+* Menu:
+
+* Command Line Editing:: GNU Readline User's Manual.
+* Programming with GNU Readline:: GNU Readline Programmer's Manual.
+* GNU Free Documentation License:: License for copying this manual.
+* Concept Index:: Index of concepts described in this manual.
+* Function and Variable Index:: Index of externally visible functions
+ and variables.
+
+
+File: readline.info, Node: Command Line Editing, Next: Programming with GNU Readline, Prev: Top, Up: Top
+
+1 Command Line Editing
+**********************
+
+This chapter describes the basic features of the GNU command line
+editing interface.
+
+* Menu:
+
+* Introduction and Notation:: Notation used in this text.
+* Readline Interaction:: The minimum set of commands for editing a line.
+* Readline Init File:: Customizing Readline from a user's view.
+* Bindable Readline Commands:: A description of most of the Readline commands
+ available for binding
+* Readline vi Mode:: A short description of how to make Readline
+ behave like the vi editor.
+
+
+File: readline.info, Node: Introduction and Notation, Next: Readline Interaction, Up: Command Line Editing
+
+1.1 Introduction to Line Editing
+================================
+
+The following paragraphs describe the notation used to represent
+keystrokes.
+
+ The text 'C-k' is read as 'Control-K' and describes the character
+produced when the <k> key is pressed while the Control key is depressed.
+
+ The text 'M-k' is read as 'Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the <k>
+key is pressed. The Meta key is labeled <ALT> on many keyboards. On
+keyboards with two keys labeled <ALT> (usually to either side of the
+space bar), the <ALT> on the left side is generally set to work as a
+Meta key. The <ALT> key on the right may also be configured to work as
+a Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+
+ If you do not have a Meta or <ALT> key, or another key working as a
+Meta key, the identical keystroke can be generated by typing <ESC>
+_first_, and then typing <k>. Either process is known as "metafying"
+the <k> key.
+
+ The text 'M-C-k' is read as 'Meta-Control-k' and describes the
+character produced by "metafying" 'C-k'.
+
+ In addition, several keys have their own names. Specifically, <DEL>,
+<ESC>, <LFD>, <SPC>, <RET>, and <TAB> all stand for themselves when seen
+in this text, or in an init file (*note Readline Init File::). If your
+keyboard lacks a <LFD> key, typing <C-j> will produce the desired
+character. The <RET> key may be labeled <Return> or <Enter> on some
+keyboards.
+
+
+File: readline.info, Node: Readline Interaction, Next: Readline Init File, Prev: Introduction and Notation, Up: Command Line Editing
+
+1.2 Readline Interaction
+========================
+
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled. The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line. Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections. Then, when you are satisfied with
+the line, you simply press <RET>. You do not have to be at the end of
+the line to press <RET>; the entire line is accepted regardless of the
+location of the cursor within the line.
+
+* Menu:
+
+* Readline Bare Essentials:: The least you need to know about Readline.
+* Readline Movement Commands:: Moving about the input line.
+* Readline Killing Commands:: How to delete text, and how to get it back!
+* Readline Arguments:: Giving numeric arguments to commands.
+* Searching:: Searching through previous lines.
+
+
+File: readline.info, Node: Readline Bare Essentials, Next: Readline Movement Commands, Up: Readline Interaction
+
+1.2.1 Readline Bare Essentials
+------------------------------
+
+In order to enter characters into the line, simply type them. The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right. If you mistype a character, you can use your erase
+character to back up and delete the mistyped character.
+
+ Sometimes you may mistype a character, and not notice the error until
+you have typed several other characters. In that case, you can type
+'C-b' to move the cursor to the left, and then correct your mistake.
+Afterwards, you can move the cursor to the right with 'C-f'.
+
+ When you add text in the middle of a line, you will notice that
+characters to the right of the cursor are 'pushed over' to make room for
+the text that you have inserted. Likewise, when you delete text behind
+the cursor, characters to the right of the cursor are 'pulled back' to
+fill in the blank space created by the removal of the text. A list of
+the bare essentials for editing the text of an input line follows.
+
+'C-b'
+ Move back one character.
+'C-f'
+ Move forward one character.
+<DEL> or <Backspace>
+ Delete the character to the left of the cursor.
+'C-d'
+ Delete the character underneath the cursor.
+Printing characters
+ Insert the character into the line at the cursor.
+'C-_' or 'C-x C-u'
+ Undo the last editing command. You can undo all the way back to an
+ empty line.
+
+(Depending on your configuration, the <Backspace> key might be set to
+delete the character to the left of the cursor and the <DEL> key set to
+delete the character underneath the cursor, like 'C-d', rather than the
+character to the left of the cursor.)
+
+
+File: readline.info, Node: Readline Movement Commands, Next: Readline Killing Commands, Prev: Readline Bare Essentials, Up: Readline Interaction
+
+1.2.2 Readline Movement Commands
+--------------------------------
+
+The above table describes the most basic keystrokes that you need in
+order to do editing of the input line. For your convenience, many other
+commands have been added in addition to 'C-b', 'C-f', 'C-d', and <DEL>.
+Here are some commands for moving more rapidly about the line.
+
+'C-a'
+ Move to the start of the line.
+'C-e'
+ Move to the end of the line.
+'M-f'
+ Move forward a word, where a word is composed of letters and
+ digits.
+'M-b'
+ Move backward a word.
+'C-l'
+ Clear the screen, reprinting the current line at the top.
+
+ Notice how 'C-f' moves forward a character, while 'M-f' moves forward
+a word. It is a loose convention that control keystrokes operate on
+characters while meta keystrokes operate on words.
+
+
+File: readline.info, Node: Readline Killing Commands, Next: Readline Arguments, Prev: Readline Movement Commands, Up: Readline Interaction
+
+1.2.3 Readline Killing Commands
+-------------------------------
+
+"Killing" text means to delete the text from the line, but to save it
+away for later use, usually by "yanking" (re-inserting) it back into the
+line. ('Cut' and 'paste' are more recent jargon for 'kill' and 'yank'.)
+
+ If the description for a command says that it 'kills' text, then you
+can be sure that you can get the text back in a different (or the same)
+place later.
+
+ When you use a kill command, the text is saved in a "kill-ring". Any
+number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all. The kill ring is not line
+specific; the text that you killed on a previously typed line is
+available to be yanked back later, when you are typing another line.
+
+ Here is the list of commands for killing text.
+
+'C-k'
+ Kill the text from the current cursor position to the end of the
+ line.
+
+'M-d'
+ Kill from the cursor to the end of the current word, or, if between
+ words, to the end of the next word. Word boundaries are the same
+ as those used by 'M-f'.
+
+'M-<DEL>'
+ Kill from the cursor to the start of the current word, or, if
+ between words, to the start of the previous word. Word boundaries
+ are the same as those used by 'M-b'.
+
+'C-w'
+ Kill from the cursor to the previous whitespace. This is different
+ than 'M-<DEL>' because the word boundaries differ.
+
+ Here is how to "yank" the text back into the line. Yanking means to
+copy the most-recently-killed text from the kill buffer.
+
+'C-y'
+ Yank the most recently killed text back into the buffer at the
+ cursor.
+
+'M-y'
+ Rotate the kill-ring, and yank the new top. You can only do this
+ if the prior command is 'C-y' or 'M-y'.
+
+
+File: readline.info, Node: Readline Arguments, Next: Searching, Prev: Readline Killing Commands, Up: Readline Interaction
+
+1.2.4 Readline Arguments
+------------------------
+
+You can pass numeric arguments to Readline commands. Sometimes the
+argument acts as a repeat count, other times it is the sign of the
+argument that is significant. If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction. For example, to kill text back to the
+start of the line, you might type 'M-- C-k'.
+
+ The general way to pass numeric arguments to a command is to type
+meta digits before the command. If the first 'digit' typed is a minus
+sign ('-'), then the sign of the argument will be negative. Once you
+have typed one meta digit to get the argument started, you can type the
+remainder of the digits, and then the command. For example, to give the
+'C-d' command an argument of 10, you could type 'M-1 0 C-d', which will
+delete the next ten characters on the input line.
+
+
+File: readline.info, Node: Searching, Prev: Readline Arguments, Up: Readline Interaction
+
+1.2.5 Searching for Commands in the History
+-------------------------------------------
+
+Readline provides commands for searching through the command history for
+lines containing a specified string. There are two search modes:
+"incremental" and "non-incremental".
+
+ Incremental searches begin before the user has finished typing the
+search string. As each character of the search string is typed,
+Readline displays the next entry from the history matching the string
+typed so far. An incremental search requires only as many characters as
+needed to find the desired history entry. To search backward in the
+history for a particular string, type 'C-r'. Typing 'C-s' searches
+forward through the history. The characters present in the value of the
+'isearch-terminators' variable are used to terminate an incremental
+search. If that variable has not been assigned a value, the <ESC> and
+'C-J' characters will terminate an incremental search. 'C-g' will abort
+an incremental search and restore the original line. When the search is
+terminated, the history entry containing the search string becomes the
+current line.
+
+ To find other matching entries in the history list, type 'C-r' or
+'C-s' as appropriate. This will search backward or forward in the
+history for the next entry matching the search string typed so far. Any
+other key sequence bound to a Readline command will terminate the search
+and execute that command. For instance, a <RET> will terminate the
+search and accept the line, thereby executing the command from the
+history list. A movement command will terminate the search, make the
+last line found the current line, and begin editing.
+
+ Readline remembers the last incremental search string. If two 'C-r's
+are typed without any intervening characters defining a new search
+string, any remembered search string is used.
+
+ Non-incremental searches read the entire search string before
+starting to search for matching history lines. The search string may be
+typed by the user or be part of the contents of the current line.
+
+
+File: readline.info, Node: Readline Init File, Next: Bindable Readline Commands, Prev: Readline Interaction, Up: Command Line Editing
+
+1.3 Readline Init File
+======================
+
+Although the Readline library comes with a set of Emacs-like keybindings
+installed by default, it is possible to use a different set of
+keybindings. Any user can customize programs that use Readline by
+putting commands in an "inputrc" file, conventionally in their home
+directory. The name of this file is taken from the value of the
+environment variable 'INPUTRC'. If that variable is unset, the default
+is '~/.inputrc'. If that file does not exist or cannot be read, the
+ultimate default is '/etc/inputrc'.
+
+ When a program which uses the Readline library starts up, the init
+file is read, and the key bindings are set.
+
+ In addition, the 'C-x C-r' command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+
+* Menu:
+
+* Readline Init File Syntax:: Syntax for the commands in the inputrc file.
+
+* Conditional Init Constructs:: Conditional key bindings in the inputrc file.
+
+* Sample Init File:: An example inputrc file.
+
+
+File: readline.info, Node: Readline Init File Syntax, Next: Conditional Init Constructs, Up: Readline Init File
+
+1.3.1 Readline Init File Syntax
+-------------------------------
+
+There are only a few basic constructs allowed in the Readline init file.
+Blank lines are ignored. Lines beginning with a '#' are comments.
+Lines beginning with a '$' indicate conditional constructs (*note
+Conditional Init Constructs::). Other lines denote variable settings
+and key bindings.
+
+Variable Settings
+ You can modify the run-time behavior of Readline by altering the
+ values of variables in Readline using the 'set' command within the
+ init file. The syntax is simple:
+
+ set VARIABLE VALUE
+
+ Here, for example, is how to change from the default Emacs-like key
+ binding to use 'vi' line editing commands:
+
+ set editing-mode vi
+
+ Variable names and values, where appropriate, are recognized
+ without regard to case. Unrecognized variable names are ignored.
+
+ Boolean variables (those that can be set to on or off) are set to
+ on if the value is null or empty, ON (case-insensitive), or 1. Any
+ other value results in the variable being set to off.
+
+ A great deal of run-time behavior is changeable with the following
+ variables.
+
+ 'active-region-start-color'
+ A string variable that controls the text color and background
+ when displaying the text in the active region (see the
+ description of 'enable-active-region' below). This string
+ must not take up any physical character positions on the
+ display, so it should consist only of terminal escape
+ sequences. It is output to the terminal before displaying the
+ text in the active region. This variable is reset to the
+ default value whenever the terminal type changes. The default
+ value is the string that puts the terminal in standout mode,
+ as obtained from the terminal's terminfo description. A
+ sample value might be '\e[01;33m'.
+
+ 'active-region-end-color'
+ A string variable that "undoes" the effects of
+ 'active-region-start-color' and restores "normal" terminal
+ display appearance after displaying text in the active region.
+ This string must not take up any physical character positions
+ on the display, so it should consist only of terminal escape
+ sequences. It is output to the terminal after displaying the
+ text in the active region. This variable is reset to the
+ default value whenever the terminal type changes. The default
+ value is the string that restores the terminal from standout
+ mode, as obtained from the terminal's terminfo description. A
+ sample value might be '\e[0m'.
+
+ 'bell-style'
+ Controls what happens when Readline wants to ring the terminal
+ bell. If set to 'none', Readline never rings the bell. If
+ set to 'visible', Readline uses a visible bell if one is
+ available. If set to 'audible' (the default), Readline
+ attempts to ring the terminal's bell.
+
+ 'bind-tty-special-chars'
+ If set to 'on' (the default), Readline attempts to bind the
+ control characters treated specially by the kernel's terminal
+ driver to their Readline equivalents.
+
+ 'blink-matching-paren'
+ If set to 'on', Readline attempts to briefly move the cursor
+ to an opening parenthesis when a closing parenthesis is
+ inserted. The default is 'off'.
+
+ 'colored-completion-prefix'
+ If set to 'on', when listing completions, Readline displays
+ the common prefix of the set of possible completions using a
+ different color. The color definitions are taken from the
+ value of the 'LS_COLORS' environment variable. If there is a
+ color definition in 'LS_COLORS' for the custom suffix
+ 'readline-colored-completion-prefix', Readline uses this color
+ for the common prefix instead of its default. The default is
+ 'off'.
+
+ 'colored-stats'
+ If set to 'on', Readline displays possible completions using
+ different colors to indicate their file type. The color
+ definitions are taken from the value of the 'LS_COLORS'
+ environment variable. The default is 'off'.
+
+ 'comment-begin'
+ The string to insert at the beginning of the line when the
+ 'insert-comment' command is executed. The default value is
+ '"#"'.
+
+ 'completion-display-width'
+ The number of screen columns used to display possible matches
+ when performing completion. The value is ignored if it is
+ less than 0 or greater than the terminal screen width. A
+ value of 0 will cause matches to be displayed one per line.
+ The default value is -1.
+
+ 'completion-ignore-case'
+ If set to 'on', Readline performs filename matching and
+ completion in a case-insensitive fashion. The default value
+ is 'off'.
+
+ 'completion-map-case'
+ If set to 'on', and COMPLETION-IGNORE-CASE is enabled,
+ Readline treats hyphens ('-') and underscores ('_') as
+ equivalent when performing case-insensitive filename matching
+ and completion. The default value is 'off'.
+
+ 'completion-prefix-display-length'
+ The length in characters of the common prefix of a list of
+ possible completions that is displayed without modification.
+ When set to a value greater than zero, common prefixes longer
+ than this value are replaced with an ellipsis when displaying
+ possible completions.
+
+ 'completion-query-items'
+ The number of possible completions that determines when the
+ user is asked whether the list of possibilities should be
+ displayed. If the number of possible completions is greater
+ than or equal to this value, Readline will ask whether or not
+ the user wishes to view them; otherwise, they are simply
+ listed. This variable must be set to an integer value greater
+ than or equal to zero. A zero value means Readline should
+ never ask; negative values are treated as zero. The default
+ limit is '100'.
+
+ 'convert-meta'
+ If set to 'on', Readline will convert characters with the
+ eighth bit set to an ASCII key sequence by stripping the
+ eighth bit and prefixing an <ESC> character, converting them
+ to a meta-prefixed key sequence. The default value is 'on',
+ but will be set to 'off' if the locale is one that contains
+ eight-bit characters. This variable is dependent on the
+ 'LC_CTYPE' locale category, and may change if the locale is
+ changed.
+
+ 'disable-completion'
+ If set to 'On', Readline will inhibit word completion.
+ Completion characters will be inserted into the line as if
+ they had been mapped to 'self-insert'. The default is 'off'.
+
+ 'echo-control-characters'
+ When set to 'on', on operating systems that indicate they
+ support it, Readline echoes a character corresponding to a
+ signal generated from the keyboard. The default is 'on'.
+
+ 'editing-mode'
+ The 'editing-mode' variable controls which default set of key
+ bindings is used. By default, Readline starts up in Emacs
+ editing mode, where the keystrokes are most similar to Emacs.
+ This variable can be set to either 'emacs' or 'vi'.
+
+ 'emacs-mode-string'
+ If the SHOW-MODE-IN-PROMPT variable is enabled, this string is
+ displayed immediately before the last line of the primary
+ prompt when emacs editing mode is active. The value is
+ expanded like a key binding, so the standard set of meta- and
+ control prefixes and backslash escape sequences is available.
+ Use the '\1' and '\2' escapes to begin and end sequences of
+ non-printing characters, which can be used to embed a terminal
+ control sequence into the mode string. The default is '@'.
+
+ 'enable-active-region'
+ The "point" is the current cursor position, and "mark" refers
+ to a saved cursor position (*note Commands For Moving::). The
+ text between the point and mark is referred to as the
+ "region". When this variable is set to 'On', Readline allows
+ certain commands to designate the region as "active". When
+ the region is active, Readline highlights the text in the
+ region using the value of the 'active-region-start-color',
+ which defaults to the string that enables the terminal's
+ standout mode. The active region shows the text inserted by
+ bracketed-paste and any matching text found by incremental and
+ non-incremental history searches. The default is 'On'.
+
+ 'enable-bracketed-paste'
+ When set to 'On', Readline configures the terminal to insert
+ each paste into the editing buffer as a single string of
+ characters, instead of treating each character as if it had
+ been read from the keyboard. This is called putting the
+ terminal into "bracketed paste mode"; it prevents Readline
+ from executing any editing commands bound to key sequences
+ appearing in the pasted text. The default is 'On'.
+
+ 'enable-keypad'
+ When set to 'on', Readline will try to enable the application
+ keypad when it is called. Some systems need this to enable
+ the arrow keys. The default is 'off'.
+
+ 'enable-meta-key'
+ When set to 'on', Readline will try to enable any meta
+ modifier key the terminal claims to support when it is called.
+ On many terminals, the meta key is used to send eight-bit
+ characters. The default is 'on'.
+
+ 'expand-tilde'
+ If set to 'on', tilde expansion is performed when Readline
+ attempts word completion. The default is 'off'.
+
+ 'history-preserve-point'
+ If set to 'on', the history code attempts to place the point
+ (the current cursor position) at the same location on each
+ history line retrieved with 'previous-history' or
+ 'next-history'. The default is 'off'.
+
+ 'history-size'
+ Set the maximum number of history entries saved in the history
+ list. If set to zero, any existing history entries are
+ deleted and no new entries are saved. If set to a value less
+ than zero, the number of history entries is not limited. By
+ default, the number of history entries is not limited. If an
+ attempt is made to set HISTORY-SIZE to a non-numeric value,
+ the maximum number of history entries will be set to 500.
+
+ 'horizontal-scroll-mode'
+ This variable can be set to either 'on' or 'off'. Setting it
+ to 'on' means that the text of the lines being edited will
+ scroll horizontally on a single screen line when they are
+ longer than the width of the screen, instead of wrapping onto
+ a new screen line. This variable is automatically set to 'on'
+ for terminals of height 1. By default, this variable is set
+ to 'off'.
+
+ 'input-meta'
+ If set to 'on', Readline will enable eight-bit input (it will
+ not clear the eighth bit in the characters it reads),
+ regardless of what the terminal claims it can support. The
+ default value is 'off', but Readline will set it to 'on' if
+ the locale contains eight-bit characters. The name
+ 'meta-flag' is a synonym for this variable. This variable is
+ dependent on the 'LC_CTYPE' locale category, and may change if
+ the locale is changed.
+
+ 'isearch-terminators'
+ The string of characters that should terminate an incremental
+ search without subsequently executing the character as a
+ command (*note Searching::). If this variable has not been
+ given a value, the characters <ESC> and 'C-J' will terminate
+ an incremental search.
+
+ 'keymap'
+ Sets Readline's idea of the current keymap for key binding
+ commands. Built-in 'keymap' names are 'emacs',
+ 'emacs-standard', 'emacs-meta', 'emacs-ctlx', 'vi', 'vi-move',
+ 'vi-command', and 'vi-insert'. 'vi' is equivalent to
+ 'vi-command' ('vi-move' is also a synonym); 'emacs' is
+ equivalent to 'emacs-standard'. Applications may add
+ additional names. The default value is 'emacs'. The value of
+ the 'editing-mode' variable also affects the default keymap.
+
+ 'keyseq-timeout'
+ Specifies the duration Readline will wait for a character when
+ reading an ambiguous key sequence (one that can form a
+ complete key sequence using the input read so far, or can take
+ additional input to complete a longer key sequence). If no
+ input is received within the timeout, Readline will use the
+ shorter but complete key sequence. Readline uses this value
+ to determine whether or not input is available on the current
+ input source ('rl_instream' by default). The value is
+ specified in milliseconds, so a value of 1000 means that
+ Readline will wait one second for additional input. If this
+ variable is set to a value less than or equal to zero, or to a
+ non-numeric value, Readline will wait until another key is
+ pressed to decide which key sequence to complete. The default
+ value is '500'.
+
+ 'mark-directories'
+ If set to 'on', completed directory names have a slash
+ appended. The default is 'on'.
+
+ 'mark-modified-lines'
+ This variable, when set to 'on', causes Readline to display an
+ asterisk ('*') at the start of history lines which have been
+ modified. This variable is 'off' by default.
+
+ 'mark-symlinked-directories'
+ If set to 'on', completed names which are symbolic links to
+ directories have a slash appended (subject to the value of
+ 'mark-directories'). The default is 'off'.
+
+ 'match-hidden-files'
+ This variable, when set to 'on', causes Readline to match
+ files whose names begin with a '.' (hidden files) when
+ performing filename completion. If set to 'off', the leading
+ '.' must be supplied by the user in the filename to be
+ completed. This variable is 'on' by default.
+
+ 'menu-complete-display-prefix'
+ If set to 'on', menu completion displays the common prefix of
+ the list of possible completions (which may be empty) before
+ cycling through the list. The default is 'off'.
+
+ 'output-meta'
+ If set to 'on', Readline will display characters with the
+ eighth bit set directly rather than as a meta-prefixed escape
+ sequence. The default is 'off', but Readline will set it to
+ 'on' if the locale contains eight-bit characters. This
+ variable is dependent on the 'LC_CTYPE' locale category, and
+ may change if the locale is changed.
+
+ 'page-completions'
+ If set to 'on', Readline uses an internal 'more'-like pager to
+ display a screenful of possible completions at a time. This
+ variable is 'on' by default.
+
+ 'print-completions-horizontally'
+ If set to 'on', Readline will display completions with matches
+ sorted horizontally in alphabetical order, rather than down
+ the screen. The default is 'off'.
+
+ 'revert-all-at-newline'
+ If set to 'on', Readline will undo all changes to history
+ lines before returning when 'accept-line' is executed. By
+ default, history lines may be modified and retain individual
+ undo lists across calls to 'readline()'. The default is
+ 'off'.
+
+ 'show-all-if-ambiguous'
+ This alters the default behavior of the completion functions.
+ If set to 'on', words which have more than one possible
+ completion cause the matches to be listed immediately instead
+ of ringing the bell. The default value is 'off'.
+
+ 'show-all-if-unmodified'
+ This alters the default behavior of the completion functions
+ in a fashion similar to SHOW-ALL-IF-AMBIGUOUS. If set to
+ 'on', words which have more than one possible completion
+ without any possible partial completion (the possible
+ completions don't share a common prefix) cause the matches to
+ be listed immediately instead of ringing the bell. The
+ default value is 'off'.
+
+ 'show-mode-in-prompt'
+ If set to 'on', add a string to the beginning of the prompt
+ indicating the editing mode: emacs, vi command, or vi
+ insertion. The mode strings are user-settable (e.g.,
+ EMACS-MODE-STRING). The default value is 'off'.
+
+ 'skip-completed-text'
+ If set to 'on', this alters the default completion behavior
+ when inserting a single match into the line. It's only active
+ when performing completion in the middle of a word. If
+ enabled, Readline does not insert characters from the
+ completion that match characters after point in the word being
+ completed, so portions of the word following the cursor are
+ not duplicated. For instance, if this is enabled, attempting
+ completion when the cursor is after the 'e' in 'Makefile' will
+ result in 'Makefile' rather than 'Makefilefile', assuming
+ there is a single possible completion. The default value is
+ 'off'.
+
+ 'vi-cmd-mode-string'
+ If the SHOW-MODE-IN-PROMPT variable is enabled, this string is
+ displayed immediately before the last line of the primary
+ prompt when vi editing mode is active and in command mode.
+ The value is expanded like a key binding, so the standard set
+ of meta- and control prefixes and backslash escape sequences
+ is available. Use the '\1' and '\2' escapes to begin and end
+ sequences of non-printing characters, which can be used to
+ embed a terminal control sequence into the mode string. The
+ default is '(cmd)'.
+
+ 'vi-ins-mode-string'
+ If the SHOW-MODE-IN-PROMPT variable is enabled, this string is
+ displayed immediately before the last line of the primary
+ prompt when vi editing mode is active and in insertion mode.
+ The value is expanded like a key binding, so the standard set
+ of meta- and control prefixes and backslash escape sequences
+ is available. Use the '\1' and '\2' escapes to begin and end
+ sequences of non-printing characters, which can be used to
+ embed a terminal control sequence into the mode string. The
+ default is '(ins)'.
+
+ 'visible-stats'
+ If set to 'on', a character denoting a file's type is appended
+ to the filename when listing possible completions. The
+ default is 'off'.
+
+Key Bindings
+ The syntax for controlling key bindings in the init file is simple.
+ First you need to find the name of the command that you want to
+ change. The following sections contain tables of the command name,
+ the default keybinding, if any, and a short description of what the
+ command does.
+
+ Once you know the name of the command, simply place on a line in
+ the init file the name of the key you wish to bind the command to,
+ a colon, and then the name of the command. There can be no space
+ between the key name and the colon - that will be interpreted as
+ part of the key name. The name of the key can be expressed in
+ different ways, depending on what you find most comfortable.
+
+ In addition to command names, Readline allows keys to be bound to a
+ string that is inserted when the key is pressed (a MACRO).
+
+ KEYNAME: FUNCTION-NAME or MACRO
+ KEYNAME is the name of a key spelled out in English. For
+ example:
+ Control-u: universal-argument
+ Meta-Rubout: backward-kill-word
+ Control-o: "> output"
+
+ In the example above, 'C-u' is bound to the function
+ 'universal-argument', 'M-DEL' is bound to the function
+ 'backward-kill-word', and 'C-o' is bound to run the macro
+ expressed on the right hand side (that is, to insert the text
+ '> output' into the line).
+
+ A number of symbolic character names are recognized while
+ processing this key binding syntax: DEL, ESC, ESCAPE, LFD,
+ NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB.
+
+ "KEYSEQ": FUNCTION-NAME or MACRO
+ KEYSEQ differs from KEYNAME above in that strings denoting an
+ entire key sequence can be specified, by placing the key
+ sequence in double quotes. Some GNU Emacs style key escapes
+ can be used, as in the following example, but the special
+ character names are not recognized.
+
+ "\C-u": universal-argument
+ "\C-x\C-r": re-read-init-file
+ "\e[11~": "Function Key 1"
+
+ In the above example, 'C-u' is again bound to the function
+ 'universal-argument' (just as it was in the first example),
+ ''C-x' 'C-r'' is bound to the function 're-read-init-file',
+ and '<ESC> <[> <1> <1> <~>' is bound to insert the text
+ 'Function Key 1'.
+
+ The following GNU Emacs style escape sequences are available when
+ specifying key sequences:
+
+ '\C-'
+ control prefix
+ '\M-'
+ meta prefix
+ '\e'
+ an escape character
+ '\\'
+ backslash
+ '\"'
+ <">, a double quotation mark
+ '\''
+ <'>, a single quote or apostrophe
+
+ In addition to the GNU Emacs style escape sequences, a second set
+ of backslash escapes is available:
+
+ '\a'
+ alert (bell)
+ '\b'
+ backspace
+ '\d'
+ delete
+ '\f'
+ form feed
+ '\n'
+ newline
+ '\r'
+ carriage return
+ '\t'
+ horizontal tab
+ '\v'
+ vertical tab
+ '\NNN'
+ the eight-bit character whose value is the octal value NNN
+ (one to three digits)
+ '\xHH'
+ the eight-bit character whose value is the hexadecimal value
+ HH (one or two hex digits)
+
+ When entering the text of a macro, single or double quotes must be
+ used to indicate a macro definition. Unquoted text is assumed to
+ be a function name. In the macro body, the backslash escapes
+ described above are expanded. Backslash will quote any other
+ character in the macro text, including '"' and '''. For example,
+ the following binding will make ''C-x' \' insert a single '\' into
+ the line:
+ "\C-x\\": "\\"
+
+
+File: readline.info, Node: Conditional Init Constructs, Next: Sample Init File, Prev: Readline Init File Syntax, Up: Readline Init File
+
+1.3.2 Conditional Init Constructs
+---------------------------------
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key bindings and
+variable settings to be performed as the result of tests. There are
+four parser directives used.
+
+'$if'
+ The '$if' construct allows bindings to be made based on the editing
+ mode, the terminal being used, or the application using Readline.
+ The text of the test, after any comparison operator, extends to the
+ end of the line; unless otherwise noted, no characters are required
+ to isolate it.
+
+ 'mode'
+ The 'mode=' form of the '$if' directive is used to test
+ whether Readline is in 'emacs' or 'vi' mode. This may be used
+ in conjunction with the 'set keymap' command, for instance, to
+ set bindings in the 'emacs-standard' and 'emacs-ctlx' keymaps
+ only if Readline is starting out in 'emacs' mode.
+
+ 'term'
+ The 'term=' form may be used to include terminal-specific key
+ bindings, perhaps to bind the key sequences output by the
+ terminal's function keys. The word on the right side of the
+ '=' is tested against both the full name of the terminal and
+ the portion of the terminal name before the first '-'. This
+ allows 'sun' to match both 'sun' and 'sun-cmd', for instance.
+
+ 'version'
+ The 'version' test may be used to perform comparisons against
+ specific Readline versions. The 'version' expands to the
+ current Readline version. The set of comparison operators
+ includes '=' (and '=='), '!=', '<=', '>=', '<', and '>'. The
+ version number supplied on the right side of the operator
+ consists of a major version number, an optional decimal point,
+ and an optional minor version (e.g., '7.1'). If the minor
+ version is omitted, it is assumed to be '0'. The operator may
+ be separated from the string 'version' and from the version
+ number argument by whitespace. The following example sets a
+ variable if the Readline version being used is 7.0 or newer:
+ $if version >= 7.0
+ set show-mode-in-prompt on
+ $endif
+
+ 'application'
+ The APPLICATION construct is used to include
+ application-specific settings. Each program using the
+ Readline library sets the APPLICATION NAME, and you can test
+ for a particular value. This could be used to bind key
+ sequences to functions useful for a specific program. For
+ instance, the following command adds a key sequence that
+ quotes the current or previous word in Bash:
+ $if Bash
+ # Quote the current or previous word
+ "\C-xq": "\eb\"\ef\""
+ $endif
+
+ 'variable'
+ The VARIABLE construct provides simple equality tests for
+ Readline variables and values. The permitted comparison
+ operators are '=', '==', and '!='. The variable name must be
+ separated from the comparison operator by whitespace; the
+ operator may be separated from the value on the right hand
+ side by whitespace. Both string and boolean variables may be
+ tested. Boolean variables must be tested against the values
+ ON and OFF. The following example is equivalent to the
+ 'mode=emacs' test described above:
+ $if editing-mode == emacs
+ set show-mode-in-prompt on
+ $endif
+
+'$endif'
+ This command, as seen in the previous example, terminates an '$if'
+ command.
+
+'$else'
+ Commands in this branch of the '$if' directive are executed if the
+ test fails.
+
+'$include'
+ This directive takes a single filename as an argument and reads
+ commands and bindings from that file. For example, the following
+ directive reads from '/etc/inputrc':
+ $include /etc/inputrc
+
+
+File: readline.info, Node: Sample Init File, Prev: Conditional Init Constructs, Up: Readline Init File
+
+1.3.3 Sample Init File
+----------------------
+
+Here is an example of an INPUTRC file. This illustrates key binding,
+variable assignment, and conditional syntax.
+
+ # This file controls the behaviour of line input editing for
+ # programs that use the GNU Readline library. Existing
+ # programs include FTP, Bash, and GDB.
+ #
+ # You can re-read the inputrc file with C-x C-r.
+ # Lines beginning with '#' are comments.
+ #
+ # First, include any system-wide bindings and variable
+ # assignments from /etc/Inputrc
+ $include /etc/Inputrc
+
+ #
+ # Set various bindings for emacs mode.
+
+ set editing-mode emacs
+
+ $if mode=emacs
+
+ Meta-Control-h: backward-kill-word Text after the function name is ignored
+
+ #
+ # Arrow keys in keypad mode
+ #
+ #"\M-OD": backward-char
+ #"\M-OC": forward-char
+ #"\M-OA": previous-history
+ #"\M-OB": next-history
+ #
+ # Arrow keys in ANSI mode
+ #
+ "\M-[D": backward-char
+ "\M-[C": forward-char
+ "\M-[A": previous-history
+ "\M-[B": next-history
+ #
+ # Arrow keys in 8 bit keypad mode
+ #
+ #"\M-\C-OD": backward-char
+ #"\M-\C-OC": forward-char
+ #"\M-\C-OA": previous-history
+ #"\M-\C-OB": next-history
+ #
+ # Arrow keys in 8 bit ANSI mode
+ #
+ #"\M-\C-[D": backward-char
+ #"\M-\C-[C": forward-char
+ #"\M-\C-[A": previous-history
+ #"\M-\C-[B": next-history
+
+ C-q: quoted-insert
+
+ $endif
+
+ # An old-style binding. This happens to be the default.
+ TAB: complete
+
+ # Macros that are convenient for shell interaction
+ $if Bash
+ # edit the path
+ "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+ # prepare to type a quoted word --
+ # insert open and close double quotes
+ # and move to just after the open quote
+ "\C-x\"": "\"\"\C-b"
+ # insert a backslash (testing backslash escapes
+ # in sequences and macros)
+ "\C-x\\": "\\"
+ # Quote the current or previous word
+ "\C-xq": "\eb\"\ef\""
+ # Add a binding to refresh the line, which is unbound
+ "\C-xr": redraw-current-line
+ # Edit variable on current line.
+ "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+ $endif
+
+ # use a visible bell if one is available
+ set bell-style visible
+
+ # don't strip characters to 7 bits when reading
+ set input-meta on
+
+ # allow iso-latin1 characters to be inserted rather
+ # than converted to prefix-meta sequences
+ set convert-meta off
+
+ # display characters with the eighth bit set directly
+ # rather than as meta-prefixed characters
+ set output-meta on
+
+ # if there are 150 or more possible completions for a word,
+ # ask whether or not the user wants to see all of them
+ set completion-query-items 150
+
+ # For FTP
+ $if Ftp
+ "\C-xg": "get \M-?"
+ "\C-xt": "put \M-?"
+ "\M-.": yank-last-arg
+ $endif
+
+
+File: readline.info, Node: Bindable Readline Commands, Next: Readline vi Mode, Prev: Readline Init File, Up: Command Line Editing
+
+1.4 Bindable Readline Commands
+==============================
+
+* Menu:
+
+* Commands For Moving:: Moving about the line.
+* Commands For History:: Getting at previous lines.
+* Commands For Text:: Commands for changing text.
+* Commands For Killing:: Commands for killing and yanking.
+* Numeric Arguments:: Specifying numeric arguments, repeat counts.
+* Commands For Completion:: Getting Readline to do the typing for you.
+* Keyboard Macros:: Saving and re-executing typed characters
+* Miscellaneous Commands:: Other miscellaneous commands.
+
+This section describes Readline commands that may be bound to key
+sequences. Command names without an accompanying key sequence are
+unbound by default.
+
+ In the following descriptions, "point" refers to the current cursor
+position, and "mark" refers to a cursor position saved by the 'set-mark'
+command. The text between the point and mark is referred to as the
+"region".
+
+
+File: readline.info, Node: Commands For Moving, Next: Commands For History, Up: Bindable Readline Commands
+
+1.4.1 Commands For Moving
+-------------------------
+
+'beginning-of-line (C-a)'
+ Move to the start of the current line.
+
+'end-of-line (C-e)'
+ Move to the end of the line.
+
+'forward-char (C-f)'
+ Move forward a character.
+
+'backward-char (C-b)'
+ Move back a character.
+
+'forward-word (M-f)'
+ Move forward to the end of the next word. Words are composed of
+ letters and digits.
+
+'backward-word (M-b)'
+ Move back to the start of the current or previous word. Words are
+ composed of letters and digits.
+
+'previous-screen-line ()'
+ Attempt to move point to the same physical screen column on the
+ previous physical screen line. This will not have the desired
+ effect if the current Readline line does not take up more than one
+ physical line or if point is not greater than the length of the
+ prompt plus the screen width.
+
+'next-screen-line ()'
+ Attempt to move point to the same physical screen column on the
+ next physical screen line. This will not have the desired effect
+ if the current Readline line does not take up more than one
+ physical line or if the length of the current Readline line is not
+ greater than the length of the prompt plus the screen width.
+
+'clear-display (M-C-l)'
+ Clear the screen and, if possible, the terminal's scrollback
+ buffer, then redraw the current line, leaving the current line at
+ the top of the screen.
+
+'clear-screen (C-l)'
+ Clear the screen, then redraw the current line, leaving the current
+ line at the top of the screen.
+
+'redraw-current-line ()'
+ Refresh the current line. By default, this is unbound.
+
+
+File: readline.info, Node: Commands For History, Next: Commands For Text, Prev: Commands For Moving, Up: Bindable Readline Commands
+
+1.4.2 Commands For Manipulating The History
+-------------------------------------------
+
+'accept-line (Newline or Return)'
+ Accept the line regardless of where the cursor is. If this line is
+ non-empty, it may be added to the history list for future recall
+ with 'add_history()'. If this line is a modified history line, the
+ history line is restored to its original state.
+
+'previous-history (C-p)'
+ Move 'back' through the history list, fetching the previous
+ command.
+
+'next-history (C-n)'
+ Move 'forward' through the history list, fetching the next command.
+
+'beginning-of-history (M-<)'
+ Move to the first line in the history.
+
+'end-of-history (M->)'
+ Move to the end of the input history, i.e., the line currently
+ being entered.
+
+'reverse-search-history (C-r)'
+ Search backward starting at the current line and moving 'up'
+ through the history as necessary. This is an incremental search.
+ This command sets the region to the matched text and activates the
+ mark.
+
+'forward-search-history (C-s)'
+ Search forward starting at the current line and moving 'down'
+ through the history as necessary. This is an incremental search.
+ This command sets the region to the matched text and activates the
+ mark.
+
+'non-incremental-reverse-search-history (M-p)'
+ Search backward starting at the current line and moving 'up'
+ through the history as necessary using a non-incremental search for
+ a string supplied by the user. The search string may match
+ anywhere in a history line.
+
+'non-incremental-forward-search-history (M-n)'
+ Search forward starting at the current line and moving 'down'
+ through the history as necessary using a non-incremental search for
+ a string supplied by the user. The search string may match
+ anywhere in a history line.
+
+'history-search-forward ()'
+ Search forward through the history for the string of characters
+ between the start of the current line and the point. The search
+ string must match at the beginning of a history line. This is a
+ non-incremental search. By default, this command is unbound.
+
+'history-search-backward ()'
+ Search backward through the history for the string of characters
+ between the start of the current line and the point. The search
+ string must match at the beginning of a history line. This is a
+ non-incremental search. By default, this command is unbound.
+
+'history-substring-search-forward ()'
+ Search forward through the history for the string of characters
+ between the start of the current line and the point. The search
+ string may match anywhere in a history line. This is a
+ non-incremental search. By default, this command is unbound.
+
+'history-substring-search-backward ()'
+ Search backward through the history for the string of characters
+ between the start of the current line and the point. The search
+ string may match anywhere in a history line. This is a
+ non-incremental search. By default, this command is unbound.
+
+'yank-nth-arg (M-C-y)'
+ Insert the first argument to the previous command (usually the
+ second word on the previous line) at point. With an argument N,
+ insert the Nth word from the previous command (the words in the
+ previous command begin with word 0). A negative argument inserts
+ the Nth word from the end of the previous command. Once the
+ argument N is computed, the argument is extracted as if the '!N'
+ history expansion had been specified.
+
+'yank-last-arg (M-. or M-_)'
+ Insert last argument to the previous command (the last word of the
+ previous history entry). With a numeric argument, behave exactly
+ like 'yank-nth-arg'. Successive calls to 'yank-last-arg' move back
+ through the history list, inserting the last word (or the word
+ specified by the argument to the first call) of each line in turn.
+ Any numeric argument supplied to these successive calls determines
+ the direction to move through the history. A negative argument
+ switches the direction through the history (back or forward). The
+ history expansion facilities are used to extract the last argument,
+ as if the '!$' history expansion had been specified.
+
+'operate-and-get-next (C-o)'
+ Accept the current line for return to the calling application as if
+ a newline had been entered, and fetch the next line relative to the
+ current line from the history for editing. A numeric argument, if
+ supplied, specifies the history entry to use instead of the current
+ line.
+
+'fetch-history ()'
+ With a numeric argument, fetch that entry from the history list and
+ make it the current line. Without an argument, move back to the
+ first entry in the history list.
+
+
+File: readline.info, Node: Commands For Text, Next: Commands For Killing, Prev: Commands For History, Up: Bindable Readline Commands
+
+1.4.3 Commands For Changing Text
+--------------------------------
+
+'end-of-file (usually C-d)'
+ The character indicating end-of-file as set, for example, by
+ 'stty'. If this character is read when there are no characters on
+ the line, and point is at the beginning of the line, Readline
+ interprets it as the end of input and returns EOF.
+
+'delete-char (C-d)'
+ Delete the character at point. If this function is bound to the
+ same character as the tty EOF character, as 'C-d' commonly is, see
+ above for the effects.
+
+'backward-delete-char (Rubout)'
+ Delete the character behind the cursor. A numeric argument means
+ to kill the characters instead of deleting them.
+
+'forward-backward-delete-char ()'
+ Delete the character under the cursor, unless the cursor is at the
+ end of the line, in which case the character behind the cursor is
+ deleted. By default, this is not bound to a key.
+
+'quoted-insert (C-q or C-v)'
+ Add the next character typed to the line verbatim. This is how to
+ insert key sequences like 'C-q', for example.
+
+'tab-insert (M-<TAB>)'
+ Insert a tab character.
+
+'self-insert (a, b, A, 1, !, ...)'
+ Insert yourself.
+
+'bracketed-paste-begin ()'
+ This function is intended to be bound to the "bracketed paste"
+ escape sequence sent by some terminals, and such a binding is
+ assigned by default. It allows Readline to insert the pasted text
+ as a single unit without treating each character as if it had been
+ read from the keyboard. The characters are inserted as if each one
+ was bound to 'self-insert' instead of executing any editing
+ commands.
+
+ Bracketed paste sets the region (the characters between point and
+ the mark) to the inserted text. It uses the concept of an _active
+ mark_: when the mark is active, Readline redisplay uses the
+ terminal's standout mode to denote the region.
+
+'transpose-chars (C-t)'
+ Drag the character before the cursor forward over the character at
+ the cursor, moving the cursor forward as well. If the insertion
+ point is at the end of the line, then this transposes the last two
+ characters of the line. Negative arguments have no effect.
+
+'transpose-words (M-t)'
+ Drag the word before point past the word after point, moving point
+ past that word as well. If the insertion point is at the end of
+ the line, this transposes the last two words on the line.
+
+'upcase-word (M-u)'
+ Uppercase the current (or following) word. With a negative
+ argument, uppercase the previous word, but do not move the cursor.
+
+'downcase-word (M-l)'
+ Lowercase the current (or following) word. With a negative
+ argument, lowercase the previous word, but do not move the cursor.
+
+'capitalize-word (M-c)'
+ Capitalize the current (or following) word. With a negative
+ argument, capitalize the previous word, but do not move the cursor.
+
+'overwrite-mode ()'
+ Toggle overwrite mode. With an explicit positive numeric argument,
+ switches to overwrite mode. With an explicit non-positive numeric
+ argument, switches to insert mode. This command affects only
+ 'emacs' mode; 'vi' mode does overwrite differently. Each call to
+ 'readline()' starts in insert mode.
+
+ In overwrite mode, characters bound to 'self-insert' replace the
+ text at point rather than pushing the text to the right.
+ Characters bound to 'backward-delete-char' replace the character
+ before point with a space.
+
+ By default, this command is unbound.
+
+
+File: readline.info, Node: Commands For Killing, Next: Numeric Arguments, Prev: Commands For Text, Up: Bindable Readline Commands
+
+1.4.4 Killing And Yanking
+-------------------------
+
+'kill-line (C-k)'
+ Kill the text from point to the end of the line. With a negative
+ numeric argument, kill backward from the cursor to the beginning of
+ the current line.
+
+'backward-kill-line (C-x Rubout)'
+ Kill backward from the cursor to the beginning of the current line.
+ With a negative numeric argument, kill forward from the cursor to
+ the end of the current line.
+
+'unix-line-discard (C-u)'
+ Kill backward from the cursor to the beginning of the current line.
+
+'kill-whole-line ()'
+ Kill all characters on the current line, no matter where point is.
+ By default, this is unbound.
+
+'kill-word (M-d)'
+ Kill from point to the end of the current word, or if between
+ words, to the end of the next word. Word boundaries are the same
+ as 'forward-word'.
+
+'backward-kill-word (M-<DEL>)'
+ Kill the word behind point. Word boundaries are the same as
+ 'backward-word'.
+
+'shell-transpose-words (M-C-t)'
+ Drag the word before point past the word after point, moving point
+ past that word as well. If the insertion point is at the end of
+ the line, this transposes the last two words on the line. Word
+ boundaries are the same as 'shell-forward-word' and
+ 'shell-backward-word'.
+
+'unix-word-rubout (C-w)'
+ Kill the word behind point, using white space as a word boundary.
+ The killed text is saved on the kill-ring.
+
+'unix-filename-rubout ()'
+ Kill the word behind point, using white space and the slash
+ character as the word boundaries. The killed text is saved on the
+ kill-ring.
+
+'delete-horizontal-space ()'
+ Delete all spaces and tabs around point. By default, this is
+ unbound.
+
+'kill-region ()'
+ Kill the text in the current region. By default, this command is
+ unbound.
+
+'copy-region-as-kill ()'
+ Copy the text in the region to the kill buffer, so it can be yanked
+ right away. By default, this command is unbound.
+
+'copy-backward-word ()'
+ Copy the word before point to the kill buffer. The word boundaries
+ are the same as 'backward-word'. By default, this command is
+ unbound.
+
+'copy-forward-word ()'
+ Copy the word following point to the kill buffer. The word
+ boundaries are the same as 'forward-word'. By default, this
+ command is unbound.
+
+'yank (C-y)'
+ Yank the top of the kill ring into the buffer at point.
+
+'yank-pop (M-y)'
+ Rotate the kill-ring, and yank the new top. You can only do this
+ if the prior command is 'yank' or 'yank-pop'.
+
+
+File: readline.info, Node: Numeric Arguments, Next: Commands For Completion, Prev: Commands For Killing, Up: Bindable Readline Commands
+
+1.4.5 Specifying Numeric Arguments
+----------------------------------
+
+'digit-argument (M-0, M-1, ... M--)'
+ Add this digit to the argument already accumulating, or start a new
+ argument. 'M--' starts a negative argument.
+
+'universal-argument ()'
+ This is another way to specify an argument. If this command is
+ followed by one or more digits, optionally with a leading minus
+ sign, those digits define the argument. If the command is followed
+ by digits, executing 'universal-argument' again ends the numeric
+ argument, but is otherwise ignored. As a special case, if this
+ command is immediately followed by a character that is neither a
+ digit nor minus sign, the argument count for the next command is
+ multiplied by four. The argument count is initially one, so
+ executing this function the first time makes the argument count
+ four, a second time makes the argument count sixteen, and so on.
+ By default, this is not bound to a key.
+
+
+File: readline.info, Node: Commands For Completion, Next: Keyboard Macros, Prev: Numeric Arguments, Up: Bindable Readline Commands
+
+1.4.6 Letting Readline Type For You
+-----------------------------------
+
+'complete (<TAB>)'
+ Attempt to perform completion on the text before point. The actual
+ completion performed is application-specific. The default is
+ filename completion.
+
+'possible-completions (M-?)'
+ List the possible completions of the text before point. When
+ displaying completions, Readline sets the number of columns used
+ for display to the value of 'completion-display-width', the value
+ of the environment variable 'COLUMNS', or the screen width, in that
+ order.
+
+'insert-completions (M-*)'
+ Insert all completions of the text before point that would have
+ been generated by 'possible-completions'.
+
+'menu-complete ()'
+ Similar to 'complete', but replaces the word to be completed with a
+ single match from the list of possible completions. Repeated
+ execution of 'menu-complete' steps through the list of possible
+ completions, inserting each match in turn. At the end of the list
+ of completions, the bell is rung (subject to the setting of
+ 'bell-style') and the original text is restored. An argument of N
+ moves N positions forward in the list of matches; a negative
+ argument may be used to move backward through the list. This
+ command is intended to be bound to <TAB>, but is unbound by
+ default.
+
+'menu-complete-backward ()'
+ Identical to 'menu-complete', but moves backward through the list
+ of possible completions, as if 'menu-complete' had been given a
+ negative argument.
+
+'delete-char-or-list ()'
+ Deletes the character under the cursor if not at the beginning or
+ end of the line (like 'delete-char'). If at the end of the line,
+ behaves identically to 'possible-completions'. This command is
+ unbound by default.
+
+
+File: readline.info, Node: Keyboard Macros, Next: Miscellaneous Commands, Prev: Commands For Completion, Up: Bindable Readline Commands
+
+1.4.7 Keyboard Macros
+---------------------
+
+'start-kbd-macro (C-x ()'
+ Begin saving the characters typed into the current keyboard macro.
+
+'end-kbd-macro (C-x ))'
+ Stop saving the characters typed into the current keyboard macro
+ and save the definition.
+
+'call-last-kbd-macro (C-x e)'
+ Re-execute the last keyboard macro defined, by making the
+ characters in the macro appear as if typed at the keyboard.
+
+'print-last-kbd-macro ()'
+ Print the last keyboard macro defined in a format suitable for the
+ INPUTRC file.
+
+
+File: readline.info, Node: Miscellaneous Commands, Prev: Keyboard Macros, Up: Bindable Readline Commands
+
+1.4.8 Some Miscellaneous Commands
+---------------------------------
+
+'re-read-init-file (C-x C-r)'
+ Read in the contents of the INPUTRC file, and incorporate any
+ bindings or variable assignments found there.
+
+'abort (C-g)'
+ Abort the current editing command and ring the terminal's bell
+ (subject to the setting of 'bell-style').
+
+'do-lowercase-version (M-A, M-B, M-X, ...)'
+ If the metafied character X is upper case, run the command that is
+ bound to the corresponding metafied lower case character. The
+ behavior is undefined if X is already lower case.
+
+'prefix-meta (<ESC>)'
+ Metafy the next character typed. This is for keyboards without a
+ meta key. Typing '<ESC> f' is equivalent to typing 'M-f'.
+
+'undo (C-_ or C-x C-u)'
+ Incremental undo, separately remembered for each line.
+
+'revert-line (M-r)'
+ Undo all changes made to this line. This is like executing the
+ 'undo' command enough times to get back to the beginning.
+
+'tilde-expand (M-~)'
+ Perform tilde expansion on the current word.
+
+'set-mark (C-@)'
+ Set the mark to the point. If a numeric argument is supplied, the
+ mark is set to that position.
+
+'exchange-point-and-mark (C-x C-x)'
+ Swap the point with the mark. The current cursor position is set
+ to the saved position, and the old cursor position is saved as the
+ mark.
+
+'character-search (C-])'
+ A character is read and point is moved to the next occurrence of
+ that character. A negative argument searches for previous
+ occurrences.
+
+'character-search-backward (M-C-])'
+ A character is read and point is moved to the previous occurrence
+ of that character. A negative argument searches for subsequent
+ occurrences.
+
+'skip-csi-sequence ()'
+ Read enough characters to consume a multi-key sequence such as
+ those defined for keys like Home and End. Such sequences begin
+ with a Control Sequence Indicator (CSI), usually ESC-[. If this
+ sequence is bound to "\e[", keys producing such sequences will have
+ no effect unless explicitly bound to a Readline command, instead of
+ inserting stray characters into the editing buffer. This is
+ unbound by default, but usually bound to ESC-[.
+
+'insert-comment (M-#)'
+ Without a numeric argument, the value of the 'comment-begin'
+ variable is inserted at the beginning of the current line. If a
+ numeric argument is supplied, this command acts as a toggle: if the
+ characters at the beginning of the line do not match the value of
+ 'comment-begin', the value is inserted, otherwise the characters in
+ 'comment-begin' are deleted from the beginning of the line. In
+ either case, the line is accepted as if a newline had been typed.
+
+'dump-functions ()'
+ Print all of the functions and their key bindings to the Readline
+ output stream. If a numeric argument is supplied, the output is
+ formatted in such a way that it can be made part of an INPUTRC
+ file. This command is unbound by default.
+
+'dump-variables ()'
+ Print all of the settable variables and their values to the
+ Readline output stream. If a numeric argument is supplied, the
+ output is formatted in such a way that it can be made part of an
+ INPUTRC file. This command is unbound by default.
+
+'dump-macros ()'
+ Print all of the Readline key sequences bound to macros and the
+ strings they output. If a numeric argument is supplied, the output
+ is formatted in such a way that it can be made part of an INPUTRC
+ file. This command is unbound by default.
+
+'emacs-editing-mode (C-e)'
+ When in 'vi' command mode, this causes a switch to 'emacs' editing
+ mode.
+
+'vi-editing-mode (M-C-j)'
+ When in 'emacs' editing mode, this causes a switch to 'vi' editing
+ mode.
+
+
+File: readline.info, Node: Readline vi Mode, Prev: Bindable Readline Commands, Up: Command Line Editing
+
+1.5 Readline vi Mode
+====================
+
+While the Readline library does not have a full set of 'vi' editing
+functions, it does contain enough to allow simple editing of the line.
+The Readline 'vi' mode behaves as specified in the POSIX standard.
+
+ In order to switch interactively between 'emacs' and 'vi' editing
+modes, use the command 'M-C-j' (bound to emacs-editing-mode when in 'vi'
+mode and to vi-editing-mode in 'emacs' mode). The Readline default is
+'emacs' mode.
+
+ When you enter a line in 'vi' mode, you are already placed in
+'insertion' mode, as if you had typed an 'i'. Pressing <ESC> switches
+you into 'command' mode, where you can edit the text of the line with
+the standard 'vi' movement keys, move to previous history lines with 'k'
+and subsequent lines with 'j', and so forth.
+
+ This document describes the GNU Readline Library, a utility for
+aiding in the consistency of user interface across discrete programs
+that need to provide a command line interface.
+
+ Copyright (C) 1988-2022 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice pare
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that the
+entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Foundation.
+
+
+File: readline.info, Node: Programming with GNU Readline, Next: GNU Free Documentation License, Prev: Command Line Editing, Up: Top
+
+2 Programming with GNU Readline
+*******************************
+
+This chapter describes the interface between the GNU Readline Library
+and other programs. If you are a programmer, and you wish to include
+the features found in GNU Readline such as completion, line editing, and
+interactive history manipulation in your own programs, this section is
+for you.
+
+* Menu:
+
+* Basic Behavior:: Using the default behavior of Readline.
+* Custom Functions:: Adding your own functions to Readline.
+* Readline Variables:: Variables accessible to custom
+ functions.
+* Readline Convenience Functions:: Functions which Readline supplies to
+ aid in writing your own custom
+ functions.
+* Readline Signal Handling:: How Readline behaves when it receives signals.
+* Custom Completers:: Supplanting or supplementing Readline's
+ completion functions.
+
+
+File: readline.info, Node: Basic Behavior, Next: Custom Functions, Up: Programming with GNU Readline
+
+2.1 Basic Behavior
+==================
+
+Many programs provide a command line interface, such as 'mail', 'ftp',
+and 'sh'. For such programs, the default behaviour of Readline is
+sufficient. This section describes how to use Readline in the simplest
+way possible, perhaps to replace calls in your code to 'gets()' or
+'fgets()'.
+
+ The function 'readline()' prints a prompt PROMPT and then reads and
+returns a single line of text from the user. If PROMPT is 'NULL' or the
+empty string, no prompt is displayed. The line 'readline' returns is
+allocated with 'malloc()'; the caller should 'free()' the line when it
+has finished with it. The declaration for 'readline' in ANSI C is
+
+ char *readline (const char *PROMPT);
+
+So, one might say
+ char *line = readline ("Enter a line: ");
+in order to read a line of text from the user. The line returned has
+the final newline removed, so only the text remains.
+
+ If 'readline' encounters an 'EOF' while reading the line, and the
+line is empty at that point, then '(char *)NULL' is returned.
+Otherwise, the line is ended just as if a newline had been typed.
+
+ Readline performs some expansion on the PROMPT before it is displayed
+on the screen. See the description of 'rl_expand_prompt' (*note
+Redisplay::) for additional details, especially if PROMPT will contain
+characters that do not consume physical screen space when displayed.
+
+ If you want the user to be able to get at the line later, (with <C-p>
+for example), you must call 'add_history()' to save the line away in a
+"history" list of such lines.
+
+ add_history (line);
+
+For full details on the GNU History Library, see the associated manual.
+
+ It is preferable to avoid saving empty lines on the history list,
+since users rarely have a burning need to reuse a blank line. Here is a
+function which usefully replaces the standard 'gets()' library function,
+and has the advantage of no static buffer to overflow:
+
+ /* A static variable for holding the line. */
+ static char *line_read = (char *)NULL;
+
+ /* Read a string, and return a pointer to it.
+ Returns NULL on EOF. */
+ char *
+ rl_gets ()
+ {
+ /* If the buffer has already been allocated,
+ return the memory to the free pool. */
+ if (line_read)
+ {
+ free (line_read);
+ line_read = (char *)NULL;
+ }
+
+ /* Get a line from the user. */
+ line_read = readline ("");
+
+ /* If the line has any text in it,
+ save it on the history. */
+ if (line_read && *line_read)
+ add_history (line_read);
+
+ return (line_read);
+ }
+
+ This function gives the user the default behaviour of <TAB>
+completion: completion on file names. If you do not want Readline to
+complete on filenames, you can change the binding of the <TAB> key with
+'rl_bind_key()'.
+
+ int rl_bind_key (int KEY, rl_command_func_t *FUNCTION);
+
+ 'rl_bind_key()' takes two arguments: KEY is the character that you
+want to bind, and FUNCTION is the address of the function to call when
+KEY is pressed. Binding <TAB> to 'rl_insert()' makes <TAB> insert
+itself. 'rl_bind_key()' returns non-zero if KEY is not a valid ASCII
+character code (between 0 and 255).
+
+ Thus, to disable the default <TAB> behavior, the following suffices:
+ rl_bind_key ('\t', rl_insert);
+
+ This code should be executed once at the start of your program; you
+might write a function called 'initialize_readline()' which performs
+this and other desired initializations, such as installing custom
+completers (*note Custom Completers::).
+
+
+File: readline.info, Node: Custom Functions, Next: Readline Variables, Prev: Basic Behavior, Up: Programming with GNU Readline
+
+2.2 Custom Functions
+====================
+
+Readline provides many functions for manipulating the text of the line,
+but it isn't possible to anticipate the needs of all programs. This
+section describes the various functions and variables defined within the
+Readline library which allow a user program to add customized
+functionality to Readline.
+
+ Before declaring any functions that customize Readline's behavior, or
+using any functionality Readline provides in other code, an application
+writer should include the file '<readline/readline.h>' in any file that
+uses Readline's features. Since some of the definitions in 'readline.h'
+use the 'stdio' library, the file '<stdio.h>' should be included before
+'readline.h'.
+
+ 'readline.h' defines a C preprocessor variable that should be treated
+as an integer, 'RL_READLINE_VERSION', which may be used to conditionally
+compile application code depending on the installed Readline version.
+The value is a hexadecimal encoding of the major and minor version
+numbers of the library, of the form 0xMMMM. MM is the two-digit major
+version number; MM is the two-digit minor version number. For Readline
+4.2, for example, the value of 'RL_READLINE_VERSION' would be '0x0402'.
+
+* Menu:
+
+* Readline Typedefs:: C declarations to make code readable.
+* Function Writing:: Variables and calling conventions.
+
+
+File: readline.info, Node: Readline Typedefs, Next: Function Writing, Up: Custom Functions
+
+2.2.1 Readline Typedefs
+-----------------------
+
+For readability, we declare a number of new object types, all pointers
+to functions.
+
+ The reason for declaring these new types is to make it easier to
+write code describing pointers to C functions with appropriately
+prototyped arguments and return values.
+
+ For instance, say we want to declare a variable FUNC as a pointer to
+a function which takes two 'int' arguments and returns an 'int' (this is
+the type of all of the Readline bindable functions). Instead of the
+classic C declaration
+
+ 'int (*func)();'
+
+or the ANSI-C style declaration
+
+ 'int (*func)(int, int);'
+
+we may write
+
+ 'rl_command_func_t *func;'
+
+ The full list of function pointer types available is
+
+'typedef int rl_command_func_t (int, int);'
+
+'typedef char *rl_compentry_func_t (const char *, int);'
+
+'typedef char **rl_completion_func_t (const char *, int, int);'
+
+'typedef char *rl_quote_func_t (char *, int, char *);'
+
+'typedef char *rl_dequote_func_t (char *, int);'
+
+'typedef int rl_compignore_func_t (char **);'
+
+'typedef void rl_compdisp_func_t (char **, int, int);'
+
+'typedef int rl_hook_func_t (void);'
+
+'typedef int rl_getc_func_t (FILE *);'
+
+'typedef int rl_linebuf_func_t (char *, int);'
+
+'typedef int rl_intfunc_t (int);'
+'#define rl_ivoidfunc_t rl_hook_func_t'
+'typedef int rl_icpfunc_t (char *);'
+'typedef int rl_icppfunc_t (char **);'
+
+'typedef void rl_voidfunc_t (void);'
+'typedef void rl_vintfunc_t (int);'
+'typedef void rl_vcpfunc_t (char *);'
+'typedef void rl_vcppfunc_t (char **);'
+
+
+File: readline.info, Node: Function Writing, Prev: Readline Typedefs, Up: Custom Functions
+
+2.2.2 Writing a New Function
+----------------------------
+
+In order to write new functions for Readline, you need to know the
+calling conventions for keyboard-invoked functions, and the names of the
+variables that describe the current state of the line read so far.
+
+ The calling sequence for a command 'foo' looks like
+
+ int foo (int count, int key)
+
+where COUNT is the numeric argument (or 1 if defaulted) and KEY is the
+key that invoked this function.
+
+ It is completely up to the function as to what should be done with
+the numeric argument. Some functions use it as a repeat count, some as
+a flag, and others to choose alternate behavior (refreshing the current
+line as opposed to refreshing the screen, for example). Some choose to
+ignore it. In general, if a function uses the numeric argument as a
+repeat count, it should be able to do something useful with both
+negative and positive arguments. At the very least, it should be aware
+that it can be passed a negative argument.
+
+ A command function should return 0 if its action completes
+successfully, and a value greater than zero if some error occurs. This
+is the convention obeyed by all of the builtin Readline bindable command
+functions.
+
+
+File: readline.info, Node: Readline Variables, Next: Readline Convenience Functions, Prev: Custom Functions, Up: Programming with GNU Readline
+
+2.3 Readline Variables
+======================
+
+These variables are available to function writers.
+
+ -- Variable: char * rl_line_buffer
+ This is the line gathered so far. You are welcome to modify the
+ contents of the line, but see *note Allowing Undoing::. The
+ function 'rl_extend_line_buffer' is available to increase the
+ memory allocated to 'rl_line_buffer'.
+
+ -- Variable: int rl_point
+ The offset of the current cursor position in 'rl_line_buffer' (the
+ _point_).
+
+ -- Variable: int rl_end
+ The number of characters present in 'rl_line_buffer'. When
+ 'rl_point' is at the end of the line, 'rl_point' and 'rl_end' are
+ equal.
+
+ -- Variable: int rl_mark
+ The MARK (saved position) in the current line. If set, the mark
+ and point define a _region_.
+
+ -- Variable: int rl_done
+ Setting this to a non-zero value causes Readline to return the
+ current line immediately. Readline will set this variable when it
+ has read a key sequence bound to 'accept-line' and is about to
+ return the line to the caller.
+
+ -- Variable: int rl_eof_found
+ Readline will set this variable when it has read an EOF character
+ (e.g., the stty 'EOF' character) on an empty line or encountered a
+ read error and is about to return a NULL line to the caller.
+
+ -- Variable: int rl_num_chars_to_read
+ Setting this to a positive value before calling 'readline()' causes
+ Readline to return after accepting that many characters, rather
+ than reading up to a character bound to 'accept-line'.
+
+ -- Variable: int rl_pending_input
+ Setting this to a value makes it the next keystroke read. This is
+ a way to stuff a single character into the input stream.
+
+ -- Variable: int rl_dispatching
+ Set to a non-zero value if a function is being called from a key
+ binding; zero otherwise. Application functions can test this to
+ discover whether they were called directly or by Readline's
+ dispatching mechanism.
+
+ -- Variable: int rl_erase_empty_line
+ Setting this to a non-zero value causes Readline to completely
+ erase the current line, including any prompt, any time a newline is
+ typed as the only character on an otherwise-empty line. The cursor
+ is moved to the beginning of the newly-blank line.
+
+ -- Variable: char * rl_prompt
+ The prompt Readline uses. This is set from the argument to
+ 'readline()', and should not be assigned to directly. The
+ 'rl_set_prompt()' function (*note Redisplay::) may be used to
+ modify the prompt string after calling 'readline()'.
+
+ -- Variable: char * rl_display_prompt
+ The string displayed as the prompt. This is usually identical to
+ RL_PROMPT, but may be changed temporarily by functions that use the
+ prompt string as a message area, such as incremental search.
+
+ -- Variable: int rl_already_prompted
+ If an application wishes to display the prompt itself, rather than
+ have Readline do it the first time 'readline()' is called, it
+ should set this variable to a non-zero value after displaying the
+ prompt. The prompt must also be passed as the argument to
+ 'readline()' so the redisplay functions can update the display
+ properly. The calling application is responsible for managing the
+ value; Readline never sets it.
+
+ -- Variable: const char * rl_library_version
+ The version number of this revision of the library.
+
+ -- Variable: int rl_readline_version
+ An integer encoding the current version of the library. The
+ encoding is of the form 0xMMMM, where MM is the two-digit major
+ version number, and MM is the two-digit minor version number. For
+ example, for Readline-4.2, 'rl_readline_version' would have the
+ value 0x0402.
+
+ -- Variable: int rl_gnu_readline_p
+ Always set to 1, denoting that this is GNU Readline rather than
+ some emulation.
+
+ -- Variable: const char * rl_terminal_name
+ The terminal type, used for initialization. If not set by the
+ application, Readline sets this to the value of the 'TERM'
+ environment variable the first time it is called.
+
+ -- Variable: const char * rl_readline_name
+ This variable is set to a unique name by each application using
+ Readline. The value allows conditional parsing of the inputrc file
+ (*note Conditional Init Constructs::).
+
+ -- Variable: FILE * rl_instream
+ The stdio stream from which Readline reads input. If 'NULL',
+ Readline defaults to STDIN.
+
+ -- Variable: FILE * rl_outstream
+ The stdio stream to which Readline performs output. If 'NULL',
+ Readline defaults to STDOUT.
+
+ -- Variable: int rl_prefer_env_winsize
+ If non-zero, Readline gives values found in the 'LINES' and
+ 'COLUMNS' environment variables greater precedence than values
+ fetched from the kernel when computing the screen dimensions.
+
+ -- Variable: rl_command_func_t * rl_last_func
+ The address of the last command function Readline executed. May be
+ used to test whether or not a function is being executed twice in
+ succession, for example.
+
+ -- Variable: rl_hook_func_t * rl_startup_hook
+ If non-zero, this is the address of a function to call just before
+ 'readline' prints the first prompt.
+
+ -- Variable: rl_hook_func_t * rl_pre_input_hook
+ If non-zero, this is the address of a function to call after the
+ first prompt has been printed and just before 'readline' starts
+ reading input characters.
+
+ -- Variable: rl_hook_func_t * rl_event_hook
+ If non-zero, this is the address of a function to call periodically
+ when Readline is waiting for terminal input. By default, this will
+ be called at most ten times a second if there is no keyboard input.
+
+ -- Variable: rl_getc_func_t * rl_getc_function
+ If non-zero, Readline will call indirectly through this pointer to
+ get a character from the input stream. By default, it is set to
+ 'rl_getc', the default Readline character input function (*note
+ Character Input::). In general, an application that sets
+ RL_GETC_FUNCTION should consider setting RL_INPUT_AVAILABLE_HOOK as
+ well.
+
+ -- Variable: rl_hook_func_t * rl_signal_event_hook
+ If non-zero, this is the address of a function to call if a read
+ system call is interrupted when Readline is reading terminal input.
+
+ -- Variable: rl_hook_func_t * rl_timeout_event_hook
+ If non-zero, this is the address of a function to call if Readline
+ times out while reading input.
+
+ -- Variable: rl_hook_func_t * rl_input_available_hook
+ If non-zero, Readline will use this function's return value when it
+ needs to determine whether or not there is available input on the
+ current input source. The default hook checks 'rl_instream'; if an
+ application is using a different input source, it should set the
+ hook appropriately. Readline queries for available input when
+ implementing intra-key-sequence timeouts during input and
+ incremental searches. This may use an application-specific timeout
+ before returning a value; Readline uses the value passed to
+ 'rl_set_keyboard_input_timeout()' or the value of the user-settable
+ KEYSEQ-TIMEOUT variable. This is designed for use by applications
+ using Readline's callback interface (*note Alternate Interface::),
+ which may not use the traditional 'read(2)' and file descriptor
+ interface, or other applications using a different input mechanism.
+ If an application uses an input mechanism or hook that can
+ potentially exceed the value of KEYSEQ-TIMEOUT, it should increase
+ the timeout or set this hook appropriately even when not using the
+ callback interface. In general, an application that sets
+ RL_GETC_FUNCTION should consider setting RL_INPUT_AVAILABLE_HOOK as
+ well.
+
+ -- Variable: rl_voidfunc_t * rl_redisplay_function
+ If non-zero, Readline will call indirectly through this pointer to
+ update the display with the current contents of the editing buffer.
+ By default, it is set to 'rl_redisplay', the default Readline
+ redisplay function (*note Redisplay::).
+
+ -- Variable: rl_vintfunc_t * rl_prep_term_function
+ If non-zero, Readline will call indirectly through this pointer to
+ initialize the terminal. The function takes a single argument, an
+ 'int' flag that says whether or not to use eight-bit characters.
+ By default, this is set to 'rl_prep_terminal' (*note Terminal
+ Management::).
+
+ -- Variable: rl_voidfunc_t * rl_deprep_term_function
+ If non-zero, Readline will call indirectly through this pointer to
+ reset the terminal. This function should undo the effects of
+ 'rl_prep_term_function'. By default, this is set to
+ 'rl_deprep_terminal' (*note Terminal Management::).
+
+ -- Variable: Keymap rl_executing_keymap
+ This variable is set to the keymap (*note Keymaps::) in which the
+ currently executing Readline function was found.
+
+ -- Variable: Keymap rl_binding_keymap
+ This variable is set to the keymap (*note Keymaps::) in which the
+ last key binding occurred.
+
+ -- Variable: char * rl_executing_macro
+ This variable is set to the text of any currently-executing macro.
+
+ -- Variable: int rl_executing_key
+ The key that caused the dispatch to the currently-executing
+ Readline function.
+
+ -- Variable: char * rl_executing_keyseq
+ The full key sequence that caused the dispatch to the
+ currently-executing Readline function.
+
+ -- Variable: int rl_key_sequence_length
+ The number of characters in RL_EXECUTING_KEYSEQ.
+
+ -- Variable: int rl_readline_state
+ A variable with bit values that encapsulate the current Readline
+ state. A bit is set with the 'RL_SETSTATE' macro, and unset with
+ the 'RL_UNSETSTATE' macro. Use the 'RL_ISSTATE' macro to test
+ whether a particular state bit is set. Current state bits include:
+
+ 'RL_STATE_NONE'
+ Readline has not yet been called, nor has it begun to
+ initialize.
+ 'RL_STATE_INITIALIZING'
+ Readline is initializing its internal data structures.
+ 'RL_STATE_INITIALIZED'
+ Readline has completed its initialization.
+ 'RL_STATE_TERMPREPPED'
+ Readline has modified the terminal modes to do its own input
+ and redisplay.
+ 'RL_STATE_READCMD'
+ Readline is reading a command from the keyboard.
+ 'RL_STATE_METANEXT'
+ Readline is reading more input after reading the meta-prefix
+ character.
+ 'RL_STATE_DISPATCHING'
+ Readline is dispatching to a command.
+ 'RL_STATE_MOREINPUT'
+ Readline is reading more input while executing an editing
+ command.
+ 'RL_STATE_ISEARCH'
+ Readline is performing an incremental history search.
+ 'RL_STATE_NSEARCH'
+ Readline is performing a non-incremental history search.
+ 'RL_STATE_SEARCH'
+ Readline is searching backward or forward through the history
+ for a string.
+ 'RL_STATE_NUMERICARG'
+ Readline is reading a numeric argument.
+ 'RL_STATE_MACROINPUT'
+ Readline is currently getting its input from a
+ previously-defined keyboard macro.
+ 'RL_STATE_MACRODEF'
+ Readline is currently reading characters defining a keyboard
+ macro.
+ 'RL_STATE_OVERWRITE'
+ Readline is in overwrite mode.
+ 'RL_STATE_COMPLETING'
+ Readline is performing word completion.
+ 'RL_STATE_SIGHANDLER'
+ Readline is currently executing the readline signal handler.
+ 'RL_STATE_UNDOING'
+ Readline is performing an undo.
+ 'RL_STATE_INPUTPENDING'
+ Readline has input pending due to a call to
+ 'rl_execute_next()'.
+ 'RL_STATE_TTYCSAVED'
+ Readline has saved the values of the terminal's special
+ characters.
+ 'RL_STATE_CALLBACK'
+ Readline is currently using the alternate (callback) interface
+ (*note Alternate Interface::).
+ 'RL_STATE_VIMOTION'
+ Readline is reading the argument to a vi-mode "motion"
+ command.
+ 'RL_STATE_MULTIKEY'
+ Readline is reading a multiple-keystroke command.
+ 'RL_STATE_VICMDONCE'
+ Readline has entered vi command (movement) mode at least one
+ time during the current call to 'readline()'.
+ 'RL_STATE_DONE'
+ Readline has read a key sequence bound to 'accept-line' and is
+ about to return the line to the caller.
+ 'RL_STATE_TIMEOUT'
+ Readline has timed out (it did not receive a line or specified
+ number of characters before the timeout duration specified by
+ 'rl_set_timeout' elapsed) and is returning that status to the
+ caller.
+ 'RL_STATE_EOF'
+ Readline has read an EOF character (e.g., the stty 'EOF'
+ character) or encountered a read error and is about to return
+ a NULL line to the caller.
+
+ -- Variable: int rl_explicit_arg
+ Set to a non-zero value if an explicit numeric argument was
+ specified by the user. Only valid in a bindable command function.
+
+ -- Variable: int rl_numeric_arg
+ Set to the value of any numeric argument explicitly specified by
+ the user before executing the current Readline function. Only
+ valid in a bindable command function.
+
+ -- Variable: int rl_editing_mode
+ Set to a value denoting Readline's current editing mode. A value
+ of 1 means Readline is currently in emacs mode; 0 means that vi
+ mode is active.
+
+
+File: readline.info, Node: Readline Convenience Functions, Next: Readline Signal Handling, Prev: Readline Variables, Up: Programming with GNU Readline
+
+2.4 Readline Convenience Functions
+==================================
+
+* Menu:
+
+* Function Naming:: How to give a function you write a name.
+* Keymaps:: Making keymaps.
+* Binding Keys:: Changing Keymaps.
+* Associating Function Names and Bindings:: Translate function names to
+ key sequences.
+* Allowing Undoing:: How to make your functions undoable.
+* Redisplay:: Functions to control line display.
+* Modifying Text:: Functions to modify 'rl_line_buffer'.
+* Character Input:: Functions to read keyboard input.
+* Terminal Management:: Functions to manage terminal settings.
+* Utility Functions:: Generally useful functions and hooks.
+* Miscellaneous Functions:: Functions that don't fall into any category.
+* Alternate Interface:: Using Readline in a 'callback' fashion.
+* A Readline Example:: An example Readline function.
+* Alternate Interface Example:: An example program using the alternate interface.
+
+
+File: readline.info, Node: Function Naming, Next: Keymaps, Up: Readline Convenience Functions
+
+2.4.1 Naming a Function
+-----------------------
+
+The user can dynamically change the bindings of keys while using
+Readline. This is done by representing the function with a descriptive
+name. The user is able to type the descriptive name when referring to
+the function. Thus, in an init file, one might find
+
+ Meta-Rubout: backward-kill-word
+
+ This binds the keystroke <Meta-Rubout> to the function
+_descriptively_ named 'backward-kill-word'. You, as the programmer,
+should bind the functions you write to descriptive names as well.
+Readline provides a function for doing that:
+
+ -- Function: int rl_add_defun (const char *name, rl_command_func_t
+ *function, int key)
+ Add NAME to the list of named functions. Make FUNCTION be the
+ function that gets called. If KEY is not -1, then bind it to
+ FUNCTION using 'rl_bind_key()'.
+
+ Using this function alone is sufficient for most applications. It is
+the recommended way to add a few functions to the default functions that
+Readline has built in. If you need to do something other than adding a
+function to Readline, you may need to use the underlying functions
+described below.
+
+
+File: readline.info, Node: Keymaps, Next: Binding Keys, Prev: Function Naming, Up: Readline Convenience Functions
+
+2.4.2 Selecting a Keymap
+------------------------
+
+Key bindings take place on a "keymap". The keymap is the association
+between the keys that the user types and the functions that get run.
+You can make your own keymaps, copy existing keymaps, and tell Readline
+which keymap to use.
+
+ -- Function: Keymap rl_make_bare_keymap (void)
+ Returns a new, empty keymap. The space for the keymap is allocated
+ with 'malloc()'; the caller should free it by calling
+ 'rl_free_keymap()' when done.
+
+ -- Function: Keymap rl_copy_keymap (Keymap map)
+ Return a new keymap which is a copy of MAP.
+
+ -- Function: Keymap rl_make_keymap (void)
+ Return a new keymap with the printing characters bound to
+ rl_insert, the lowercase Meta characters bound to run their
+ equivalents, and the Meta digits bound to produce numeric
+ arguments.
+
+ -- Function: void rl_discard_keymap (Keymap keymap)
+ Free the storage associated with the data in KEYMAP. The caller
+ should free KEYMAP.
+
+ -- Function: void rl_free_keymap (Keymap keymap)
+ Free all storage associated with KEYMAP. This calls
+ 'rl_discard_keymap' to free subordindate keymaps and macros.
+
+ -- Function: int rl_empty_keymap (Keymap keymap)
+ Return non-zero if there are no keys bound to functions in KEYMAP;
+ zero if there are any keys bound.
+
+ Readline has several internal keymaps. These functions allow you to
+change which keymap is active.
+
+ -- Function: Keymap rl_get_keymap (void)
+ Returns the currently active keymap.
+
+ -- Function: void rl_set_keymap (Keymap keymap)
+ Makes KEYMAP the currently active keymap.
+
+ -- Function: Keymap rl_get_keymap_by_name (const char *name)
+ Return the keymap matching NAME. NAME is one which would be
+ supplied in a 'set keymap' inputrc line (*note Readline Init
+ File::).
+
+ -- Function: char * rl_get_keymap_name (Keymap keymap)
+ Return the name matching KEYMAP. NAME is one which would be
+ supplied in a 'set keymap' inputrc line (*note Readline Init
+ File::).
+
+ -- Function: int rl_set_keymap_name (const char *name, Keymap keymap)
+ Set the name of KEYMAP. This name will then be "registered" and
+ available for use in a 'set keymap' inputrc directive *note
+ Readline Init File::). The NAME may not be one of Readline's
+ builtin keymap names; you may not add a different name for one of
+ Readline's builtin keymaps. You may replace the name associated
+ with a given keymap by calling this function more than once with
+ the same KEYMAP argument. You may associate a registered NAME with
+ a new keymap by calling this function more than once with the same
+ NAME argument. There is no way to remove a named keymap once the
+ name has been registered. Readline will make a copy of NAME. The
+ return value is greater than zero unless NAME is one of Readline's
+ builtin keymap names or KEYMAP is one of Readline's builtin
+ keymaps.
+
+
+File: readline.info, Node: Binding Keys, Next: Associating Function Names and Bindings, Prev: Keymaps, Up: Readline Convenience Functions
+
+2.4.3 Binding Keys
+------------------
+
+Key sequences are associate with functions through the keymap. Readline
+has several internal keymaps: 'emacs_standard_keymap',
+'emacs_meta_keymap', 'emacs_ctlx_keymap', 'vi_movement_keymap', and
+'vi_insertion_keymap'. 'emacs_standard_keymap' is the default, and the
+examples in this manual assume that.
+
+ Since 'readline()' installs a set of default key bindings the first
+time it is called, there is always the danger that a custom binding
+installed before the first call to 'readline()' will be overridden. An
+alternate mechanism is to install custom key bindings in an
+initialization function assigned to the 'rl_startup_hook' variable
+(*note Readline Variables::).
+
+ These functions manage key bindings.
+
+ -- Function: int rl_bind_key (int key, rl_command_func_t *function)
+ Binds KEY to FUNCTION in the currently active keymap. Returns
+ non-zero in the case of an invalid KEY.
+
+ -- Function: int rl_bind_key_in_map (int key, rl_command_func_t
+ *function, Keymap map)
+ Bind KEY to FUNCTION in MAP. Returns non-zero in the case of an
+ invalid KEY.
+
+ -- Function: int rl_bind_key_if_unbound (int key, rl_command_func_t
+ *function)
+ Binds KEY to FUNCTION if it is not already bound in the currently
+ active keymap. Returns non-zero in the case of an invalid KEY or
+ if KEY is already bound.
+
+ -- Function: int rl_bind_key_if_unbound_in_map (int key,
+ rl_command_func_t *function, Keymap map)
+ Binds KEY to FUNCTION if it is not already bound in MAP. Returns
+ non-zero in the case of an invalid KEY or if KEY is already bound.
+
+ -- Function: int rl_unbind_key (int key)
+ Bind KEY to the null function in the currently active keymap.
+ Returns non-zero in case of error.
+
+ -- Function: int rl_unbind_key_in_map (int key, Keymap map)
+ Bind KEY to the null function in MAP. Returns non-zero in case of
+ error.
+
+ -- Function: int rl_unbind_function_in_map (rl_command_func_t
+ *function, Keymap map)
+ Unbind all keys that execute FUNCTION in MAP.
+
+ -- Function: int rl_unbind_command_in_map (const char *command, Keymap
+ map)
+ Unbind all keys that are bound to COMMAND in MAP.
+
+ -- Function: int rl_bind_keyseq (const char *keyseq, rl_command_func_t
+ *function)
+ Bind the key sequence represented by the string KEYSEQ to the
+ function FUNCTION, beginning in the current keymap. This makes new
+ keymaps as necessary. The return value is non-zero if KEYSEQ is
+ invalid.
+
+ -- Function: int rl_bind_keyseq_in_map (const char *keyseq,
+ rl_command_func_t *function, Keymap map)
+ Bind the key sequence represented by the string KEYSEQ to the
+ function FUNCTION. This makes new keymaps as necessary. Initial
+ bindings are performed in MAP. The return value is non-zero if
+ KEYSEQ is invalid.
+
+ -- Function: int rl_set_key (const char *keyseq, rl_command_func_t
+ *function, Keymap map)
+ Equivalent to 'rl_bind_keyseq_in_map'.
+
+ -- Function: int rl_bind_keyseq_if_unbound (const char *keyseq,
+ rl_command_func_t *function)
+ Binds KEYSEQ to FUNCTION if it is not already bound in the
+ currently active keymap. Returns non-zero in the case of an
+ invalid KEYSEQ or if KEYSEQ is already bound.
+
+ -- Function: int rl_bind_keyseq_if_unbound_in_map (const char *keyseq,
+ rl_command_func_t *function, Keymap map)
+ Binds KEYSEQ to FUNCTION if it is not already bound in MAP.
+ Returns non-zero in the case of an invalid KEYSEQ or if KEYSEQ is
+ already bound.
+
+ -- Function: int rl_generic_bind (int type, const char *keyseq, char
+ *data, Keymap map)
+ Bind the key sequence represented by the string KEYSEQ to the
+ arbitrary pointer DATA. TYPE says what kind of data is pointed to
+ by DATA; this can be a function ('ISFUNC'), a macro ('ISMACR'), or
+ a keymap ('ISKMAP'). This makes new keymaps as necessary. The
+ initial keymap in which to do bindings is MAP.
+
+ -- Function: int rl_parse_and_bind (char *line)
+ Parse LINE as if it had been read from the 'inputrc' file and
+ perform any key bindings and variable assignments found (*note
+ Readline Init File::).
+
+ -- Function: int rl_read_init_file (const char *filename)
+ Read keybindings and variable assignments from FILENAME (*note
+ Readline Init File::).
+
+
+File: readline.info, Node: Associating Function Names and Bindings, Next: Allowing Undoing, Prev: Binding Keys, Up: Readline Convenience Functions
+
+2.4.4 Associating Function Names and Bindings
+---------------------------------------------
+
+These functions allow you to find out what keys invoke named functions
+and the functions invoked by a particular key sequence. You may also
+associate a new function name with an arbitrary function.
+
+ -- Function: rl_command_func_t * rl_named_function (const char *name)
+ Return the function with name NAME.
+
+ -- Function: rl_command_func_t * rl_function_of_keyseq (const char
+ *keyseq, Keymap map, int *type)
+ Return the function invoked by KEYSEQ in keymap MAP. If MAP is
+ 'NULL', the current keymap is used. If TYPE is not 'NULL', the
+ type of the object is returned in the 'int' variable it points to
+ (one of 'ISFUNC', 'ISKMAP', or 'ISMACR'). It takes a "translated"
+ key sequence and should not be used if the key sequence can include
+ NUL.
+
+ -- Function: rl_command_func_t * rl_function_of_keyseq_len (const char
+ *keyseq, size_t len, Keymap map, int *type)
+ Return the function invoked by KEYSEQ of length LEN in keymap MAP.
+ Equivalent to 'rl_function_of_keyseq' with the addition of the LEN
+ parameter. It takes a "translated" key sequence and should be used
+ if the key sequence can include NUL.
+
+ -- Function: int rl_trim_arg_from_keyseq (const char *keyseq, size_t
+ len, Keymap map)
+ If there is a numeric argument at the beginning of KEYSEQ, possibly
+ including digits, return the index of the first character in KEYSEQ
+ following the numeric argument. This can be used to skip over the
+ numeric argument (which is available as 'rl_numeric_arg' while
+ traversing the key sequence that invoked the current command.
+
+ -- Function: char ** rl_invoking_keyseqs (rl_command_func_t *function)
+ Return an array of strings representing the key sequences used to
+ invoke FUNCTION in the current keymap.
+
+ -- Function: char ** rl_invoking_keyseqs_in_map (rl_command_func_t
+ *function, Keymap map)
+ Return an array of strings representing the key sequences used to
+ invoke FUNCTION in the keymap MAP.
+
+ -- Function: void rl_function_dumper (int readable)
+ Print the Readline function names and the key sequences currently
+ bound to them to 'rl_outstream'. If READABLE is non-zero, the list
+ is formatted in such a way that it can be made part of an 'inputrc'
+ file and re-read.
+
+ -- Function: void rl_list_funmap_names (void)
+ Print the names of all bindable Readline functions to
+ 'rl_outstream'.
+
+ -- Function: const char ** rl_funmap_names (void)
+ Return a NULL terminated array of known function names. The array
+ is sorted. The array itself is allocated, but not the strings
+ inside. You should free the array, but not the pointers, using
+ 'free' or 'rl_free' when you are done.
+
+ -- Function: int rl_add_funmap_entry (const char *name,
+ rl_command_func_t *function)
+ Add NAME to the list of bindable Readline command names, and make
+ FUNCTION the function to be called when NAME is invoked.
+
+
+File: readline.info, Node: Allowing Undoing, Next: Redisplay, Prev: Associating Function Names and Bindings, Up: Readline Convenience Functions
+
+2.4.5 Allowing Undoing
+----------------------
+
+Supporting the undo command is a painless thing, and makes your
+functions much more useful. It is certainly easy to try something if
+you know you can undo it.
+
+ If your function simply inserts text once, or deletes text once, and
+uses 'rl_insert_text()' or 'rl_delete_text()' to do it, then undoing is
+already done for you automatically.
+
+ If you do multiple insertions or multiple deletions, or any
+combination of these operations, you should group them together into one
+operation. This is done with 'rl_begin_undo_group()' and
+'rl_end_undo_group()'.
+
+ The types of events that can be undone are:
+
+ enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END };
+
+ Notice that 'UNDO_DELETE' means to insert some text, and
+'UNDO_INSERT' means to delete some text. That is, the undo code tells
+what to undo, not how to undo it. 'UNDO_BEGIN' and 'UNDO_END' are tags
+added by 'rl_begin_undo_group()' and 'rl_end_undo_group()'.
+
+ -- Function: int rl_begin_undo_group (void)
+ Begins saving undo information in a group construct. The undo
+ information usually comes from calls to 'rl_insert_text()' and
+ 'rl_delete_text()', but could be the result of calls to
+ 'rl_add_undo()'.
+
+ -- Function: int rl_end_undo_group (void)
+ Closes the current undo group started with 'rl_begin_undo_group
+ ()'. There should be one call to 'rl_end_undo_group()' for each
+ call to 'rl_begin_undo_group()'.
+
+ -- Function: void rl_add_undo (enum undo_code what, int start, int end,
+ char *text)
+ Remember how to undo an event (according to WHAT). The affected
+ text runs from START to END, and encompasses TEXT.
+
+ -- Function: void rl_free_undo_list (void)
+ Free the existing undo list.
+
+ -- Function: int rl_do_undo (void)
+ Undo the first thing on the undo list. Returns '0' if there was
+ nothing to undo, non-zero if something was undone.
+
+ Finally, if you neither insert nor delete text, but directly modify
+the existing text (e.g., change its case), call 'rl_modifying()' once,
+just before you modify the text. You must supply the indices of the
+text range that you are going to modify.
+
+ -- Function: int rl_modifying (int start, int end)
+ Tell Readline to save the text between START and END as a single
+ undo unit. It is assumed that you will subsequently modify that
+ text.
+
+
+File: readline.info, Node: Redisplay, Next: Modifying Text, Prev: Allowing Undoing, Up: Readline Convenience Functions
+
+2.4.6 Redisplay
+---------------
+
+ -- Function: void rl_redisplay (void)
+ Change what's displayed on the screen to reflect the current
+ contents of 'rl_line_buffer'.
+
+ -- Function: int rl_forced_update_display (void)
+ Force the line to be updated and redisplayed, whether or not
+ Readline thinks the screen display is correct.
+
+ -- Function: int rl_on_new_line (void)
+ Tell the update functions that we have moved onto a new (empty)
+ line, usually after outputting a newline.
+
+ -- Function: int rl_on_new_line_with_prompt (void)
+ Tell the update functions that we have moved onto a new line, with
+ RL_PROMPT already displayed. This could be used by applications
+ that want to output the prompt string themselves, but still need
+ Readline to know the prompt string length for redisplay. It should
+ be used after setting RL_ALREADY_PROMPTED.
+
+ -- Function: int rl_clear_visible_line (void)
+ Clear the screen lines corresponding to the current line's
+ contents.
+
+ -- Function: int rl_reset_line_state (void)
+ Reset the display state to a clean state and redisplay the current
+ line starting on a new line.
+
+ -- Function: int rl_crlf (void)
+ Move the cursor to the start of the next screen line.
+
+ -- Function: int rl_show_char (int c)
+ Display character C on 'rl_outstream'. If Readline has not been
+ set to display meta characters directly, this will convert meta
+ characters to a meta-prefixed key sequence. This is intended for
+ use by applications which wish to do their own redisplay.
+
+ -- Function: int rl_message (const char *, ...)
+ The arguments are a format string as would be supplied to 'printf',
+ possibly containing conversion specifications such as '%d', and any
+ additional arguments necessary to satisfy the conversion
+ specifications. The resulting string is displayed in the "echo
+ area". The echo area is also used to display numeric arguments and
+ search strings. You should call 'rl_save_prompt' to save the
+ prompt information before calling this function.
+
+ -- Function: int rl_clear_message (void)
+ Clear the message in the echo area. If the prompt was saved with a
+ call to 'rl_save_prompt' before the last call to 'rl_message', call
+ 'rl_restore_prompt' before calling this function.
+
+ -- Function: void rl_save_prompt (void)
+ Save the local Readline prompt display state in preparation for
+ displaying a new message in the message area with 'rl_message()'.
+
+ -- Function: void rl_restore_prompt (void)
+ Restore the local Readline prompt display state saved by the most
+ recent call to 'rl_save_prompt'. if 'rl_save_prompt' was called to
+ save the prompt before a call to 'rl_message', this function should
+ be called before the corresponding call to 'rl_clear_message'.
+
+ -- Function: int rl_expand_prompt (char *prompt)
+ Expand any special character sequences in PROMPT and set up the
+ local Readline prompt redisplay variables. This function is called
+ by 'readline()'. It may also be called to expand the primary
+ prompt if the 'rl_on_new_line_with_prompt()' function or
+ 'rl_already_prompted' variable is used. It returns the number of
+ visible characters on the last line of the (possibly multi-line)
+ prompt. Applications may indicate that the prompt contains
+ characters that take up no physical screen space when displayed by
+ bracketing a sequence of such characters with the special markers
+ 'RL_PROMPT_START_IGNORE' and 'RL_PROMPT_END_IGNORE' (declared in
+ 'readline.h' as '\001' and '\002', respectively). This may be used
+ to embed terminal-specific escape sequences in prompts.
+
+ -- Function: int rl_set_prompt (const char *prompt)
+ Make Readline use PROMPT for subsequent redisplay. This calls
+ 'rl_expand_prompt()' to expand the prompt and sets 'rl_prompt' to
+ the result.
+
+
+File: readline.info, Node: Modifying Text, Next: Character Input, Prev: Redisplay, Up: Readline Convenience Functions
+
+2.4.7 Modifying Text
+--------------------
+
+ -- Function: int rl_insert_text (const char *text)
+ Insert TEXT into the line at the current cursor position. Returns
+ the number of characters inserted.
+
+ -- Function: int rl_delete_text (int start, int end)
+ Delete the text between START and END in the current line. Returns
+ the number of characters deleted.
+
+ -- Function: char * rl_copy_text (int start, int end)
+ Return a copy of the text between START and END in the current
+ line.
+
+ -- Function: int rl_kill_text (int start, int end)
+ Copy the text between START and END in the current line to the kill
+ ring, appending or prepending to the last kill if the last command
+ was a kill command. The text is deleted. If START is less than
+ END, the text is appended, otherwise prepended. If the last
+ command was not a kill, a new kill ring slot is used.
+
+ -- Function: int rl_push_macro_input (char *macro)
+ Cause MACRO to be inserted into the line, as if it had been invoked
+ by a key bound to a macro. Not especially useful; use
+ 'rl_insert_text()' instead.
+
+
+File: readline.info, Node: Character Input, Next: Terminal Management, Prev: Modifying Text, Up: Readline Convenience Functions
+
+2.4.8 Character Input
+---------------------
+
+ -- Function: int rl_read_key (void)
+ Return the next character available from Readline's current input
+ stream. This handles input inserted into the input stream via
+ RL_PENDING_INPUT (*note Readline Variables::) and
+ 'rl_stuff_char()', macros, and characters read from the keyboard.
+ While waiting for input, this function will call any function
+ assigned to the 'rl_event_hook' variable.
+
+ -- Function: int rl_getc (FILE *stream)
+ Return the next character available from STREAM, which is assumed
+ to be the keyboard.
+
+ -- Function: int rl_stuff_char (int c)
+ Insert C into the Readline input stream. It will be "read" before
+ Readline attempts to read characters from the terminal with
+ 'rl_read_key()'. Up to 512 characters may be pushed back.
+ 'rl_stuff_char' returns 1 if the character was successfully
+ inserted; 0 otherwise.
+
+ -- Function: int rl_execute_next (int c)
+ Make C be the next command to be executed when 'rl_read_key()' is
+ called. This sets RL_PENDING_INPUT.
+
+ -- Function: int rl_clear_pending_input (void)
+ Unset RL_PENDING_INPUT, effectively negating the effect of any
+ previous call to 'rl_execute_next()'. This works only if the
+ pending input has not already been read with 'rl_read_key()'.
+
+ -- Function: int rl_set_keyboard_input_timeout (int u)
+ While waiting for keyboard input in 'rl_read_key()', Readline will
+ wait for U microseconds for input before calling any function
+ assigned to 'rl_event_hook'. U must be greater than or equal to
+ zero (a zero-length timeout is equivalent to a poll). The default
+ waiting period is one-tenth of a second. Returns the old timeout
+ value.
+
+ -- Function: int rl_set_timeout (unsigned int secs, unsigned int usecs)
+ Set a timeout for subsequent calls to 'readline()'. If Readline
+ does not read a complete line, or the number of characters
+ specified by 'rl_num_chars_to_read', before the duration specified
+ by SECS (in seconds) and USECS (microseconds), it returns and sets
+ 'RL_STATE_TIMEOUT' in 'rl_readline_state'. Passing 0 for 'secs'
+ and 'usecs' cancels any previously set timeout; the convenience
+ macro 'rl_clear_timeout()' is shorthand for this. Returns 0 if the
+ timeout is set successfully.
+
+ -- Function: int rl_timeout_remaining (unsigned int *secs, unsigned int
+ *usecs)
+ Return the number of seconds and microseconds remaining in the
+ current timeout duration in *SECS and *USECS, respectively. Both
+ *SECS and *USECS must be non-NULL to return any values. The return
+ value is -1 on error or when there is no timeout set, 0 when the
+ timeout has expired (leaving *SECS and *USECS unchanged), and 1 if
+ the timeout has not expired. If either of SECS and USECS is
+ 'NULL', the return value indicates whether the timeout has expired.
+
+
+File: readline.info, Node: Terminal Management, Next: Utility Functions, Prev: Character Input, Up: Readline Convenience Functions
+
+2.4.9 Terminal Management
+-------------------------
+
+ -- Function: void rl_prep_terminal (int meta_flag)
+ Modify the terminal settings for Readline's use, so 'readline()'
+ can read a single character at a time from the keyboard. The
+ META_FLAG argument should be non-zero if Readline should read
+ eight-bit input.
+
+ -- Function: void rl_deprep_terminal (void)
+ Undo the effects of 'rl_prep_terminal()', leaving the terminal in
+ the state in which it was before the most recent call to
+ 'rl_prep_terminal()'.
+
+ -- Function: void rl_tty_set_default_bindings (Keymap kmap)
+ Read the operating system's terminal editing characters (as would
+ be displayed by 'stty') to their Readline equivalents. The
+ bindings are performed in KMAP.
+
+ -- Function: void rl_tty_unset_default_bindings (Keymap kmap)
+ Reset the bindings manipulated by 'rl_tty_set_default_bindings' so
+ that the terminal editing characters are bound to 'rl_insert'. The
+ bindings are performed in KMAP.
+
+ -- Function: int rl_tty_set_echoing (int value)
+ Set Readline's idea of whether or not it is echoing output to its
+ output stream (RL_OUTSTREAM). If VALUE is 0, Readline does not
+ display output to RL_OUTSTREAM; any other value enables output.
+ The initial value is set when Readline initializes the terminal
+ settings. This function returns the previous value.
+
+ -- Function: int rl_reset_terminal (const char *terminal_name)
+ Reinitialize Readline's idea of the terminal settings using
+ TERMINAL_NAME as the terminal type (e.g., 'vt100'). If
+ TERMINAL_NAME is 'NULL', the value of the 'TERM' environment
+ variable is used.
+
+
+File: readline.info, Node: Utility Functions, Next: Miscellaneous Functions, Prev: Terminal Management, Up: Readline Convenience Functions
+
+2.4.10 Utility Functions
+------------------------
+
+ -- Function: int rl_save_state (struct readline_state *sp)
+ Save a snapshot of Readline's internal state to SP. The contents
+ of the READLINE_STATE structure are documented in 'readline.h'.
+ The caller is responsible for allocating the structure.
+
+ -- Function: int rl_restore_state (struct readline_state *sp)
+ Restore Readline's internal state to that stored in SP, which must
+ have been saved by a call to 'rl_save_state'. The contents of the
+ READLINE_STATE structure are documented in 'readline.h'. The
+ caller is responsible for freeing the structure.
+
+ -- Function: void rl_free (void *mem)
+ Deallocate the memory pointed to by MEM. MEM must have been
+ allocated by 'malloc'.
+
+ -- Function: void rl_replace_line (const char *text, int clear_undo)
+ Replace the contents of 'rl_line_buffer' with TEXT. The point and
+ mark are preserved, if possible. If CLEAR_UNDO is non-zero, the
+ undo list associated with the current line is cleared.
+
+ -- Function: void rl_extend_line_buffer (int len)
+ Ensure that 'rl_line_buffer' has enough space to hold LEN
+ characters, possibly reallocating it if necessary.
+
+ -- Function: int rl_initialize (void)
+ Initialize or re-initialize Readline's internal state. It's not
+ strictly necessary to call this; 'readline()' calls it before
+ reading any input.
+
+ -- Function: int rl_ding (void)
+ Ring the terminal bell, obeying the setting of 'bell-style'.
+
+ -- Function: int rl_alphabetic (int c)
+ Return 1 if C is an alphabetic character.
+
+ -- Function: void rl_display_match_list (char **matches, int len, int
+ max)
+ A convenience function for displaying a list of strings in columnar
+ format on Readline's output stream. 'matches' is the list of
+ strings, in argv format, such as a list of completion matches.
+ 'len' is the number of strings in 'matches', and 'max' is the
+ length of the longest string in 'matches'. This function uses the
+ setting of 'print-completions-horizontally' to select how the
+ matches are displayed (*note Readline Init File Syntax::). When
+ displaying completions, this function sets the number of columns
+ used for display to the value of 'completion-display-width', the
+ value of the environment variable 'COLUMNS', or the screen width,
+ in that order.
+
+ The following are implemented as macros, defined in 'chardefs.h'.
+Applications should refrain from using them.
+
+ -- Function: int _rl_uppercase_p (int c)
+ Return 1 if C is an uppercase alphabetic character.
+
+ -- Function: int _rl_lowercase_p (int c)
+ Return 1 if C is a lowercase alphabetic character.
+
+ -- Function: int _rl_digit_p (int c)
+ Return 1 if C is a numeric character.
+
+ -- Function: int _rl_to_upper (int c)
+ If C is a lowercase alphabetic character, return the corresponding
+ uppercase character.
+
+ -- Function: int _rl_to_lower (int c)
+ If C is an uppercase alphabetic character, return the corresponding
+ lowercase character.
+
+ -- Function: int _rl_digit_value (int c)
+ If C is a number, return the value it represents.
+
+
+File: readline.info, Node: Miscellaneous Functions, Next: Alternate Interface, Prev: Utility Functions, Up: Readline Convenience Functions
+
+2.4.11 Miscellaneous Functions
+------------------------------
+
+ -- Function: int rl_macro_bind (const char *keyseq, const char *macro,
+ Keymap map)
+ Bind the key sequence KEYSEQ to invoke the macro MACRO. The
+ binding is performed in MAP. When KEYSEQ is invoked, the MACRO
+ will be inserted into the line. This function is deprecated; use
+ 'rl_generic_bind()' instead.
+
+ -- Function: void rl_macro_dumper (int readable)
+ Print the key sequences bound to macros and their values, using the
+ current keymap, to 'rl_outstream'. If READABLE is non-zero, the
+ list is formatted in such a way that it can be made part of an
+ 'inputrc' file and re-read.
+
+ -- Function: int rl_variable_bind (const char *variable, const char
+ *value)
+ Make the Readline variable VARIABLE have VALUE. This behaves as if
+ the Readline command 'set VARIABLE VALUE' had been executed in an
+ 'inputrc' file (*note Readline Init File Syntax::).
+
+ -- Function: char * rl_variable_value (const char *variable)
+ Return a string representing the value of the Readline variable
+ VARIABLE. For boolean variables, this string is either 'on' or
+ 'off'.
+
+ -- Function: void rl_variable_dumper (int readable)
+ Print the Readline variable names and their current values to
+ 'rl_outstream'. If READABLE is non-zero, the list is formatted in
+ such a way that it can be made part of an 'inputrc' file and
+ re-read.
+
+ -- Function: int rl_set_paren_blink_timeout (int u)
+ Set the time interval (in microseconds) that Readline waits when
+ showing a balancing character when 'blink-matching-paren' has been
+ enabled.
+
+ -- Function: char * rl_get_termcap (const char *cap)
+ Retrieve the string value of the termcap capability CAP. Readline
+ fetches the termcap entry for the current terminal name and uses
+ those capabilities to move around the screen line and perform other
+ terminal-specific operations, like erasing a line. Readline does
+ not use all of a terminal's capabilities, and this function will
+ return values for only those capabilities Readline uses.
+
+ -- Function: void rl_clear_history (void)
+ Clear the history list by deleting all of the entries, in the same
+ manner as the History library's 'clear_history()' function. This
+ differs from 'clear_history' because it frees private data Readline
+ saves in the history list.
+
+ -- Function: void rl_activate_mark (void)
+ Enable an _active_ mark. When this is enabled, the text between
+ point and mark (the REGION) is displayed in the terminal's standout
+ mode (a FACE). This is called by various Readline functions that
+ set the mark and insert text, and is available for applications to
+ call.
+
+ -- Function: void rl_deactivate_mark (void)
+ Turn off the active mark.
+
+ -- Function: void rl_keep_mark_active (void)
+ Indicate that the mark should remain active when the current
+ Readline function completes and after redisplay occurs. In most
+ cases, the mark remains active for only the duration of a single
+ bindable Readline function.
+
+ -- Function: int rl_mark_active_p (void)
+ Return a non-zero value if the mark is currently active; zero
+ otherwise.
+
+
+File: readline.info, Node: Alternate Interface, Next: A Readline Example, Prev: Miscellaneous Functions, Up: Readline Convenience Functions
+
+2.4.12 Alternate Interface
+--------------------------
+
+An alternate interface is available to plain 'readline()'. Some
+applications need to interleave keyboard I/O with file, device, or
+window system I/O, typically by using a main loop to 'select()' on
+various file descriptors. To accommodate this need, Readline can also
+be invoked as a 'callback' function from an event loop. There are
+functions available to make this easy.
+
+ -- Function: void rl_callback_handler_install (const char *prompt,
+ rl_vcpfunc_t *lhandler)
+ Set up the terminal for Readline I/O and display the initial
+ expanded value of PROMPT. Save the value of LHANDLER to use as a
+ handler function to call when a complete line of input has been
+ entered. The handler function receives the text of the line as an
+ argument. As with 'readline()', the handler function should 'free'
+ the line when it it finished with it.
+
+ -- Function: void rl_callback_read_char (void)
+ Whenever an application determines that keyboard input is
+ available, it should call 'rl_callback_read_char()', which will
+ read the next character from the current input source. If that
+ character completes the line, 'rl_callback_read_char' will invoke
+ the LHANDLER function installed by 'rl_callback_handler_install' to
+ process the line. Before calling the LHANDLER function, the
+ terminal settings are reset to the values they had before calling
+ 'rl_callback_handler_install'. If the LHANDLER function returns,
+ and the line handler remains installed, the terminal settings are
+ modified for Readline's use again. 'EOF' is indicated by calling
+ LHANDLER with a 'NULL' line.
+
+ -- Function: void rl_callback_sigcleanup (void)
+ Clean up any internal state the callback interface uses to maintain
+ state between calls to rl_callback_read_char (e.g., the state of
+ any active incremental searches). This is intended to be used by
+ applications that wish to perform their own signal handling;
+ Readline's internal signal handler calls this when appropriate.
+
+ -- Function: void rl_callback_handler_remove (void)
+ Restore the terminal to its initial state and remove the line
+ handler. You may call this function from within a callback as well
+ as independently. If the LHANDLER installed by
+ 'rl_callback_handler_install' does not exit the program, either
+ this function or the function referred to by the value of
+ 'rl_deprep_term_function' should be called before the program exits
+ to reset the terminal settings.
+
+
+File: readline.info, Node: A Readline Example, Next: Alternate Interface Example, Prev: Alternate Interface, Up: Readline Convenience Functions
+
+2.4.13 A Readline Example
+-------------------------
+
+Here is a function which changes lowercase characters to their uppercase
+equivalents, and uppercase characters to lowercase. If this function
+was bound to 'M-c', then typing 'M-c' would change the case of the
+character under point. Typing 'M-1 0 M-c' would change the case of the
+following 10 characters, leaving the cursor on the last character
+changed.
+
+ /* Invert the case of the COUNT following characters. */
+ int
+ invert_case_line (count, key)
+ int count, key;
+ {
+ register int start, end, i;
+
+ start = rl_point;
+
+ if (rl_point >= rl_end)
+ return (0);
+
+ if (count < 0)
+ {
+ direction = -1;
+ count = -count;
+ }
+ else
+ direction = 1;
+
+ /* Find the end of the range to modify. */
+ end = start + (count * direction);
+
+ /* Force it to be within range. */
+ if (end > rl_end)
+ end = rl_end;
+ else if (end < 0)
+ end = 0;
+
+ if (start == end)
+ return (0);
+
+ if (start > end)
+ {
+ int temp = start;
+ start = end;
+ end = temp;
+ }
+
+ /* Tell readline that we are modifying the line,
+ so it will save the undo information. */
+ rl_modifying (start, end);
+
+ for (i = start; i != end; i++)
+ {
+ if (_rl_uppercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]);
+ else if (_rl_lowercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]);
+ }
+ /* Move point to on top of the last character changed. */
+ rl_point = (direction == 1) ? end - 1 : start;
+ return (0);
+ }
+
+
+File: readline.info, Node: Alternate Interface Example, Prev: A Readline Example, Up: Readline Convenience Functions
+
+2.4.14 Alternate Interface Example
+----------------------------------
+
+Here is a complete program that illustrates Readline's alternate
+interface. It reads lines from the terminal and displays them,
+providing the standard history and TAB completion functions. It
+understands the EOF character or "exit" to exit the program.
+
+ /* Standard include files. stdio.h is required. */
+ #include <stdlib.h>
+ #include <string.h>
+ #include <unistd.h>
+ #include <locale.h>
+
+ /* Used for select(2) */
+ #include <sys/types.h>
+ #include <sys/select.h>
+
+ #include <signal.h>
+
+ #include <stdio.h>
+
+ /* Standard readline include files. */
+ #include <readline/readline.h>
+ #include <readline/history.h>
+
+ static void cb_linehandler (char *);
+ static void sighandler (int);
+
+ int running;
+ int sigwinch_received;
+ const char *prompt = "rltest$ ";
+
+ /* Handle SIGWINCH and window size changes when readline is not active and
+ reading a character. */
+ static void
+ sighandler (int sig)
+ {
+ sigwinch_received = 1;
+ }
+
+ /* Callback function called for each line when accept-line executed, EOF
+ seen, or EOF character read. This sets a flag and returns; it could
+ also call exit(3). */
+ static void
+ cb_linehandler (char *line)
+ {
+ /* Can use ^D (stty eof) or `exit' to exit. */
+ if (line == NULL || strcmp (line, "exit") == 0)
+ {
+ if (line == 0)
+ printf ("\n");
+ printf ("exit\n");
+ /* This function needs to be called to reset the terminal settings,
+ and calling it from the line handler keeps one extra prompt from
+ being displayed. */
+ rl_callback_handler_remove ();
+
+ running = 0;
+ }
+ else
+ {
+ if (*line)
+ add_history (line);
+ printf ("input line: %s\n", line);
+ free (line);
+ }
+ }
+
+ int
+ main (int c, char **v)
+ {
+ fd_set fds;
+ int r;
+
+ /* Set the default locale values according to environment variables. */
+ setlocale (LC_ALL, "");
+
+ /* Handle window size changes when readline is not active and reading
+ characters. */
+ signal (SIGWINCH, sighandler);
+
+ /* Install the line handler. */
+ rl_callback_handler_install (prompt, cb_linehandler);
+
+ /* Enter a simple event loop. This waits until something is available
+ to read on readline's input stream (defaults to standard input) and
+ calls the builtin character read callback to read it. It does not
+ have to modify the user's terminal settings. */
+ running = 1;
+ while (running)
+ {
+ FD_ZERO (&fds);
+ FD_SET (fileno (rl_instream), &fds);
+
+ r = select (FD_SETSIZE, &fds, NULL, NULL, NULL);
+ if (r < 0 && errno != EINTR)
+ {
+ perror ("rltest: select");
+ rl_callback_handler_remove ();
+ break;
+ }
+ if (sigwinch_received)
+ {
+ rl_resize_terminal ();
+ sigwinch_received = 0;
+ }
+ if (r < 0)
+ continue;
+
+ if (FD_ISSET (fileno (rl_instream), &fds))
+ rl_callback_read_char ();
+ }
+
+ printf ("rltest: Event loop has exited\n");
+ return 0;
+ }
+
+
+File: readline.info, Node: Readline Signal Handling, Next: Custom Completers, Prev: Readline Convenience Functions, Up: Programming with GNU Readline
+
+2.5 Readline Signal Handling
+============================
+
+Signals are asynchronous events sent to a process by the Unix kernel,
+sometimes on behalf of another process. They are intended to indicate
+exceptional events, like a user pressing the terminal's interrupt key,
+or a network connection being broken. There is a class of signals that
+can be sent to the process currently reading input from the keyboard.
+Since Readline changes the terminal attributes when it is called, it
+needs to perform special processing when such a signal is received in
+order to restore the terminal to a sane state, or provide application
+writers with functions to do so manually.
+
+ Readline contains an internal signal handler that is installed for a
+number of signals ('SIGINT', 'SIGQUIT', 'SIGTERM', 'SIGHUP', 'SIGALRM',
+'SIGTSTP', 'SIGTTIN', and 'SIGTTOU'). When one of these signals is
+received, the signal handler will reset the terminal attributes to those
+that were in effect before 'readline()' was called, reset the signal
+handling to what it was before 'readline()' was called, and resend the
+signal to the calling application. If and when the calling
+application's signal handler returns, Readline will reinitialize the
+terminal and continue to accept input. When a 'SIGINT' is received, the
+Readline signal handler performs some additional work, which will cause
+any partially-entered line to be aborted (see the description of
+'rl_free_line_state()' below).
+
+ There is an additional Readline signal handler, for 'SIGWINCH', which
+the kernel sends to a process whenever the terminal's size changes (for
+example, if a user resizes an 'xterm'). The Readline 'SIGWINCH' handler
+updates Readline's internal screen size information, and then calls any
+'SIGWINCH' signal handler the calling application has installed.
+Readline calls the application's 'SIGWINCH' signal handler without
+resetting the terminal to its original state. If the application's
+signal handler does more than update its idea of the terminal size and
+return (for example, a 'longjmp' back to a main processing loop), it
+_must_ call 'rl_cleanup_after_signal()' (described below), to restore
+the terminal state.
+
+ When an application is using the callback interface (*note Alternate
+Interface::), Readline installs signal handlers only for the duration of
+the call to 'rl_callback_read_char'. Applications using the callback
+interface should be prepared to clean up Readline's state if they wish
+to handle the signal before the line handler completes and restores the
+terminal state.
+
+ If an application using the callback interface wishes to have
+Readline install its signal handlers at the time the application calls
+'rl_callback_handler_install' and remove them only when a complete line
+of input has been read, it should set the
+'rl_persistent_signal_handlers' variable to a non-zero value. This
+allows an application to defer all of the handling of the signals
+Readline catches to Readline. Applications should use this variable
+with care; it can result in Readline catching signals and not acting on
+them (or allowing the application to react to them) until the
+application calls 'rl_callback_read_char'. This can result in an
+application becoming less responsive to keyboard signals like SIGINT. If
+an application does not want or need to perform any signal handling, or
+does not need to do any processing between calls to
+'rl_callback_read_char', setting this variable may be desirable.
+
+ Readline provides two variables that allow application writers to
+control whether or not it will catch certain signals and act on them
+when they are received. It is important that applications change the
+values of these variables only when calling 'readline()', not in a
+signal handler, so Readline's internal signal state is not corrupted.
+
+ -- Variable: int rl_catch_signals
+ If this variable is non-zero, Readline will install signal handlers
+ for 'SIGINT', 'SIGQUIT', 'SIGTERM', 'SIGHUP', 'SIGALRM', 'SIGTSTP',
+ 'SIGTTIN', and 'SIGTTOU'.
+
+ The default value of 'rl_catch_signals' is 1.
+
+ -- Variable: int rl_catch_sigwinch
+ If this variable is set to a non-zero value, Readline will install
+ a signal handler for 'SIGWINCH'.
+
+ The default value of 'rl_catch_sigwinch' is 1.
+
+ -- Variable: int rl_persistent_signal_handlers
+ If an application using the callback interface wishes Readline's
+ signal handlers to be installed and active during the set of calls
+ to 'rl_callback_read_char' that constitutes an entire single line,
+ it should set this variable to a non-zero value.
+
+ The default value of 'rl_persistent_signal_handlers' is 0.
+
+ -- Variable: int rl_change_environment
+ If this variable is set to a non-zero value, and Readline is
+ handling 'SIGWINCH', Readline will modify the LINES and COLUMNS
+ environment variables upon receipt of a 'SIGWINCH'
+
+ The default value of 'rl_change_environment' is 1.
+
+ If an application does not wish to have Readline catch any signals,
+or to handle signals other than those Readline catches ('SIGHUP', for
+example), Readline provides convenience functions to do the necessary
+terminal and internal state cleanup upon receipt of a signal.
+
+ -- Function: int rl_pending_signal (void)
+ Return the signal number of the most recent signal Readline
+ received but has not yet handled, or 0 if there is no pending
+ signal.
+
+ -- Function: void rl_cleanup_after_signal (void)
+ This function will reset the state of the terminal to what it was
+ before 'readline()' was called, and remove the Readline signal
+ handlers for all signals, depending on the values of
+ 'rl_catch_signals' and 'rl_catch_sigwinch'.
+
+ -- Function: void rl_free_line_state (void)
+ This will free any partial state associated with the current input
+ line (undo information, any partial history entry, any
+ partially-entered keyboard macro, and any partially-entered numeric
+ argument). This should be called before
+ 'rl_cleanup_after_signal()'. The Readline signal handler for
+ 'SIGINT' calls this to abort the current input line.
+
+ -- Function: void rl_reset_after_signal (void)
+ This will reinitialize the terminal and reinstall any Readline
+ signal handlers, depending on the values of 'rl_catch_signals' and
+ 'rl_catch_sigwinch'.
+
+ If an application wants to force Readline to handle any signals that
+have arrived while it has been executing, 'rl_check_signals()' will call
+Readline's internal signal handler if there are any pending signals.
+This is primarily intended for those applications that use a custom
+'rl_getc_function' (*note Readline Variables::) and wish to handle
+signals received while waiting for input.
+
+ -- Function: void rl_check_signals (void)
+ If there are any pending signals, call Readline's internal signal
+ handling functions to process them. 'rl_pending_signal()' can be
+ used independently to determine whether or not there are any
+ pending signals.
+
+ If an application does not wish Readline to catch 'SIGWINCH', it may
+call 'rl_resize_terminal()' or 'rl_set_screen_size()' to force Readline
+to update its idea of the terminal size when it receives a 'SIGWINCH'.
+
+ -- Function: void rl_echo_signal_char (int sig)
+ If an application wishes to install its own signal handlers, but
+ still have Readline display characters that generate signals,
+ calling this function with SIG set to 'SIGINT', 'SIGQUIT', or
+ 'SIGTSTP' will display the character generating that signal.
+
+ -- Function: void rl_resize_terminal (void)
+ Update Readline's internal screen size by reading values from the
+ kernel.
+
+ -- Function: void rl_set_screen_size (int rows, int cols)
+ Set Readline's idea of the terminal size to ROWS rows and COLS
+ columns. If either ROWS or COLUMNS is less than or equal to 0,
+ Readline's idea of that terminal dimension is unchanged. This is
+ intended to tell Readline the physical dimensions of the terminal,
+ and is used internally to calculate the maximum number of
+ characters that may appear on a single line and on the screen.
+
+ If an application does not want to install a 'SIGWINCH' handler, but
+is still interested in the screen dimensions, it may query Readline's
+idea of the screen size.
+
+ -- Function: void rl_get_screen_size (int *rows, int *cols)
+ Return Readline's idea of the terminal's size in the variables
+ pointed to by the arguments.
+
+ -- Function: void rl_reset_screen_size (void)
+ Cause Readline to reobtain the screen size and recalculate its
+ dimensions.
+
+ The following functions install and remove Readline's signal
+handlers.
+
+ -- Function: int rl_set_signals (void)
+ Install Readline's signal handler for 'SIGINT', 'SIGQUIT',
+ 'SIGTERM', 'SIGHUP', 'SIGALRM', 'SIGTSTP', 'SIGTTIN', 'SIGTTOU',
+ and 'SIGWINCH', depending on the values of 'rl_catch_signals' and
+ 'rl_catch_sigwinch'.
+
+ -- Function: int rl_clear_signals (void)
+ Remove all of the Readline signal handlers installed by
+ 'rl_set_signals()'.
+
+
+File: readline.info, Node: Custom Completers, Prev: Readline Signal Handling, Up: Programming with GNU Readline
+
+2.6 Custom Completers
+=====================
+
+Typically, a program that reads commands from the user has a way of
+disambiguating commands and data. If your program is one of these, then
+it can provide completion for commands, data, or both. The following
+sections describe how your program and Readline cooperate to provide
+this service.
+
+* Menu:
+
+* How Completing Works:: The logic used to do completion.
+* Completion Functions:: Functions provided by Readline.
+* Completion Variables:: Variables which control completion.
+* A Short Completion Example:: An example of writing completer subroutines.
+
+
+File: readline.info, Node: How Completing Works, Next: Completion Functions, Up: Custom Completers
+
+2.6.1 How Completing Works
+--------------------------
+
+In order to complete some text, the full list of possible completions
+must be available. That is, it is not possible to accurately expand a
+partial word without knowing all of the possible words which make sense
+in that context. The Readline library provides the user interface to
+completion, and two of the most common completion functions: filename
+and username. For completing other types of text, you must write your
+own completion function. This section describes exactly what such
+functions must do, and provides an example.
+
+ There are three major functions used to perform completion:
+
+ 1. The user-interface function 'rl_complete()'. This function is
+ called with the same arguments as other bindable Readline
+ functions: COUNT and INVOKING_KEY. It isolates the word to be
+ completed and calls 'rl_completion_matches()' to generate a list of
+ possible completions. It then either lists the possible
+ completions, inserts the possible completions, or actually performs
+ the completion, depending on which behavior is desired.
+
+ 2. The internal function 'rl_completion_matches()' uses an
+ application-supplied "generator" function to generate the list of
+ possible matches, and then returns the array of these matches. The
+ caller should place the address of its generator function in
+ 'rl_completion_entry_function'.
+
+ 3. The generator function is called repeatedly from
+ 'rl_completion_matches()', returning a string each time. The
+ arguments to the generator function are TEXT and STATE. TEXT is
+ the partial word to be completed. STATE is zero the first time the
+ function is called, allowing the generator to perform any necessary
+ initialization, and a positive non-zero integer for each subsequent
+ call. The generator function returns '(char *)NULL' to inform
+ 'rl_completion_matches()' that there are no more possibilities
+ left. Usually the generator function computes the list of possible
+ completions when STATE is zero, and returns them one at a time on
+ subsequent calls. Each string the generator function returns as a
+ match must be allocated with 'malloc()'; Readline frees the strings
+ when it has finished with them. Such a generator function is
+ referred to as an "application-specific completion function".
+
+ -- Function: int rl_complete (int ignore, int invoking_key)
+ Complete the word at or before point. You have supplied the
+ function that does the initial simple matching selection algorithm
+ (see 'rl_completion_matches()'). The default is to do filename
+ completion.
+
+ -- Variable: rl_compentry_func_t * rl_completion_entry_function
+ This is a pointer to the generator function for
+ 'rl_completion_matches()'. If the value of
+ 'rl_completion_entry_function' is 'NULL' then the default filename
+ generator function, 'rl_filename_completion_function()', is used.
+ An "application-specific completion function" is a function whose
+ address is assigned to 'rl_completion_entry_function' and whose
+ return values are used to generate possible completions.
+
+
+File: readline.info, Node: Completion Functions, Next: Completion Variables, Prev: How Completing Works, Up: Custom Completers
+
+2.6.2 Completion Functions
+--------------------------
+
+Here is the complete list of callable completion functions present in
+Readline.
+
+ -- Function: int rl_complete_internal (int what_to_do)
+ Complete the word at or before point. WHAT_TO_DO says what to do
+ with the completion. A value of '?' means list the possible
+ completions. 'TAB' means do standard completion. '*' means insert
+ all of the possible completions. '!' means to display all of the
+ possible completions, if there is more than one, as well as
+ performing partial completion. '@' is similar to '!', but possible
+ completions are not listed if the possible completions share a
+ common prefix.
+
+ -- Function: int rl_complete (int ignore, int invoking_key)
+ Complete the word at or before point. You have supplied the
+ function that does the initial simple matching selection algorithm
+ (see 'rl_completion_matches()' and 'rl_completion_entry_function').
+ The default is to do filename completion. This calls
+ 'rl_complete_internal()' with an argument depending on
+ INVOKING_KEY.
+
+ -- Function: int rl_possible_completions (int count, int invoking_key)
+ List the possible completions. See description of 'rl_complete
+ ()'. This calls 'rl_complete_internal()' with an argument of '?'.
+
+ -- Function: int rl_insert_completions (int count, int invoking_key)
+ Insert the list of possible completions into the line, deleting the
+ partially-completed word. See description of 'rl_complete()'.
+ This calls 'rl_complete_internal()' with an argument of '*'.
+
+ -- Function: int rl_completion_mode (rl_command_func_t *cfunc)
+ Returns the appropriate value to pass to 'rl_complete_internal()'
+ depending on whether CFUNC was called twice in succession and the
+ values of the 'show-all-if-ambiguous' and 'show-all-if-unmodified'
+ variables. Application-specific completion functions may use this
+ function to present the same interface as 'rl_complete()'.
+
+ -- Function: char ** rl_completion_matches (const char *text,
+ rl_compentry_func_t *entry_func)
+ Returns an array of strings which is a list of completions for
+ TEXT. If there are no completions, returns 'NULL'. The first
+ entry in the returned array is the substitution for TEXT. The
+ remaining entries are the possible completions. The array is
+ terminated with a 'NULL' pointer.
+
+ ENTRY_FUNC is a function of two args, and returns a 'char *'. The
+ first argument is TEXT. The second is a state argument; it is zero
+ on the first call, and non-zero on subsequent calls. ENTRY_FUNC
+ returns a 'NULL' pointer to the caller when there are no more
+ matches.
+
+ -- Function: char * rl_filename_completion_function (const char *text,
+ int state)
+ A generator function for filename completion in the general case.
+ TEXT is a partial filename. The Bash source is a useful reference
+ for writing application-specific completion functions (the Bash
+ completion functions call this and other Readline functions).
+
+ -- Function: char * rl_username_completion_function (const char *text,
+ int state)
+ A completion generator for usernames. TEXT contains a partial
+ username preceded by a random character (usually '~'). As with all
+ completion generators, STATE is zero on the first call and non-zero
+ for subsequent calls.
+
+
+File: readline.info, Node: Completion Variables, Next: A Short Completion Example, Prev: Completion Functions, Up: Custom Completers
+
+2.6.3 Completion Variables
+--------------------------
+
+ -- Variable: rl_compentry_func_t * rl_completion_entry_function
+ A pointer to the generator function for 'rl_completion_matches()'.
+ 'NULL' means to use 'rl_filename_completion_function()', the
+ default filename completer.
+
+ -- Variable: rl_completion_func_t * rl_attempted_completion_function
+ A pointer to an alternative function to create matches. The
+ function is called with TEXT, START, and END. START and END are
+ indices in 'rl_line_buffer' defining the boundaries of TEXT, which
+ is a character string. If this function exists and returns 'NULL',
+ or if this variable is set to 'NULL', then 'rl_complete()' will
+ call the value of 'rl_completion_entry_function' to generate
+ matches, otherwise the array of strings returned will be used. If
+ this function sets the 'rl_attempted_completion_over' variable to a
+ non-zero value, Readline will not perform its default completion
+ even if this function returns no matches.
+
+ -- Variable: rl_quote_func_t * rl_filename_quoting_function
+ A pointer to a function that will quote a filename in an
+ application-specific fashion. This is called if filename
+ completion is being attempted and one of the characters in
+ 'rl_filename_quote_characters' appears in a completed filename.
+ The function is called with TEXT, MATCH_TYPE, and QUOTE_POINTER.
+ The TEXT is the filename to be quoted. The MATCH_TYPE is either
+ 'SINGLE_MATCH', if there is only one completion match, or
+ 'MULT_MATCH'. Some functions use this to decide whether or not to
+ insert a closing quote character. The QUOTE_POINTER is a pointer
+ to any opening quote character the user typed. Some functions
+ choose to reset this character.
+
+ -- Variable: rl_dequote_func_t * rl_filename_dequoting_function
+ A pointer to a function that will remove application-specific
+ quoting characters from a filename before completion is attempted,
+ so those characters do not interfere with matching the text against
+ names in the filesystem. It is called with TEXT, the text of the
+ word to be dequoted, and QUOTE_CHAR, which is the quoting character
+ that delimits the filename (usually ''' or '"'). If QUOTE_CHAR is
+ zero, the filename was not in an embedded string.
+
+ -- Variable: rl_linebuf_func_t * rl_char_is_quoted_p
+ A pointer to a function to call that determines whether or not a
+ specific character in the line buffer is quoted, according to
+ whatever quoting mechanism the program calling Readline uses. The
+ function is called with two arguments: TEXT, the text of the line,
+ and INDEX, the index of the character in the line. It is used to
+ decide whether a character found in
+ 'rl_completer_word_break_characters' should be used to break words
+ for the completer.
+
+ -- Variable: rl_compignore_func_t * rl_ignore_some_completions_function
+ This function, if defined, is called by the completer when real
+ filename completion is done, after all the matching names have been
+ generated. It is passed a 'NULL' terminated array of matches. The
+ first element ('matches[0]') is the maximal substring common to all
+ matches. This function can re-arrange the list of matches as
+ required, but each element deleted from the array must be freed.
+
+ -- Variable: rl_icppfunc_t * rl_directory_completion_hook
+ This function, if defined, is allowed to modify the directory
+ portion of filenames Readline completes. It could be used to
+ expand symbolic links or shell variables in pathnames. It is
+ called with the address of a string (the current directory name) as
+ an argument, and may modify that string. If the string is replaced
+ with a new string, the old value should be freed. Any modified
+ directory name should have a trailing slash. The modified value
+ will be used as part of the completion, replacing the directory
+ portion of the pathname the user typed. At the least, even if no
+ other expansion is performed, this function should remove any quote
+ characters from the directory name, because its result will be
+ passed directly to 'opendir()'.
+
+ The directory completion hook returns an integer that should be
+ non-zero if the function modifies its directory argument. The
+ function should not modify the directory argument if it returns 0.
+
+ -- Variable: rl_icppfunc_t * rl_directory_rewrite_hook;
+ If non-zero, this is the address of a function to call when
+ completing a directory name. This function takes the address of
+ the directory name to be modified as an argument. Unlike
+ 'rl_directory_completion_hook', it only modifies the directory name
+ used in 'opendir', not what is displayed when the possible
+ completions are printed or inserted. It is called before
+ rl_directory_completion_hook. At the least, even if no other
+ expansion is performed, this function should remove any quote
+ characters from the directory name, because its result will be
+ passed directly to 'opendir()'.
+
+ The directory rewrite hook returns an integer that should be
+ non-zero if the function modifies its directory argument. The
+ function should not modify the directory argument if it returns 0.
+
+ -- Variable: rl_icppfunc_t * rl_filename_stat_hook
+ If non-zero, this is the address of a function for the completer to
+ call before deciding which character to append to a completed name.
+ This function modifies its filename name argument, and the modified
+ value is passed to 'stat()' to determine the file's type and
+ characteristics. This function does not need to remove quote
+ characters from the filename.
+
+ The stat hook returns an integer that should be non-zero if the
+ function modifies its directory argument. The function should not
+ modify the directory argument if it returns 0.
+
+ -- Variable: rl_dequote_func_t * rl_filename_rewrite_hook
+ If non-zero, this is the address of a function called when reading
+ directory entries from the filesystem for completion and comparing
+ them to the partial word to be completed. The function should
+ perform any necessary application or system-specific conversion on
+ the filename, such as converting between character sets or
+ converting from a filesystem format to a character input format.
+ The function takes two arguments: FNAME, the filename to be
+ converted, and FNLEN, its length in bytes. It must either return
+ its first argument (if no conversion takes place) or the converted
+ filename in newly-allocated memory. The converted form is used to
+ compare against the word to be completed, and, if it matches, is
+ added to the list of matches. Readline will free the allocated
+ string.
+
+ -- Variable: rl_compdisp_func_t * rl_completion_display_matches_hook
+ If non-zero, then this is the address of a function to call when
+ completing a word would normally display the list of possible
+ matches. This function is called in lieu of Readline displaying
+ the list. It takes three arguments: ('char **'MATCHES, 'int'
+ NUM_MATCHES, 'int' MAX_LENGTH) where MATCHES is the array of
+ matching strings, NUM_MATCHES is the number of strings in that
+ array, and MAX_LENGTH is the length of the longest string in that
+ array. Readline provides a convenience function,
+ 'rl_display_match_list', that takes care of doing the display to
+ Readline's output stream. You may call that function from this
+ hook.
+
+ -- Variable: const char * rl_basic_word_break_characters
+ The basic list of characters that signal a break between words for
+ the completer routine. The default value of this variable is the
+ characters which break words for completion in Bash: '"
+ \t\n\"\\'`@$><=;|&{("'.
+
+ -- Variable: const char * rl_basic_quote_characters
+ A list of quote characters which can cause a word break.
+
+ -- Variable: const char * rl_completer_word_break_characters
+ The list of characters that signal a break between words for
+ 'rl_complete_internal()'. The default list is the value of
+ 'rl_basic_word_break_characters'.
+
+ -- Variable: rl_cpvfunc_t * rl_completion_word_break_hook
+ If non-zero, this is the address of a function to call when
+ Readline is deciding where to separate words for word completion.
+ It should return a character string like
+ 'rl_completer_word_break_characters' to be used to perform the
+ current completion. The function may choose to set
+ 'rl_completer_word_break_characters' itself. If the function
+ returns 'NULL', 'rl_completer_word_break_characters' is used.
+
+ -- Variable: const char * rl_completer_quote_characters
+ A list of characters which can be used to quote a substring of the
+ line. Completion occurs on the entire substring, and within the
+ substring 'rl_completer_word_break_characters' are treated as any
+ other character, unless they also appear within this list.
+
+ -- Variable: const char * rl_filename_quote_characters
+ A list of characters that cause a filename to be quoted by the
+ completer when they appear in a completed filename. The default is
+ the null string.
+
+ -- Variable: const char * rl_special_prefixes
+ The list of characters that are word break characters, but should
+ be left in TEXT when it is passed to the completion function.
+ Programs can use this to help determine what kind of completing to
+ do. For instance, Bash sets this variable to "$@" so that it can
+ complete shell variables and hostnames.
+
+ -- Variable: int rl_completion_query_items
+ Up to this many items will be displayed in response to a
+ possible-completions call. After that, Readline asks the user for
+ confirmation before displaying them. The default value is 100. A
+ negative value indicates that Readline should never ask for
+ confirmation.
+
+ -- Variable: int rl_completion_append_character
+ When a single completion alternative matches at the end of the
+ command line, this character is appended to the inserted completion
+ text. The default is a space character (' '). Setting this to the
+ null character ('\0') prevents anything being appended
+ automatically. This can be changed in application-specific
+ completion functions to provide the "most sensible word separator
+ character" according to an application-specific command line syntax
+ specification. It is set to the default before any
+ application-specific completion function is called, and may only be
+ changed within such a function.
+
+ -- Variable: int rl_completion_suppress_append
+ If non-zero, RL_COMPLETION_APPEND_CHARACTER is not appended to
+ matches at the end of the command line, as described above. It is
+ set to 0 before any application-specific completion function is
+ called, and may only be changed within such a function.
+
+ -- Variable: int rl_completion_quote_character
+ When Readline is completing quoted text, as delimited by one of the
+ characters in RL_COMPLETER_QUOTE_CHARACTERS, it sets this variable
+ to the quoting character found. This is set before any
+ application-specific completion function is called.
+
+ -- Variable: int rl_completion_suppress_quote
+ If non-zero, Readline does not append a matching quote character
+ when performing completion on a quoted string. It is set to 0
+ before any application-specific completion function is called, and
+ may only be changed within such a function.
+
+ -- Variable: int rl_completion_found_quote
+ When Readline is completing quoted text, it sets this variable to a
+ non-zero value if the word being completed contains or is delimited
+ by any quoting characters, including backslashes. This is set
+ before any application-specific completion function is called.
+
+ -- Variable: int rl_completion_mark_symlink_dirs
+ If non-zero, a slash will be appended to completed filenames that
+ are symbolic links to directory names, subject to the value of the
+ user-settable MARK-DIRECTORIES variable. This variable exists so
+ that application-specific completion functions can override the
+ user's global preference (set via the MARK-SYMLINKED-DIRECTORIES
+ Readline variable) if appropriate. This variable is set to the
+ user's preference before any application-specific completion
+ function is called, so unless that function modifies the value, the
+ user's preferences are honored.
+
+ -- Variable: int rl_ignore_completion_duplicates
+ If non-zero, then duplicates in the matches are removed. The
+ default is 1.
+
+ -- Variable: int rl_filename_completion_desired
+ Non-zero means that the results of the matches are to be treated as
+ filenames. This is _always_ zero when completion is attempted, and
+ can only be changed within an application-specific completion
+ function. If it is set to a non-zero value by such a function,
+ directory names have a slash appended and Readline attempts to
+ quote completed filenames if they contain any characters in
+ 'rl_filename_quote_characters' and 'rl_filename_quoting_desired' is
+ set to a non-zero value.
+
+ -- Variable: int rl_filename_quoting_desired
+ Non-zero means that the results of the matches are to be quoted
+ using double quotes (or an application-specific quoting mechanism)
+ if the completed filename contains any characters in
+ 'rl_filename_quote_chars'. This is _always_ non-zero when
+ completion is attempted, and can only be changed within an
+ application-specific completion function. The quoting is effected
+ via a call to the function pointed to by
+ 'rl_filename_quoting_function'.
+
+ -- Variable: int rl_attempted_completion_over
+ If an application-specific completion function assigned to
+ 'rl_attempted_completion_function' sets this variable to a non-zero
+ value, Readline will not perform its default filename completion
+ even if the application's completion function returns no matches.
+ It should be set only by an application's completion function.
+
+ -- Variable: int rl_sort_completion_matches
+ If an application sets this variable to 0, Readline will not sort
+ the list of completions (which implies that it cannot remove any
+ duplicate completions). The default value is 1, which means that
+ Readline will sort the completions and, depending on the value of
+ 'rl_ignore_completion_duplicates', will attempt to remove duplicate
+ matches.
+
+ -- Variable: int rl_completion_type
+ Set to a character describing the type of completion Readline is
+ currently attempting; see the description of
+ 'rl_complete_internal()' (*note Completion Functions::) for the
+ list of characters. This is set to the appropriate value before
+ any application-specific completion function is called, allowing
+ such functions to present the same interface as 'rl_complete()'.
+
+ -- Variable: int rl_completion_invoking_key
+ Set to the final character in the key sequence that invoked one of
+ the completion functions that call 'rl_complete_internal()'. This
+ is set to the appropriate value before any application-specific
+ completion function is called.
+
+ -- Variable: int rl_inhibit_completion
+ If this variable is non-zero, completion is inhibited. The
+ completion character will be inserted as any other bound to
+ 'self-insert'.
+
+
+File: readline.info, Node: A Short Completion Example, Prev: Completion Variables, Up: Custom Completers
+
+2.6.4 A Short Completion Example
+--------------------------------
+
+Here is a small application demonstrating the use of the GNU Readline
+library. It is called 'fileman', and the source code resides in
+'examples/fileman.c'. This sample application provides completion of
+command names, line editing features, and access to the history list.
+
+ /* fileman.c -- A tiny application which demonstrates how to use the
+ GNU Readline library. This application interactively allows users
+ to manipulate files and their modes. */
+
+ #ifdef HAVE_CONFIG_H
+ # include <config.h>
+ #endif
+
+ #include <sys/types.h>
+ #ifdef HAVE_SYS_FILE_H
+ # include <sys/file.h>
+ #endif
+ #include <sys/stat.h>
+
+ #ifdef HAVE_UNISTD_H
+ # include <unistd.h>
+ #endif
+
+ #include <fcntl.h>
+ #include <stdio.h>
+ #include <errno.h>
+ #include <locale.h>
+
+ #if defined (HAVE_STRING_H)
+ # include <string.h>
+ #else /* !HAVE_STRING_H */
+ # include <strings.h>
+ #endif /* !HAVE_STRING_H */
+
+ #ifdef HAVE_STDLIB_H
+ # include <stdlib.h>
+ #endif
+
+ #include <time.h>
+
+ #include <readline/readline.h>
+ #include <readline/history.h>
+
+ extern char *xmalloc PARAMS((size_t));
+
+ /* The names of functions that actually do the manipulation. */
+ int com_list PARAMS((char *));
+ int com_view PARAMS((char *));
+ int com_rename PARAMS((char *));
+ int com_stat PARAMS((char *));
+ int com_pwd PARAMS((char *));
+ int com_delete PARAMS((char *));
+ int com_help PARAMS((char *));
+ int com_cd PARAMS((char *));
+ int com_quit PARAMS((char *));
+
+ /* A structure which contains information on the commands this program
+ can understand. */
+
+ typedef struct {
+ char *name; /* User printable name of the function. */
+ rl_icpfunc_t *func; /* Function to call to do the job. */
+ char *doc; /* Documentation for this function. */
+ } COMMAND;
+
+ COMMAND commands[] = {
+ { "cd", com_cd, "Change to directory DIR" },
+ { "delete", com_delete, "Delete FILE" },
+ { "help", com_help, "Display this text" },
+ { "?", com_help, "Synonym for `help'" },
+ { "list", com_list, "List files in DIR" },
+ { "ls", com_list, "Synonym for `list'" },
+ { "pwd", com_pwd, "Print the current working directory" },
+ { "quit", com_quit, "Quit using Fileman" },
+ { "rename", com_rename, "Rename FILE to NEWNAME" },
+ { "stat", com_stat, "Print out statistics on FILE" },
+ { "view", com_view, "View the contents of FILE" },
+ { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
+ };
+
+ /* Forward declarations. */
+ char *stripwhite ();
+ COMMAND *find_command ();
+
+ /* The name of this program, as taken from argv[0]. */
+ char *progname;
+
+ /* When non-zero, this global means the user is done using this program. */
+ int done;
+
+ char *
+ dupstr (s)
+ char *s;
+ {
+ char *r;
+
+ r = xmalloc (strlen (s) + 1);
+ strcpy (r, s);
+ return (r);
+ }
+
+ main (argc, argv)
+ int argc;
+ char **argv;
+ {
+ char *line, *s;
+
+ setlocale (LC_ALL, "");
+
+ progname = argv[0];
+
+ initialize_readline (); /* Bind our completer. */
+
+ /* Loop reading and executing lines until the user quits. */
+ for ( ; done == 0; )
+ {
+ line = readline ("FileMan: ");
+
+ if (!line)
+ break;
+
+ /* Remove leading and trailing whitespace from the line.
+ Then, if there is anything left, add it to the history list
+ and execute it. */
+ s = stripwhite (line);
+
+ if (*s)
+ {
+ add_history (s);
+ execute_line (s);
+ }
+
+ free (line);
+ }
+ exit (0);
+ }
+
+ /* Execute a command line. */
+ int
+ execute_line (line)
+ char *line;
+ {
+ register int i;
+ COMMAND *command;
+ char *word;
+
+ /* Isolate the command word. */
+ i = 0;
+ while (line[i] && whitespace (line[i]))
+ i++;
+ word = line + i;
+
+ while (line[i] && !whitespace (line[i]))
+ i++;
+
+ if (line[i])
+ line[i++] = '\0';
+
+ command = find_command (word);
+
+ if (!command)
+ {
+ fprintf (stderr, "%s: No such command for FileMan.\n", word);
+ return (-1);
+ }
+
+ /* Get argument to command, if any. */
+ while (whitespace (line[i]))
+ i++;
+
+ word = line + i;
+
+ /* Call the function. */
+ return ((*(command->func)) (word));
+ }
+
+ /* Look up NAME as the name of a command, and return a pointer to that
+ command. Return a NULL pointer if NAME isn't a command name. */
+ COMMAND *
+ find_command (name)
+ char *name;
+ {
+ register int i;
+
+ for (i = 0; commands[i].name; i++)
+ if (strcmp (name, commands[i].name) == 0)
+ return (&commands[i]);
+
+ return ((COMMAND *)NULL);
+ }
+
+ /* Strip whitespace from the start and end of STRING. Return a pointer
+ into STRING. */
+ char *
+ stripwhite (string)
+ char *string;
+ {
+ register char *s, *t;
+
+ for (s = string; whitespace (*s); s++)
+ ;
+
+ if (*s == 0)
+ return (s);
+
+ t = s + strlen (s) - 1;
+ while (t > s && whitespace (*t))
+ t--;
+ *++t = '\0';
+
+ return s;
+ }
+
+ /* **************************************************************** */
+ /* */
+ /* Interface to Readline Completion */
+ /* */
+ /* **************************************************************** */
+
+ char *command_generator PARAMS((const char *, int));
+ char **fileman_completion PARAMS((const char *, int, int));
+
+ /* Tell the GNU Readline library how to complete. We want to try to complete
+ on command names if this is the first word in the line, or on filenames
+ if not. */
+ initialize_readline ()
+ {
+ /* Allow conditional parsing of the ~/.inputrc file. */
+ rl_readline_name = "FileMan";
+
+ /* Tell the completer that we want a crack first. */
+ rl_attempted_completion_function = fileman_completion;
+ }
+
+ /* Attempt to complete on the contents of TEXT. START and END bound the
+ region of rl_line_buffer that contains the word to complete. TEXT is
+ the word to complete. We can use the entire contents of rl_line_buffer
+ in case we want to do some simple parsing. Return the array of matches,
+ or NULL if there aren't any. */
+ char **
+ fileman_completion (text, start, end)
+ const char *text;
+ int start, end;
+ {
+ char **matches;
+
+ matches = (char **)NULL;
+
+ /* If this word is at the start of the line, then it is a command
+ to complete. Otherwise it is the name of a file in the current
+ directory. */
+ if (start == 0)
+ matches = rl_completion_matches (text, command_generator);
+
+ return (matches);
+ }
+
+ /* Generator function for command completion. STATE lets us know whether
+ to start from scratch; without any state (i.e. STATE == 0), then we
+ start at the top of the list. */
+ char *
+ command_generator (text, state)
+ const char *text;
+ int state;
+ {
+ static int list_index, len;
+ char *name;
+
+ /* If this is a new word to complete, initialize now. This includes
+ saving the length of TEXT for efficiency, and initializing the index
+ variable to 0. */
+ if (!state)
+ {
+ list_index = 0;
+ len = strlen (text);
+ }
+
+ /* Return the next name which partially matches from the command list. */
+ while (name = commands[list_index].name)
+ {
+ list_index++;
+
+ if (strncmp (name, text, len) == 0)
+ return (dupstr(name));
+ }
+
+ /* If no names matched, then return NULL. */
+ return ((char *)NULL);
+ }
+
+ /* **************************************************************** */
+ /* */
+ /* FileMan Commands */
+ /* */
+ /* **************************************************************** */
+
+ /* String to pass to system (). This is for the LIST, VIEW and RENAME
+ commands. */
+ static char syscom[1024];
+
+ /* List the file(s) named in arg. */
+ com_list (arg)
+ char *arg;
+ {
+ if (!arg)
+ arg = "";
+
+ sprintf (syscom, "ls -FClg %s", arg);
+ return (system (syscom));
+ }
+
+ com_view (arg)
+ char *arg;
+ {
+ if (!valid_argument ("view", arg))
+ return 1;
+
+ #if defined (__MSDOS__)
+ /* more.com doesn't grok slashes in pathnames */
+ sprintf (syscom, "less %s", arg);
+ #else
+ sprintf (syscom, "more %s", arg);
+ #endif
+ return (system (syscom));
+ }
+
+ com_rename (arg)
+ char *arg;
+ {
+ too_dangerous ("rename");
+ return (1);
+ }
+
+ com_stat (arg)
+ char *arg;
+ {
+ struct stat finfo;
+
+ if (!valid_argument ("stat", arg))
+ return (1);
+
+ if (stat (arg, &finfo) == -1)
+ {
+ perror (arg);
+ return (1);
+ }
+
+ printf ("Statistics for `%s':\n", arg);
+
+ printf ("%s has %d link%s, and is %d byte%s in length.\n",
+ arg,
+ finfo.st_nlink,
+ (finfo.st_nlink == 1) ? "" : "s",
+ finfo.st_size,
+ (finfo.st_size == 1) ? "" : "s");
+ printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime));
+ printf (" Last access at: %s", ctime (&finfo.st_atime));
+ printf (" Last modified at: %s", ctime (&finfo.st_mtime));
+ return (0);
+ }
+
+ com_delete (arg)
+ char *arg;
+ {
+ too_dangerous ("delete");
+ return (1);
+ }
+
+ /* Print out help for ARG, or for all of the commands if ARG is
+ not present. */
+ com_help (arg)
+ char *arg;
+ {
+ register int i;
+ int printed = 0;
+
+ for (i = 0; commands[i].name; i++)
+ {
+ if (!*arg || (strcmp (arg, commands[i].name) == 0))
+ {
+ printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+ printed++;
+ }
+ }
+
+ if (!printed)
+ {
+ printf ("No commands match `%s'. Possibilities are:\n", arg);
+
+ for (i = 0; commands[i].name; i++)
+ {
+ /* Print in six columns. */
+ if (printed == 6)
+ {
+ printed = 0;
+ printf ("\n");
+ }
+
+ printf ("%s\t", commands[i].name);
+ printed++;
+ }
+
+ if (printed)
+ printf ("\n");
+ }
+ return (0);
+ }
+
+ /* Change to the directory ARG. */
+ com_cd (arg)
+ char *arg;
+ {
+ if (chdir (arg) == -1)
+ {
+ perror (arg);
+ return 1;
+ }
+
+ com_pwd ("");
+ return (0);
+ }
+
+ /* Print out the current working directory. */
+ com_pwd (ignore)
+ char *ignore;
+ {
+ char dir[1024], *s;
+
+ s = getcwd (dir, sizeof(dir) - 1);
+ if (s == 0)
+ {
+ printf ("Error getting pwd: %s\n", dir);
+ return 1;
+ }
+
+ printf ("Current directory is %s\n", dir);
+ return 0;
+ }
+
+ /* The user wishes to quit using this program. Just set DONE non-zero. */
+ com_quit (arg)
+ char *arg;
+ {
+ done = 1;
+ return (0);
+ }
+
+ /* Function which tells you that you can't do this. */
+ too_dangerous (caller)
+ char *caller;
+ {
+ fprintf (stderr,
+ "%s: Too dangerous for me to distribute. Write it yourself.\n",
+ caller);
+ }
+
+ /* Return non-zero if ARG is a valid argument for CALLER, else print
+ an error message and return zero. */
+ int
+ valid_argument (caller, arg)
+ char *caller, *arg;
+ {
+ if (!arg || !*arg)
+ {
+ fprintf (stderr, "%s: Argument required.\n", caller);
+ return (0);
+ }
+
+ return (1);
+ }
+
+
+File: readline.info, Node: GNU Free Documentation License, Next: Concept Index, Prev: Programming with GNU Readline, Up: Top
+
+Appendix A GNU Free Documentation License
+*****************************************
+
+ Version 1.3, 3 November 2008
+
+ Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+ <http://fsf.org/>
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document "free" in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book. We
+ recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it can
+ be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You accept
+ the license if you copy, modify or distribute the work in a way
+ requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in the
+ notice that says that the Document is released under this License.
+ If a section does not fit the above definition of Secondary then it
+ is not allowed to be designated as Invariant. The Document may
+ contain zero Invariant Sections. If the Document does not identify
+ any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images composed
+ of pixels) generic paint programs or (for drawings) some widely
+ available drawing editor, and that is suitable for input to text
+ formatters or for automatic translation to a variety of formats
+ suitable for input to text formatters. A copy made in an otherwise
+ Transparent file format whose markup, or absence of markup, has
+ been arranged to thwart or discourage subsequent modification by
+ readers is not Transparent. An image format is not Transparent if
+ used for any substantial amount of text. A copy that is not
+ "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and standard-conforming
+ simple HTML, PostScript or PDF designed for human modification.
+ Examples of transparent image formats include PNG, XCF and JPG.
+ Opaque formats include proprietary formats that can be read and
+ edited only by proprietary word processors, SGML or XML for which
+ the DTD and/or processing tools are not generally available, and
+ the machine-generated HTML, PostScript or PDF produced by some word
+ processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ The "publisher" means any person or entity that distributes copies
+ of the Document to the public.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow the
+ conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the title
+ equally prominent and visible. You may add other material on the
+ covers in addition. Copying with changes limited to the covers, as
+ long as they preserve the title of the Document and satisfy these
+ conditions, can be treated as verbatim copying in other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a machine-readable
+ Transparent copy along with each Opaque copy, or state in or with
+ each Opaque copy a computer-network location from which the general
+ network-using public has access to download using public-standard
+ network protocols a complete Transparent copy of the Document, free
+ of added material. If you use the latter option, you must take
+ reasonably prudent steps, when you begin distribution of Opaque
+ copies in quantity, to ensure that this Transparent copy will
+ remain thus accessible at the stated location until at least one
+ year after the last time you distribute an Opaque copy (directly or
+ through your agents or retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of copies,
+ to give them a chance to provide you with an updated version of the
+ Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with the
+ Modified Version filling the role of the Document, thus licensing
+ distribution and modification of the Modified Version to whoever
+ possesses a copy of it. In addition, you must do these things in
+ the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of previous
+ versions (which should, if there were any, be listed in the
+ History section of the Document). You may use the same title
+ as a previous version if the original publisher of that
+ version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on the
+ Title Page. If there is no section Entitled "History" in the
+ Document, create one stating the title, year, authors, and
+ publisher of the Document as given on its Title Page, then add
+ an item describing the Modified Version as stated in the
+ previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in the
+ "History" section. You may omit a network location for a work
+ that was published at least four years before the Document
+ itself, or if the original publisher of the version it refers
+ to gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section
+ all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document, unaltered
+ in their text and in their titles. Section numbers or the
+ equivalent are not considered part of the section titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option designate
+ some or all of these sections as invariant. To do this, add their
+ titles to the list of Invariant Sections in the Modified Version's
+ license notice. These titles must be distinct from any other
+ section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end of
+ the list of Cover Texts in the Modified Version. Only one passage
+ of Front-Cover Text and one of Back-Cover Text may be added by (or
+ through arrangements made by) any one entity. If the Document
+ already includes a cover text for the same cover, previously added
+ by you or by arrangement made by the same entity you are acting on
+ behalf of, you may not add another; but you may replace the old
+ one, on explicit permission from the previous publisher that added
+ the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination all
+ of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the documents
+ in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow this
+ License in all other respects regarding verbatim copying of that
+ document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of a
+ storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly and
+ finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from you
+ under this License. If your rights have been terminated and not
+ permanently reinstated, receipt of a copy of some or all of the
+ same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ <http://www.gnu.org/copyleft/>.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If the
+ Document does not specify a version number of this License, you may
+ choose any version ever published (not as a draft) by the Free
+ Software Foundation. If the Document specifies that a proxy can
+ decide which future versions of this License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+ "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ "Incorporate" means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is "eligible for relicensing" if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with
+ the Front-Cover Texts being LIST, and with the Back-Cover Texts
+ being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of free
+software license, such as the GNU General Public License, to permit
+their use in free software.
+
+
+File: readline.info, Node: Concept Index, Next: Function and Variable Index, Prev: GNU Free Documentation License, Up: Top
+
+Concept Index
+*************
+
+
+* Menu:
+
+* application-specific completion functions: Custom Completers.
+ (line 6)
+* command editing: Readline Bare Essentials.
+ (line 6)
+* editing command lines: Readline Bare Essentials.
+ (line 6)
+* initialization file, readline: Readline Init File. (line 6)
+* interaction, readline: Readline Interaction. (line 6)
+* kill ring: Readline Killing Commands.
+ (line 18)
+* killing text: Readline Killing Commands.
+ (line 6)
+* notation, readline: Readline Bare Essentials.
+ (line 6)
+* readline, function: Basic Behavior. (line 12)
+* variables, readline: Readline Init File Syntax.
+ (line 34)
+* yanking text: Readline Killing Commands.
+ (line 6)
+
+
+File: readline.info, Node: Function and Variable Index, Prev: Concept Index, Up: Top
+
+Function and Variable Index
+***************************
+
+
+* Menu:
+
+* _rl_digit_p: Utility Functions. (line 64)
+* _rl_digit_value: Utility Functions. (line 75)
+* _rl_lowercase_p: Utility Functions. (line 61)
+* _rl_to_lower: Utility Functions. (line 71)
+* _rl_to_upper: Utility Functions. (line 67)
+* _rl_uppercase_p: Utility Functions. (line 58)
+* abort (C-g): Miscellaneous Commands.
+ (line 10)
+* accept-line (Newline or Return): Commands For History.
+ (line 6)
+* active-region-end-color: Readline Init File Syntax.
+ (line 48)
+* active-region-start-color: Readline Init File Syntax.
+ (line 35)
+* backward-char (C-b): Commands For Moving. (line 15)
+* backward-delete-char (Rubout): Commands For Text. (line 17)
+* backward-kill-line (C-x Rubout): Commands For Killing.
+ (line 11)
+* backward-kill-word (M-<DEL>): Commands For Killing.
+ (line 28)
+* backward-word (M-b): Commands For Moving. (line 22)
+* beginning-of-history (M-<): Commands For History.
+ (line 19)
+* beginning-of-line (C-a): Commands For Moving. (line 6)
+* bell-style: Readline Init File Syntax.
+ (line 61)
+* bind-tty-special-chars: Readline Init File Syntax.
+ (line 68)
+* blink-matching-paren: Readline Init File Syntax.
+ (line 73)
+* bracketed-paste-begin (): Commands For Text. (line 36)
+* call-last-kbd-macro (C-x e): Keyboard Macros. (line 13)
+* capitalize-word (M-c): Commands For Text. (line 69)
+* character-search (C-]): Miscellaneous Commands.
+ (line 42)
+* character-search-backward (M-C-]): Miscellaneous Commands.
+ (line 47)
+* clear-display (M-C-l): Commands For Moving. (line 40)
+* clear-screen (C-l): Commands For Moving. (line 45)
+* colored-completion-prefix: Readline Init File Syntax.
+ (line 78)
+* colored-stats: Readline Init File Syntax.
+ (line 88)
+* comment-begin: Readline Init File Syntax.
+ (line 94)
+* complete (<TAB>): Commands For Completion.
+ (line 6)
+* completion-display-width: Readline Init File Syntax.
+ (line 99)
+* completion-ignore-case: Readline Init File Syntax.
+ (line 106)
+* completion-map-case: Readline Init File Syntax.
+ (line 111)
+* completion-prefix-display-length: Readline Init File Syntax.
+ (line 117)
+* completion-query-items: Readline Init File Syntax.
+ (line 124)
+* convert-meta: Readline Init File Syntax.
+ (line 135)
+* copy-backward-word (): Commands For Killing.
+ (line 60)
+* copy-forward-word (): Commands For Killing.
+ (line 65)
+* copy-region-as-kill (): Commands For Killing.
+ (line 56)
+* delete-char (C-d): Commands For Text. (line 12)
+* delete-char-or-list (): Commands For Completion.
+ (line 39)
+* delete-horizontal-space (): Commands For Killing.
+ (line 48)
+* digit-argument (M-0, M-1, ... M--): Numeric Arguments. (line 6)
+* disable-completion: Readline Init File Syntax.
+ (line 145)
+* do-lowercase-version (M-A, M-B, M-X, ...): Miscellaneous Commands.
+ (line 14)
+* downcase-word (M-l): Commands For Text. (line 65)
+* dump-functions (): Miscellaneous Commands.
+ (line 70)
+* dump-macros (): Miscellaneous Commands.
+ (line 82)
+* dump-variables (): Miscellaneous Commands.
+ (line 76)
+* echo-control-characters: Readline Init File Syntax.
+ (line 150)
+* editing-mode: Readline Init File Syntax.
+ (line 155)
+* emacs-editing-mode (C-e): Miscellaneous Commands.
+ (line 88)
+* emacs-mode-string: Readline Init File Syntax.
+ (line 161)
+* enable-active-region: Readline Init File Syntax.
+ (line 171)
+* enable-bracketed-paste: Readline Init File Syntax.
+ (line 184)
+* enable-keypad: Readline Init File Syntax.
+ (line 193)
+* end-kbd-macro (C-x )): Keyboard Macros. (line 9)
+* end-of-file (usually C-d): Commands For Text. (line 6)
+* end-of-history (M->): Commands For History.
+ (line 22)
+* end-of-line (C-e): Commands For Moving. (line 9)
+* exchange-point-and-mark (C-x C-x): Miscellaneous Commands.
+ (line 37)
+* expand-tilde: Readline Init File Syntax.
+ (line 204)
+* fetch-history (): Commands For History.
+ (line 102)
+* forward-backward-delete-char (): Commands For Text. (line 21)
+* forward-char (C-f): Commands For Moving. (line 12)
+* forward-search-history (C-s): Commands For History.
+ (line 32)
+* forward-word (M-f): Commands For Moving. (line 18)
+* history-preserve-point: Readline Init File Syntax.
+ (line 208)
+* history-search-backward (): Commands For History.
+ (line 56)
+* history-search-forward (): Commands For History.
+ (line 50)
+* history-size: Readline Init File Syntax.
+ (line 214)
+* history-substring-search-backward (): Commands For History.
+ (line 68)
+* history-substring-search-forward (): Commands For History.
+ (line 62)
+* horizontal-scroll-mode: Readline Init File Syntax.
+ (line 223)
+* input-meta: Readline Init File Syntax.
+ (line 232)
+* insert-comment (M-#): Miscellaneous Commands.
+ (line 61)
+* insert-completions (M-*): Commands For Completion.
+ (line 18)
+* isearch-terminators: Readline Init File Syntax.
+ (line 242)
+* keymap: Readline Init File Syntax.
+ (line 249)
+* kill-line (C-k): Commands For Killing.
+ (line 6)
+* kill-region (): Commands For Killing.
+ (line 52)
+* kill-whole-line (): Commands For Killing.
+ (line 19)
+* kill-word (M-d): Commands For Killing.
+ (line 23)
+* mark-modified-lines: Readline Init File Syntax.
+ (line 279)
+* mark-symlinked-directories: Readline Init File Syntax.
+ (line 284)
+* match-hidden-files: Readline Init File Syntax.
+ (line 289)
+* menu-complete (): Commands For Completion.
+ (line 22)
+* menu-complete-backward (): Commands For Completion.
+ (line 34)
+* menu-complete-display-prefix: Readline Init File Syntax.
+ (line 296)
+* meta-flag: Readline Init File Syntax.
+ (line 232)
+* next-history (C-n): Commands For History.
+ (line 16)
+* next-screen-line (): Commands For Moving. (line 33)
+* non-incremental-forward-search-history (M-n): Commands For History.
+ (line 44)
+* non-incremental-reverse-search-history (M-p): Commands For History.
+ (line 38)
+* operate-and-get-next (C-o): Commands For History.
+ (line 95)
+* output-meta: Readline Init File Syntax.
+ (line 301)
+* overwrite-mode (): Commands For Text. (line 73)
+* page-completions: Readline Init File Syntax.
+ (line 309)
+* possible-completions (M-?): Commands For Completion.
+ (line 11)
+* prefix-meta (<ESC>): Miscellaneous Commands.
+ (line 19)
+* previous-history (C-p): Commands For History.
+ (line 12)
+* previous-screen-line (): Commands For Moving. (line 26)
+* print-last-kbd-macro (): Keyboard Macros. (line 17)
+* quoted-insert (C-q or C-v): Commands For Text. (line 26)
+* re-read-init-file (C-x C-r): Miscellaneous Commands.
+ (line 6)
+* readline: Basic Behavior. (line 12)
+* redraw-current-line (): Commands For Moving. (line 49)
+* reverse-search-history (C-r): Commands For History.
+ (line 26)
+* revert-all-at-newline: Readline Init File Syntax.
+ (line 319)
+* revert-line (M-r): Miscellaneous Commands.
+ (line 26)
+* rl_activate_mark: Miscellaneous Functions.
+ (line 55)
+* rl_add_defun: Function Naming. (line 18)
+* rl_add_funmap_entry: Associating Function Names and Bindings.
+ (line 62)
+* rl_add_undo: Allowing Undoing. (line 39)
+* rl_alphabetic: Utility Functions. (line 38)
+* rl_already_prompted: Readline Variables. (line 70)
+* rl_attempted_completion_function: Completion Variables.
+ (line 11)
+* rl_attempted_completion_over: Completion Variables.
+ (line 256)
+* rl_basic_quote_characters: Completion Variables.
+ (line 143)
+* rl_basic_word_break_characters: Completion Variables.
+ (line 137)
+* rl_begin_undo_group: Allowing Undoing. (line 28)
+* rl_binding_keymap: Readline Variables. (line 195)
+* rl_bind_key: Binding Keys. (line 21)
+* rl_bind_keyseq: Binding Keys. (line 57)
+* rl_bind_keyseq_if_unbound: Binding Keys. (line 75)
+* rl_bind_keyseq_if_unbound_in_map: Binding Keys. (line 81)
+* rl_bind_keyseq_in_map: Binding Keys. (line 64)
+* rl_bind_key_if_unbound: Binding Keys. (line 30)
+* rl_bind_key_if_unbound_in_map: Binding Keys. (line 36)
+* rl_bind_key_in_map: Binding Keys. (line 25)
+* rl_callback_handler_install: Alternate Interface. (line 13)
+* rl_callback_handler_remove: Alternate Interface. (line 42)
+* rl_callback_read_char: Alternate Interface. (line 22)
+* rl_callback_sigcleanup: Alternate Interface. (line 35)
+* rl_catch_signals: Readline Signal Handling.
+ (line 69)
+* rl_catch_sigwinch: Readline Signal Handling.
+ (line 76)
+* rl_change_environment: Readline Signal Handling.
+ (line 90)
+* rl_char_is_quoted_p: Completion Variables.
+ (line 45)
+* rl_check_signals: Readline Signal Handling.
+ (line 133)
+* rl_cleanup_after_signal: Readline Signal Handling.
+ (line 107)
+* rl_clear_history: Miscellaneous Functions.
+ (line 49)
+* rl_clear_message: Redisplay. (line 51)
+* rl_clear_pending_input: Character Input. (line 29)
+* rl_clear_signals: Readline Signal Handling.
+ (line 182)
+* rl_clear_visible_line: Redisplay. (line 25)
+* rl_complete: How Completing Works.
+ (line 46)
+* rl_complete <1>: Completion Functions.
+ (line 19)
+* rl_completer_quote_characters: Completion Variables.
+ (line 160)
+* rl_completer_word_break_characters: Completion Variables.
+ (line 146)
+* rl_complete_internal: Completion Functions.
+ (line 9)
+* rl_completion_append_character: Completion Variables.
+ (line 185)
+* rl_completion_display_matches_hook: Completion Variables.
+ (line 124)
+* rl_completion_entry_function: How Completing Works.
+ (line 52)
+* rl_completion_entry_function <1>: Completion Variables.
+ (line 6)
+* rl_completion_found_quote: Completion Variables.
+ (line 215)
+* rl_completion_invoking_key: Completion Variables.
+ (line 279)
+* rl_completion_mark_symlink_dirs: Completion Variables.
+ (line 221)
+* rl_completion_matches: Completion Functions.
+ (line 43)
+* rl_completion_mode: Completion Functions.
+ (line 36)
+* rl_completion_query_items: Completion Variables.
+ (line 178)
+* rl_completion_quote_character: Completion Variables.
+ (line 203)
+* rl_completion_suppress_append: Completion Variables.
+ (line 197)
+* rl_completion_suppress_quote: Completion Variables.
+ (line 209)
+* rl_completion_type: Completion Variables.
+ (line 271)
+* rl_completion_word_break_hook: Completion Variables.
+ (line 151)
+* rl_copy_keymap: Keymaps. (line 16)
+* rl_copy_text: Modifying Text. (line 14)
+* rl_crlf: Redisplay. (line 33)
+* rl_deactivate_mark: Miscellaneous Functions.
+ (line 62)
+* rl_delete_text: Modifying Text. (line 10)
+* rl_deprep_terminal: Terminal Management. (line 12)
+* rl_deprep_term_function: Readline Variables. (line 185)
+* rl_ding: Utility Functions. (line 35)
+* rl_directory_completion_hook: Completion Variables.
+ (line 63)
+* rl_directory_rewrite_hook;: Completion Variables.
+ (line 81)
+* rl_discard_keymap: Keymaps. (line 25)
+* rl_dispatching: Readline Variables. (line 47)
+* rl_display_match_list: Utility Functions. (line 41)
+* rl_display_prompt: Readline Variables. (line 65)
+* rl_done: Readline Variables. (line 27)
+* rl_do_undo: Allowing Undoing. (line 47)
+* rl_echo_signal_char: Readline Signal Handling.
+ (line 143)
+* rl_editing_mode: Readline Variables. (line 301)
+* rl_empty_keymap: Keymaps. (line 33)
+* rl_end: Readline Variables. (line 18)
+* rl_end_undo_group: Allowing Undoing. (line 34)
+* rl_eof_found: Readline Variables. (line 33)
+* rl_erase_empty_line: Readline Variables. (line 53)
+* rl_event_hook: Readline Variables. (line 130)
+* rl_execute_next: Character Input. (line 25)
+* rl_executing_key: Readline Variables. (line 202)
+* rl_executing_keymap: Readline Variables. (line 191)
+* rl_executing_keyseq: Readline Variables. (line 206)
+* rl_executing_macro: Readline Variables. (line 199)
+* rl_expand_prompt: Redisplay. (line 66)
+* rl_explicit_arg: Readline Variables. (line 292)
+* rl_extend_line_buffer: Utility Functions. (line 26)
+* rl_filename_completion_desired: Completion Variables.
+ (line 236)
+* rl_filename_completion_function: Completion Functions.
+ (line 57)
+* rl_filename_dequoting_function: Completion Variables.
+ (line 36)
+* rl_filename_quote_characters: Completion Variables.
+ (line 166)
+* rl_filename_quoting_desired: Completion Variables.
+ (line 246)
+* rl_filename_quoting_function: Completion Variables.
+ (line 23)
+* rl_filename_rewrite_hook: Completion Variables.
+ (line 109)
+* rl_filename_stat_hook: Completion Variables.
+ (line 97)
+* rl_forced_update_display: Redisplay. (line 10)
+* rl_free: Utility Functions. (line 17)
+* rl_free_keymap: Keymaps. (line 29)
+* rl_free_line_state: Readline Signal Handling.
+ (line 113)
+* rl_free_undo_list: Allowing Undoing. (line 44)
+* rl_function_dumper: Associating Function Names and Bindings.
+ (line 46)
+* rl_function_of_keyseq: Associating Function Names and Bindings.
+ (line 13)
+* rl_function_of_keyseq_len: Associating Function Names and Bindings.
+ (line 22)
+* rl_funmap_names: Associating Function Names and Bindings.
+ (line 56)
+* rl_generic_bind: Binding Keys. (line 87)
+* rl_getc: Character Input. (line 14)
+* rl_getc_function: Readline Variables. (line 135)
+* rl_get_keymap: Keymaps. (line 40)
+* rl_get_keymap_by_name: Keymaps. (line 46)
+* rl_get_keymap_name: Keymaps. (line 51)
+* rl_get_screen_size: Readline Signal Handling.
+ (line 165)
+* rl_get_termcap: Miscellaneous Functions.
+ (line 41)
+* rl_gnu_readline_p: Readline Variables. (line 89)
+* rl_ignore_completion_duplicates: Completion Variables.
+ (line 232)
+* rl_ignore_some_completions_function: Completion Variables.
+ (line 55)
+* rl_inhibit_completion: Completion Variables.
+ (line 285)
+* rl_initialize: Utility Functions. (line 30)
+* rl_input_available_hook: Readline Variables. (line 151)
+* rl_insert_completions: Completion Functions.
+ (line 31)
+* rl_insert_text: Modifying Text. (line 6)
+* rl_instream: Readline Variables. (line 103)
+* rl_invoking_keyseqs: Associating Function Names and Bindings.
+ (line 37)
+* rl_invoking_keyseqs_in_map: Associating Function Names and Bindings.
+ (line 41)
+* rl_keep_mark_active: Miscellaneous Functions.
+ (line 65)
+* rl_key_sequence_length: Readline Variables. (line 210)
+* rl_kill_text: Modifying Text. (line 18)
+* rl_last_func: Readline Variables. (line 116)
+* rl_library_version: Readline Variables. (line 79)
+* rl_line_buffer: Readline Variables. (line 8)
+* rl_list_funmap_names: Associating Function Names and Bindings.
+ (line 52)
+* rl_macro_bind: Miscellaneous Functions.
+ (line 6)
+* rl_macro_dumper: Miscellaneous Functions.
+ (line 13)
+* rl_make_bare_keymap: Keymaps. (line 11)
+* rl_make_keymap: Keymaps. (line 19)
+* rl_mark: Readline Variables. (line 23)
+* rl_mark_active_p: Miscellaneous Functions.
+ (line 71)
+* rl_message: Redisplay. (line 42)
+* rl_modifying: Allowing Undoing. (line 56)
+* rl_named_function: Associating Function Names and Bindings.
+ (line 10)
+* rl_numeric_arg: Readline Variables. (line 296)
+* rl_num_chars_to_read: Readline Variables. (line 38)
+* rl_on_new_line: Redisplay. (line 14)
+* rl_on_new_line_with_prompt: Redisplay. (line 18)
+* rl_outstream: Readline Variables. (line 107)
+* rl_parse_and_bind: Binding Keys. (line 95)
+* rl_pending_input: Readline Variables. (line 43)
+* rl_pending_signal: Readline Signal Handling.
+ (line 102)
+* rl_persistent_signal_handlers: Readline Signal Handling.
+ (line 82)
+* rl_point: Readline Variables. (line 14)
+* rl_possible_completions: Completion Functions.
+ (line 27)
+* rl_prefer_env_winsize: Readline Variables. (line 111)
+* rl_prep_terminal: Terminal Management. (line 6)
+* rl_prep_term_function: Readline Variables. (line 178)
+* rl_pre_input_hook: Readline Variables. (line 125)
+* rl_prompt: Readline Variables. (line 59)
+* rl_push_macro_input: Modifying Text. (line 25)
+* rl_readline_name: Readline Variables. (line 98)
+* rl_readline_state: Readline Variables. (line 213)
+* rl_readline_version: Readline Variables. (line 82)
+* rl_read_init_file: Binding Keys. (line 100)
+* rl_read_key: Character Input. (line 6)
+* rl_redisplay: Redisplay. (line 6)
+* rl_redisplay_function: Readline Variables. (line 172)
+* rl_replace_line: Utility Functions. (line 21)
+* rl_reset_after_signal: Readline Signal Handling.
+ (line 121)
+* rl_reset_line_state: Redisplay. (line 29)
+* rl_reset_screen_size: Readline Signal Handling.
+ (line 169)
+* rl_reset_terminal: Terminal Management. (line 34)
+* rl_resize_terminal: Readline Signal Handling.
+ (line 149)
+* rl_restore_prompt: Redisplay. (line 60)
+* rl_restore_state: Utility Functions. (line 11)
+* rl_save_prompt: Redisplay. (line 56)
+* rl_save_state: Utility Functions. (line 6)
+* rl_set_key: Binding Keys. (line 71)
+* rl_set_keyboard_input_timeout: Character Input. (line 34)
+* rl_set_keymap: Keymaps. (line 43)
+* rl_set_keymap_name: Keymaps. (line 56)
+* rl_set_paren_blink_timeout: Miscellaneous Functions.
+ (line 36)
+* rl_set_prompt: Redisplay. (line 80)
+* rl_set_screen_size: Readline Signal Handling.
+ (line 153)
+* rl_set_signals: Readline Signal Handling.
+ (line 176)
+* rl_set_timeout: Character Input. (line 42)
+* rl_show_char: Redisplay. (line 36)
+* rl_signal_event_hook: Readline Variables. (line 143)
+* rl_sort_completion_matches: Completion Variables.
+ (line 263)
+* rl_special_prefixes: Completion Variables.
+ (line 171)
+* rl_startup_hook: Readline Variables. (line 121)
+* rl_stuff_char: Character Input. (line 18)
+* rl_terminal_name: Readline Variables. (line 93)
+* rl_timeout_event_hook: Readline Variables. (line 147)
+* rl_timeout_remaining: Character Input. (line 52)
+* rl_trim_arg_from_keyseq: Associating Function Names and Bindings.
+ (line 29)
+* rl_tty_set_default_bindings: Terminal Management. (line 17)
+* rl_tty_set_echoing: Terminal Management. (line 27)
+* rl_tty_unset_default_bindings: Terminal Management. (line 22)
+* rl_unbind_command_in_map: Binding Keys. (line 53)
+* rl_unbind_function_in_map: Binding Keys. (line 49)
+* rl_unbind_key: Binding Keys. (line 41)
+* rl_unbind_key_in_map: Binding Keys. (line 45)
+* rl_username_completion_function: Completion Functions.
+ (line 64)
+* rl_variable_bind: Miscellaneous Functions.
+ (line 19)
+* rl_variable_dumper: Miscellaneous Functions.
+ (line 30)
+* rl_variable_value: Miscellaneous Functions.
+ (line 25)
+* self-insert (a, b, A, 1, !, ...): Commands For Text. (line 33)
+* set-mark (C-@): Miscellaneous Commands.
+ (line 33)
+* shell-transpose-words (M-C-t): Commands For Killing.
+ (line 32)
+* show-all-if-ambiguous: Readline Init File Syntax.
+ (line 326)
+* show-all-if-unmodified: Readline Init File Syntax.
+ (line 332)
+* show-mode-in-prompt: Readline Init File Syntax.
+ (line 341)
+* skip-completed-text: Readline Init File Syntax.
+ (line 347)
+* skip-csi-sequence (): Miscellaneous Commands.
+ (line 52)
+* start-kbd-macro (C-x (): Keyboard Macros. (line 6)
+* tab-insert (M-<TAB>): Commands For Text. (line 30)
+* tilde-expand (M-~): Miscellaneous Commands.
+ (line 30)
+* transpose-chars (C-t): Commands For Text. (line 50)
+* transpose-words (M-t): Commands For Text. (line 56)
+* undo (C-_ or C-x C-u): Miscellaneous Commands.
+ (line 23)
+* universal-argument (): Numeric Arguments. (line 10)
+* unix-filename-rubout (): Commands For Killing.
+ (line 43)
+* unix-line-discard (C-u): Commands For Killing.
+ (line 16)
+* unix-word-rubout (C-w): Commands For Killing.
+ (line 39)
+* upcase-word (M-u): Commands For Text. (line 61)
+* vi-cmd-mode-string: Readline Init File Syntax.
+ (line 360)
+* vi-editing-mode (M-C-j): Miscellaneous Commands.
+ (line 92)
+* vi-ins-mode-string: Readline Init File Syntax.
+ (line 371)
+* visible-stats: Readline Init File Syntax.
+ (line 382)
+* yank (C-y): Commands For Killing.
+ (line 70)
+* yank-last-arg (M-. or M-_): Commands For History.
+ (line 83)
+* yank-nth-arg (M-C-y): Commands For History.
+ (line 74)
+* yank-pop (M-y): Commands For Killing.
+ (line 73)
+
+
+
+Tag Table:
+Node: Top866
+Node: Command Line Editing1591
+Node: Introduction and Notation2243
+Node: Readline Interaction3867
+Node: Readline Bare Essentials5059
+Node: Readline Movement Commands6849
+Node: Readline Killing Commands7810
+Node: Readline Arguments9732
+Node: Searching10777
+Node: Readline Init File12930
+Node: Readline Init File Syntax14086
+Node: Conditional Init Constructs37389
+Node: Sample Init File41586
+Node: Bindable Readline Commands44711
+Node: Commands For Moving45766
+Node: Commands For History47525
+Node: Commands For Text52489
+Node: Commands For Killing56192
+Node: Numeric Arguments58906
+Node: Commands For Completion60046
+Node: Keyboard Macros62015
+Node: Miscellaneous Commands62704
+Node: Readline vi Mode66632
+Node: Programming with GNU Readline68449
+Node: Basic Behavior69435
+Node: Custom Functions73118
+Node: Readline Typedefs74601
+Node: Function Writing76235
+Node: Readline Variables77549
+Node: Readline Convenience Functions91224
+Node: Function Naming92296
+Node: Keymaps93558
+Node: Binding Keys96637
+Node: Associating Function Names and Bindings101185
+Node: Allowing Undoing104415
+Node: Redisplay106965
+Node: Modifying Text111024
+Node: Character Input112271
+Node: Terminal Management115352
+Node: Utility Functions117175
+Node: Miscellaneous Functions120503
+Node: Alternate Interface123922
+Node: A Readline Example126664
+Node: Alternate Interface Example128603
+Node: Readline Signal Handling132135
+Node: Custom Completers141388
+Node: How Completing Works142108
+Node: Completion Functions145415
+Node: Completion Variables148989
+Node: A Short Completion Example164795
+Node: GNU Free Documentation License177632
+Node: Concept Index202806
+Node: Function and Variable Index204327
+
+End Tag Table
+
+
+Local Variables:
+coding: utf-8
+End:
diff --git a/doc/readline.pdf b/doc/readline.pdf
new file mode 100644
index 0000000..b0925cd
--- /dev/null
+++ b/doc/readline.pdf
Binary files differ
diff --git a/doc/readline.ps b/doc/readline.ps
new file mode 100644
index 0000000..011e8cb
--- /dev/null
+++ b/doc/readline.ps
@@ -0,0 +1,12656 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 2022.1 (TeX Live 2022) Copyright 2022 Radical Eye Software
+%%Title: readline.dvi
+%%CreationDate: Tue Sep 20 14:17:05 2022
+%%Pages: 86
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: CMBX12 CMR10 CMTT10 CMSY10 CMMI12 CMMI10 CMCSC10
+%%+ CMSLTT10 CMTI10 CMSL10 CMSS10 CMTT9 CMR9 CMMI9
+%%DocumentPaperSizes: Letter
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 600 -t letter -o readline.ps readline.dvi
+%DVIPSParameters: dpi=600
+%DVIPSSource: TeX output 2022.09.20:1017
+%%BeginProcSet: tex.pro 0 0
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S
+/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy
+setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask
+restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3
+def}B/p{dir 2 eq{-90 rotate show 90 rotate}{dir 3 eq{-90 rotate show 90
+rotate}{show}ifelse}ifelse}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0
+N/Ry 0 N/V{}B/RV/v{/Ry X/Rx X V}B statusdict begin/product where{pop
+false[(Display)(NeXT)(LaserWriter 16/600)]{A length product length le{A
+length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}
+forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{
+BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat
+{BDot}imagemask grestore}}ifelse B/QV{gsave newpath transform round exch
+round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0
+rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B
+/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}
+B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p
+-3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{
+0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+%%BeginProcSet: texps.pro 0 0
+%!
+TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
+index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0
+ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{
+pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get
+div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type
+/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end
+definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup
+sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll
+mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[
+exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if}
+forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def
+end
+
+%%EndProcSet
+%%BeginFont: CMMI9
+%!PS-AdobeFont-1.0: CMMI9 003.002
+%%Title: CMMI9
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMMI9.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMMI9 known{/CMMI9 findfont dup/UniqueID known{dup
+/UniqueID get 5087384 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMMI9 def
+/FontBBox {-29 -250 1075 750 }readonly def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMMI9.) readonly def
+/FullName (CMMI9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+/ascent 750 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 58 /period put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5
+45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4
+7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7
+72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E
+BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89
+974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674
+11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBD07FC5A8862A8DB
+7E2B90C16137614CDAFB584A32E50C0935109679E31306B8BDD29F1756946A67
+7A7C2D9BA6FAB9B20A424AA0E6F4BA64C2801C2FB5A1156CBEED0ACB95F697B8
+BC2A6E6AA7EB1F9FD8E3C9B1A16697EE1F0E7400421A7765AB218FC837A49365
+82DC6B2C877A7DA84A81E6126EE96DB25C17A207D3020A045DCDAA064360DFFC
+E3CD50E21ED239D2A6450D04F879A26443ADEB6A20ACC504989876476C7D1A74
+91564FEA1F4CC2C8C8FDF666DB537F315AE1886C73CB5B00E67E7B398A6C018E
+540EAEE98BB8136C4F044EDD63C33431D2CF9740F051DF365A4045D9D8782112
+7BB5D494D9235BA98CF2F30CB119F5A904C32AD04C960C43FC1F5FD8DA7D90D8
+93AFB59F3FF4F796481AE2A7548F948FECFC6C127C4D3F159B08F206AE8C296D
+EE470DB2F879EA79475E029D22D7A8535C09A18689DB0609CC233E5199C02756
+972CC9C94D9FCE264DEE5D75C8D651E4E2D1189AD9588CB815722BB5EE3C379A
+6F31C2E6AE1AE4CCEB29766190AFA20EA937114978752189F1A9F42B39483149
+796FCFA123BA9CCD1D9BE28289660BCAE16C40B5B504058D55CFCBFB4F4E3D94
+DDBF39F157E63946534DA81C018B1C01B9F10DDB55E0A5C2B3985ED1977C039B
+D6755EA42CD09E27751E159C30B93F376DBE61CD3AED34BA36A768F232EB3B80
+E3E6B77C4A48D408217818E398B83D995AB6BC871F20991DF57313D6EB0C793D
+0F28088EBDB7F38DAF7E01AAB3476EC24D7BB38A9889A7D3038D930FF4289B83
+F54A7BE1E2D98A3822098D2E4D067A0D400C20C0B2B4BBD74C13ED1B827490F9
+ECF48F8C3994C1C5AAC9CF783BFA4F307528F51EAB55F961808A42ED53F00C97
+72A432EAEDCFCFB622389BDA707B6ACC9433B065CF29EBFE93AD14B8ECD5F47F
+F073F11822C49B8BE924CDFA6348C3A75E9BB9BF3F31C41716B34794B28CDAC9
+4DB8B087E180A9B3B17680F73D9C12C8D86A922C948093629F5D7F542ED882A1
+692F4F6696865E53E3E2DD43B2D5E8C989CFAA5CA5C4C5999045E170BDE9921C
+BACD6F2863F5553EAB2BA2D4A9034729EC0C4201DE90DA89B0A27C5A5C974109
+4E37BFB3F46B3A506169FB0C68E1CAFC844419A8D261A1FD86A3BB78E33D5FB1
+CFC687A5975987CE45155E5FDFAF0CC5FD5568CB1C26212F92E88255F0549F59
+41B33125946DE43436BEC00804063FBF03EC796E3361B1C852EC3038D107F80A
+9198968265D5488B26D7670B22C2D75EDFFD1B7B4AAFA36DFD94640C9D0E2D20
+5BCA18683EFB91834A3939AB8EB60E2F09655BE003582634C52770DA9668C292
+2E02929D812EE2B0CC65F020064AD5BDAC5F5693B30508F40ED8E20E87149BD5
+8DD41AFF83FD1944804017DC5A04512E593549FFFAE501131CE2FDB65EFD0B8B
+33809CBAEE411B3941C241550B9C30DD28088708F1C0CC3125CBEDCD985EAD28
+03313741F67DB5744A87B381147D5BA70AE1145C27F794854628D87D6C1ECCA1
+749E3465B950175D3C3F40E344297BD92D3190041A4392033A79BEAEAABB8DBE
+CC14E39612F43721CFAE6F79074429221CA588AA2501DE520A464DE157A03AFE
+3C082FAE7628FC0C57FFC61D0330AE6332D20FDBB09BF36848FE05E782D6379F
+64F9C82C45402481B0A35989027F9756BF5A79DA2D96E10F39167ADB4305578F
+90B509B6891338FA1D67DCFD61804AA6621526B2EE4769589A2646581712AC05
+DA6E98D16494F07D612743058F54FEE516BD89A8EC3E03F9D7F905175D3412C8
+F7329077FD6EB25213F3CAC94BA0C3363B759401B6EF7548C7D709F3241D030D
+4EB46A1AE81863C412BDDAEA6084C37143A4C5E41BC646315B1CD09F934186CF
+49D1D8239E363A435307030BD79536B50B723A39DD763DB539F24A10DDA12BD4
+E467339D2D6DB177D6FC539FA77D2DE4118EBAC161E928749F7C753ADEF86117
+58619F1155C563DF2E11ACA8347908B98113AED58FCD0394150EEC94B7F986EE
+88BF7171D208D8F1774B1DD478F0C2958AE372D257E7EDF0F6B5D6059CC4D5D3
+B00FCBD2E9CBE79235B9A5A3E943CC27AABB58728C95C7DBD4F4A1F8A4DA99AE
+7377B0CC0BFBD454794398AE0D5F7281771FFE87B25A819F36E692286A42D776
+01794A43CA9BB30FB8FFDAAF014F909A369E34C2F6C75B7D4EB9DB0580E33F46
+19654443AFF8384B95600B86FF8E41FEFD032355626D60C7507C058EF832DF41
+194B48A36F11082D1DCF4723E21401E0C7447AABFAB4639B26E3D2730E348F55
+53EBFF39CDD03E06E2FA5FB379603C879EDB7E1A10F89695C9C47DEEE52BE0A3
+F446F187AB9D7E93E6F9387F21129034F36DF40605D28FD526AF82CA9D232BE4
+412567F06B38ECCD496EF40A7B243E46C9FEBA4F1BF4B1ECA029C5EC239353D6
+C0B100BF7E7DB33BD1277DE104F15AA19F37340A777741AD1AD693BC76DA48CC
+C6F83CD84591ECFEE375979972B0FAC4C10B625E4BFB261B9FFFA83C31DA0108
+4FFB6377466E9739E0EB64424BD9FC7239C7DD834EC6788A0F97FE714AF92831
+E1BA36A8A9E24739F1DC82DC26CC3CE28C210AA7C569B19E1784D663A0CA4E81
+AFF43E86D6F5F63778847700072CEB77A4EB946DC1F23DBC00BCE773203F76DF
+00F0B085F31420672974DDC642D885E95BA6BBE43E1CA8ABF464D9881CDECC7A
+E98E31B9754C9B72A8BD5CF6D4D214DBC3BA7A0CDF6635953F5AC1E7639C4A91
+C7AECE4C75CA3389C348F656FC2CC96C84C85A926237B6504DB51937C9CFCDAC
+B75C31ED570D180757884E27757783DB2D5F35ECC48C496CDA342D49AA947BF8
+2FDAD2F19DFE8CD1C76A8FA08F33681F3E12E229D7DAB45BE3A3F258B5ED4980
+F15340CF20D965252843E026803E8AEE736EC41CCA82167401977AB719AA2F50
+0B791EEAA82027B3C712D2EB9D14BF8F94FBDE2227609BCAC41EC08DE2BAC023
+28352F913F7DF08D4E1C66E83F764578B22B4EB7191E852B91ADCCB1BCFDB1F4
+E63DFD152E86FA9DE9BC8908130EFDE29CC4401339C05B5B9764CF8EFF14951A
+C6C13AF979546996BF22F2B96D3D585B90CD27DADEC78914DA48432C6ACBDD42
+20EF583FD41F2F6D6D10C3DF7DD077304B5940BB0462656E306CBD91EB9B756B
+7014B1884A36201EC582FC9345C386043DD2818FC301EF78791C1D7854F8FACE
+5DE9801DE9F59D5B4271E003AB897B2EF49501589D681D59CFFD9B03F722EEF4
+74ABD29997515DA3591496B62666744EA76DCA45504F8075C0652D6779DBEAE4
+90430C2945FBD60AD53B51DDBEFC7ED703C418B4B244C8FFA5A3C1B7600C5A55
+3EBDB93C16AC191C3A28EB2279BD3F0D67C826BC6A73D3C0AD02262368AB4621
+98A1605F2887BC5880E1AF2780330E0FD01D7CAACBB0F008A42C427F38236066
+54799594E515B289044BAC4DADF8B3686B4372C5110201221FDA923F131E07E7
+93C44BAD406838BA4D1C277EF74098B8C0EDC41EEDD58C195D7DFF5FEDBF96FC
+19CEBC6C3006DD2CBF76916B4298BB915663C2F61AFD7747E03A03BD7280197A
+9DA590E3D081C6F53DBF94E8D6FDDDD910A70AB18A0F6D48A590FFAB314D6CFD
+E3FB20C1F3C91063F00726A2C13A3D48323F9854839405E5A29D66A43E6E2B84
+A8B3765F1D817071D4D6FF42BC785C2D11AB2B9452F141696CE19C6AFB9777DB
+107D6E22D8CC6C26440BC48248AD8805C4329D46BF433741CB519B21663392DA
+5DC7FC9BF37E5BC396BFADD7263D09F6B4D69594AB386B7BDFCF3BACB97A0E08
+22013E716E642592A20136CF9CFD61D4E515D80E06A4CB4FC9D9B916C93CEA95
+B83B98C48CF36C1D02291D4F5C0419338D64E33C90C90EDD2BA3B96D70FAFE0D
+403A060CFF448D3E28A9B1E3916018465E86095BAAB4706CF7ED350D7C554789
+D7F4FE5F180767DE8739259E68CF142040BE1E2E8C6152DE3417C1FAEA7584B6
+20781DC4A9796431EE713DAC4E713C839D7A4FDC8AB6BFEFFE767AFD8B67FDA6
+943AD387E5D3BCB09039ADB64ECC2BE2620C6EC269E708DD06C311F450099E33
+AF46AEC644222E7DC4DBB9371EE12CFBC4F9B27AB46AD1DA96CE006E1DF8291F
+A550A93026CBFFC1087B134EC6EA76F5E109CDA58FF47338A0039A786A575F70
+B8A03A4F9C8D07A4C856C77D9BCC8E3EAA740172D0C2D0A15BA35C9E5717D7FA
+2691774DDE730BB9D7C70D7AE103DB8D35F3728470C76EBA0E670634E1A0BA84
+2FA102BAD7271DF2680D86A4CA6FC353869987700E5E3FD778165456033D624F
+E9B3E80EBF431ACC934AA0357E824B8AD73E222B510DE8445C55C07C8E5DE46D
+E478F832BDDECAF2EBB11941DCF84CCD887043FAED9AA90D12BC8CA9A0C8D94F
+8D3BF1F80B14B6CAE6BB1C6AA405AA64BB94D5A82CFEA548BA070796A02F9642
+87326D066101435AB9EB40BA9EA9E61B363F5F5E3B924369796E8B78DE3414A4
+2B79C6A13ECB2F34E6299658D07D2B3DEF3D4383CE009A927F0EF5C196652842
+D96B857AB5E905201E7E8BA21A5EBED1FC6863BA9A1A6E5390407F75055E2EEC
+512FBDB3E82CEA13663F1A1944DA072C765D8CED06AB461470C5723BDC1271D4
+4D1D049D3EB131743F1EC9A6ADDAA038ACA2C41D139DC6A84EC3C61AC7F1E559
+6155CC2F49171F6E07CF56D721D9728E87FC7DCBCAC46455A3694C765FE807E9
+9CBC2D304AF37E0F28CCB22F239541B53A4D24D09C662559267467EA487BD33A
+0BEFD4899B581D20582930703A868655C31BE935364CA6A95FBCB22CB714C040
+9718824DFE97929D0482430726CCB5A5307957DD2432A9B6271E849148DEB76B
+FAA290FF6D0B18DC5B76407852E81C105EC6CFAB0F620C6DC9DA555A33C167B1
+430A8BC338BFC7D75B7099CC906AD923FA107C74D3FBB719D77A4E5A685FF9D8
+56424EE4AA074434B809D894ED50F6A60A035C5223EA25DD8983B9B34210DABE
+718D7B2BEB293FF1B63CFB1CBDAFC69552963D90F5E3FF533A3FDBB626E9FAA3
+F3C119E5E01C7BFF832A033C3515BF049E29558B1DAD652F2888E339E67D15AE
+95F9BD14E3253DFE9072B24C0E7E85025B71096AF51C86AECB2921126A43156B
+EC812B32B1164BD9B2B947D503C015616DBF2024F5C8CB3236C1DCA653D661FE
+6B1C19A22D272A176B7F1B7F9E67AF40DB0EFD4940E58B2A050249CA4E55CAF7
+6ACFD84FB46FEF952D18552B3972D79D808B4C263B8C7E1BB647A2D03E102867
+630D5C3F2C917F765A4F6FB8106BA6A9D0093E27A4CB6049C2371287D94B5111
+6E7020776EBD744C6C920464BBBC0AC206033E8240017F8CCB112596ECD7CAFA
+89950CF43FD87ACA750C03A778A37FBCE9C82C2F5ABB135BB02DA8E8C0D24475
+3BEA9D79372D0022FF1ABD378C151417DBC69FE5C9CA38D23A3900E34BF924A2
+90777ACDC37930B67DD44A2E76DDBD9B89598D5F626BFD325A978D277265DA47
+38CFAF16E7FF1946E15F41CA73F7B4B02E5AE8FC4C37B115BC567E4EEEFEFC34
+EC8974B1465AE57759EDDA28DD38A9210871D35D331AE1BE6097C3EC21C770C9
+B25D040B2ECCC3AEB1EA1BF99E0C2C0F192C13BB9152CFCF75332E03F9CEC376
+9B8C285A35F53655BE38713E09AE34BA2DA9C06FA42A6FD2D00CBF2AFD2BADB9
+1571629C65DA38A431710CF5B01FCA68E8B8569922FBC3F9B64A5509B6F677AF
+1B97E91FFFEB6308AB68AC58F9BA43DB5E764021E75B56170EB44C2C0A7DB86C
+62B8982256D3621EBE3DB3994DBF5C5A14CF34B4AF3BD5697F8E3203085DE9D5
+84B0598169760B925463E93DC87CE70AF4C2DF0F4287D2F2069847BCCF7A37A2
+AD451D5ACE4DBCCB2E14D5DF38B226952E7446BF87BEC736EF3D5AE793304618
+D66D3299AB9F9CA1D13F134FAEDF36750046E27706C7CBD8E0877BB6276E5196
+BC2A355D109C0253644918E1CC11B717DE6FBDA201E769812752888CD66268F6
+4ACF4A9449378F9F9923D584BA1B51F33663BE7A306887BC14A37E3C5A4654E6
+531D6EB63DE3946BD8BA95CFB037991174F36D61D842071E6625605CAA350A24
+FE551025D10871FE0E2599A63900C8520EF4911C53A03897C8BEE152451708E2
+43FCF4E700C583A5E8DBCC03BF9CAB864DBD19E1760945DEA0EC0BA38BEA8256
+D3A8D4F70F6685A99C6BD2BA8B412A26C002D76138CFCC7DF6802931E5D97BA6
+0151F6A4C572235B4196B22B7B2D14B32886DF0D2CA8A277ABAAC53B63F64CE4
+E4C088192AAB674497E8AF81961359C389B51F4A257373D907C615030BFBEF53
+DBD99058FD06E352450B658478C10454AC8FC0232B70D5CB916981978053E358
+99D322A07294748BA427FFD1E45C909171017B52B7C742FD77A8560852D819DD
+8DD53211A14D7B2FD11E42941722FD3985D627FDAF87EB57326A0D290B5077D1
+8A4230BEB40523A8565F95E0D44F036A571DB698EDD9D94FEC9512369E5E5E73
+A3CA5C142617944F4F99C0697ED088ACAC007FCE06E5A6EDE7D0E03A3399DCE5
+362271BC31533866BA79FD1FB3F608B22CCD4111FFB1BA35D920A23AD157C6B3
+C3DAE11069D5E46DEDA7158C6478D8B8C0D9DC237CDF0CC6633911673C43FB79
+E4F9B7F27495201E5ADE66255BC2CBE9D9F237DECB62A19D62CB41A1C92432D2
+07F0629E913A71B3F1AAF8B8C5AC66D3C8605A48F8913E39C859E163DB1DBC8F
+0ACFEE80A40B6172032E95A76B752B873FB4DF23CF3A655AF1A1B88C8DC156C6
+190DE72973950565454C0A188A33395FD3D529A88F2B578356DE8EBBC12F04C4
+5B899F667D9E6F3A4EC6DD8DE71FD4C2E2B6D56823EE4E0526679D71FF1B868D
+F261489F06F97B010CCBE640E2F57BA3DC3332B329F7958394BA9777D833AB50
+005E8E9232547104065ACE33396772B0E0BD66D2C6CC54DEDD071E444D8C95F8
+6F88B31E20FDB80F77C83151B7E25BD3736B4F9BDC52EE78C41E9475E5A6D94C
+D348AB42F5E36B4F167D29EBDFBD43B03F77EB296B06A36880FF17D412E77EA9
+F2E7C25FD05E16BEC6732681EA21AC3FF6893B93FC09316A370CDDB86D9E6087
+F6042C3F9ECD742778389170F5F041329782FB9F9702F7533E51F355F71825AE
+2BF4F8FE50D413AC9A20C41B42537FDBE8DDC5A5C793D3760C1EE13716068752
+F0AF10812250BEDFB4D7133FD58F4587BACD572505C84A7D3802D27443175FE0
+0D89C3398B55176D8642AFBAB5CBCDFD6220C8488564B4306D74A58CD2921AAD
+73CF803C754DAC2F30A5324886E273064FA51781D5BC596BFEDDCE3982EA1AA2
+62CA7BAA1B16C6EBB99B2AAC4E6C9CEFB3D10F19987045C4918DB239E6E63D79
+5F44B9D097118D081153AFF96E5EB39CBFBB99A3BE30909F614869031358EB98
+F07A97EA78AE50375941B2474DB46AF3305F2B208D45921F93743A6CB8AC584F
+6BEBE25ECAADD5A789EF60C9F54446687E7B030DA3E5243189F02BA46BFD28B7
+DC14822E136AC7E40CE20458DDBF356488045C95907363864CD6943643BF0109
+EE027A3091C11EA392EA91320EBFEA3B857370AD8EB86D73F035A476F7058222
+E8CDE78CA1AA9EA69A8AA6EBFF3E67324C567B914134DE042D6F8F18A9373107
+536E8D90189917D343F5299024239E2EC1D2D177D82DC8E344A7CF2AC71AEC18
+36F139E7A4EB59A67192BCA9ED0EB25DE13032F6FEAFC3B1F4FC81BB0EDC41DF
+B9EB92618667C59EA499B788CD26C2137D70F1B0AF793AF5AD0D0941F2E746E3
+F5A7F0288BC1EE11E982EAAE763CA422D72FBBC0D754AD58FBF92629DC8866A0
+431213513744DB48E52EFC89C83FEB082588E4F30D7DA77BB598E51CAE7E4900
+5CD570C914EFBA426BAFF7A56FC775ECF5BE13F2C42E51EF96784E5201C0B64C
+074AC229FF0BFDF71E6D5E08D8755D2C12B770B6466A9C9C61C15582DCD2FF78
+E9E74DC2B1CAA344EC0339EBFF92CD2CC1D62E2FA8FF15E7459A83C6CFA58A77
+2F1A40BD276E76B675FD6834052B33BF9190F04DF6AA5FA3BB7D77A88DD5B600
+324C5E28216F47682EC29EABF35BA842BA2294A3D72B126EBB852AB741186C9F
+FC84B12DC4A6CEC08F2D03EE61B65C845841EE17F1B765649A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMR9
+%!PS-AdobeFont-1.0: CMR9 003.002
+%%Title: CMR9
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMR9.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMR9 known{/CMR9 findfont dup/UniqueID known{dup
+/UniqueID get 5000792 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMR9 def
+/FontBBox {-39 -250 1036 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMR9.) readonly def
+/FullName (CMR9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 12 /fi put
+dup 13 /fl put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9AF72336CC4AD340
+15A449513D5F74BFB9A68ABC471020464E3E6E33008238B123DEDE18557D712E
+ED5223722892A4DAC477120B8C9F3FE3FD334EACD3E8AABDC3C967C61FF003B4
+B10C56D6A490CE9594D57A2D431B9E5E10FE3D8832E227A7087611431ABCD029
+85F4865E17E17F8CFBD2CADC97E0A8820E3ACEC873F31464466A9545E967E53C
+DBDDB8478E69063FBB891566BAF88B7660A4405B16834761F041CCF7650AF955
+F9E853AA9F5F4382E1FE7D0C5BB4023818A2383F91249D48CE021250EC9EEB1D
+2835E18FB73026250B32A8849067D5E2258797C917F998F2D4121D96560C5FB5
+B5D3471216639A8671B6DFAC5E3554EC36D9A72518525A795590C74DD70DA3A7
+78BFC43E51D6F2BA52F17D4DD00D389D3983EC54912AFF73684A8A7E345537B7
+E62361C04A47859DA084BC72EA53512DC54132EB2EE671793603015652EAFDE3
+41C4B6B679BD60AEC5153EA0D2200CB1D097DAD770F5F31E6FC475A225995277
+B867B731D5401E2D02B85BA85158C80FF7E2BBCC42B98AC867E67D25DB656072
+55A0D32AB7AA483A5A9686CEA4E2B3031D90D84DB3E2DEE7706C91BA81CB8DAA
+700E5F61E07D6998C9552C81B66FD10A10033D49EF3BCB0FF22ED0A3737523C9
+8F851C61C4BF8A213BF6EC70C956AE48B5BD276CC0437C72BF6515B10739919A
+F00F6ADD2798CB211668842349171A5AEB0664D2C44397E55A4A9EBDF54A3EF4
+FBBCDAD9DAEF4B0CAEF7112FA828F2F8D9F633D37E5516AB5ECEA87342EF8DC4
+3A50548490F5BC9A8A1F98AC7AEAD9D913BFA10CA86D73AEB5BACC1FEEFDCC15
+B3655522CCA2C772E902FAB2A6FC153597D52763EB44AB7489FF061F7F58E8F2
+AEAAF4D17F36CBFC00D3C653F335D14240C87DB4339DA9D30A5BD1F502BC9013
+461B9DB2FBEEC01BB18990439A0E9CA6576BC9CF6B1A3DB9386C4A5D4AA6A5DC
+CFA45FB75F22E10ECB72565DB441A194902C91427B4F676E531C661F7A2C3C85
+CD534D1C89B6779B2EDC8E44667B992C20C70B663BFBF680A6CF4383EB7CA26C
+4D1F06B5EF4025BBE65795F1EDB5CCB97050872D6C07BC2974F905ACDB7A765F
+291365D6C8152153E7F017A25FB4476C60FD9EAF9A121633DBEAC32F62850223
+D6418566AB350F90F4B35F19598478F76B63E347D4C61E203D4DB8ECB9889181
+C387F4B663A502C638761D2782BB96EAC81A0108D7BD6938F67FEBB69218D115
+D8E89CFABCE15C6ACC7FEB983332A51A6A73CF4E341574F366713D7FB29956D9
+9BF238A87483D37E526A2EA2F101EDD34E34CB92730DCA7235AA0027189BE405
+2DAB4AA021A30C28B26C50808E1E965C02F6212EC7C72F5683339425A7739380
+A422E6191ED8453AF0CAAA424AE44DFA7CC5C2F6EAA8D73A5101D8E9517DBCFB
+2858D0E8ECB7DC430EF23A9E4428CB7DED8D035D6050251AC101A2D0E884721E
+2F21E573F948048BB8FF888911C508CC198BD750083B339500C426AFCD5634A6
+AAAC1C7E91249667B231BBFC64B4317192FE07FE9DA0DDB5E517D097AAE46577
+9555F29D45C67CDE9812CAD03F220B20519F2FF32DCA56A554D4296FE2D1F3FB
+B209B5270E0E695EA5A0EF1144957CE045881AEB8D05D72CE57F4D34617AED67
+0D3AF0472CD8D60933651626550366E300E72A9C89ACD475C2E2ED9BD44B472D
+9DAFE943F8E02A6DC38E447EED964624C37C3130E48211CA279BB6A0BD59466B
+42F3D89B5746F29E084E22CF58395AF0F29E55113F3A3F2F52CB3A6DF3D026D0
+C81754B8E2E4A15F6943BE9D0087D5166060734FD07C4C57D7C7D90E8C9C1F35
+623CEEE3ABAE75E1A18A1E3B50B7266BD2D8E812CFEB4A46B856885B185640D6
+B9C22179551002B94282F57FB433B7FF157D2F0D240836B72AF4A331668AE5D4
+E6B85415F4E8B9D2F9AF90FAFAA0A3866DF417CA5A31348CF9B41B8F5F4D2F97
+CCF7ADE851B5E2E2F6E319AAF5792EBB9DA2C6AA8B73D889F3CDAA42932CDA7D
+07A7E59183CD89520DDFC36E5D513BFD8AD0886046585F29B4D7F42CC0C27AA7
+53915AB1167D292FE91957E94A57FEE2D49C20C9070ECD736BDEE0F046E60350
+EA539DC298156A4E0D019E7D481FDDA6861E20678516AB80ABEC1F09B126BCB9
+52E8272A06BB6DD87ACFC423B4A4FC9A3DC8DCAEBB807C5F748F1FF8B17B8B88
+F426206BF1B7B7D239D26BC3CF0776C467A98CFBBCA5FB6145D5900137ED19DC
+D002F10704AA680EC753C22E29AAB15712EF22AF73D80820A1EEE953463D4EA3
+81FAF99518D4FD0F862A324FC44C4B9542A92C5B60CC983CC8F647CE5BDB4D6D
+B92B380E0E5F7208A9CD91FA9A469548162C761C1BA05AC9D60B766764D821B6
+B4E17F56CE455F06EA1EE2D38FE47581746C4C5FBA63AEE2B58E877D1A8FA83A
+31C972D53B64E92EEEA147426A92CFBF76FC614119C6E9C6476FD6A069C803BF
+E949FBE50B5AB1F1463F9747E8D353F7BBD991C4F90F920BC9407D8E24720293
+846D052214E60390C3CB926D38C83AF697425D80C2B4FC4706615B905516B733
+46ACA325CEA68FB21B2D17CF0B68BA4DF249368625CF83441EDBF2B86C957C1E
+44CD722BD2537CE84FBA07EC7AE15C840041B9F7F3040072E6084CD55B301C08
+A64A53BD4D3DC30DCAC6C152F316ABC59B8EE978793EBD568849DCC2A75A495A
+BC83470D503F8E389F54B4A4A31624E83C601B43AC1E52CB811FAA7CA6B644A5
+1AE0BFD4FC774C9C9DFC2769ABFA9C83F900BE2DD4010416053A1D4874E6ECF4
+D86E44B4CAB15D53E5630C144B0C15B58DAAD785BA298B1893D1B09BA5D40344
+6678FD2D17FF6674433C976D6DAC659175CED26139967C9B2B9CFFD78FC2570A
+E5142141C2888DBF2DC8503F9137CE7CB21A1EBC2D65BF33FCEFBC85C9CB736E
+24E8595CE934AB032CC70BD6A3B0F3BDBFBBE185512FDB7BE3D4A6620478453E
+75D044BF770B44C9741E31985E6DAF5A318D7BED12B02A4BCFE60D25EF12843D
+EFC9BAE2A3F2EFAD66D7858E83EB46BB09D2FF8AE9C43844A7001C86ED97AF51
+C511E3A89A1BE349FF5215D1A57843EF51456B9838133846F19BE79AAA5C1AB0
+5F400E5E8E7B0BF96EFCA3B8F0894BE589F2C9FB6C97BD16D38F0A237CD4F034
+099C41F85C7E2C7BEC8E02C4F327306A53B4B48B26A8926670CEEF96F6DF2281
+7C2DAD99EF8B81BBB777227C2475AE7400DC393D9C0445E925DB1E955950F7AE
+53E9AC4306794239346A419F7B5DF4168382EF5956B81F83BD4BB7635B3BCC84
+7D84D05AEDC02D14675D777CD19B08124001A4F4EA96990D96000C082A12F00F
+7FEF793A7FA69D56D3A38D012168C5458B667190AFE80E02C816CAFF0A71953C
+D80B085CD286027E2FDBB05452AA762FD7C813B2E19A79C74190E04E746C4933
+CE1E300CAF5DD53B08110509BDA404EF07FA1BC5224BF1205DE8E0C3276A13DD
+866675103B960C5F36644F96B4FAC16F5D6E91F74629B318FCCC8E8CB13EB76B
+B0B7B90718D913A52A04732EA3667674994A325A7973C601A7DDD50F658E0826
+ACB8E53D4914B0274AED98D7BC3B2B7F9D48A7ECC2F8ABEE05CF2C4F2B90360B
+B7DF779EAF3E103D1D83EDBE32DDA873768D8C37DC10A5354A94B4153049AD64
+FF3E0BB51AB91D7C0B4134D8731CD0270DAAF19BED9EAD800A14B65B68EEE89B
+40DD624111670DDC7C030DEFE0D1B96420E249332445C155BA96231C88E70643
+D526BDF3CA1E05FEE72CE2B881CFC01ED780C10E89F0828AD55FE29043BC56E8
+2750A6DD15AADD54492F6092618F4CC6A31766B17FC60766D18C307EFC9BB787
+39047DAD6B38419EFBA46B4E2C932F97451FE78AD75FA90DE409FC6DD46585D2
+1941F5ED47A8FBAEF5A917A240959E8D9F9917DEA3247D9CAE6BF7A88DB4C4A4
+F9F5A6DCE542420A032FF3392FE0F3357B51F884D6181583A554F75B1DF192E9
+253CC828FF06B0D992D5316435980B044BB191508C7C45CD90F797F88856424B
+14A5707459C50EDCF3E3D8D1667AAA83015405354CE744C66D9A5728F29E0085
+6DBF740717FA0799E3BCC4ED7841588B496A5E549B953A7FD288B4A045DB611E
+E3B2F35963FF18ACCB1C968BEEA2CBF52B3999AAF89A05320BB2E97F52CFE06B
+9F10E3A79865A3059A957F97972D80ADF678A36E2B586C101FC6AFA4D137C13E
+EE7102C9B8EF78CB057F8B7476F146E8FF5C897FD5503DD198128CFF7B5FB339
+FAD0AF0EA967F77B07B367A4AC9F668F8BED99B98E87FAC750EE045602D76C3F
+289FC9D97694C96AAC0AD1BD3FA94DF2CBCEA24B40F47B9B59E54EECEE7AC4C3
+A3F5D19160E4C1EA830D57FBE10D8D46AC5CA0260F22FAA45236F0F542BEA9C5
+5A88F878F68B36114E0573900C65E305462B22A3429A17C7A567694414DDDA46
+5F30542B8FD4F00F6C295B2E8D3A986B953D96822DB2ECD48E8BB1763434E652
+152EF3717F5E7FA10FF0B01D9F64E22C5DBD7254629658887BACEC0ABDE972EE
+67299FB84A05B3EFE22B6976DB4CCA384232DDAE38C31623A4E39EA2E82C1EA3
+BBB68F1A7DBF405DEC37CB7203A895C36A44BD2D63F45B3888AF91D37B510A59
+3C921BB44DA620892AD87B665F69F6FA510B071ECC403CB2BE2F54B3969C9E88
+713244BC97C1466DA8216DA7600C221E7E7EF5C789D2E12B36422023A03E11BF
+2790FD6062FE6BF62F5010A92F0A104B76E255A0975E04F6F20F760881BDA7F5
+D834D1D328B6EC19AA7D5E5678A84C74C82553DBE8BB5765E84F5A8789032143
+6020940B4B8D45FC3433D356E28C25F42D0C19F911213D85951B2B00D01B77BB
+A4C72E964F9D95422BEDE582A05CD52E03D28A996E6CC8FCD910CBAB728073F9
+F9FAEED5470FFA55930447C5BA816F826F983D53EC9941EC8364B3060FD74C95
+26D4F5CA753B574FD2FA4D1D333785241D8741B79E628BC852FDC35478C5ED9A
+C1BE88C5EE7302816E65C12B58EA16FEDD4672EB3E24B6EDAD5DCE263BA8A970
+350B651E5A9F3C281D85BC3F44EADD0D93402E36489BA5185E7D388974B0B700
+70575188BB610CCA20F081E2CBDA13DCC6F72567962ADB342E02C1E763B673C5
+F7384E24C6E1730A3A790D690A2103AEF88E0C1D4480DC9B25E5C8C9E1919C95
+F83320179B4C7C4A26D559BFB24D7D596FB73758C9990C451E77FCDDD17763B8
+9C30A9534E3CB6680D3D419D4B70B0B0A0D160FCCDE169714E373F65B7144CC2
+DB9A44E041211E1517D3148E65A2486CBE5E74E625261CCF65392FB4F3091473
+F9E8DF327D59A58558E5C9F7190DB577D5DC658F5E36258291C708B3D224653D
+064BB6079F91293FC733710893AD1C96169B30CBFE4E9D52E7EFAE4AFEE68FEF
+1AFD5E7E9DFCE8DE332B0FDC0514F9B3090AC85BBFB527FD8034DD33E9576325
+A8769AE09AF1BA792447DDD932B98FC9486B39E0B04DDB3EFB7A30DA0940B33E
+E27490E0E841E87B1C90E5248A91742ABEDC10F43A8AF0F9C5B4A4930B1AADAF
+01874B9AC3B8D0DBECCDA6CD7E96471FAA15CB7F8A599C5746327CE392224C3C
+40BD60AF97BCA6FF6FCAB2FEA114D7300B89E91C3BC92D5B3E2C83BB37992D8C
+72F661EFD0AA034C738C019DFB79BF40651A1A34BC1EB9F5AAF58F8B3DA32645
+24AFF8636486F08BC21533B5FF7391B0679A78DFDCB03DAF6BB7475A1D51DAC1
+EE4BE9B986655D1FDB6936445EF99B58B303FE79F11275EEA96A9F6808EA8775
+D873D1052FAC93769789C700F20EB2ED6D15676F6E563A769CA9298E463FC311
+83281483B1C953370D196727A6A0E66D32D9480AB1B6DCA77868C1A2D5DB6483
+5F31EB6B18EEFEF1CDC31533E69B0AFC6B30FC9912DC89BAAEEADC30BE14F448
+1A6B70D36A5D9B01799BEEA686066114910842D022EB464A9A1E8F0A5628BA69
+AA9A1925CCADD44703BC67A89F3B48E4680726DC4360274185CF3C8AB747A8FC
+4B928AD62B092EFE48B01E33ED756DB696171FDB775396BBA138E056F71EDAE3
+7A1E4CC272B8418114B0E81DE0BC43DB3C133167344488820A92DF10FFA26FB9
+65FCA2C87D302E956DE6B4FE145145440C83DB43A68F8B29A592B127BDF49063
+B7F11E155CD4CAE305525BEA56B7C412A6260426407BD892A3F2B444AC3421E6
+FB6E6425EB5C3053C5644666B80405530FA0012B54557327C98E0F4F064099A6
+4ACAAFC1870359C1B6FBE7606BB8A26026AE20C212210449905E628AF1B20490
+8CE908B7EF3E3DB551C85AEB0F7FEB6A8D215B97998E5DD9C7CCFB2A9402B8B6
+1770D4023777D4B45A73F471355353412C51D4CE71FAD1E0AFBD87B5F86307F3
+10D0B94F1194EFFB64AD5DA54A4200490F609CA8B912E149F8217ABB1E9EBB3B
+C4470E7365CF5E1E761AA1945044B225BD53D142F6588C50E0644740F7DD55E4
+8F73201E5354A8BC78339211AFC4935F44701FBA043AAC4BA4698E9D7700029A
+C79F992F62627C91EB855F64C4B251718FDA71EDAF082A0C7B00550949D617A0
+7071FB14F05620CCF2180941341D8E60FC88823438FD728A4042AFA8B853107F
+852F631518B61B234565291B5D5B89DA818DEE3AE3B68A2869DFA63255CC882C
+3B16BBA08FCE3632E57FF7A07F857A1F0FDCADAB39D77960BD827CCC8661A997
+648BF5BEBC0FD2286C2A112A8DEB9CCB6330A049170D5D68EEEEA011D3EF3EBD
+855236B9380087CBBB6BE24191F728B7EAC5B50F7A547AA0989B7C7D3437DBCE
+1669341264E290646F2C8C5A3ACAAC7CB63DC692FAAE13E9B40E8BD39FE16A0C
+1660CE66872D061056C04DDDC265C024BEF8B7E3C3AEE76FE5C9702002C28BE0
+B180295EE00E567FA2E5CD1638226D24A7C732E1BD8103B476EF5702768689C7
+D4FCD47F2AB94A2B1FBAE6ABF87B09E7713C773FB65CA83F7318035B332B9F99
+24A2C8897527021321D003AAD7C273E4BFA2710B9BB26C2CFD3D9A5D7ED1096C
+552D50028AE2476FCD6D12A5D0A897521313ED1A3A8456A70C16EAA50A3E6733
+6DC89FEC56AB54A579EF264377A103939D5EE00A90B4F2206D0023AF9491FBE0
+800C6540FC945199E20E945F46CEEA2E885F6800B9DF042BCEF4291A4B1A62C8
+6A7ACFF872B25FA3AE69E0093F3D0FF13A3313430C06F1AF94D500431566F659
+E8C859A5F80F5BD2E85C8E32603D3745628E8FE6FBC50FA68F9C3811A2BEFEA4
+5852CAE2AE5AAD3230ED050593BAD0A9581EB7B327C6916B8FC348F4C23E6FA2
+00FA28AAACCB3091C1D83F7BB88672A53A2EA3B8C7C24374E400C57F0F01019F
+E52D5C47F389D4C9AF126F4080F9AB8D1C8F470932BBECCEC72A9796F6E965A4
+82057DDB43D68298A00880D4C2E2496F26F015FD83C5549215753459310339B7
+6B2961EEEE74DA31FEC8E2BDDA42D4080A32372AC372524BDDA580EF6634ACE3
+128C69D04D890DCA337212B109585C665AA83EFE47D5BABC2627A86EAD11BF7D
+744176652C7F9497785A7A06A994ED8414BBE8B26E74D48CB83FA24AAFBDD507
+84A90195EA3D77BCE8C2BEDDD1DC52E8164DF15D65B916EBDF3A8A76849653DF
+AE3CAF9561AF3B705F75B9E5DFD6758DB65A2FD54683759912E0D0035CFBCD86
+5D2579DAAEE12528C23ED8A1A2F34CAD1CE8BA67D0B660E9281F247EC10F816B
+FBD6B9E8AAAA1DFCC4C9FF1C6AD05C0D776DBF675838C2629826D5337EED815F
+4268604A4EED01A2C7842FCAED2E37F7F39F980866DC5BCACA8616749FFE946C
+A0AB0475DA734C00D99912C544BD31F8A69367D068F0A18EE79FBD4D5385B8C1
+DEB92502ACB3B657A54C9BF786D7DC1ACABDF29591D77ACE1D4FE00E935D2858
+3733656C79DD1C174C26DD97D462B4323F33B410DEB64244095927C572FA90C6
+4C8B709C5B7E4386AEB936C2656B59AAFB74F9E40E680D890903458CB1B2AB8E
+6E629F88B51546877F7799B99DECDC13638E2765343988DE2ED33279DEC3FF0E
+2255A734F5925608991F068274CB1E5301C5B8623C5878851857B3E665490A7F
+FCE5A8DC0FFCF3D56BF55E4AB2ACC6743F52B59C1343A1C25BD46A6A3722957E
+24A6F4B970A594F67A09BADB6A7B4BEAD3FF97D0734470750FCE29807D315EFE
+F93BE16F39C0B59D107D1834FDDFD520D8A429FCDCA408C79DEB580081191B43
+20650B5375AECFC2DC500E3CA934AFA3D241FE7988892CEA42C8677DE18C43FA
+C3094F8DCB1D070DE0D32B69E2E1ECB4A82AD9E38D889D05418DF4E3C398FEA7
+BFE9B364A389B13BE713F5B2553ACD16C14AAE521B63E8A7DD0258EFFB95646C
+18226B01D916D41DDB322F6E83C3E3717FC113BF7D7AFDA2CC03B8175BD7DCD2
+AEC82FB156E051F2D87B9F12F81E1F43E822EE27219758B3E237AD772E7B1DB0
+19ABCE7BE6A2FC3C7DA0766FB82CEDBAFC19F7EB19C7448C1719C88FE99BCB73
+F7DEA427FBFCDF4F00E0FDACD080AF068F7A1CDE18315BD694C60B1DC71DAF1D
+1009AFC847156F96D9CD38A764D0EA70E5E9B6E19A2A0B80ECBB84CA44C137F1
+4925EF5766F00C22F967F9F68D7637DF0982785DABB8684A5525C6D23DB05B31
+026B49433392C8930BD9661B23C2EC0E0BC4F00FFB2587943DFDB4C6864CF1FC
+7152CC20860754204B7D4536F3C11460CD2626DEE88BBFE1CAFB5E62C9BA0C8D
+514629E5A25C4FDEDF56FA2CFEE1A648E78803062DAA41E3D2CA4400C74C3C33
+B77692A278BCC9B4E4512CFE8D71D53750ED0F7BBBC811EDDDAE0E7049BD916F
+8D1819A0AEF50E284BCE7CD48517DACB587D2C48AA89062A791DBA7549C22C0D
+2B14B2FFB48A05CEFA73D1F81BECD4BE921AEF860B30CC1FEFA6199BB39A8156
+1AC9CE55140BD9EFB3B2BCF6FB6645816F11C172C525D9E623FE2041BE9D41C1
+A3338195A24873E110DE875B1E4FFD5CA3CC44FF36163C867855620EA60319B2
+27A40368957F81B38F6346C45EEF35636B01923E356F2F4279001DF3FF52BA26
+B0C523895515658EE61DCD016A839A71ACB5645B4CEF3035843545920F7F6624
+B414350819CFBED577BEC9CAF1465EA75DFD39318F02ABF8697621325964DD46
+E8206C04B7C5285DDC91EDBB7F76DF9C9448A778F4D62307B2F042B169053544
+B3B19D36FF290B4BD1B807749BBF6077BA682539E07B846C9BEE668BC5DC5DEF
+CFAC349ECCA59B1A46CF89F2C410C648AB50B63BC616BA3D448B1A08A2C10BB2
+CA96A7BB2A498E7F00CFFFAC03C1BFFBA166D4948593ACEFB6E1E6D586D24F58
+43A02C59ADDAAC725D06E4C4EC1E1F5B2203289908605D950551C23A71E12403
+A443576CA8BF7C365ED9ED2AC7FA6B17A786DFD3731967B43B8715028241DA09
+934CD93AFE81013D9642DFBA66EA1C024FC804ED884088FA398F065F2AF53163
+6ABC66A18AB971A7B494B6EE78A12FEF18EAB42529A1296D054ACA5BF2C386B3
+5DC802B67E362B2FC35633487F2C0FC90333508BA50DCA2EBEE2FB939910E7EC
+128B7A7AA0F7A7CA91AF854AD2505F5DA70889940C4945BE229F6C2ECD1A8D5A
+B35F475DA0D33125009C6C3E7730DACFCF279EDC74DFC88630342D1D81315AEF
+884EABB7E785653BA2463C48708ECE70A49503575048CC768BB8F13FAECE7FCF
+29FAE1045C5C6E475E634DA1A2128A0D16487BF3D62BBAAFF6ABE72FF971C361
+E5B530D6C6977137319321BFDB6A526B7AEA07EB6548F6FACAD54C426D3E5207
+0443CA8ED660D368BF42FA1107A9503F5FCC4EB8D4C7D2CE580597E4A84EEA31
+135D139540C7D5B0AAE65FFE3475C1F2DA4318DB4204677B4C30652DA10155F9
+C1CEE50DA12BF2F08521A17641A2F5541EC84195149392FB34E900EE8C130A72
+A06E8D5C1C3012486BCBE6F82A8570054C243ADAB55F1BD0A2AC1D73029F6E0A
+91230FC5BD62E7C8179271886FE2A3D0A4D55D26A953064E16B99189D714CE51
+6C1ED25B47BBBF5494E1C788038B82BFD0D6CE9DB60E49EAF500DF9ED431BE3B
+5C5E93A14078C7962DCCF2A34966BC16EC17989C10D2C74FE0DC9306CEB61DF8
+A42FB761999A3EB75E31431F568CDEB0A3CC8C5FB6B76B8768086F20D284D302
+A144E5CDDB303676D612FE7D749FAF7E0EEBA5D5FF48E3CBBE5046131A8A00DB
+21F4A2C8788781CC2D3ED96148B7C77CAA7278CC32284B2BC83BBF542172F186
+677F635F73216E1D41D2CA802498C469234B79AF35BE521DF9E633293B1BAFDD
+3A0B043626E3CB0EE9072FE09F90B8ABAB28F60C42CD3F2323B7BA4E4F9FF6C9
+BEB3D0E12B74799E2321A65B88840470446AFB66E7B9FD92638947923F8942B8
+B9182715510969377DE1362216F2EF6B96D4622ABE65EBBC5F7FC397B50DF682
+07EEB73A649383B86EB255B9145916EE2E8C326052ECDE0EB367DCB62F7F88B3
+6F9F23853CF377EDF5F4B1F0A6DF99EF29F21452D2628A40F589BBA831118DA9
+DDF19BB85E5AF7D79F5DB4015D90F3AF189E7D5E9E3585B9D444218B889366E5
+7B4B8EB34F4106ED4E54EF08F08581EB40A5B49E214A86251FEB131BCB071406
+B322E962F9B14AEBD38747B44F976B30B184AD7667EB5AE3EBA6744D6C8422D8
+F4CB40C3216799F46067651DD21F6F763A59E93B9A67484E6CF9EEE3913B6687
+BFE8E68087D287651AA7666BA83B0D271A422E3F0FE0C2942AFA64F71B8237F5
+31C7F7D6E5D4903D3CA32C77781BD8C959FD6DD1BE80C113B59B39F1941E8770
+BF7F8B7139ADF77E2CCADFD99E2A87A5C10802D2D6CE3D9A3830378BE37D8903
+B87B38EF25C49FE93C797FEF7114D4BE3A58555F701CE4D8BC2605CEA9725E08
+B2460459E5A4CE44793FDF3C212A6B5909B49A4ECA55F53AA3B9AF63A2DDD339
+9023D61FF6C29721EF2B49C89320372059FA33F25CF6BC7F64E3B4EC7D7527F9
+62A8FE056259BFC788F24506F8F6E9777B693AA26F646A22F3ABA85A6FEE1B41
+373D90C3CB55A474A2E5EF80A129F5628CD064B590DEEE7935DE9AF5D68C622C
+814452DB304B52DEF5C9490B1366BA1834AC5B27DFF17CAA5722CF783AC8283D
+B84A3DD19587B204EF584499E78DB2222DCCD50847959B4820CCDC092F88693E
+50B9DA33FFEE72C235520F58332A3725BF62BEB005D36FD3CD1B2310B2982A34
+A095ACF013BB5C340A21B4537A7BDCD5161377A4818CC44D8A15BE7CACC03D33
+11CDF7811E0CF02F6F3213D3B598713F2EDE54E6857A526879C920D085A01997
+8DA06915850E5402A4444AABCB08881EDCA2DD068E1455BF9A155C54EF315FAA
+279D726F57FC86300BC4D9DFCD4D44EDFDDD4B00DE34948028C7A9255B931CC2
+77A0FF40F7ABEC709B67C6EADAD9D24B014DEB4C342E5F37E1CA26A1999CFDAF
+50D8E76F1715FA8EF095B88D9A8DF4325572B26753F763F264DA8887E4E5845E
+2A01F86149EBDD9CFC21CF2852CE95386DBB1E4DAA2113AA1E0C53746A3AA5F5
+78570500FB89E376549E282E2AE990E72C0E77F701FCC977868ED3FBB7C9CCCF
+CD28795A80AE8787EF1D0C374297819A324504623E12688B08E4782B18F05C75
+2E2CD594D0E6C10B002AD61CE491D4B95244E83DB861E36D293C0F556B295FBB
+8F045711CD606D024F0F03603629F3BD495183E821D0A1ACD83F3376B62D278A
+FFD084EF020A119836EB60D0F8A059BAD8D8CCE26A37182E7C89CFC2AB80C724
+275E921332ACC5A6991B36A2C7828B632DDDAF04780086F84E1A122461719992
+061E3F597C8E6DD8ECE708251DE0DED5DAF913AD4130ED89DD271B17C556F466
+A2587876F7954A9888751460B468313DDD88F267BE6C5FEA492A6CF1365AB8B0
+D8E872A625799B9BE1859AEFAD98B6F41AE33D0CC069BD36333819995FD9B510
+715BC8AC70443A107EB2E34809771DF24D3AC09D47768D3202D809B023FABA7D
+C6B8CACBEEC4B47082177995C3C00D08446DA56D527D8857E5D3342EC3C42DFA
+7E35C992B8C2A50E7374FE57092086613D5A3B4567A9DA3758F48E6817CA3C2D
+BC552BF4A17E92DFB106E74A2C53DBEA13481DFB9EB64422F5CE073512B67018
+46E902A52D5AC8A943C93B1921ACBA76D6DD2DE9077C280E1E6E43ABB9DD11AF
+E065D8EB102BB53A37F6B491EE341CC8D4D3AE311F122A28F7FC5481CC80E119
+EC3E67AEAC772AB31D41151AD51B88122325456163D1E84EFBC5CB9A55BC4C15
+7A2D56ABC55E61A49311ECB2C3267F7EAA3C284A0135985EB5E2D4113BDB8433
+123A4A4109F6926D9C38D502B5659AF97969C3160BA5E6E32B95AD5D6855D307
+89BDDE727683B2F05D6D9E74813CAF8038C03C574183CA79025D33FEBD68811E
+1A3B42236EE1CF60614237538CB2C9567612DE1DAB1C864828B9604A5D4A52DF
+D5012F80352DB0AF93758E8DD4ACEC077160D74FC723F6878B2556690E9ACC91
+5B552329E06B87A06E733270BE98C16A30CAE3A798CA80E7A9C3B8733A9428DE
+0F4DAFA656E6D01470FA746BB58E686846C29933F9A48932E6AD3A20C7A0FA91
+AA45745AF05ABC50D77498AF81E72D0DBF7D6FAF97E5538673C57A6EE39776EE
+06BFD30F67A57AC796036A5394DC9A8C75556144497637C28F3C56DBFB21595A
+D2A46D6C4A0B63508A238B97ACB24499AB5540851B86E273B7B2DED24B458DB1
+5280B3F9040C08672F7DFDC4B69C54B92EE3555902BF55D64CFC95A9DD143C18
+FEEDB1BEA96762AECDA9DEE705AF2DD54C619328B9A26D019984DEC1EE34F30E
+CA4EBD5A4AB2C8547C0EB264D47943AF93E281A9E346B6346B809363CD7D67D9
+9A8D6A2B1C109C8F226BE11C405F18E0197A47E44B57C1CBC8CAB957A2F60771
+CF8DAD0E361FF6891CACF5672997B0357F9A5D16D424F2B32A0256210106B3B8
+160B3CF0FB7D28A84FA861B0210F383466B6E69DA79B59D95AA05D608DAE9D56
+7A05E3CBBDFA558C8F3A5D5AD9F70AD60FF059AD26041DE8819EDB2746DAB76A
+6600D7C708F08D266FE22609BA7462A9378E691E175230E4D4CF6F1FB40BBCE0
+31E34EE09023FB7BEB557267986637DD5D9C70E38C14E485BB6CDFE0826F9DFF
+F5094AABB6719C11474BD877358C603FE16B3A26B8C3CA026E6B29B1868F2AD6
+2960CF99DE7E16B18D3480F52585F39D0B45574D4A0008BCD49C3F2B27930B25
+3117251BB7116A23C586F7B0706F7F2BB00611C4FA705CC11783E6A1D868E1E4
+5685B46356200BACD8C9851AC613169CDF40BBF1B400E21137D00EBA1E782E97
+BD6972E405ECD84202049433393B3C283D44AF4C3BDB3D1B700F43AB576B4C7A
+195500FEE676D1DE97C32859987267428884E4E58C2D8FB367810741B0FB7D37
+4F185ECAE1AF834069503E8014FA13225152CBEDD5A1CB8895DE03E1B1704892
+23D2C13F5EE53AD95EBE5C0AE07FE2DD36209897001FF645DB1276FDA49951B2
+D319D63FB045B477BE528C3667F0CCB6853E0D31C77ACFBED46251BFD60C1321
+D0FD450193208958E91C05E9518F3E2FB9D4B6AFD5084ED2C13DC3E59F85C853
+10AB3B7706863D6056954E6E89A23D22FF9D3A868C7A47FAA92C95A5BCAAD7DA
+0D145FDAEC7EF719C077D8FFB191CFE21E87736A98965A4A4AB2447B607D02AE
+8995550F0BCEFA8BAB7A197C053F69BBA12CB7C01976219DFC6D2A49D415EFFA
+66F17762549A09F43FFEC19B4A6CEE65A6903702F1750B263C342E5CD8D26F9B
+363D9AF452BBB2B0D5551D412872AC8F781630B293FA0B96FF49893200BDC53E
+32CAEA43D4AC2D01FB9212277ADB59C864CED023A8C30665A2BFD059A1031D86
+6410CF5A2716F0927A8F9213C73681278B8EC121E0AC73D46A704D6B28D7B003
+FD075F4455CABF65FE19A91768983B2B3FCD40AA0194EDEF3C94C06D2787F469
+BB045AF387183D001E980E05859D316821023CBC205C505B11DA011D784B7F3A
+C47E20AD8F87E499D7D77EF84C75093BC67969E7CA8714F55D7945F799D6A640
+E6F00FCFE28DE659F36F947324DFF4E79AEFB61EF14ACB3FC078873A17FCB5E1
+D3C40C11B5A4327CF96E07F5CA9D62127553EE94BF3C148D9EB83353E9DBFDFD
+FF9FACBDC8AED20340D2FCA6F3866DF72EE9CC880E4069DAAA2BA5A845DE7FB6
+CF7E686BC5CE9A4B6D37890D902CB7641033A7C1B7F974828F4FC8AF251F7985
+E576958972852E144094C10EDA802DEE259F7437CD26A1C9094F87ED0697D713
+94BF9E15347EF558B9D40243DDD348C7FDC96A1FB6D362BD9D955BAE3F6A2353
+84D89A27BB4DABE3CB58A9334971E39215DE41B4DA77FFD32B088EDE2E23A26B
+59273A7DC587D70CCDF43BC64BC3CB11B6EF90042B8193C0C4E66D9C7BC7F459
+F8FFA1D733503659A2C2BA42C0A1E262D15E97A55E97D746455266507B4B2913
+EAB47632D372206F3F1CA23939A281F2CDF5E2DFF06B94560879BE2080E2CBE7
+DC93A7869391B1F44A4466B38B2A4A8A8F8774D76B8F2449435B525F2651791D
+890D1078533B845F34713FC87A34153D1175B40B7A46F2C228C6405E4652E635
+D9DC320111AB934184B34B30A946D74D30894AA99769BCD213FA3494F8C998D9
+BE4501663B8CA4441C8A7A0314BE23D451D19E1ED15831DBB29180E023A989ED
+4A4C4C92C65637A9DEB914179A4D3735CABEC726E9F431367994E32CA1C83541
+ECCB0D463DB8A0316213A3356D7C654F9F5A4C57260485D0FE8ACFB6FA759A74
+BC1C53F32A147A9F0B2264AA8CAC642D6D932E462D76F113ED2BE639DC67F8E9
+7CEDAC5FC2ED44E4AF3ABB083F3D103378B784E9B0D88DDC98160629B0731AFD
+1502AA443FFF69071A8C6E6EA0A309893DF57E550C270B7BA271234BC69DB3DE
+7D7A87D9A8450596960F05942E390BD546A9C10501057B96009548EAA8FA3DD9
+DE5BACF5AEDAEABC2998F34BB48497E022CF71C4260537F19A7D38679558E405
+EEB015B7BDB6092553644D28857CF4FA28E18040C3E6B8DB88289CFB10FD86E1
+99D4DAF86714EFA28E61FBB3010CCFB8EFD7C9B6E2B759F276616DDA9F90335A
+388DDAC61C577A057434F28CCFB339902BE256D21F4D52DCD450AA5B747D7471
+8098E4B634907BE1DAAA43FFAB7E4AA8705E76E9ED086CAF7D73375E7EC6626C
+FCAE8CE2AB754C256B795BE48428076BF67D614F3FB28AF32DFCD73F17B13E2B
+B127E86C5726769BA5A5D2045B839E4FB5D382E93851E839D2C0FF5824B72C84
+D1C96EE48AFC44DBE54E1844BF709BD50C0E1D456EF920662D905C823C912A13
+018EC340C0F4B508F7D8AEAF895AC0CEE8B15A2620DEAF8B4CDCCDCBF40D626E
+43CB4C280366C106F7951D505973018D307D9858D32E7360183E68C226060B32
+A342BF4CFFDE1AD9B5111CB80734C1E625343148FF2870D1D87DC70E9264E9E9
+BA20D962DA30CB7A2755B510F86899FE1430E46E76672E30A1CED0AAAD9E983D
+4E3911BB537D48A168F7B3BD46592FD4B07B9CE043BE9DE2148BE10BF8C30C68
+76B76138AB34805C6D8B6454E3D5A830407A51B9E1A71DB17668E7A94BB150E7
+BEAC13AE7363DEE94E696FEC3627958DC530490FEE0DBDA1ADA7F00848D3C3EA
+683757DCB8AFEEA2C95B7B27D8EEC5956AF8E26BC8CFF14DD8A2E6A638C5D6CF
+E128C7F8BB3A3F27EC922041E857CB68CA824DE6DBC56F68CBD131AAEBD6B0BF
+4189A1AFA1108BC42C2697B3C24AD8587EFF5C8B46A995CD881ED98523FC98CA
+6A123D37FC9D79F0E9A6E6D9E783D8826A0A07A9EFCD563286710FA3CA4EF170
+1B42B440BEF8ABA94FCCF86F0BA118F36F80F6BFFEA5D13CE0FF328CF428D437
+EA9076A01A151C0D6CA5A7B8410815A88DD92BBD2A27EF160F39CAA7E0A27549
+EE8E1B301374028A8C30504461A0CE8CF9D1AF3BC27182E4FCADBE153FC3BDCE
+04B9EF6B6C383FCEEA6DD9D51CFC360A9DDA8F18F28175B3AC453E4387D9CF90
+28B44827AEB043F2971C0E6C852882734C9B790DF14ADD37A55E807068431ACE
+0BC67F4D03FBB3C611004D0C1E1B9D5CA572191A13820DE990F029E1EC07866B
+9307D5B77304C9AA9D987D8E2CB1C302F4EBE5AE1A18EBE36901C6D94A3B4D48
+F31301459C87955B6C24F48A98BE883BFBF526DB1DBFAD1D6B23F29E6C32B3C0
+CC56550FB658455B8E3F2A76BCF1EBC9F6AAA1200C428465A22FC1C748CA45D2
+7427F87D506B90D3C676AD753DDAE196464C9672614D1FC43F0DB91DD9A00B4E
+9D8E31DFADEF3AB6518EA1C7BD9BE20AC8C66D0B1CE9737C338E02794640F7F4
+F1F2E04CA39971AEBC9FB699ECA8F07569C8AD9833E69DD9EBAF42376BEA1961
+9D3312A8620A66BC68607C0B7D723DEF61764B7CA43EBA27ABA5B0F518F40B01
+E713AED7BA6E23BA5D866E10638DA78B9BFA68757921C9E766603F884C18E76F
+848CE800A1A1E6FADA9E1BC717AF098446AF80924915D0AB86F4A3615D4FD49A
+A5A844530155E047DF9A6F878677C12391DC8FEE91C90709E3D06F31D10952A6
+5B0D30556D0AA5F59DA5637BB280842DF8720816D67F465B48A063BD606B536D
+760A402075ABBD70940DFB7EDA04B55B5E36D2B512A6D01E7E97FC90D708EAB6
+0F9A77ADCAD63063C5837DDDF800A4D407601B15895E83B58359821426E93994
+019B73A5FD9661550718CC3B2F79E9A6A0E7C4984EC1426C0B8EB86DDEAB3FCD
+D1B467FF32005EDABE59166D2E0564CCD1AF482301D2BFAF138F88E2FEC6AC7F
+060555D402304EDECAD793EF9F779F6AC52B1AF86D714F5CDF3C574592E8C742
+23204EC2C4C226968B8633554349A2C0A987E2812B8CA402A0A1BC7A16D452A5
+76083FA380D36F227828DF913C468AC69C435B2341A590AEE61A44B1A00D5409
+B836D6BD6670D5C02A614241941EFF04BB09366E4CCE644F8A3D2CAD5BF9E445
+BA296EF46392ECA30976FC566CCD4354D124DA25D9708578214DA5582122D8F6
+8EACCEA4CA8F63F15CAB59FDF29AEA5B4480023D6A61878B43B0F9CF1F4C6792
+C9B0726B1D5162E665CE4F89BD724CA7B957DDF865F6833BDA3736310595F2A8
+58182EFCF9911455FC934CEBD36C3D6E258D948AB4E28D225BAE6C73D7F96E9B
+EE7BB7FB24CFE23558DB7050113CF8FAAF62E6DF1B05064FA99C2016537F4A60
+0C80147EBBB95DBFD8A03B125C464E5917AE0F11D293CB75C8FF18322D788FF9
+61593E2CF4FFBDD2A1169A37CD3483C3125A9669231592B85D80FFC5FAABBB79
+3E7F46EA5B3F67B0B5802642CC139D752C8A9FC6687CD6380192BBE2864AD792
+F84A826F9052A4970DE4725B125874C162F00453A685A329867D237E3FF253B4
+0B05384E0452602C3F021E47F5B2D680A5D120B7A7F4E261B1598DA4B55B3AA3
+BE47D2C7FB46780153B3A7E124BEEBF25BA598021BF943DDDC3CAC5CC661FCD7
+F78EAB069BDD1531684BADB59CB3DAA544A7F38429104399FFD147B2973E02BA
+5D7C964A69650D9C5B1C3806A9B0F33478B9B2D8CB730D4E28BDF9C35A0E015E
+AEE3110714E6E09D51A47EBE4DD5C1A4A7E608B0C5233B85426B1696C88E4A1C
+56210C41D7B778DFDAC0708EEEA185E37CEFDE917728E9E2BC9ACE85CEBFF12F
+702AE7B7D0288FD933ADDC3AC849D7352613C41BA4A7988A08D24DDF178E3C48
+1C7D348E7F5D67A764FDFBF5FB9A20195F4C806ACB59A47F334CE16B5CE3B8AC
+FC951D49170D29B662A7A6EBEC46EBA01C96E85F8A4559CBC60D675EB6E1D7B3
+84C917104B318B9AD8CBAF12CFA478590690265DDB43198C7B7C1C6D5A23DB30
+11C1D6AE610ABB2985CB9D00B91860963C316BC83B9F2747AA99CF8EC08CF47C
+D599CCA471FBD4C2059F8EF134050CC6247E9E56FD480E9B93DC083B0F16D673
+7E0A1096C30E9B8B0501BB25516B18471413428F50217BC2EDFD22EC1135D121
+DA739DCD4AB3AFDE2AB9407887D1F23CC5778C90D5C32BAA41A094968BB78F81
+FE42DB18820C03641895AF1D998B2A0C5C1543FDF91D6562A7D63C136C47AD42
+C1B04F7A70393CE6D13D313B63967BBA42F356AFDC81851BA94ACEA54ECAF0AD
+8B6D4BC392CD8B4C71CBCD1B31A4FFC431970C88ED7D003EA9964F8829FA69C8
+D7BB49B7AE6571ACC901BAECF22D72CF86CE1AC1D831FC5FB5E6FBAF959CDC2D
+900A773752D320C730E4A8D8612CDABAB22B6FE49DCA590A05861E2421541766
+3230671D0722C743024A8D143E3CA1DC3658F10B9779F4BB5859BBA03E03EA43
+68F9B65C04CD618BF61F0110EFF9DAC63DD889230010AFB6EADC13371A34D3A7
+CF3879D64242EB295ACFE2A2A7AA7D5919EBA50C38462BD9AC72160A24CAAA4D
+F467AF4A4102D2C291E4B80543BC7D72AAF725BE15A1CD8499ECF99B73105E15
+53F2E4FCBFE1200A418A2207BF2F9D9BCDDDB62500F8394AA90E615D06A805EF
+BA1006E2C3638FF8AF1D67D3A02F3E5185394D4D83A8E0502759A14F38DB9523
+1059BF230DFA29CF3020F2380406A8DBCABC40B50833E5E5253B524E2A4DE292
+49117835FBA70CC6B1A7E662B1FF2A5C96AA9CBCBBA454A623CBD4FB0FE35578
+3DC8B468AB579AA8D154035EB6F30F961412B5AFE7074F18AB9019AD2E600DCE
+5C8376340B88DDFADCB4B1C46D4F63BBFA3631E11BA5DF550A4381B3DD1F1D11
+F47DF28562E706A080E38B2E61E03603694816D50D9AE19079228882B70AB605
+D5D4836F29B382A61683318A3442770BB18BC376EBC07BBDE01ECA8677702913
+2688777C8CB4E87B6692E5E86A54A220F927C3CBF885A78960D307B572F57650
+8D817DFB1124BDF3803A828D64EEE5EDC69D3568EF04D2D8C0285568817FA562
+08FDB68E1C0B822668CB706C3700BF0C30D72D048B943D50B00889A33003B446
+DD7F3E4B35F257B0537E91ED175FB3A32895457989C018A71A1023E096B539FF
+1B09C66F77EF13F874F16E6F7D5BFD6EFF37202730AE5231A29B4F91B868C93B
+CB3D9F38159EB9CCA2E1B3CBF296E27005DF9884F71C733BD4EE3F144D37E20A
+65262030DA75AF8151F141693F97E380C5733B92A5615351E506925301308872
+09EAC5535D6185652AED2621F4E0D3224128620FB6D9D0B99C3D31B3E20F980A
+A43A22BDCF8A2779BE4744B76E908354589E1D69A7691884319FDF889A288E89
+696E5FEFA1350410F0411CC4B1FA2E4A767A662606978716754FD44FD7161DD6
+7CAEA2734F499316BAF6E665DD6C85980CEC818542DC7460B336097E25C47AAB
+F26FC408465B034EC7173FC10CC7FCE36A9D74786BF2007D0EA403D3F8E90FB9
+852B4D1400ED16A4B945C3426617EF47A8118551D0CF6B5E95C525FB8A896FF7
+FD7FABA141B597D27499B7D7D97712248CF0DF7976BED02A5D564D59B23F4B18
+9F13FB0DC17334A496FE3C2C84F4CFEEC9F89B14A7482AB324DFB201B6B72295
+98EFBE2C8A5A58FB4EEF33F4888773533A9D5D73732662192B72A1D5102E2F5E
+247C9282EAF1705B5E96C9EDC36111AD5FC2E1FCC606DB766775AF00834B2631
+AB76888E6FF3CD6BA444C804770463EF3F5014DB69D860EE563CBA238F8DC2ED
+3B5948A27A0D02033850B4B49E15EFD202B0B3ECE75C407F0843FD84D070344E
+01D1462A8F7CD73954D75D7CFE22A8F4B69185A3B3081C1D113D9B2FDA91AB0A
+5D3FADD335B480F61C6A5C25496F3FAD35449A156A23CCC9C3D5BFF5F1C1D243
+607E05B2F81999337A57A673026E7716ABD0395134BE23DC11484F898D9DC7E9
+68CBA68E60DD836462767ADBCAB8F3353778FA7B976E01458064B51B5D2F2B53
+4E26AA1EB608D072089F858B1C7A7E1C217C8872E44CC5AABC5DE83E10C3986F
+E5A484B2EF6D8B05F70C499BAF6054C05C10C1D45C8FEF8D493968F065EC4161
+B8B04F8588F208C4902D37520724B2CB0299D8120D11B836F8B301229BC57CE8
+3DE15D7DD8D829BA7A7F3E39885771A4469E5E4390A60C295926AB828CD91058
+93832AC0A6BDC8A6B7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMSLTT10
+%!PS-AdobeFont-1.0: CMSLTT10 003.002
+%%Title: CMSLTT10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSLTT10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMSLTT10 known{/CMSLTT10 findfont dup/UniqueID known{dup
+/UniqueID get 5000800 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMSLTT10 def
+/FontBBox {-20 -233 617 696 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSLTT10.) readonly def
+/FullName (CMSLTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch true def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 39 /quoteright put
+dup 45 /hyphen put
+dup 48 /zero put
+dup 49 /one put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 72 /H put
+dup 74 /J put
+dup 76 /L put
+dup 77 /M put
+dup 92 /backslash put
+dup 95 /underscore put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE33C33655F6FF751F340A8D6C01E3
+2E02C24E186BA91B34A1F538959D4450CB683EAE5B034D030186901B458D3777
+6B3942BD2E07121385120248891AEC2EB33C4E3A0CF00828D0F130C31A918C18
+979FE94379C648EF21ABF659253E43CD1253866F157F1DF85AE7E8714F061B1E
+ABA3AD094FE8D6293916FA82EE4F486C7E513A06D4C9BE44306A8287970B4ABF
+B6D1F9274A5A0BB6ECF713ADBD1260D5D6C4420D357FD486470A74B2F0621B59
+A9373ABECDBF32FA68AABB66FAB0C970A3354A335FEDDA1C288245E6C890B8DA
+3D0EB953283ABFE372221EEB1586B0167F634E3F29CADCAB484B81A243CE1E3F
+D5106AD6BDB1AEC91123377F816711CB9D5140120FEA84B8205B79D1569509FC
+6B671211985CEF51691C45A168740BD826464B2CB0ABC575E7D453161328F80F
+3AF1C99EC219010EC6C95E0A8D1909719CF18BE424967E90DF67537220E60C3C
+4345B154D08F9EA684710E659DFFB0BA1B7FDDCD519305900A5E1CDA219A6C90
+DF8BD712A3686DAB90344E8784C7A9AF3318550285039B701B9FA1D3A3C3B6C2
+753F1E794A3463A173C99A9EC0E2AB5737134CEC2C97CD6A37E38692ADB4B131
+54697B7BBBB23680C72CE96066D8007B90AF0FC5958232AB4F21826691E9874D
+107F47DAC1026298D787989BD77CB43A09FC95F6997DB00D8483AE9C2716CBD3
+7CDF02DA34FDA2F0754ED0968270E118DDD8BAAAA65C41D699E2BCC2556AA231
+328187D2F50FD518CF458B0BA1F7DBAF4B231CFD61D5DC56335B53C3013BCCC9
+85690E19E992ACE55EEF2BA7A75DEE6DC33933C226FC1494269B7CA4CBAE987C
+2C787386400172AE3F44AE47115F4117EED866713BDDCA4A7AF658C49F913CB7
+308635000043F63BA210410A66E192289592882C477B2EEA0B2A339F0E7CF450
+CA0EF79D3A6C28598825CA03FD688DA60C95EF707C6E67CB7E57DE7A80545195
+739ACBDF27069F34C9E0216C3D17CFE7A652B910FCC9B9AECC2E646809C22D93
+FAFAD465DE794755AFF5BEC17160C9563B5C51D07022E2D3A256FB5CACE131D6
+F4B30F591A0419D957D8F0DCAA0A8D65A8D83422AD7C2613FF13A302E152B312
+3F1ABB45E42084EAC894FE335C07324849C9736D00C872C4551997DB889AF17A
+A52C5AA77DEB548B0103B77F65717F70B90C1BBAEA7BCB4959F32851A9882A3F
+55673F24103D6BF7FB3AD3EC3CC50FD8FBB4A6B13C3D278174320713A7B327CC
+A71F01E50840B33D0FC3F5F6A6F2B0F2D0E38494B1C73096A430510F927235FB
+69E931DA8CE5415EE88D0248565E3347353621A48F7948AC9EAB5F5057541B50
+82BA955D90BBC82E582FD71904445A59186022FB928015235B60830DA59813D0
+8DA3FC306C43FF8BB2CB6772B1F7BA3C1AA4B2343E7DA7E065EA53A4E5E28DC8
+0790F2D5CFB203CB135A08DCC9702B59A63290444F202756E55B9FB053F773D6
+0F69C63E74DE593E49186FF4304E8FA76C3E3006358DE549E946DB69431981E8
+1261C9C9A884E4EC708F69E6AF5D22C5BAC49F2AE85903E3D48D03B7B97054F1
+D2937A0C685D912D6D20A75A77712164DCBF8FE4D5460DACE139C5A934EEA09F
+B94DBF168A4BC03A9D689936D833018FF43837DF9519AD10F357F00BC068E737
+170FC9FC6715165F733A0B6FADB9ABB48B845167DBE6D771C916577FC2132863
+767DC6E3D460E779254194AA690983184D934F5E858C1176B3862B69B42EBE7D
+EC9AC4E020085D474093F7694C8A8C2025D4B0163E29320C384D62A9F3FBCB1F
+AB5A374EF3DBA48AC2147A207AEFE8B78BECEBC55C97B538F3A0FF4589D171E3
+826342C8A5186224FEE54E4C6AD5EB02BCB4088B132FA1A48362824BEF161235
+8E661DCFDFD8429C65CCEF63902D0E07C2FEC1DC2756D942F13FECCB7E8A8048
+345338F24B7808E46A04A915C111F939E2669A12FAC0BA4F74B832EAC83EABEE
+67E2817C058E69C2010F2572FDD15194CD8DF0FE9F827D349C0444A18D1A86FD
+802BC120A5114FA3523C221242C7E767B0AAF6AD15DA1561CE8EB18A2401D71E
+20481FA5F1E247CB5288F47795A6A3A3BB186E89EAAC4A54AC91405427136127
+5B151203426830F7CADABDB3FF63B40CA29CF8E667E71615869978E99E6F3F07
+0170EACDE3DC62DC05681D7680E2E96C30002AE34A4E5EAEDF88577601A82C36
+22D625A03B0451D7BBAAAE0C396711500E94A482EA787495073F16A76D1657DC
+4EA7C7B83BC30CE7F145B65B6E2ADC207D192CE3B5FEF7031F4BD64F57E1BEFF
+CCFFE06F1E4ECA48B442DF413766A70DA626359183A9B24C70419487423C816B
+4BCB067E661E47E172563090D6328BD738D2B0FE41A0C1D7A47576A79BAFC880
+0473229D134F998909898301CEF50A82B627A9A06DF59D0B9C530EC5D877F1E5
+220D3A1ABD2ACBFDF1933F92B3137B22B9F95A961D93B729307749A50D8A6403
+7AD0F9C40743E39B8D198CFCF7C033D99440D46D821D97545B930EF92E7AE005
+27F2FC766FDD4790FD1913C7A13328E73E587618ABD9008022C5C6C23935CEFE
+B5ECA2CEBA1D25DD846B48423F7186E03B1F61C8F1D5AC95CE03C83B2F221300
+7A761D6CB5F7F9251D3F9A7F4B25B99EE7A1347ED3059A811A82A35A033E9B07
+A4FB2A95009576F48665605C478E5F6C1B135016FEB4AE6A6BE4B4359836E04D
+45AA11366992162973FB6266547C2E570B8F56F6D992D2C0F63950A16839FE10
+F56E59D93A37573E3268C5892C9F3358753D1FAD6379E82BE740FA17236E96F7
+C53A2FF785FAB86AD17EB1DE8A6AA9C69B91C9D9B43B5188E51F6939FEC21B65
+AF17DCE95DD3BA4F1DD51F0BD5E5869A1ECA7398B6E664EB0D189181E9C23012
+DC1E54C146842A90909DBEC03B79B58909205F2CB2A7F83C66B437D7F7DB9781
+FF0C67F004E979C95B706D8D85255CCD827CF6196D847DB380B56980109E96CA
+997157BE78A4F758CE59D78158A854EF2C20099438F74777D3B0298D45BA86D4
+3C0AC30C984718FD62ABA0567AF0A70C1DD41953E3E7212D5C562085177E650A
+2ACD49940551E3F7619B4CC31DBF67AC15D938619B95DBF66E6D1300B1BB8605
+31C4011379FB5388CA49E4A9BD6C921560CB8D513F8716A0733D2A7D77E62D22
+A69B54E9048CA168D210816E613CF6357706EF6B118A1263B858B7E19AA98891
+43BD675B06C893579957BAB97199ACB82C080593ECB8B66A7334779CC16E4D0D
+4AF365CA6AF9727AE29417B61A5FD52452873B1D666044F8E7C1F6C6AA3397B5
+94A5780F4005FB5E41698FADD1594B505A58253D68D2AE3320E22165D198050E
+425820CC0A43FF1D61F168D87CDD30C14D387610B6CDB63BAA39B3EC9B3CA616
+FF1CC679227749DED3DDEA26B4D97C633090DCB8D8A6E5E07E3579E4A99BF1D5
+51E43D1D7F139C9CB1D76D8F693A3F23A74EFBE79F01E0B850BC6B6C7F62C2E9
+859469A144853434895D73DA6BD2B348A48BA80E79327ABD96539F2EA2209852
+E1BF6B0B819D7C68A9A1D0F6F39416E3EC4AC21DCD3C51D3B5B8D417EFAE165F
+2A7E0B76E558AC9F685A76FEC7E3C73CD607D9025DE6113BE5D0401887A53910
+82A813B026A502B51D484797D9D7E79A25B6624940AEDB4A15F2C73CA1AF60FA
+22D15BFBF268EB044FAE17822511AC6580D1D74DBA3C3335217780B29FEE792D
+200B00B8CD888A8BFF15D938FC758BB5CD9B3E08E1AC6CD1669E663BE86711A5
+892684DFCAF70C11E803164994BDAD89128AAD6461D4558AC2ECA3E05EB56D32
+0290AB16A6DF7133DDCBDEAE89C6CD83552792E23CBF567D57E46548EEB0A140
+437492B53C14419B6FE7E64AC23923A9E85F56A9DF209DC4E6BCAF1E045F9CA3
+BB904BFA150F4083C18B0CB5580450CDB657EA768E71222C71DA911A722AB9D9
+E18B6847F417125C40EA8A0CA1F551A4548712D098209C78DF9C3F78605E5402
+DA2DBE2218E49B819296D5AC88D17DDBA982E171733D1E9E295B3157C9B90BF1
+CE68CB185947D1E3D7544155B741296D14B064BEFD3E6AF25C74006CF6800551
+80FCAAEE6FC9105E1674EDFE68C45617D8D3E2264CD395EE94EDD017EB85884F
+FDF530EDF4F3F14750CA066F149E688FAF8EF4B5FE6AB515CD298E8D170346CA
+9B32BAD1D86DC147BD12EBEDF6CE1E749C5B48314F512470A568C172C35CFA41
+031E34586A89404CB5372D7B2C7A6D96F420D4D7C2D4C08184F4AF86B4536A90
+9367598424112A7B05D7107B23695CBCD569002290599E0FF4EC5C852C31F5F3
+9BD56BB840DC17DEEA579E7A7A9F764788D4E3774BD523D21267869224D68891
+4523070E80A123B58F7B579866332FC38A41A5915EC06F2D14FBE4A6CAF59AEB
+57E98D661637EBB885AA5D74AD429CCFF64E5149815E7350118E6385F4C74E0B
+2EB474A6DED021D429F01C9B0634A09250C40E22B3BFE1B7246D18116D585F39
+0E06E9B5F27A6CB77C8E9462189CB900CFEF08F798CAE15FBD94587F33816EE9
+03FB2DA6826EB69D8C284AB9F7B00630D0420EB6E35E0E288BA25F5C2345C067
+22412633898AF99C2FB232D1469025BF262B567F29A05F4816FE8EEF5F02BD79
+06202F6A1E3E5D4B3C91BA8D5FF53D5136BF70E5FAEF441A7310CA83721711FC
+39EE48BFB2FF287234B1A6102AF146B10A632A53AF97E11FFAC3A2A86BBAE3BD
+E0459ECF0305366078066F2CC628A3918E775E4236651B3D817AF1684B07A163
+A0142D16F55D2FB5F2255A8813B8E54EF3E801E95A4A226AB8C0476AC5EDCAD6
+9258ACB6F7C0CBDD298A0B816560622A1871FBE2FAEBFE697A8216A0D8FE30C6
+B1BA6C3E975F78182743842E7F851064037394142AC91B2530FB1D511EB20F3F
+79EDD8B7E1579D35F6E7B2883C47A46B6C1A458BECD6BE58AAFD834A7D82A553
+2FE4E66878E4699856DEDE964F454638F768AEDB595A883E380408F558015FB5
+8720954ECE2704AFAD4D62E8BB2657C4FA920D72248B3F762B2F12D125B796AA
+1C4BD6B42D766EC1C9B2C7AA4B6A3474BF753742DE8AB76D0AB0DD9A20EE2DCA
+0F34CB25995ED3183759CA83ABC32B8BDF0B06EF169252587971F7D37463BFA2
+BE36B2E45559DD73DE7CBE29DE92B9BE6B9F8093F934BA311D81E18A8DA92FC3
+312E3FAB43C53E803975981F0076EBB8F257C123908450661B6FA79E7ECE98F3
+B0A94E0DE3A4DCC8E0FEC106CDEDAA297A75BF1E40F3C2419BF72A644F452E2F
+9A8793810319885EB3AB23B1E80E8B62A889311355C73722C18E62711A7E6A16
+A5B923408444B13F6522FECA9A60B067EE332B83E1A69CD835C9D69B5D8859D6
+91F9276863D2E2E8193641E4239F4ED15E2C482C735BF5434BAA454EC2830C1F
+7CF766DAC9E924F17F03093132627673BA3D99DC2DBFC89E5BA032C16D3C1C8D
+78B3C464081044DB53C7A29E925F4157EEEE928C8E28EDA5F0A4BB6E0042D8AC
+7595C350645118172D04FBF06B2C9A9F3603A54B57999E2960C993724CCD6A09
+766BDF73F66E07FCA9BD09079CE8010E6CFECBE2E5DE1EA4E280AB78D5184C11
+016385007CB5AC0BC95955A1E88EA1A1D8EFEA886007708BA063F556D9284D4D
+C764E75CECA51BEE3D35DFCEBF6175953D30FDAC00F23B1721A1DD577945B5E3
+8176A21A649D907B5F63C71718ECF32ECCF1B26BF15AF694F1045CF98FC75278
+E9782ACD3D83CBDBEE690D29B3176E745AAE436382D258CB22F3DEDD02E441FC
+6A9931AC2F61156DE258DAAD5EDAD41E6C0DFC902173168BB4F51DFA7EA615C8
+B0F92FDB118378CBAC3D56B6B9BB0883C0C14EAA67396AAA7987222A132B7959
+44FC1E9D6DB6D549DFBEF8D2DD8C53DD3B66935FC239E74E2C440CCA13C068EB
+C4A3B69F499F573D076E2C92E24F2C69B806591B0807CD903E078683854963EE
+5125C3640860CEF37BE186DB781475554BFE6C528A9633AD5772BD53244E24AB
+42CA2D1123AF45FA257940CE611D83014DF04E60220E9AF27CB2A2247BBB004A
+F5722A5EF058FDC7DC2B6ED1406649DBAA58DF2ED3A91483D60F11C4A39BAF57
+CB1E320A987B790672CDD3E3BEF4A67032244DED2FF4588B2072CDABFEB36009
+9F4BCBEE16F811A44CEC77F8AE873C90C0F4C975E51014ECBD45A56A63F034C2
+82212977023A132E5C88AAA826D841FDE9CBCE7A01E4B6F0EBDDB9A69EFEBD72
+0B41EDA807CEDB791084047624BC11CE10B7A0A311272EFC9E013FA374D97EA5
+F7998FD908748CA72D8CABFD0F01220C2114D3B462B22FB71A23B284B1CBC7D9
+EA20BE71F8ACCED21F096009A14A7C7B51450BA51514707EB46B9FAAB31CFBEA
+E1DDA6F5D9AF0B6E7D05A1EEEEECD606427B0F2363D1B882B50140466B9D3CBD
+D00DB06DDD1BD4681E367DAA4B7C405C6281B67FFF794041738FC6A01D261CDD
+F6E0A330985F2CA782CBCC02B6F4EE5993434F656B91A51CC03B1D73FFA6629F
+14F6075EBFD83B702D8844A96CFB5C14051595BC7DB2218156A6DEDA5C98CAD8
+BEB5284D9D9F86406A8C1AE85857185991C360E5F44DEF352A1F301207BE94C2
+9A3A11BA468FACB3FA2D683419C44EFDD7C8F1079659F3ABD89D7F168B1591E5
+6105F9B3FA481BA953CD34CCFE73E427D3AFC46E5C58C2981198BA284DB8B37A
+6647BEAA561799877DD6858FCA71CA6003F2961FAA529906673EA94D82D78116
+4DAC81011FD175DA707C1E15D4B6FF19F8720A4E05E6E103E2DE880FA9C192BE
+C5ABE7C311C2ECCBCE8F9713DBA74AEC37A61C8F21F271B35F0F7C88B182525B
+A4183377597ACDA9A6E2F181725D427795B975BC4168A408D292CAA484BD1B8C
+9DC62E737ABC805C8FCB7E96454DA032B601345570EAE0379BDA84BB6D15D780
+42FA1E068A7D62F152B43B788513E13724666FAB4E2B4F04B0448194E46582CE
+7389BAF0D1DD4435BAA6B82AC305C04686B89FD51197C721D941BD2893596024
+1598E6C2BD84527EDA6FAB782033E4BB4F964FBACD96CAEC3F3CF89CBABF6B4D
+4D3AD14A03D4BE931632BB03BC2B92842FAD51A19A756892D5B978DB695D0540
+CC9D030C612E2B201D60D09F56332DD0BA1351EE62816C21A35C33DC11B37BE4
+D2F164ACD836A5CA1553CBC733E3B159860454B17064B4E22D3764FF6293BC81
+CFA3B2325C8E072857F6FF4ADAA8818247D431A28D3C5FDFBFB24A6CAA327AC1
+0B3630C84ED9F0D33B8255A3CAA9C5A0C79F7BF6BA3B9801C3BD0B30AEF7CCA9
+92F25E332EA97A7CC653C93D1497992D6B76363885B92ADE34C2A33E30A3B1A0
+57E9C16D8CEC189565808D3FAC92973C71CDE74DE9D8781CCAF88747758014C4
+5B62667D4D2CC5EBEBE77C5AD00C6A69D1819F5A786964501E077EB3BBEA52A4
+57729AEDF35253F7E1D31F2DD1587BC15CCFC1B0CA930DA83E2031B099A38158
+8D1849E7145AC74777A3C7136DEABB0C787E5A218309A65EC7D128147EDE3AE0
+C0AC039B56F767A22555CFCC12DCBC7F5A5A3B4E86EF5A69EEA93DF0BAF2A3F3
+7504F5C6A7A67388D2F9045BD755BEB7DFBC2EED679497EBEC808BE20FDCB5C7
+B586463BBB898DECCCF7249E9047DA943FAF0718A2050FCFDF8A4C2029FBA674
+EA64003AC03A847185936FC375CC67B3006EA681F61F640C3640A78D0C7FF521
+D477981E23E5956BAF42252463FDBEC49BB560A9428D248B0C5250CFA2A49CD9
+DBCEF73123C13BA382D3CF6A7B8A8CA3191D379A659F0E2C6E9CAFE9DA2AC074
+F622E397A2F7C73347364AE249B11AE2C34AA7F0D27B5F35D548D5AD1228597D
+D16A478C901D3A34D870BA39F770885B7DE62298F0114752435050E99EA4E5E0
+56B965EA185E8DF96B9FE97EE23DD45AADBFE02B427222B9FC99DA94FB2648B8
+46BD30F881BAD3820DCA4D8093BA0FE70E03482CC063B751439125623FA7AE40
+52DB2A380D89D5E37BF264CC73DA9A1540031587F481A0F146C6ED6F3F2957FA
+19477F075ACF608CD94CE466C1FC3EDAEA3ED25C96FE89A7CBFE528A33C4E84D
+465FE6FB031B48D904C5120D428D6B51F3232847CB0B7521E5CEA887FFC56F02
+0882B3BB7F5B0B954E7078DE3E31D8AE65F9EA55F4C169DB7C35DB9645617AFE
+078E03BF9A1BCE4E489AC9495A1E6CC7D1FFDCC03CEC1A32490186FE8B53B09B
+DBA7F0E23C8F5E5270D039B409D504203A458EEF12C035039A8AA12C719C0339
+F766BE6275511D585F82E9D4AC9B5424312755C4B74383FD094BBB24817D6525
+EE62456392E5DCAD0A0157A4A033E440AA014D5682606312F72248E13C43EC3F
+BBC9B4A2CF19A4AC6ED7F561EB13C3AB22FB3F3EF644B5B47DACE807262DE5C9
+50578464845B950140ADD91D72D28470A5A5FB134EC52F4DBBB9C50A7523592B
+C5BAA056E46F8C004062298BEA010C1CF9F49DEAB58C4D2012E04E630F54C985
+328DB2B6FEAC584308D71A9F5FD945A37EA13F3DEB1748320870057A362E70CD
+50C269D32993CE9CD1E8CB35BC6F69E7574F37032219C6E1C960F3693CB8D1F4
+7E3376495E6CDA3BD280DEA744D382D720935D605E1E2464A31B86E831A1DB1B
+BA9185DC43D32993D3B5900F9D5B45EE9D2C607172A670530780EEA08AECBBF7
+5F59F645CF7A86ED8CFFAAAE50BEC460C07B11BEAB82765FD18D152AD476B7B6
+2D08A8C7B5D8F7B6400C8435E6F08CCDE4234D981D056E7F1B361F478759FFEA
+468FDA9D4EE5B8BF0B83506B39C1FD36B16D14D5005202EEA3D9BF656BA60548
+A94BAE6159A75BAA549ECB9D5272C475CFF6BC373C60723049295392D4BCA477
+3FF6270B7658362D0014743F1686ECB611912E6B82670BCBA93832C4EC9CDD22
+BB2FD9FF321840A882A1E2BE9B354E69C9F4C6210564C02DBD96D4BC181B4876
+49818380D9DD9424E30DA3E8E3BE7682CE0CDF6CB3F7554ACDAE1812AD3B8AAF
+F0990BA00B058A1C5CC83A60491B7875821799B231BD9BF1D568ACFAE9E5FE2A
+7558D3820A67A6158EA037FDBE8A6EADD8C934380101327B8F1736D996F9699D
+D64AF938C999C6C93C9DDC7A8F4497FE81DBB787F24EA08ACF82B3C7620088E1
+8002FC529C8FAF40A519878DCB79EB5C7C34DD5D6F911D9DA790DAB33E7A8968
+A266E95AA808AEC8FD854D1326778821DAAD03ADC0863C83E5D0FE70ABB35619
+AB31554DED6142E2E1E26481377AE95C9F32D0EA3DE07F78C6A30FEB98B15F69
+296FC94E6DAB5829F1B59672C6A87EE4E2CD3F0D9894D6DC8D7A514B6BABF018
+B199CC3A4478821649A7389ED46DBB9AFB7D4FF7696F8DB586830D7F74F0FABD
+4BB32F787DFF04CE1E7349704FB5D3154D1BE3CEA0B476C2B787C6E534061EA3
+E28F7D8F65EB1FBD8177AA013A6FFC03BAE514112214F67C7957583FA78FA805
+29C0AD1C6FF9750CA24D3505C889502833CB71EEAC21B8F2F4D3415372E0FD82
+33A937D50F4BC55D381E2E2C831D2CBE4F960978BF7041FBB69C6C9C9246F8DF
+FA2D5C5875200AE8F9BE1C44F839F446C23E630B74B823FFFC88DC30B931769A
+3D5D444376B7138972BE07E5D8215B79288401B0E9E76831250304635714B64B
+2BAFC31E2583F26B15B38400125BE793931E7887175D98A1CE1505AD21BD08BA
+16BFACB350DB1BB37E647D7A00A48130CA4F7B6FC5CA17FBA73F7737366E906B
+AA3335A2E51D65DFC79B1D87F109E9CF3F420408BFFC2C399CA6844A3C5D50C2
+2B3673FD3A796F654D2624FE5B1E02C1720B91A00B4998F825D9C1EB29885A11
+D100A98620A7C186BFAEEC214F0E63A21A28E076D0CFC7DF62A016A21AF198C7
+28E5C374A93D0683E91F06858358E1AEFCCAAAF2CDBC382B1C999D489D06AB82
+60D4C548B9AA7B011F0382324737A74EF18AE7D5402DB1B8FB15AC162E6E1D2D
+371BB20E1F78C962F032B7647A301F771D496B14B11DD63965897BEA60DF1B75
+EAED63791A62BA912A8ED5EFD66340D07FD2DD8A9EAA1A98957F8D4B9F0C7142
+024FF2918E971B73F5BECDC098C7D011335077F059697C9429CA2E13B03886CA
+5D07C7178C2368B4DBA1BE17A074A1565A9DFDEB90F96163829C4F2BE8D537D4
+606E7CF1BB667190AEE95B4D68422B7EB84B054D41F6677D840ADA7BED269A8E
+8ECEFA88484CDFD6F999D9F51F4431057929706105172AE2635764B326446A07
+1BCB5A2277441E0C0C8A6CEDD2D886D794D3495F7CE828E1E9F65C3CB47C2634
+1E3BA769EA7DD098296E5CC981916608DC33279BDF53510C8BBA06A0A0E9203C
+EA569B24DB5EC1DA6254156276944ECB2338CC5679558DFF053863B3E6FDCC2C
+FAA0D336E9ECA4236917455D8DFA46EAE6ABE8C942E087ADD33E3CE49C2A8C5E
+9E4BF0A357D1B9DAD6B2C01D64D65A99EC728DADC5DA83FC279CD60A08971941
+638CE3A7E1A298FB9832804EB4752758EE1ED81FA96B60A6AA1004D79AEE456F
+C3AF0687AD5AA5062DF7F0C8FE7AB78DC6122BD2894DBC59B4126A0D85F34C8D
+A748048087E7D9E12CF55AA2786E595EF5BEEABD86563204CFD5B1FCE181B2D0
+5410E3836E394D0843984362F65D4A55D26C805E15EBF488AEACA766DB081C3E
+51267E8BC8B7E4373183CC054B68A4839F842DB22341130D4A1D312DB573060A
+7E73FCF514617C3D486651D2C8075E02331EFF65A2CE8B9AB7E35CD969550C2A
+89DCE554802F08D5C6163A09E669B7F5C6754138D778CBC5458F40B4B51C9A93
+5DD23BEDF12182BD5F1E42B2BFE76F421FD8128DA78F195038907F9EB52268A8
+324B1A134148226CD0B235B8A6DBAA8508A7209720E892B910056D55AD5797D4
+26ADBC7FC9E6A41F2EFA145DE8707D8AB76970B46D2F2CA4CE11DFB46B9D156A
+E75210C6F9A2B31DFFB3670CA8E52F322AAD31EB71D3E0C99CA791797650E5F5
+FE5EDC86B5B19433B9363A388FBD4C8ECDBDD8281A81AC935371FEAA2B841C98
+3E54FCA6C6445C89374981ADF8A974F5D5CACE8E158AAE572AFB2D282E73B1F6
+C7150271CDE9FA5E5BB94244F04B0CB671EB2391BB35EC2FFBFC522237F54168
+2A4AD8B48C84C4FEAA2602AF9483A1A07570F8E84434F1FD3942A13D3A30C1CA
+BD7901D49659C85ABFC78124215386C475AA0E229E98A9A2A47E32B46F09AAAD
+6C8F0D5FE2E4D4D4BB3B3C3B23EDDAED65004BD410BA829EFFC414DE349F8852
+75D4C9567FC887F173EA3E5AB863903C728D65DEAF592F400C803317FF9859E3
+1BCB658A0458AA355CE3671C35047760ECFE8AC3A01C3B975F01A02CA21E4CF6
+697A9B828DF3FD28BDD625D8502133E85586A0F66386AD428C1E65AF78A65106
+188721680B04E7EB756C564859E4F8E16B9DE6B7231F8F8AEC8064CDD8C923AF
+7B0888ACFC86AD6E03D83A37C52DFD5BAC714A09727B53ABA05461DA406D894B
+81B4B43D3F737939EBB7CEF3C4CA965705411B1EFA1FB6385A6556913A6D32F0
+3CDFDC04F88F214763B7E989D288C6B8861504CF5E8A6C67D16FAEE5E6962F6E
+0935372016194115F205519805A8FE8EE76676EA3CC75CEF7C7326810BD3BE34
+2EC114C3BD2508ABA9206401315D75C4AB6401E9AF3AABA580E47776C6A7D7AA
+B576D209AF4EF84F37608B2CE84D98008988331C5DEA082E8523E06A7BB59004
+CB8C7F4F39B4E83C926CC519163C17FE4CF47F1B66CB444842F494B5C8C1A386
+2DD05BED6BF59227A5757410F63CD8BB77AD0AB848E4B8FC85186E222208740C
+09B0E47BCCBAC26EDCB9029727EB96521F17A7B32E719001E59C483237D8B9BD
+6695799A0C3B80ED9C7D64DC153CBBCEFC22B4B25524BF5B301431F192BC6933
+A6DA377691670958B04AA1F7491379CB60C87F3110CF2BEDE95D6611C2A9604E
+083B721D51F513E47499871C0E3E504E8EE620CD2E0F450E3035CBCA94242BCB
+E42CB0E8408A3CCC5575C261F2325EAA2B06D91A65AEC162268D751CBBE9D5DB
+469592065418BAFB50E658E286933DC0EDFB9E9F7D82AF9851E71AE9DC4A9DD0
+8E01F2533F5C8F83DE9C0D0A49DFC375BA4F32C2BCA5774B702066CAE2647B9F
+AB7541FEC25269D28A7AB4F1F60F3EEEB5D2EE23408BCC84AE471EB6540A5438
+DA807B936F6C27FDC536D2D8471EBE9967B9133A1A5641BE80E64632E61E5E8A
+7700465D087E89BFD1C6197B8BA8A41CF2159A0817B5F95351E02E654CAA7978
+1FA6571CE47EDE08B7E66A2D0C8EB88AD6E4F287B9809EE5485A94EFFE85A73C
+454BF8BAB70BA2000F2B56BB3E0255892C3E4480C147CA11D4C3AB71744BC536
+CD21B6DC302B5895BCA9E72285744E93E85D33A86688758A060304E3EF024281
+590A765C943980884EAC5298497E7D2460C55EE1BD234C407FC63B9B3029C018
+6C86BBBCA5BDCD4300359A40D1281A0211B09B2DF2941EA893F5DB95BDFDD018
+6D674A37A25F63722AD62597314CABEC1F3A2460F51E00451D3095DAE1071ABB
+17A8DB8BA0E224D420D4A0EFF9EA17FFC7801D36BABADACC27A0AF1879C56628
+573059FD22294243357928DB4A835F02B3807067DC963CDE81CF4F69669421B4
+88A159B3502CA9619F5B30CD992F3F94EF3868CC695F52C5E0619E88A750D6F4
+90DF0CD32D6642A3D19549C733B89391041D0FC126AADC04D882188D9769CAB5
+21BCEB131BC5283CE6E9E6F650246B1D59A7A559EB45AADD9A669FC39EDE6CAD
+FCA20CFE0922C8730D56962F4AD00DDDEE28B1A7C2FA02CC7C59932AC31BD59F
+E0C837740EA82EE6C804114DE18CA35D8EBDE3F0C16565C2F51A14083F5CDDED
+C5B7796F9E6717A6A3E963F3DCF7E76DD7F896716193C975F4EA5CC73F6E8C95
+C987260A3653AA099EAE36068B7FD793154050D9868D9D30F4E4603AEF7B591E
+DFD9F478EB30D16AD0496965F5702DCA4BF33541778EA2FAB83C25313F8E694B
+43FAD86D47D5E84B51309B3E7991B29E9922E80A34AA1A5B895765ACE2329F92
+8A04E9A68A0D9C008EA9E52A114B3F09144C30A00A6E010BEDECB7B955AD1B06
+467F156EF79E4AEE257AC357EE49724730D9DE4942E84ECBBFEC6CC7C85CA2B4
+3BAE1CBA5ECFEACAA7ADFA4508F1DB7E6C37405439138ED4BF236C1589A319CD
+3A5DD32D848C22F07732BCE84FD15F86AF8373AAC85252A8F8EB7F3915B52558
+EF02270FFE20521F0347386B3A253A69D9510900F7052A95DE26B29D48D662A9
+20A437B9944E0AB22AB623E7C766A752D89A57AE7BA6A64FD96FA05A5FDE6C8E
+C6084C44FF6732B5B95A844FFBE2BBB234A3A247D4D89B0FECCA87C986912A90
+4791231605EE8EFAA7BC7F2FA5551991706DD4A677639A69EC231CEE3B0B05DE
+AD7C4A221B7B74349DEF428680366F1947D0103D5E4D72AF8579FF824DF89949
+6904BD33856ED29B9AB43113DB038902A9DFB2DF3036B99E5508156522E76539
+440A83884F8C08F8D8449DE3EBF2E6A775090536040BCB299FDCB7E9AB6AE453
+3AD36E109C46221C82265DFA576029157FB1EB3236F1A84FCA1B9B68EA2AE583
+6BCFC2D127B1A169A7392AC1AC251A14C32D643D21C5756BB6E39AD478160069
+A11B985D9F69B800D339BB0242A9A7199E996B02467F6A1F220A8FC245BF2F45
+5AED4D104C5513D3206D57C6DCD93B9428F82CD9938EF6468A165B5A53CF556A
+68E702C0A9796DDFC79DFAEB0ED0267BD57D099D407AF32F8F84EECC9C84C57E
+C34339DD87991056EA0246914D3E2096517B7C0CD1F674CEE593B92129F0BEBC
+2ED3DBAF4AA2EC0217DDA3A7265148B433CDBFF63A68C4A33BA2780E99BF8744
+D3ECA386BA3872EDA1B99A6191EAA8FE477301A84DDFF5BCA00551286CF62477
+10EDF4D58FB980707E202C9C337663C9B16F9283D36D540C75DDCFBD525473BB
+027BBA7FD75E952C2ED012B5455FFE95DA7E04C20F8A7D5C11813646516968E4
+36259B6A91966E87664978BEA76C2B2E093B2A65591D0EF3D501D91FE135C2BE
+E97A446B0586BE37201363A10C2F73026DDF0F0B6FCB331272BE349027410D4D
+958EC50B66EB7A45A1E818B67ED9A5DCC638D66164772ECEE06A80765C0B259D
+1B01A13FA9208182644F5853A8B8C3EBFF7F25C575761E9A49C5275E66B16FC6
+625D7E73A657F9B23EF1CECED93FEE2DC83EEF7D695D76D19BA87F83642F6676
+C460692CD64AA6FB768DA6008FC1C79E22055261A9A62DD1950F4899A7F6A2E9
+21D800038C30183019E084C951394B9F6AA87646410623B996B310E86858BE3E
+8C6DA85FEA3D6BCF62D2C3B154104E7CB5FDD42B54F52F8DBBC12087570F4C6E
+8173A04835CEA36D2280C5C42B880A498E30C7A77940F28397DD279907693979
+077CA5D28515A04B4EFAC1F0C948D69FF108320BF3B5C3C7D642AA0122A49ABA
+735B8D950535460E0B2C17475404D8E85DDA4BB68E888250500363648828A193
+AEBA46DF8C644FF81A998C5A7E4F9F9435C4F202C3DAF498484A012D4088C4D3
+AA9E813A9161BE6F9844167AEB52F29013BFFF51928E5DB7B48BD20D86F317AD
+63EDEC755F5A85B2B07C5B0E0A1B7A006D547744462AB0DDDFA9BC20C95DC57A
+61D44CB4A45558C68E36DD3F680605C9987B6B6959DE24DD65C874E46D5AE7B0
+C54608ACA7D5C7A88FFA06D9F6366E623F036EAF7A9914B0B549747AD58CC031
+97036EA1D54D01A736BD6CD796600E5884E90DB6BC5E2CECD68B995D06B26FC5
+2B6EBCE4279DA0E33317071FA1801279FB48563890C888BF6F2C1057F9728A95
+59D07684FD8997DC446EB635E9A5171C14E2A357C00C30886EF1DFFD229A82B6
+42912D02E3AF236F5C773456BDE13F60E8C674B21BD59D4E6444371E28956C23
+FCB55999382C3347777CA0CE8BC002CB3DAABC58D52FE542A115FDD96D19061E
+1A1DDD098498C9A8E713AFCAF355D2765DAE775FE6F9EA4DE42A066DEE306432
+065E7DC31F144697EBD270671A77E6096C0E191C96449F7E94419C752B920EC3
+034686DABF9FE674DB5E0744D44A82DE6B3933193F2E91D7A74BD17CA9FCA7AE
+CF9E5650355DA885806A24A9993F3041038DBB0DA23D74F12B86A329DFAB87CE
+C06B3F1C7A0D84DEBB870E64E15E251253E82ACEE05186D3ACC88E838F276B99
+0729AC02CE325EDFA5BC3F5DA079E55CA302824AD2DA70964AEE86504BBADCAC
+44B9244CC456CBEA44517185285515DF5AE0BDD7D98AC8928EAACE6AAE7D93AC
+E256992BD972DD6E33EF98DE9D9EB30B6D0569DB0B0BB23A1D0F9A6AC788F6AF
+AF81260D25B767AF16D5F060960E11146384A241CC05185408FE265CFA941DA6
+86AC510021788D2767FF5B384A17E60EF2A664207D6344302CA491D7D292D7C5
+A6DF93AF2ACDAC6970A16A5D3C78991931163509561A0CF10E7375F7E91F331F
+B84E8405E9A1881DD4103B575E80F36F7203522282CB5E899DDC42C781963830
+BA1051F49DAF440F28847188237492149C74E4A99C3323635BC051B8000986D4
+1629B1B7038C98D182481E182D4CA4F1554902D6D88ADEE755E9155861C0D772
+CB414808198E4686B722786911914585F81D84501B40684E279C5E6B0B0C2FCA
+F3538806C4A410EA894CEC8218DE6D2489C6239BA36233871B0F449B4AE9DDC7
+F00502EC6E7247BA3A829795C9351B50D312455F1486DECC64D2F159B0003FED
+E201B29443F8127878BDD436CF7873F22B3FD597EB81F1D630811BE93A51D340
+FAB3D607EFF2A65A74E78C792896CCEA1C2F1C36D43F1950453C79A9F0767B08
+DA6247B44B703157FDDE2F431089FAA9AF23C786737E921D76BAA2D68C3BC8DB
+DED8E756624970C823E97C598DEC658E28AE00CB901213CBA0110E625AF40618
+D9EA9369F124D089C2CAC832A145474AE476AD16BA5BA3FD9C28122229C3380F
+AFA46693D5E9A6254C055DAF47FE051751FE7F9284EF39A36C5D25FE6FACB838
+17F86520B8F143F8A7DE0615FFE77078603F5CD60DD0DDA9B84F44CA3BDBF2EA
+10F6CF79CA3E66EEF95C8E8DF98951933358360BE4A9CA23EDB5F5CD794974F7
+1A6708F418D34E6BE5BE645C266229A960C947877EA14415CEA2B238C8191387
+100FC1D6A879B129AD2CF7D50EA7FB9E8BF2C80E6609809A0E8CE2A70F2DC54F
+3F958E45E63AAF577AC7023F097A77C8412A48A3E608B36F96C39AD6067C60D1
+CC7A2E00BEAA799FD75F1F694928003FEB29A8E6EE075C57C789781D3E983115
+68AC3B16695D5FF9E2416277288367B040DC47D40D5EE565ED73DC18D23B8EC4
+DEC6790571546F0ABCD004B3A6C2360D7BECAD494888E737FD41C0FF1D277891
+7DAC83316800F786A16959022C9729ABA334E45E077A69D02EA82FA23086DDC5
+BD96F41FE176A7F491EB87181FE64F647980DBA6F210F3260CEAB4E076918F99
+D8246512F1BAD74D3C15EC69ED19346B60E59D8A9DC26D00B47741F103DCAE31
+A2CB69D1BF659C091044AE0E2796F13C9FB5CEDC3527F90D035EF785A0655296
+0C979C70AF9637D7C6E3DDAB3A9E17594FAC3DEA75
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMR10
+%!PS-AdobeFont-1.0: CMR10 003.002
+%%Title: CMR10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMR10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMR10 known{/CMR10 findfont dup/UniqueID known{dup
+/UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMR10 def
+/FontBBox {-40 -250 1009 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMR10.) readonly def
+/FullName (CMR10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 34 /quotedblright put
+dup 36 /dollar put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9B8591E5F01442D8
+569672CF86B91C3F79C5DDC97C190EE0082814A5B5A2A5E77C790F087E729079
+24A5AC880DDED58334DD5E8DC6A0B2BD4F04B17334A74BF8FF5D88B7B678A04A
+2255C050CB39A389106B0C672A1912AFA86A49EFD02E61E6509E50EE35E67944
+8FC63D91C3D2794B49A0C2993832BC4CDC8F7BD7575AD61BCDF42E2E421AA93E
+3FF9E4FAD980256D8B377043A07FC75D6169338028692CCA8CD1FE92FD60AD26
+D57B7519B80A8F8DCE9CEE5CDF720AF268D3C14099498A843D76E3B6C0328F24
+D36EFE7F5C4E5B5C612786200C8DE3A41EE5F1FFAF4097653CFCDC8F4FD32E0B
+03EDB3E413283B9EFB0AC33B055617005BC9B0057FD68C52D1B0E67F0C571685
+767F2AA85ADE4E0104A1C777733D5E318A22A9944336E5B98D965E50D31F357A
+8B6EA5A0EA98E1B027CE68C2EDB149EDDD04ED74A1B3D206D471A0C11C11449B
+DE190BBFEBC08C9E1B7513B43DA3134D6B11A2516E6E86B67F68C970A320D05E
+94FEC57FB347606DF89989C33482BD09D011C55AA920319E7B26A205D3D0F004
+22466F09C0482A164CFB27EF6ED2B040ECCC3DCAF345B5A73676F193D43123B7
+72FD6CFC5E37930E61EBD5A6307E4DE70194E6384EC0D79DB6AD86D3B319A31C
+8B0589D0FE28241D8ACE280D0530EE99C80723E560BB72AE9D53F4713181F491
+344B06D3027BA4E9E94D4305BE1D817197C54C8FF56CD6964165F6448ECC8A8A
+64B48B4F0FD69299A137589E2491A283509B21A3A5772F75B7602A9F60AE559B
+07A58436D04222C73EAEA72DE9A5A441F88D27C11F4F91255EFE280E91A4ACAC
+1E98A4E5E6C57B9AE86FD218C3CD8F24A4104156A80F13821384E529783C52C8
+78B94AB3A0096090867ED32E8A30980E737922037F75F062BD83BF4F5929BC51
+CC22AEE2DBBAAA001CFFBFF41D258424FAD888FFF1BEAB796A44E3126159E120
+7E4025C676CF94888A1971AEF8B6764B3AF4A92D36FAF6FC56FD049710EE3782
+BC2CD84FE2473F133BE03C1346B875463F126DCAB15C7A9BCC9A727D23611462
+4E8D2BFD2466600285D79518712B8681ABCD69608E6AA9578F7BD771EC36E01A
+5A17BC17E375020ECA59B43790ABEB9DF5F4FBBEF807E5699EFEAC563E1ACC5D
+EFA336E75DE6D8248E9381BB110884FDC89C2F9A41EBBC9A8A1F98E6A41F68BE
+EE30E25CA148C1EFF42DFF8C214A6537AB11F260B8C329A4947B5FC8DC9C5622
+4DF7BF4FBFB00380D47BABB03BC30627AA74103E553F55278F538EDD8C1E64CE
+0F1398CA0AB5A86630139B4A7E8FC02804CAFF3830114640AE50D2FDA3B561B5
+C63AD7EE3347804CBB40FB1E77A6C89735DD870351C3A1811591AB493251B904
+314F65791963C0412377C1D02362C5E9655F1C3D4803CD379A8EF24C48218C2E
+DF1165840462BF37DDE1B8D5FF09FA2C3B261E2F1A65ECFBE5D4EAD43B52C029
+EEB3948CB8A252CBAF545C8FA1C31E920E23A12DD7222CEF2D2A513BD758EA13
+DA33BF5FBF1D734653EB83DA2D374A5B9A0CE316F24EE375D6DF6BDA49954C2E
+DB25A88821193636119D469BA66E5DAA9C92520FD4F84426A4E54273FA469084
+7517817A6EE3E21176D333825E88046F50B3CF6938AF9BA79A2F51398239EB91
+1A2D07F7FCD948427FF62F40FF95E39FE1A1AA8451411563FD5388472251C155
+69BDE9283B41900B21EB1190D06E6B13B7794FED020D2C1BDD205AE77B084BCE
+EF628249398B496DE85B406FC2E1939EF00DFC84C07E26CF72EC401BAAE756E5
+7F6673216E7560D1C2A723CB405EE5CA474A07F61B81F8836482F73DC9516D67
+CE0CB770EAD755B6B356198B4B97EBB29C63456953270CCC8D5650C1D006E69D
+38DE2DFEAB27DAD50A817F0D645D30AF5B75A7B53CBD3D2B8D87BD0A7E525AF3
+22F7ADDFCE31716914C2318260C2E2B4664893921B68C5A93334A361D94A759C
+0D7B146D6FD94F0442D672BDA0F6432E18F3C5DFA37ADA378D95B75F413C9ED1
+BB5C606A3EC7DFB3F796F59B0478C13FD1900381EFE0BB5242D5B5D34D03AF1D
+4BDC93EAF8020E26CA23C8B0E7DDEBBC6762A557067A4CE05A524188A8F02E2F
+3625DA38DFCF381727887F5646A3995A8A38A5FB1E5D5EBB395FDD0B7C8E71AD
+B48EEDB62AB2CE99D121435EFBBFCEEA69AE9ED8238B60CC7288DE33C766CDFE
+15B767B4AE2E6CE0965E77272AC9F86023DA620548CFAC85BC751C44218A29C9
+849F1C2DCBDFAD895B54E51A569952ED50F82DC8A19F367E7E44643854EFD6B3
+FCAEB04E55E4661C82D31E2932611748480EF61FB2FBFB0CFB940BEA81AFCD84
+4C6A6332D7A600170E38A8EAFCD4F93DC153C43175434C86BC747348FAC61B76
+1FEC9027C1A193E55C80F1F20B5317AA0A05AAA36AE235F6E49F06E570FEE798
+84857D7552EA92EF3EFAD52DE39C2F8F43C59E3A957B7B926FC95FC4B60186DF
+7F3523EE2AB74E294C8C4BCD8B4975E84849E0FBDA6C0B0F24A636DFA578B122
+CF97BC5089E21E9F5298D1C9F30CB8BAFF6A3A11BB4D9A0A5CF2B18D055C44CA
+4FD4D8FE1AF3630907DE7E585AA811F9CD11FB2C8FC791851D651009FA5DF20B
+3C33FD2FF848A9E3F5652BD294965A332DD3F246C91B0ADA34017FF2451D1394
+F9C3C95AAC6EC8062BE98E8914D51DA6A164AD13938693D446044859D03A949D
+F9AC5DF4A000CDA98BB516D762CB9F6D44B5268FD0C26E88BC4A760C0F75A140
+DEBDECA4F511128B7D2805872160C55236F0A0FA7637FF0D4E94AC079CD3C8A7
+D03A5A56F26B0438B577C46011A10532FEBCAD14FBD6032E224F45691A726886
+56F305231EB2FCDF59C8BBFCB5DBD2D093A0E84D62AC93A2312CA69295E937C4
+8DBA1802B85F54B5E7E6D6216A918F911FF705D3B5CF055F1D873B96283A0B53
+59344D910CD396D883F6F7836BA65FAB4393A773A8F6BC298069E5BA38210EED
+49C9D920F718E3FCE692527DC7CCE6963BF744F2C91BC5952564196D60574E86
+87A0FAB21F2DB2BD5A51D7FBD8FC19946D24E5A228462C4772F978E650ADCE3B
+8D66B9C21279C531CA1C3A8ECE3420BB65837287A7222CC3673A2A5F8BBFDB60
+C719CD073EF9A23675198462C7C87B24CC92D6AEE5C25AC63855CC3281494342
+D28F3D2FDE0C183486769A4FD5B0143193D31FCB2C2A14E487BBD96D0BADBB64
+D1B56021C363A795BF10E2DB448261C363A54A4AC1182B470C457AA82DF3F5D1
+F4B329806141EBD53CAE309319B94133D7EBDC2D0453A905ADD207364371E178
+0A95C2686E3B34C4A978BFC0EE968C39ABA00889BC5149162C2B54483D44FD3B
+5CFF41F611C7E03B94945F414560E874D7CF27FFD0630890D7D7EA66CBD15448
+229059E1C436BB33D69552B5367AB5D53591C4678D0C704DD3EA23F5D9E8A7AC
+17D003C19E333E726FFFA2961F33C70F429085F7BFE3E2510F59B78F58B19CB4
+01B48E184BAD9020FECCE3AF52048A056981DAEA02AE78197E65855DDB170616
+F54278395D9EA50DC83761AE759F9CDEF9E1948E7002414FC05286ED793E6662
+3347F2A9AF8917493D7305B92CF93E8E9185F70015F5594084298A6C2F9FD3C0
+689F262AC9FEDC9B89577ECDE92F08D3142209FBCE7B5C0A840CC767BCA56C20
+4E4E545E2BE4D21C53855CEE4CD0AB35D1A604C0FFFF77DBAE4289752276559F
+A05FEE65F45ECAF44E95E23FAB6052195C7948AF0B1126482D4E02D72BF8AB03
+DE0F1A632F7672AD9DDE70EDC82AA993678A82BEAD0BC2649C4707FD8509810D
+364B5C6FE0E10772E95288C622C2F06C634F4DF8C7FD1432BC9310D5F24FEE3F
+7AB324863D6DABAA1576E70643CA79EF4D7DF4105093D66CEE0F3B87D2164A7F
+26EA05F5C4645B22D3E1BFD2219657712C168FD90DE801FB0F32759E80DEC1E1
+43CEEB19FED12D757205043FC98FEC62D6A8D8B97BC083B4A0E985AF7850D6FD
+8716B9957C1C35A0675BC53DF672C425C79F43FDABAEE7D63F092CF271C9A9D7
+C41F40C4189510987887942E60A412B3EEC84C9A6E1AC7D54D528F5604B72C08
+94B7882621A5BF1F325B92FF96B80878CC550D1AE4D8196E41CB1251856609A5
+C4D3BD05A922D0D45E039D9450DEF8490A3E924E41434194910BF60BA1B08BE1
+B41824345627745541A4F1703E956328F6227D11C74946B38CFB096139979E56
+4E723B889B44C6D78673868C89912F8B4F0B4B485F1587A637B630F92E6072D5
+7F3B44EA6FD96BBD4FC28A6C1D90805E3BE3E42A7BC9C880762966C55BC04E01
+204D083AE976FAE6F37C94F27E68F8C0F28D52B17F6C0FD7C9150701FD78F8CE
+B8E8DC9260E3974005EB5CA728171F482D765016C94D4ADFE4A42EF42212BC56
+7E4EEEE8B0D2A7856CD4E44F55C0BAB762F92CB8D64C17022D4BF3A47C12F5E6
+279FC23101FEE93753653CE8CEDC3B75C9CCB29BF1D4554C6120DE8EE750FCBB
+E38B5D915206974962E320362E59B3F21B3AB1875703191043D03284D4467346
+CFF2F98CEB4845B73ED8E003E0DC94251B73E13A9B51A3F1430BCF6A21EB9B7A
+65E17FA411F53BE6432F1506232B8159E008FA257F884A4A01AC53BE91754D78
+BF14A5B0FBFB9C31BF4908355F8A762052968DF526D118708CCB0B7CB5BEE285
+6DAB6CD2E3934178E60BECB11AAB5478623CF6C50C92F8BB5D1A583609028FA7
+B8A53B791BDC9EF76A124F3F7641857E4BEA0837CB36176EC9A522EA7F41B8D3
+63C37D1145367BD300F17B54522A834BBB74DE12BF9EB26ACE6F24A046D58F89
+4D4B7DF74875F1A0C1C9D97BE0849593D7B398EB4B00BEBC8C8D1497B6EF831A
+A35380FFB7F1AFA4D888AA52C9482E8B1755CC209905F98F40D95B44D4DCBCB6
+67423D1BC2F3560FF0A8B4F0CAC352A4EE2C1D946E45AAEC8A6AD40303F3382C
+DF0756BFA3B1ED64C169E56ED1C760F2FF0E24DC5C9F41306EF8D2628153D30A
+5DCB0791126BEFD4947D7EF08301FE015F2B0008DFFCBF9F2D4D859FD43EC7D9
+C5BE237E9BF6665B7B1BEBB362F0C0C3A8D86010B9C97FA741C97C2E0513386C
+9C26C235B14DD2A58BFDAC7B5F63DB4DA6D5D37D0098175A9071590E1DF66A3D
+B8173A047C29D7D35557F06132CC920B5460B8AFC11D23D09A4E45D089F5EB51
+963FA1A6256E359D485107FD143B2BF21FDE9DA5744BC2615E86C31C89470CF0
+D06C6397D9FCCB316EA9989430240759D2C4945D941F159FC02327F34B042BAB
+B5C3A47C78E8C1A6FBCD396B1A51CC4B020B8AD401841EDABACECDB482D6EC5B
+72D2BFEB4556720FADD49D07307C8B22ACB7E310CA4151A85C71EEF70E8D15DE
+B3B00F26E0E166C14647A65ADA228A3D1C89025BE059306565DB1B1EFC37D358
+8C1EB024254AFD049BA977BD4C2C605050E17940A89D0D4C5D963E792320F5DB
+3706682E03D25D9E02487247819551465092CC22B6B56E93F3AB528038FEC3F0
+668F866707A19B0463BE706EC729D2EE1653AAC7E29BD25BFB3241D4792F5152
+ED415B4E7FA92C2EE5A22E27E8B75542C492E56D811C192E95542A6FE0BFE5A5
+69273C2ABED4300D491B92D2AECDD278404CB84B1BB1BD7AFEC858215837D118
+C0E928BE7E07CFEEB51A6D21375B772B8248C994564014015232A0DA4BEA1754
+3274F407FED0837A236371F1A32056240F2015B1E7F4B2CA72C6B58610A66F13
+407CFFBA5E0A2893C1F572D50F51286E9133B5A84239C9493B0574E77D281D01
+11D00683354A000C9700EAFBC1FD104EA19DFCB87470190E7E2CE26E3A6FD0FF
+2620B87B82AC8686B6206B530F17E9348BC7D04B948348802CE53A312443DB87
+4DBBA5313A6A2A8DAB8A1CC9A594FF8C299281C0A261C8CB2226B732FBEEDE40
+2C6ACC74A1A61379E2E1CD5548CD908268A32FA83D8504C442EA0E183ADBF7FF
+9FD09C037AB03516ECCA93FF048235BD11A25DB07F164512A079C5392AC7F889
+CE96AE5C8D9580BCAFCC087C35E76EED1A671E87C12E3045E15A687134736DF8
+DA984772AFD189D68571A2ED7256F1E204230E41D3D9DD876F938951714A3973
+0CA9310489F8E807C1C7A4E51AEA5BC030610A5D7263FF7E0F9FDE3E5E37A362
+5B919000BD94D978583B942EB79CF2BEAC33FEBC9A67272EB10865BA8FB75FD7
+9D280AB59F91B96C16C982DE848D76D8FA8620DFD7C80B7DEAE7264350D6FB3A
+EF04794DA3305844A7CF718F6D1A4A3AFF6826173A076A1372ABFC54ED3AC6C2
+09C9287FC830556CA694E21CA5342ECA7B10C90AFC4783D841D7B1E34FA3DB7A
+2B706F3E21B0FBAB23E7257962FC3BC309CEA2C7239A9D6B44CC96825115ABD2
+AF9A2566D2F3382C01569FBDB94C8D664A5DA0F7DC3DD140CA77C743D7BC1420
+324ECF9E4780280EB119885E96A6C619CE3C0C8E1E264E2DEB137E5DC8149786
+486D65667ECF47B1A1E20E9E6E4FC8323E0BC8E61BDD3BCDFC6575C69C03E31A
+EFFC290472CBBD049DE3F840AEE37A2486034240F80E75D8A79E0762377DF660
+52B12EAA16D678990B11A9BFBC03C1D4FCDA9FD4FFBB3E88352438102F10B7C5
+9F04C013B6575B5E948FAB58EA691984A0E54E6B9F3F505FFFEF74D06FA1CDF3
+4B8A95904C8A2763AA8AF5B71D00F5DE09DC1CDF87A08B6D181453063E14C12D
+B7BB3775A6E2A901636273D9EEB833EA8CF20FD83AE899E28DADE10EEEC20BD7
+BD93085A4B1AC80AC1AE8280C14767F1A487BD066007A0D050317BD081131A14
+6EA0898ED59E46DA7B6254BDCCBC660686E2EDA0E77A705A653733BB5C5497D0
+B130359F866CF293FB6EF0C2AC5BAA2DB0DED045E2DED3A2612D078333260359
+16CF0CCB272D34767EA069E0F0B0D42327A18529D72E890EDA6195C2688438ED
+E9ACDBEED41E81CA8EB5E43C2B09CE266EFCA03F2D7FF57F12B06F9E54FCC6A6
+546676F6FFC5B8B7D3F0982B6FF0D21D949309F0C0B175CC1D0976F8C55C6AED
+6E821C39041E22D91AB30922F2B2EC2746BC7DAB484991542FBC82D87B487507
+559AB466F73EE23C2D3194DC5CE4C9AE66D3164613AC5CBB3DB501B64DA7C91B
+C7ED2EE9027FC0906820B35D4F2CF66C4F9CE4A884B7C07155BCA884ECA5EB3A
+ABB83F84DB1F5639599DC7D3F51241AB5D95C3BCB7AB1EC90B4BC989F74FB354
+04B2D7366A34D335A47B8C00C05CB423482BF6C7970A95545424A08AFF9A035B
+7F83F52B65A9799CE76E303B85664B624C65E9CA58184C7BE2BB9D9C86A4DE5A
+8165EE3DA2E652B5022EE7893896BABD88931DE1D538F615787645DF5ACBBA0B
+A8E5B899A37321AA7D4B283AC9234978C2DD81813A1EE5DB6EC170DAC1B6EF02
+94892635B498765C07A38D2E9DB0B7581B11056C28278F89B0E60998379C07EB
+C0EAEDC32AA69B8B836F92A61AFD35688315B2C3F860632FC13E4BDFB63214BC
+41CC6859EAB3AC3034449213CAB99FA1D216563419CD6D6CE4E1B56F33E6C654
+7AA9DCB5B05FC068DF02AC32408C8010AD004F6CCA9887830927F8CBCD49CDB5
+18CAC1EAFF815FF2F6F527F936948201565003022C6C7390B4E3C2B219FB4F76
+9F12BD25CA7B3B61D1A2F8DFEE795D04D5428B42FB66E0C254AF7B7A10CEF7FD
+E5ADA5E217BE24851180E9A1700FBA66C7D2B0D7BFDE4F4EED1D24B821A40947
+5620363657F6D048E651A689822CF815E72FC8AE9D835BE31D1DD8B54C9A717F
+4DC319B4B59AE073936EA40B070524C7E71D5A7B64436DA107749746B516E29F
+E3BBCB8F8C473E706670E11E5B221716F315FF097CD1841D0069FA69EA1898FF
+9F9EC2518C77806A19730C97F54BEAD604548D553D4A6EDB247853225E24E7E9
+89D71F6BC94DB986467E755CCC99069B313F5745B02B4BB608A39F0A0A732B87
+7EA2DED68219754BF1FBCA350327572D769C962EF9242132D93A5C8E9725D8D3
+AAAEC15ED0F362471AA58488620156F3474FA59CA080EA96FE995D2B3DEEADF3
+3141D157481C66507725ACA5953CBBE1ACEE7E3F02C72C6552D15EB3D612730E
+61A06A43575568DC3CF3844BABF04CA767E2995196097015E0C4F622C4356B6B
+F41DBAFD797A4B9D7AC22332C552043EF98913D0D9B50CA6B7CDAF903BC5C04F
+D20A952BA5CC35B646ACD0A287C956B98C450051AF6AAF79DF37F8954473F8F6
+652BF03AE2AE82B99D820CF93F5FC0BA17EBD7AF90313E70594EB5C354023BFA
+07912408F1757319C7288E99872B907D5AB583B082EEED8AB079C63E38B07D11
+6744856E689A479CB3A8BC081F33CB06755926204981DC0A45B3ACC18F6865BB
+EE2C50DB43B62E3630FC1D9B1FFB3BFFAA6D0A20C0381ADF48E4D916BEE85BA2
+BB40F538F55C11D50F882B73913840B45161262BC8B0012694C3EF26452F9B77
+2CD7C7AD6BFEEAFE31C8A721C2D46AA00C10681BA9970D09F1E10DDB693AFE84
+246AB18279A2B24E5B50A2FF6337B7B1039FFDD4B00ED3667B5F2F7BC2786D2F
+525A0E82234B30711AA835EAEAC2E404915FC7EC0081B194765032708B5E11CE
+EF68682FBA16ECD75C6A6CAF0F577583B72C77BF328E68308B929229A0930D9C
+61CEFDC57E376B63ACB4F3DB9B5C602C248B4CA233E2C25E16314CC878BC1B88
+6C0706423F71514CC2DBF0D259D87DF704CB718A866DBAAE005180435034AF3D
+5EFA02237755986AC73CDEB3B4766710B762312D5F48C59537B158DCEC084C96
+19F1F37CD1CFB61C63F6D05F59B2E47137A433DEAA34823395727B67CBC15B6A
+857627BBD49BE34F5C7B2EA6C0ADEC83FD5E10907355E926ADFAA74C6CBBFB41
+1E37968BC3BD7F665AFE2CF6740125D751CA66148781310C76FD92731C0513A2
+0ED792B34207ACE82F3E84425756F6205E70E1BDE989DA786C6234FB98DB8195
+737FFB8086D05B4D5C88D80B7DCE555AB3882DA305ED26351BD26ADDA377EAB5
+0618D08F7EDFE61938ED5CF78A4BE43408C7C2889C8E81CE04A4C20BDDF31A5D
+31BA15A2BE1CFE0AB51E539CE09DFE33808277D947D083C066478F23A4D524A0
+D89553E24ADE78EAEB4ACFD51EA3D2E1D5C84024D893F050DAE5314C91EFD93C
+91D81F3591168B4EE3B01ED80CDDDAE0FBAB3936EEF02462A6A2895E22D24FDC
+F93DA61C36998E2297B512FAB1FD39409175426A8A7A56EEA4FA8B0D525E849E
+27AB6622A3BE999A30A415B7C8A317D3802BC0B8FA6F89712D9F38D9366BC724
+8060287F1B859F13CF627ADBC25002D1610DBCEB93C866520FD018715FCA7ECC
+853869B7F55FD5649526F9355BBEFB83E9DA1E05406F8E32C1E112BB9207637E
+8B976EC8B51F0D45F717C6BF4BD2B352FD491822DDC1FD074A4DAEC4AD128A62
+475A39455847C265210B5B4CC476930162CEE809E3E4DC76250CDBE461FEC4C0
+0C40D656D905D6AFB4390B62DD21887206733520E4C95FD857BF38350B03F2AA
+BD0AD9A87F485E0DB510F8216107EB7B31F81CF5DE76386D475A4CA18133BD84
+74E1CC1A9F2BB4013E570EF03C0F93AFF4095EED8F861BA5DB1D28EBEFBBBA0A
+AD9FA3BCA136A0EACE7D66B63728374A3A5A198D2348E8FB33DCF83C12C77A43
+01C57D222B4FD5C3A9B8BBBFAB1A04BE0C1DB269D7C7DFDDF849C849F5592390
+32023ADE6B8F65BC17C850FFE3F7154D6ABD89B1EED4ADF354A071B0DF8B22E6
+CC94F1660E4C0F9E6E22EB77ED0EE9E3E10459B9AA355E912CE927A429B02152
+56CFF25F22E753393188F7B79B49C0F44512626F2BE1339F28FEABCA02052072
+2A4B1FDF77C3C092EA151A6F3762571629775247A6AC65DEFBCBC464A5EB0BB4
+F2C8AE029BD1172B430088B5786E7CA468E96E826FAB1D8A48A3700F8EF65B63
+C6F0EDE8519C256C46808B033DC9FAB61B1D49C8AE59C69176AF3AC875F86A64
+6F149241EF5610992222B79B859135D0DA31C438D26A3C8CF43B1D23ED27C852
+E8668043F8279A423942A5070D136425ACABEE43E4A45B846F4E7F7DB374E0E3
+D066CBF83AC321D26021738105BCED4081EE6AA264737F6862385FF9F3691197
+1D924EC2D0DC8019350CD7ECBE9814BD19184BACC9DA9A3A433F950E8B3400C9
+84EA3D3DCF2CF050DC3435E1294136E6998104B897A5ED4709B6DC996527A8E1
+AAB1B3DA5285EB8AEE64A2D47D29F09004DC142553CE14262D2AE3774A65EB9D
+4782B048008979779F56C8D8BAB280B043B49F5AC33462CC5A1157DE60AB3347
+831ACEE9CBC3B88AF70F6AFA0C191867F2DF1CA821C6596552C7066932979570
+ECDC82CC1A565E4DDC16373B2B976B99BA5F0B92E0FDFD5C0D7DE2197E5C91C7
+9EBD346C4643295F769C4B2C15D2429FADBAE9F8DF0B80063F9A3B214535951F
+A61DDC0F82F21CD0C6E779EBDDF5F660E8262CD10AA422586EED7BA629AA87DE
+796AF15A95E1E579AF686729C69646AFA2DF78BC053A65AE1FF65945FBA879B4
+A21449B2F252C9601A3E54D1247C5B102D138C0D2CF15616A3E3ED3802608BE5
+4BD40194D3526B2F54E7F73D3C0DD86A64D1EAA8A23EA4719AE3E9694C8ECCAE
+5CA73829CEE0B8F18CC386797D2A696F3666950E1E9804B899AFDB003C38EDB7
+AA93BB2FA9F447DC37AAABB9140A382AD6E69933724EDC6375C6305BCCFD126A
+1E962DD9769EFAEA41D4F64FF7818DFFE7ED253836BA51AF3554AF92E3AC3145
+990C8FB0867DE7CA55C54D3CE900AD4492B2D3B50907E6B3DE62FC41CBE8C737
+760EE51E5C6D9F1CC15CFF852770A3991F86CDD3C188F08FF2AA1CF66D3ED8A4
+96C04CD3BC8E97C820FF51DBAC94109C9ACA1C8DEE7E6D43B55A3F3ACADBA997
+39FDD65E250335E05CDD9563F70AF53CE842BD51BF75777F269D3895E82A5F20
+CFCD667AB094E7DDE057203E2634DCB355054F9DD8A2DD1EF927B0154E7603E1
+76D2167B8CF3794CC8977E665AAE5D703AFB18A9C1B94B2EAC6162C36681AF82
+E3D62B671C8C274AA208813E57FC625E63296E325E2C31ED632C3136F0919FB6
+A34D452892690811A376BF8342F01CACB948360AD003609F3509EE55639B904E
+CF801A157CA626EC056A683D84AC9D95E327411C7646269A27E297D0C1616947
+BCA4D4E4C32BF7A49FBB7ADE2766785B6939FB94029B2880BAC407F736E15B3D
+6C2416C48002740A4E6663380089C45FEBC743CD82E6891224A561C003D1F65B
+B01AECDE888B9DA271C80796B4693072DD1BF68182687CF10C1B4F0FE15EBC6A
+695647F5B0C1D1B57FAD61FB1E348C8BBD3B7031A0DC7F7DB374E0E3D066C91A
+C339E16323C7E4428D2EE11C1079BA8DDD66CC775FE43E1C7D9A454DA6434341
+2AD0E5836244D8F9B99F349B12BB4EC608FD760951981D9D7D67FBA77BA1637A
+2C1D282B90601F9493B789F09B70B52F2EF2825DED6AFC88E7BF74241D7DEDFD
+CE064578CE287B1AFB246DA586223BB4D80AB9A542D62A2CC807FFFFC7383921
+09C105D198B7D05743D1779154CFF12DC90FC2DDAE7318A9065A81A757C2255E
+5832AE7DC10658AE2B5647CB5CD00E4C86AC8DE6E61B7C251F1F52A905F45745
+03F255C15ADF31815753145F3F9F1A71382A2996AD2955DD8B1A35CFB2ED77A4
+04F9DF20CA177A8A0C4863CA54B6B646828364824C7D41C3B93E473AEE9243F0
+A89C4DF01C4322AF90578A9A290C1AB64B77EAA019B739C465BDA098161F8256
+9CB8746FDA4FBD95600E6C1AA356F3A2E5DF49312C7AC27D9204EEBDF1A271A3
+AACED2042AFB7CBEA4BBBBDB159784008721738BDC79B89E7F5226092A0FEF60
+DC87CE9EFC97DA5698D5B4BFEB8F379BD02D7F1A024EF4D10D85AA4E8A0E38EA
+1974B3FF78F01CAE5274C223DF459A776B4B31492C4D6F555DAC9A6DE72D42F7
+7C28B735E62DA5413F00525CD590107C9D39B41E36C19D316C38A8F29E2D6E5C
+BA9F47D561E741B96947C368084A78375398EDD47BCA95DA3913705D4DE85882
+61BD9681B2FC75CAD1888311CA11322DFCDDC15804BD0C789D1D29562CBA2001
+A7B127F68F2914EEB96FBA5169B7ED30FCFA1023FACAA27B9AA8DC42C2C8BBC0
+B9AE6327E705B50995BA6ED0B538A693C74CCB6C250F2E2080660A2634D67D1C
+2D928502D4D5D5C9C68C0A289DF434CC3B75118690B10738560610DD15BFC537
+55B548B55DFE2D08B3682AEA2E22CF0CC35C26E8322378374BA80FF2185C146C
+3B2548A38A09796D087F33932C5ED4D513A1C8AB31058AC27B6BF81522692A15
+12DEA25281CE4DDC009ECA8ECC714D2066C9BAD6DD7D4244A3C3B1586B501DC0
+4A43DF7A21C7DE55DC385B2EA52E96A8182486574857DBA1C7DD7BE38C7F6605
+8EB798D6FE20324315A736793F0C6BEE522AD3E582E965ACC07C1F78C784982D
+BC451B029ED37E2F8492A9770813DF2B1B539C5AECCF93BCCF128F3455C30B45
+D7FBEDCC43893291BD3270368500D3BE66EFE9702411375EFE3E10F0AD8E5906
+3A70BB8298517DE21FCEF75496E0782BDC1E924E1C6F28D619F5047592830AC5
+E06EFC6525E06B7607D65B2927946E73FE9C8CAE65FF1D9E321779E94CDE9085
+4C7BAA86BBA2C4A53F0DC10ED188DE1574088A2141DE6FF48450144607B4C1DA
+C8EDC64EF6246E40CC20CDE7A22F892629475D4DA16DC62C42462393779609F1
+B479EFC7EA8C20CDE04DD0F6B6175E997D2ADF32CCC0D351B3D4A5F8E0274D1A
+3EEE83F04EB815896C3C727D60E3B85E655186F7A7BB423D1A7CD19296DAA015
+204FCF401E9A56F64C697497C61662AA7F4097C0721822BEDD824426324A70BC
+EE6757B6DD103C370796839A4E76C039B9B5B316FA8F6565B7CDDE544D0991E0
+302D896C0885A3542B3B7216F6156BF5554DA7E0129935C31A2154C7110E6061
+26B6C1102DFA3512AD1ADB0720992481EA7EFCF4DFC6FFC2605FCC550AE5ADDC
+E021A7C84541C48A0856E1F2BDB47560AEF2ED181B2F9E9D1B466FD9EABA1D02
+8F0D2989D62E03727346FBB96694AA60DB90075A1E4671888FAAC0F5CFCA3FA2
+55E024E0A3565639CBD91D4798A4735506E6A03C7A805C5AA651DFD7BFC5FC1E
+D85DBF025D98281323C7EB5A6AD56C22C139B13F4BB5346A5BFE8DA3DA8F9B40
+7ACEF81F3B6D2915E16B56BAD8F23C2B4685B19BE4DE5E0DCA120EB161E620DE
+FC3691FA087DED6F4ECDBA980E7B3E30BB3383E0FBB3BBB70194162DAB70D516
+659E682FEF8B291493F99D78494432E4D68A7212A4F363441C51E317A1C2F60D
+2A8CA4321599EBF483D155D14C173AE29B7DFBAB79E26B963EE984CA5D467FE1
+AAF9D1AAC02D00DE91D177DDDB891B6C515C8199F29C473CF4618655F70C53E4
+CA3A87DADFAB36E523AE2D91B7B8A768679DB1C90077BE6E3D7A2C72B6449348
+29F5FC9F6D2799DCB69845958006A46F7EF86830D372AEB56ADD69E33A096411
+80D9271F61CA7A28B8073D6E194F6C9BE8E93479E8E64223CE98C31A011E4BD1
+9A5746408154A365470CA46C5413C4D55B69328F13C9DA2D22EAD288E2993073
+00F51CDE2C443A4ED60821065D493C5D0F2BA5816DD57E86CEB90046E66EED20
+CF52F00A23FCC18279248872C297FBE6727A45B4EFF0199C9CE54A8FC5DC2EDC
+75CF68CE217318DFDBA3896AA6805CA4F9BE4E7E3A3A2772CFD39365F192F884
+13DF92FC39FCE3A1F9D9513BA7161088AEDDD4F8BDD9D414963BF54725802983
+64B5306599724F40C2D146F9F9EB50B9C65A211F0E9992C4E2DC925C44BCF9DE
+A619A551090A28275303FF0D0ACA6B4D00354DD874E53B167BD81B58BA6AA4DF
+3DD703EB95199BD02DA951336995D273A6B8A1345A76F043007017B077CA5127
+2CFA3215CAB06F857B22C1E1DBD335629B037482372E6CA2EF5E176F66255509
+80D0ECD3E933D029C567C4628D8938F576B16835EC112C3F3DC4AA74E8AC43FA
+6FA6F42F618B958CC83980D86567FA17E7B821FEBA4888DA6C964F2A7F9E6CE5
+04531D53DCD037FBA89A7F840DCE36E251D3896D4735394497035E96D3DA12A7
+6AC5A61146701BDA722955BB8EE66E838CB128284158E9CCCB5DF51DA6036CD0
+D4029141D01EBC90E0DDD8FB1C884D7243782F62FF196C942212E4D2F7C65788
+E8B5C79962FA1941C3F0731D16403412C3FF79C08ACF03034169E676AA39F9ED
+4BCE98694FB1A9EEFF44E40267921733AEF80C73743C20C99F49A7323EA27E15
+6D5F2C3EC4F7896EC28E3630F66741B723A7860EA5FB584185D77ACF418B79DD
+8C8E9B6DE87D17BBEDD558E350F4CE69488A995189CD56AF75677C31897C62CB
+07BFA36265AE30FD06D55F59ADF2CDB21E7E13BC9E88EFEEF3F9ABFADFF2B6C8
+5275F80D7D4BE9976DF0476D070B9625E7AFB99E6CA526FBCB61554B87F8B1BF
+320F79BE2695E7DB5E6E2BA3276275C82A53BC3DDFF0F2979F8C4E5752D130C7
+8C9F7CF16E436B823B1A2FD914700A263D3F3DE48BABC99FA90E0316AAB12D95
+8C59195EF634E8B29F9CCA10677E46730E1AF19F046BC5239B7C1F430955F158
+6E3F0BB2151E5D05C35F4C3E2205440C44B8EB2ABF0612EC6B413FC233126D16
+55AAA85F5DDEC3C008C5B559CB9C37B78512FD9FC93A435B68871DDD1D5FFD3B
+C0045588F0CA5442D7984C1F782E109653AFE579756584D216275663B2B9890F
+EB3F11B17A58EE8F5A92410DE390807D2E03B522CD0B2DEBD381270710DDC6A7
+9F1B8F8E669E65E1354D5ED7953EDF0AEC9119A162B2D1CF3039AD0EFA9DBBCA
+9446EC4819D07FA893A019A38E2189F5DE84DB0E4DA2F0C169D25A636DB7D8DA
+33BAB84A4331DDE5E29362F174D5618DAC5E1B830E0F464B7B8007A4283E48D8
+95DD3F13982278B538767816C211AAF263F1D40DA68AEE2FC007CB4093E14DFB
+042AF398DC5029B701DD13AB11473ABEE8EC65D76591C485681529863B61B321
+3D9C04C6FC4FAFA0FBAE2252012201C55E0C03F532D68854124B117B2F350654
+E000EC5844A178DE9709C32B751EECD46C0713B7989B1835F7F50F64A6147C9F
+F219283A82E3B86F6F6D29DC37B8A0C9FA4D4D41920C25D3DF33AD39ED08C289
+856FEA05AAB6D69577B0D8A5476169ECB15CA63F670F8D1B9C2E820697278597
+6BAC78708D8176B3B1576865D0280DC3588E8293A1CC7EF5FC59D9980BAA08EA
+B093970E06743EA33350BCAF0933D2B009740F9495D7B24B88F46271CF23AEF9
+273E1F6F5F1F371508FE264100A16EB6F3F97A66D718166592239AC3009D8812
+65A495A9DC01F527B189190A79DEBCFB7FDE92FF64C77BD545EADCCA35076238
+C3000C2E27445209E8B4965B25D707B51AFB11B6D80B36FAC32657A2CBD51A82
+8A159B3A433760AD4558221A09E94011B682EE29AB16E9234C0AA1834A5AEBDB
+957108C46AEE9AE963716EE61BAF4BE54C1A2224A3DB7E3C30DF9D07D652AA43
+1AB19D826F7DB18BCA8DD4806DEF031CF933406E38ECED77C7F1229C0A3CF129
+AB12BAFD207C68737198A64B573B6A11F3F287A48C92FEEA8306D1DEC14A91E6
+4CEB56C3EE69C5C36F68D96A88AF8B1289E41B3410BF2DF7C9A2BD5B9139121F
+7AFD6E7DB302E9AC30AE901D4AFB90B05E614BCCAEC67E8F57CA0F4A0B780EBD
+55D9239ED6F716F3CB0B3191AE1A4BDC6BCD82AFF7821C120A553E454D00B679
+BDC33B347F2E9B4D15223A4C7AB0D321F277E0623550917980B5BBC0607AF56C
+F10C29146DBE2F6BF9FD8E4879F6FCF8199B446C25E4E65B6214FEA3EC34E4F7
+8CBFE934045822A6C961620D2BB3A4B36825E4D8E5BEA28E55868D30B02BF507
+F6FAABE950F17B4C4130D9252701F08014068E33A4F20C83CC54FD940C92318D
+CF76AE0F4522A50DE7C14352EB7C94F746A7F73942129D6BD12A8C843DA6CF89
+A6E58575036DC8AED79C892E1AD7AA11EDBF43FA64D625556AEE04D3CD4DDA31
+CCCEEE3E3153FCAB30BA65A3A34AECC7663D745DA62838BEDFEAF4F167B0BBA7
+222BF55A9626B85DCAD9AAD5FC333A85950710749D55F7C12369941E8AB8DD41
+FAD6502A069EA1490B953694860AF8AB930DD5EC009FDBCEFECEAFE298E33727
+70ECC760BB8156DE8FC2F2B5A1E03B0F3FC8F7448AF02EEF97FE5A94BB0801AD
+E83DF738A4D5131E16CA198DEEAB023E253227DF06A26950327409A9722101E3
+79D57BC5106B6EC703320192D7DEB89BEFD19000E2E6E43C10FE960551B81D78
+50EFE679BE528666AE7CC2FD9826AA224A009C7387A542AADB9403C24F8AE183
+3A40BA685BBA9F8DFB6717E1C247C52773DDBAD04D2EFC606C55E4EF7B292595
+F03D82D3FFFACB5AB2BDE9406AB2354675CC29FD01D8A625FB22BAF3602A5C08
+663A212E29617C2CFE55AD4E251A2F864AFC683984B4D72843B24D321EB85835
+00719B26365E467D664A654C692476F0FC1BE27302FB3959D722C3613F846923
+FED287F447F5DE22DBB6771FFF56E746DAA399DF493CDCF95B96CC809CEE835C
+F8D827B1B1F7EF28AB0D91F6224E5C6DA4CFE20F7ADEE7EB834CD7C54447F49F
+9B353F9BCE262CACF2867E6F462CB21044202B554CD8C1EF87FB0A863A8CDDED
+59D32030EFB62C81136175EB9874B7C627ED7E63AC77F78FBEF2D2E5C2149360
+0C8C8278529A79E42FCD4B4551F2593E96F36D15CDB56CF8D6D65357CFA98663
+600732BA9F1CE83E0D47647F02FE3EC8443E81B3A7B55E80F3216252AAD626C3
+030A9E420221DA91E57CF1B3ECECB36FFD21EAD729CDB7B3C6F35168BEA82F36
+E52D0CD46B0A3D962E8CC48B3F35C049FF18AF0E271BF7B03429FD90EA4C68BE
+41014CE3A859D138B3D51F53790DE3E7F4BBFF2997FFCB2C189056091633A2A1
+03E88A3CF49967B712991DCC769501523EAF0D70895A45DB09A40DB1DB221E79
+A1869BFAEE115B3970D0696EE1EEA3F29AFFD16D6FEF99F6EEA625AAADE8EAF9
+C23187CC5CD5A9CC9D0A3E76AC308694FA802DA1F900A1D324CB0E622F192647
+FE0CDE1A22585CF4FACBBF456AE5AA5F01D255F4B9A4163891DA74E4364625FE
+30EB70BFFD698B6B27BF55FACE80B4A55F8370FCD74FD0B29FF8B3EE6F4DE577
+3F842ACD7F112C9AA9597AAAADC5C746AB7AF8B97B906B56B3607C72D988831B
+B5202C6F76BFA5DA8101971CABB1E24D305460305FF0C9C0BA75BF2FE7692F3D
+DA6971F3F63C81842428B93585E7C2413206969587A556B6E36AC4453394CA18
+777FC5D838D4EBFFDEFA1BCDD4064964421E862699C2E2B4BCB800D22EBEAE14
+A97744D1EBED19B62EA117EF78B59EDB5DF17647C34BFBD9FCAA296D9E3BEBB6
+ED05FFFBE063EF811B18D104AE7B8B4C386164C9B5CF1EB30247AFD937CE04E7
+6A35FF92CB0B8DD9239AD1DC8E8608AA924CAB7361D5F48192D24FB92B6D21EF
+9D83CB3E13967E2250B32410B86EC6BF4722D31239891479B0C65DE3A5A43E0D
+A0192649B5F44902FB67DD68A9609B8FB578174D970CB01B9F86248DF15A769A
+0B0EF0C116A96A4D2D0A9380137270CBED1CA8C19C486E22E13E1BCAAA65F157
+E82A6AFA76530DAA8B27BD83ECAB41121AF2C764CCED122B94FEC74719D22D98
+C6981745F42ABD6C0476776584BE443655ACA39F0BE0AAE445C96325F5A69D08
+41AB9B0ABD19ED358BEEE6DB94724900250B795404243489FB69928CEA6126A8
+2036010760904A7DC8F15D9B05DF3779D1C657FD5162B801996F1F7572BCE8B6
+89DB7020F784D2F750BDCFCAF1E66E5D1CF8206D33D104AE44659298387CD149
+4E2A992E1548A37C0587752D46EF35357BBCD8DDA9BBFB616898AA1BEAE18180
+7AAABCDF3B9D51351EE5CDC490CC365FBCC2325076F696E9C731250A014F635A
+E0EE366E3515066E0735430AF23D407FC997EB489BECFDFBD65872788AF7E13A
+5A216C115DDD2F8FAE684B0F17EC9B53EE00E5966BED1FD155F32B3744F02FC8
+592F8C5B7044F0CD6C23BD26FA11C128CF92E1EAED0DECAE1B3CA64EB558A6F0
+415DFCBFEC7339822CC12F95F0E151ECDCEDD36CCE14AD2D4F57C9932E2F9FA7
+00FB8D7B2C97EE4BFC16F650D0FCFEB70DAB22318CB400BDBCFDB79529F11403
+026348DEC4AB352296519895E23B3305A44887739E906DEF031B92A0F41A4411
+09BDAECAD78E6A853C0A1973657BAC3A58A4EEDF99C0EBDD974EE2E9D2DE83A4
+181A7E72C8CD49EF58369C674D6B7EFC24120A0F245523E85C6E91083F131CC0
+B91CC5DB16712011C2AD2DDBF6D7AECF5BDC2E09ECBD88797912330CE1FAF21C
+D2754C8B16797C577A376B452E96DA49624F063653FDB04098EF11CF1EB5B602
+DD7E66675AA3EC317152ABBD1FABC470A4841B347D80E6021D4E290512F91D53
+6DBE98C25A17631B93544297FF7CA950B903494DA2F686857C118BE4F2D2F5B4
+D63F931457D1507F13FAAF06881670C1F46A11339169B6E859D2F75F9401F5B1
+0F6BBF066B6410C522D3647DF86FEB25C1ACB394F2EE034B6FBA1E1F0C166CAC
+23AD89FD97B43C63867C86FD5609496B8B58F9E10CD24141A110530EC24ADE79
+3A9CAF5E07793AC8B0F9E560649F589FB4312CF3B61FCFAF08B8B62C185A442E
+5EA71733D96F429DA0E2343910D9FBB4225C1B6710721B89316B3F12E3A2E39B
+4B139D9805B64E831BB2D4D1885094552900CB91275C8052B93B59730F1162B8
+76DC1B604C73145C7B9CD5B8B352F3012D8FA03BE0C48998A45C9CE392047BEE
+81E8FA2AF78903D4A55CC2F8CE39C3582FFA7C010D879967F28A1FE3D21416C7
+30F381F99B01020FE3F35340A770629C16333805AE2830BECF5C40EECFCFE629
+67FF0A3A9AF794C5FDD669A18FA5EB93244E6C54843B3868C28D66902429854C
+E3B70B242CF8652F910465050775B542AF7FE158DE22027F228C48F8D137E1EA
+E734DA62FC34B5CC44C9ACD3A078C7D4FCA262EE953EC784B134F40CFF645045
+71B9E302A1B579793BCCD8ADD3FC027EC85A5770A26A1F71C545784E1998E396
+A6E567E1F605A1E89826D328ECF772FB1902F0A05F08F3F7C1DE5A0B1BA02A99
+0348A28AED186D63857976EC0B837EA34AE4D781CCB5B07F39C9E788DD15D549
+BFA3984DD591CA27AD98FD841C57ACF08A0F62287531043EA497D6F48613133F
+BD84A9EA1F660F26660147B4C62EC20648FD4D079BCFEDCE8B96A32FAE2B53CE
+62557A1C739805245755ABF416A368D238FA86EF6C904EA55516A25F4A8DC805
+C9095D78D07E2F79A6C5FC0D4DE4F5A7B14C9809E1141C78705FD9B25A482E44
+D994E5718640CC735DE0412DDE3DBD6BC724446933E83655AF78F08094D074D8
+6890E72F22E5C1228E8D21444669C7BDF8FBE16454610FABF167A63B62C46673
+6CB69B77FB6F0D144CF7B7968668069C819F7D4DEB00343F0AD05B99E8F40DA8
+A3608556D5F823F4FE26B10C1A135161F7684FA93A64EC896097D65DAACC6830
+EE3ED51E612B7D60C85D0C035BE59D78DAAAB868561015257361686D668FB635
+6A4F1B01317B6A07BA91FA9DE649B378CF0C7A37E4BA8FBE74DF0C907DA0047D
+2014ACB6F7DE1698A8E689E23355F9A56E5B36F0A5220D010DB6CC174A78BA9F
+FC79C6ADF5E5FE639264BFAAC91F253876AF829D4A6F59EBB89FA5B00EBB3049
+78FAEAD988E030CC48D18FACB55D4683A5F4DCDEBD347C64CFF09E7AF1FAFAB3
+750A2C59C2FE52A678AEF44E4D72836F7EFB4DEE537F3FCB1B5F2F46EF3835AD
+A4725EE1695F778527E6BFB0D9C1574822D31DFD5B47219954E006F5CE225B7D
+6957FF7C3400031C01DD55BBE7CA2701D3D38E7B0ACE3F14B57876D9A66BD8B5
+42DD5654030E04F002139350208DCA6D83BA9DE34F437E85D5BECDD5E26FCCEC
+892C4AE075F7824261A87484135FD125C430448F2FD46C3C3C70B0AF9AC6C683
+E22995E1A8BEA75475A817C1B399D6C5D673ABAC95BE3DD7837397C609303655
+52442881BE93455BAE061A9A4BFD2824076AAE70418A52FCB61BDDE7B9EFB935
+0DFDDB6160FEC9A4409A4A8BBDC5AEECCA8A4978BA93A63270F06D8D08137C8D
+87D80FDEE637B74C9F26E0AAF1A42111D751877DF17302D3A09EADDB12B787F6
+15FAB9D634DCF45FF7D84597813143C6AA252DD2585BE200F4C0F25C17EE82CD
+564F0044838462C828EA8CDC0B4F7D995527A5425ED593FBADD183A1F488AB67
+1E9AD1A1041E867D2B988F300D87ACA7F675DC85CFA8A478CF2B8C4F1571CB64
+EE2A4F693BA8A7D6F7D0406A4157CA86BA4C64B285186AFAB6387B3D540CC02A
+01900D447BDBB936BC0F94EC4EFA96DC2D09FA22440376C718DC6742D24128E4
+581C8143652E5E07736BCC0A6E5A1C31A1B8E137A9914EA8A38EC38515582A2A
+5F21B9814F1B95A3A231501353800B112149C71F5CFD2E3A55B6179442A55EF9
+24834308DDB593652CB134C208A7F84A4E9FCF7D580FCE2AC4AADF08DB7A7EE7
+86B8079082EC5A1FF3D45B561B69B9F56C2698EB54888531D945421ADDF26BB4
+E4A5AD30D1DFEA597292757F308971BFDED158EC1A793462CFF812E6A809A388
+24795AA06078601971152F7EDC2973374DCF2C2D3945CB839E8CB7702F6E435A
+0E79F28BCDA3D3AA18B9B9C97673B75DF095B22D658C90D163F8DF0CA86214C0
+3D165234B14E373B20F8913638FF228FEFEF111DD0F930968F17EFDD8B87C05E
+0A3A895C202389DD7F5EA6855E2841E6DC01323992E8DD4516199CEF2EDD87C9
+5C1C8F4085C9B85ACF85316E22EE715FA188632115F151BCEE512805990FF3AB
+D8F4927DE10EACD49B720FD17EB260CB9F2BE96D7B50EF189E5579166A7DF683
+EDB55429F1A54AE9DDE34B4A9AA8DF685F8567967C263E2153458BF1E654E2FE
+C19BBBBE7409AF5DDFBF32F26D50EFDD0BB09A1D1106D9B963296034E7D6997F
+9BD4C3478CCA3549D3086930C6F9DF60D1DC3ABA1A289982699ACD964112E30E
+A1C568A53D701642DB80E2B2C0B6084B29F6FB73B0A9FCCD3ABEBAD6B3D58FD4
+1C5C45606AAF806333B354D19F58467B3C315D65B9A9109708966FB7F498A999
+CB0C7DAAC86F9A0F1488D9235A07D6D524BC88C8C212D80143EFFF603406BE2C
+C3108EF1CEE6F6DCF9A3C3CED684800E0E186EE7435A20F54DF2CA4F5539A6C5
+9A5907AEF0DB6AD436FCEF56C198768FAEAEC2D886DD94F7091C44621EED8DC3
+5737DD96B7B2860DC4EF1E0A2B7A963CF707C2C29DF918B7D3066652D6CFE261
+5D381B08F5711C594C03BC72875C384BC01556D907B0641DCE086EA20C621354
+1A2FF32AE1EC09D3F39A11D0FF0A710F4F9E0E7507B6951F96F8FE1E1CA43FDD
+34A511B7AE7D87FB7239CD88D1C0E203A6B9AE1AE673AE441352112FC8728874
+D6585EDEED161FE8303725036402609F36A62E1EF8C3014C4B67A986C741B5FA
+260A32768B2D1F7B23C4BFAE60AF5353AD6C300928427A5A6E942BA44A9BE95A
+E1D5EA5E14F4FE92129D28F01A3B61E49FC01FEC7367DA93FF88DE296A22D62C
+B464A027D7F151FCD84811B26FC115932A86F16EBB16EE974B39AAC5643E6EBA
+5383F1B29C499B66C09FBE07663CF953FBDFF9AB4F50C2DB63498CB80444A58D
+9A91332C23586D1735220BDE76CDE790E86C518C07DC1597ED533CFC62467BE0
+9EC9C70EC2A095F634DB70D5D7DF3D45F66318FBF8FB8316538DDEB13136AFE4
+84B5151453FC9400CF33D0DE81B429FA70449542CDEF957A23643B31ACC5D310
+07BEEA3E2964B17FD1BD27A18D4240C1F445E3B0C177611963A32249F614E521
+1C465B1870EDB7B3EA4B003F113776A8D9EBD060201A0EA68C0D1EAF6B414BAC
+D2CF83F811F5921C0BE37730D093F78B1B58F3E566690BAF966F573370B47AF9
+575EB124495710B9DA2F16EB1E33BEF989B63DD525F57B134D15D083326329BC
+64CCFC0688BFF7A8D56FC1A6A042A4C5BCA5FBB6CE393B990C33EDED14450F24
+1BBC77354E1B4C88A4E7928890379BB6A3083E3E2D29EBA2125F993A97462F01
+B8C47D06845FAEA3FB523C5CE5761050F4D7BE3C07EF80FC8A2D96FE16DA2F52
+2B50F6518446BF64A0717824F7F8BE9E4734BD4737DB4B613E7E3ED9395672EF
+E7F61A887996E5B8B44C94EF7D5800D04353C739043E5BE9F2B93AEB49180390
+BEA7B15653E02A52C70FFA11E3D6ADF017EECA77E97BA1D5DA509A251D585225
+E7FBB89E38482514CCFAE1B3871B36ED6421014B9BC9854247ED67F962F8582B
+A4471805054B1A62A064E1CDB4CDE6CEADA8C63E5013C99E5F35611C23F93A17
+5A39EAC64AC8CBB76B19F15C3E71AFE68FA93AD903E7D2C1CC094AEAADA2EA6C
+C639BFD4842A2B7C9ACE44433CC181EA2FF9BCDC47FEFFEC9CC0737B7088AF78
+29557E8C1F7A825AB31A7E64522EA9F2F3983C1EB14048B4FA453FC04879FB27
+A38584B80E4923D449D4C9171936934F8605FDA9905A5FD87CA1C44A31920C26
+E1EDEB80B835D8E7A647AE842792BAD46DC5F4E277E534D7641AD2FA14FF177A
+0802F81CDE37059B4568A8B06649D7950471FDA7056B675A90FC1FD4B8D380B7
+6BE5958AD92772AEB05010F911CC8FE665F72CF3B8174F7558ED94A3297AE918
+91512710D7F85D5892572B15A933E98E4498882A26EEB6FCFA55D90D48F4D84C
+55E3D32F5F8CD1827A5B5A3DD8B8322EC61558D1BC1E0432D9396F508B5E2B21
+4705FA448A68E087CB39A7A3A184A098EA095301A064638156CAF3A2AB163551
+3FBA7DA70C080D6F90A2F0F2EC614ADBFDF2CC0FA7A2FD8359014F3189765B48
+4EBF26C3B384108AF709CACE708076A951E1336FDB85F6D65CF93A5FCB00E81A
+AEFD1AC063CF370A5019183C85111E7C94F0B00E84E3B5A1A844FCB9FB350253
+59CC1D705A644E174B3132B017E6CF0690FB041A3598E43C5A7379E74A68AF3C
+91030D7E1AC1150B848BA3679B9FD4C389B1A5EED00B807798928A080FB8E2D3
+9E942BA6DC13C68EA2AEB352854A3DE429010E542C59D89FE3B5F3A2FD4A7CC7
+486ADFDC50AA172E0E199B31012D4D6F088082D695410566026F6A3E20F381F0
+03B53A3B6478F821E351F8BD8EF78F793DE6AE2C326308AAD96BCF38D0429D2D
+849E05706752C6407CBF8E174648D96EB30E797B7C8B4F95495D9B7D0EF1CA0B
+C228CABA268389ACF9581CD0F51DDB8CE99FD508AFC4A38DCF717734CC076A24
+6B28248F8529207CA64F929329B012A25BB61AAC60215C6F1E736F9CA55E80E7
+2E9DAAB650FBB96212005B08D389B6DC61EDF075B734DE09B98DF4129F9EC36E
+6596E2AC6418DB0C32138AB85430005710C758D7448DF224734D2E3923259B0D
+FC6B7065C867CA4AA8199093264518584E1AA9FAAE36087116086A2E9AC10CF4
+09D3EF67012D1593BB50C9BFC3B59C3600ED250D5C70251E978313933C3C9F59
+891C46B03F7A7091E77C557E7053D3812D7D693CB6C7DA4E0F489B207738D7F3
+3759FFEEC013B1691AF0C60798CAC322685D26060C9CE6EBF066D53F30F11D25
+894358D31207551EB0AFAF3AE1D1B66A6675EBF44C467C6758594A4D01DB0912
+EAC8754AE29E0B3C4D99AE6CF89BF5692934E7A07B0177F919FCCA9EBD323E15
+374291E778B3FE8A8A6CB9A69858F3278D8419AEBADA50B248D2D8C96EB63884
+0C27CB385767F01AD1AEAE9C6406EEBF21B2DFE26C759E2D955A74A28F06F0B9
+45E678A9D7813522CAD3A0A91DA860A6C7EF9AEDF3423FDD5558F1CF976280D9
+E85944B29D1050C2482B9D97A9357C0B3853F98BF7CE394C71A92FC724AD68AF
+6A9918F688DD40C917FA4AB39C175B185896FDA430AA88A9ED2516E8EA77BA83
+E45319F24D5E82DC9762FBA0B801B8D0E4F7DE641D4695A9F0A1212F53964508
+5A9C4113B36A9605092435B16E6F765DD95A1DDBD7B8697C94A943623025C291
+04B695920CF1B9C5554F9DAE95F05DF8B61B73A45FA4D65B8450CBD46BEB6AC9
+8CEB6211F698E70F355770ABBEB1951B89FA09CD5E71138F93E2CF3285A28E2A
+F075019DB6E974A032F5137B07B6A4C63DCA29E3D60137399A43D7FDA58DBC9B
+4EAC070EA82F1BF66D7FA3B06E721048AE9B31B7D5A3327AD85A866358D3AF40
+F062B1372AEBCB11CA70420FD18657C8687EFDFDD545ECEAA2F2BE2F34A05AC7
+7919093131B5849BEDBE80429648434A0302DAA9993A83316718E48CF96BCCFA
+F7A1D7E186DCF349C7070F7385E8AA028223DDBFF26F66CF215F61F28A6457DD
+1DCE4EA972AF73F231900E0A524ECEBCEB05BC23C5B7407643F8AB7D23423C82
+0A2534D9F582280D0D2445D3EBC42B471C2458E6FBABA52D938A0EC7876A2304
+9D8B04ADCBA20D1101284D4858F97AC95D6DC0111D1573CAFAE8F6F8446C43F1
+D3BC51596AD3C2FB6C69F2A9570795CACB459EDC78C52ADFB76E6784DA1B5FEB
+3F305ADDE49ADABEB42C5C01EA61946012C921133742255494D32060EE4A2455
+5BFDDC076F26692597EBDDEF9EC84E253A3B4219F3F13E6C94E3280E8D28BCA4
+E076025C91CC07A384B9962CFE482B734D545E0CFF7B941FA601C10B3E9C2518
+BAE689B889CD18AEB0220CCE3617E63906B7D8CFC26F95B5AE3564B4E9EA384D
+3BDF74E8436805ABFAADD9CB40A59095F3FCE96C07DE973CA7958B01D74F5046
+B942EDD853FEE099584E9D2E935C7745B7FF6BEA18DC184ECEF507D14276C680
+E6F07604A1ACA225A52E1C45DC5864068A90B65B98F78357240FB76F991F9364
+F00E4602A8701E1025B16B7F1A97F594B6FBD2A321B042DB35AA44F47D2D049B
+BF97DCB804CE4EE2EDA3C5D6BAFD1B214E35D23ED4F216961419152CC037D1B0
+2CA38A5111946C23CFE641DA07FD378590CA88F7743CA51DC77923CA75B681D6
+DC69B139588E6560692E351B2ACDAB8CC26A6341CFAFB2C3486DD98915BE765F
+4CD20807C525A85B515C0C16621D90623EC943B55F0771FE3737866867A47060
+CFAA4542902BE0677A53B77544E2CEFA3C04E2008598250F28688CAA37953C71
+6C190F7D4D7C4C63BB198454EBF42AB7EF205BC46C94890A7F694DEB313157D3
+53D9CC57F45C8B4B45205B34E3BC4E6E7ABB1637BF2FE53CBDA4DB86D96883DB
+13C3E0DAC10A36BBCD0EB98943C82C3D4EC140BFADACE3CA5837657905013F19
+5D656E299E99857911C105038B940013CF7120AD119DB6387FB82673C7425E41
+3EBD4C898BB6C4CA79327C5C8224755C09F406E7ADC5312F268D28113245C5A4
+1FD5187376C43B631A46606B5E4DD342EC3794ADB2668384C6074CD62C8B3FD3
+0E250A6010DC25AB2D9C2130372A7ABA5D99A55FFD5C2BFB361B6641950273B3
+DAEC41E29B5F4E4BE6C47B6F8B07BA114715715ED44A7EC9E5E02143E9158FEB
+D74AEC18677F3289490ED44AE41E5E644A88A2608259FD8289F70382ACF1FB65
+DFFB6068CB49E42D2BD143E716B2552F79AA583492AD1B0101FD8BCEE7408A15
+EC0F74F86AD1E5960B644CB98A0D7EF61BEB88CF986591C7CA593D4C335C2242
+FA9BDEC9EF27F959874CB790433050010B76C5C4E8E52F6081FE12B43B68511A
+F8E44C320C77ADF8BE420B49D01A35B2196D311C54746A890E309014B28AAB43
+5494C69A64116E35286FA70DEC52AAF6F01B279BF7C3EEC83C5F83A7E06B86C6
+C87AAC3F48CA4A46497A678D42D7F6E5B75EE084986050C72D2AE7403918FA52
+9448E84F0C13ED2E05C5046A86B785D6B28FC837CA0679AF787FC6B9E0BB6694
+6D9E6D362C0E5D2286AE2C5108059A6F1062FE5BF325ED0AD064CF9ED457D201
+920AD9DDC276D4AAE77F4FFFED8C3CDD938EF957C720CDB03ADC8D5802852EE0
+3889A623D3CBFE97DEA0AFB94E3E8E4D46A3C58327FE6F23958DF08B80D5F764
+08F1EFDF674493B0FDBEB2B19805DED353D9995ADC3DF804E574CAB0E954E3BA
+9C76607F322D2155D8473107715EF96A06A85A765F594814198083CF841C120C
+E1DDF6EB226382EBEC5547CC40BFCF24DA3383BB8CBB1C4E5C71AA04A49A32DB
+B08E650951358951785012DD855EB6F7BE2606215B61715CDFA9E3B7F74AE31E
+19814B61AD49AF25C42C298F52D4F4B1F0D72CA53CD511BF16D59F2E3F7FF3A3
+0228445FA2267D52A1049CC43EAC74C474E19CD574DECCDAC37366BA1C533BF2
+3590EB9E6E4E402D6B331BA57C25A9DE9CAA3551C2EA3B3B48D1193C811E94E6
+477C451A23203C0F901D5DF77A2BC15A54D0289D7E1D5F051DCBB6F97A2C0007
+64F1FDE12220479919B1AD7EDE462A28BDF5625FD11BCE29DC73B0F130D7B73E
+F1C956F0EB7D355530E80263FF95A3FD86C5BF5A8F9280A302EF55B50246177B
+FCBD3C8B4F29887FE682524ADED4B3EDBE4FE9C3174C072E24631D919E297DA9
+785E4CB724A606B8E056E3C12081ABC5E3CA9DF754330539089AF63B85F05938
+D871A58BC53C5ACA3A057302E0E5EC036145465AB04210B257753DFA9D75BE9D
+B57AAE25F11331C4E19B210B39ED8AC74C2A45640C7F914B56CA1D85DDD83ED5
+40D1E4370D44FC03C5DE5384AEF8B63BAF7BC7FC32349CB6611FDCC82B91D2C4
+BA111BEA7545081D250895C8E5BABE45DCE4FE11BA87E728E08FEB146281A44D
+00012518E56AC86BCA87308C247A99C14559D383B85F045BD99EC6EC40C4D2F0
+65701599595737E17FF4707E938D4163DC5C5DB95E2F4D4AD8E437F66A3C36A4
+C792D1687679DE42FFAB0BC754E5B1E43508C21FBB1A3DC304485C415A686657
+EA1A0E90C7322A364B8AE93425E044661F6556651D3F9873A102E87B0B68D8E5
+D468CE2F02359FF20CCE5CF53A22D19250A7ECB6940A98CBF7C3E2A664D1861F
+86EAACD43BCBBB0D888BAF4B5E90E90D32CA53BCD5660FC10866B9CA92E43DB4
+569CEEAE4CFD211763AD75B885B9C65A8AC553E5CBB5F2C4496DFDDEF46C0115
+0AE64EE489283932D13FC4DE2ABCA4795F3668C63416EB357062394DA0A826C1
+7E6B05CEA77CC0CB3322700F3E1ABF1E6CCF7BAB83B6B4026F03F1BBAD0A10C5
+5E8D9828C10AA29C5A2EA82730561D4019A0C6D131B433B9DD9BE471F66C15CA
+384266E8C1714EA8585BF507366B7FC0F0F797F40CF4A613FD15F033F88BB3A9
+9D5B2654E591B634D49253B2706A31E2F0B2A1C699D0890BC8FD4B25FCCFFF92
+809336ADA46928D535ECB86D167A081FCF19AE7BC30E56225E040AD75FB5DE61
+52C32A4649F2ECF10D3438E80A50F56FA3A43009C5C845838563EA25421030FA
+F79825592A51030E21F9BBC1536F33D2CBCFC1C22499C0F80503FCBE9BAF8BAD
+D35DF34D2875D4E6E83EDE725C829D4A53083484351BF341A8DF8004E20DEDAB
+607D9328425085A8F3E757917EBB775ABB9EB9969093AA44B58E092975ED4966
+5495E0E7E602F0D3194CD7672495CA11BFB1E80231258EFB746275FFEFCEB535
+A718A12D58827F2EB225400C6881451A4BBFDD4B46114779926BD485EFC8DE44
+D6DB332605AAA5A7FC1DE0B4C222E49A33C821426D8E368B931D0402AA1B839F
+1C5FE1C77C329F8DAC88B72EED01779E9C18ECB4369240460980C264FFE5ED13
+5897ABB3A748D0F855EB83796DBBC99917F6FE0C9CDF733AE4CF9A05CB96E88D
+B81C17897EA2B714F9B83342CA33D092C148EBFE2F5341CCF2CE1E4E1E5CF89C
+5AFBD1B998C0806AA39D7BBF68DB42F013A8E1328F1F32542D5636ED8EEA525F
+33F5E1204CAA6E8498CBA5F4B4C970F31F0E9D59ECA534D6B886BDE7B5617B46
+D0B6E8796F51A4CB169C64A2D5A4D04E53B46373A7824E35CD6BFE1017F733E3
+239A0B21E556C96D64CCA81665CEA5A1EFA5B91FEC17BB99DB9B16838A615890
+F6A235A1FD3E7746681EED1A73D9C0BA3F5F229B7C4F8BCE672F8535A6332894
+8C788FC18113BB20EB0C802995E333737D6EAAFDFFBEC04DA500B28E3B1B9CF9
+8A74D155FB6560060F9E8CF4E1EBB3B47043CEC18BF2B764EA71A7F7FABB50FF
+DE301187D740865EC7CA01A58A315D9E31D38476FC8F20FBC23F3A6658001088
+B9FD73F5164E3689210E6C88A83C1894AE8CDBB53E10EDA5C88839D7AFDC3910
+66B88A12BABC981BA4099C05EB047042785ECB701932C9CC4F96E8F5A2D20B11
+E908D9C619F1D579ECD5ED7998EEE848EE23066FA80292CCF13B0B33B15EFAF5
+5878F3CA17A08440DA18802A5C6E212BC7E3B8555E9DF231C1F9571D77E2C8F0
+81AF6E1B91E53C1B630BC5A149F863290A8A596F6D4C5205A6149C9E356ECA6A
+B827C7417010AB2750F020E0BECF6F40A3D356C708FFED6CCF928911AEA0D6C4
+A96F2C1F794C9F6B208646C25A60C65B00F7E0A3321F21B25D1064FAA29113B4
+8F3D1DD8A9F67AAE5200858A7A4EADAB2326FC8DC5069225F464B34A0E6DBC92
+7E960DBC2BE9E03657BF54552699CA523BAEA23D8B0FF3DB605B6802DBDA6421
+88D4B5950ADB9DCBF1CD9C6BA643463B09C725460A9B5CED29ABDB2813613A3E
+9546615A0E247A13FE0843433BB13DA9F53ECFF4661DED22C2E33542DB518D09
+BFDB906B8952BB029BE10DDB9DC059B59E4EC6E7BD2889F2ACC74402D9F96DC7
+7D8125154FA2407151A926147689035FC32C0AD2A606A9FE3107B5EE501280D6
+C75236BCFD6C422C1216ABDA87DD13B045E541F88D566214E579F8D3E6C8B68D
+0BFDBD1715628FF84A2F8778384F9E7B796F299AA3CB76B10C82F9D5CD7B0242
+3CF6091D12DE398C69F29F1DD5F11BD467995E35F6E296D48CA8EB7D4671575F
+4A53CB37F995A33A39AC6241B7FCAD9C1A8C23E14A9CCC0E233DB1C4888FE4CC
+709DDA2563CE6F834131994CEFF5692B0E4945A2CA672913FD17E2A5C58D0EFA
+268AFA4A39E948D2084F0AC14F1F59A0AABEED9322A1BEE00959499A657EB681
+A32E13A6BFA469078B6E752C48EEBD614A48B8238105D61EC32FCA6D27C0F914
+E665E9D87C5EA62B53F1E7C4CE2E7CBF07319ED1608C9E9E3F1258C463C1C100
+2554DD5265D35A13B3CD9304BBFF08096EA237C9178F88BAC17EE12E2AA7CD29
+CCD7E976F6A102DF7EF4947846F415DED6E60D180B22EC9E91C81227CD167583
+BADFA76080A434CA059E64BADA0BEB2B0E91AE2013BA5D23D3FC1ED9519027CF
+D3E3E2482786E08B3B35D2B6E14BAD2E24C6F437BFE4CCAC08C67F2D61971C9D
+D30381D9CC8882FB245FD0BBA73EE79C1C5EA7892239B54198CA4F2DB0D77267
+38CFA22A1D8A53030602FF834C0717B3E372559D9347215675DA86CBCF01DFF9
+C46451FA26844D4B3864D9C6879F3062F8F851B552876BD15CC84504EE8D5B25
+E981F9AD4FDCE79FF59366236C19D41126BE0003908E91DFF2A3CE3A42A9ED9F
+FA8272446D31ACF35067CFA838C0D1D023C7F99F45194550851B4A11584F1EB9
+9C0E3967867C92A260D815A28CAA5CC842F313BCF1140C5C2146F2FD25A46243
+320A1C5A27725472E5640211DB0F01EA82640C880EB557298E54B1CC27CBDF6E
+C2AF67684B23B6822210207E45E302AEF4F9DC2F2A3B9B7F321243057D881DFF
+5DA582555915ADF2297C99CC0561B26C194B764B7FA2B1837B6C5F087FCB9CF7
+D718DD816FDDBC26012531473A1521E63A724D95C73D29987105C38AE741D75F
+76B95C4CEAE23A6D1D29B494D089F9B1750243E6C2443C37484721BBAA145979
+0B65E86F97F81D1A44D9AFAF762604FA442B33E0B985F8414AC699284C05FA83
+802D0ABCB947971C2DCB161661D1F38F96081E974504C00DB0D89D8BE113493A
+1A248CE00F8A54DD352BBC2728F509853EE05A1C6FF40C6DF5CD7B2968344F1F
+2350E9B88FF8415CE0E113D22DCC6E5980E5FCE557A3BC64E141B4458150347B
+168E35237A245A1D1532A7C1E8AA487271BB4DC122C0C75E47AD7E7A1C35BAF1
+BB797EA981CC72DC550BFEDAEE0DC722AD62AE9554FE9E822D2BEF7E9EC838C4
+4995143A593CF33BD92E37B12D3A8F29DE6EDD8B98401AD25FE73F3505F18369
+5A5DF007C4ABA613145AF6A8B7B06F1FDEBAE506DFE8585265ABFE2D662F1ACF
+BDFADA70EF86FDC577EFAC8B24C7C399CD098E1A0DEB65E8C95C2C773D2B1092
+1A39F5AD71DFB6EF8192FA1DA31156D08205792B948D26FA1FA3BC6F5F3275FC
+BADD90204837A228544B30AE0B0F8470DE34B9C928A980958FF01C481BA1480D
+998D4A6D648B97C060EE44AF668BC1546F7309E685C1A00D8227B4B7C5F17E78
+A89809823590469C0343177A54DEECC1BCEC612AE333F34981A28F78A0FCAA78
+116FD3C17B19EED4E55C01ADF0F8895EEA12D45B4F3A25AB605A263DE932276D
+16B9B72BEDEA2FFA8F493D119B2721F72DD3CE0F1DC7365386B63CAFD774D142
+388527F0A02394F0C5502E3768ABAB2C080FBE5A832EA82D6FF99C5A65AF5D33
+F667F0225B9F319F054C475780DDA9C6F1C8F0FD0505AE8AAEF27D0D1CC330A6
+410825436D6CC0842D91EEE3B5F198AD84CD3423177602D521570365078AE6C8
+8079A4A0D87E599C0876AED67FFB3FD13886CB536EA2F022326A00A121CAB893
+01CD94FFAACCCFEE2B2167FBBC4A62F6B40BEA1AAF1EAC43AFFBD70E53B80039
+6CFA90D932D1E597C040D98BDA0B019D36ADFAE872EC1BD91ED628994D071EBC
+F62659CBDF3EF702D0FA67EB9F95E2BA245F1957EC8BF8D5D1F7271CF8CF3837
+A07B3367ACCF0B4C4CFD30A374FA5C9156FEA1F05AD54FEB2C377AAA7911C614
+582AEDC105D97B86408C005F597F861D8FED1F401D3AFB853AADA4E81C57D744
+227F9ED2E1FA8A46C68679A5561CC83BEBCCC2B432EDC0FBEF5BA4B925B6BA76
+965CD982D5CD469FA31C5BB567171AD4D79B62894ADC3BC94749B4FC2D137759
+2892026E16A0F372EA323AB51E23C114F30BE247CB5F2BB4E3656F660A8F0C31
+25C43E7F0DD10669E2B0819D62A402AC1F403B3B3E42181207A8FD19EC9C9EA2
+00CEBB75DB7B7D1969CD18DDEF18B7A20B0D3F702455B4CB9705BDCA36B09397
+B76D7ADBB40E2037288F57C2CA99EABB9870E1D1CD7F3F2DDBA010D641BFDBD4
+321CC05839ADC1D3ADCA67B2FDD3C5A3B4D703ACE6EF665F7293162B39051CEB
+4CEAD2CFDE2AD38C1DEF0076325E869CC4279164A66D8922957AFDA10DDE38BA
+C8237AFCE135D3EDD082B4E3FCEF82E6402E44F4511F823AECED2B222DB97856
+26E846408D556491567CC4259FFC7BD9C0838652714B3CFC61F44C9BEBA4485E
+53718997739101069F14B2A1900FA728515D0BA26FAE48BDE871091AB3B6EA90
+8C2D42858E8DAD44FD2DDEE93C0785EF10A4EB9185C429750820DEFF528796FF
+1F668B63762870C23768712FD62382311C8C4737065E8FFDEF70B3DBACDFF083
+49DB6627FA66567048891BA794EDDDC9C5A1C47F60EC1E0B5744C26B4B110900
+04FEDC8143AF0DC2B02F29342CE024D6D5876E5DB59D7323A28B265FE2578FB6
+2BF0EA9F0D85987E3C7B9C4B8E491D9193D40A5E0BCCCB3E9D9428386881A3F0
+CC586A6A6C1B256976F03A0BA5028ACE4E5AFCEC7CA47FAD65FEB559B3F7B0B4
+A24316CDABCD387BE5E241A11BA2D3F48A9951FDCBEB6DDB9227B78CACA27A75
+371A9CBC4F2BE12D139E79ACBBE5760A3A0A044583B334FF524BB1D5F0FA54AA
+6ADBCAC4D6F6C01213D0C6B54BA8554B49765ECFCF8456014B7179876B88FD81
+0725C7106266B3B9241E6EE12535771864EFD3C31EA57772239B7DA8B9139C5A
+2E3AD47B2A27E560CFD6DA87776E3D66D19A9351B1E352E829A7127BCB0F9713
+83E3E5FF6301535F372C38DFB8310CDE0FF24806A4B97B608C8B249EA1D60E76
+AACBBE28B7C4A3581F977680F67C5C3A5FB412E481AE7A11417DBB7D8B2ED528
+658E92B8B0B1FEDFB8F4DEF05D2CCC42F6B57703A33EDBB4852BE8E975E4C6CF
+1085908476EC40C50CA746BD761318481936B71639B24011BF652347BEE3FDA2
+FEC5BEBA0F5A5609F5B834DB04746D4395B08B1AD4CC45B7D24099259DE86DE0
+F5C0638881A9C92C09B14B24AE8230E47E53B4785B52989911C164A58FDCB167
+2B0390701EC7B6287D9C942BD519449A4754C9AC7C0A22BB500B2A32A55208CC
+2DE0E516483DE632789471B8D46260290AC32C26FE2E31389A604490A087D0DB
+81937C0F9C0B15714F2410133CCCFDB6F0B0FCF95897DA3E0AFD783FD9AD2BE4
+6D21A6BE877592E404475471648F8205483B894BE866799E772533AA33728D4E
+F54C1354822020AFBBFA7B4BEC6F3FD9B26D6EF307618DA000C56ABC87D98643
+D543A519FC8D61A2B86C7E18364EAB4D31A48EDC70869DEB8044A17FA8B2CBA5
+224851AFB9FE49CD5219376D6EE66772EE27FF6419557E845C2B0426D793CC2A
+3165B3EEA6A1A13F421C8CA3E47C93106B0B6202D86C5A31C1122AA3F17A86BD
+065EA5A687EA3B1ED324A9F36246919BA50117492866DD545E42A1186979FC71
+DDFC98C8A6FDD649B17DEE9FF4AFD78920A75FF69ADEF128077DCB3F5FF601C8
+96599F8C9168D7229BE969E5AE9A08166EC40E890D1DD8B62E29AFD2E3B406A8
+73396BABAAFC158C6A92390B33598F8C643DD4FBDB760D2D202815DE41E8A471
+039F8D61F8033532CD100F07D726D0D92E68338C014C88B274357D554EBCC802
+265288D9E554ADA4CB6D1431D0CD94CB3D1A26675EFD6D036BC583D242710A8F
+19751007530B1CB76025D04432FBB38D7468FD4203D9A47F7E67C636ACA10E19
+A9FA72D3DF82FB37474966A58AA01C5F7568DC7D4668ADE721BA5219CEAAFD3C
+AE372963DF037ED7574AA890AD12463C5109B5CF23E54DE574CCA937D5C49BF1
+F763F6380300887970BB22246FCF5B2B2EB69942748A30BCF9A003BC6FBCA2C7
+325284834812EAB44F42921A116B12D184F9EBCDD8B782933A1BA9ED1F33F97B
+548D72EDE27B24A0A8714E6A847254763CA5AF040D304D75E376A43F9CF839ED
+1D9E2BEDD3C0BB55E19B8C5FD48CD785AAF3FD381CD301C75B6BCD63CDC52D0E
+3DB72DFD034AFCBD61DE9C83AB58A593D727B6EAB8217CC38FD5AB57FF1DBF78
+01B4CB52D6E888339B00FF527F839026787F743EC13446C2B9BC6C73E24C5E75
+29AE3FD77A54E341F0D40DE696FB0C11E12252BE4B039A80618E1B9C824744C6
+E918CA1230C1A1B389AE706AC4E4974A204854CF371E655A80CADBB400DD8F8D
+A6C3C168A237B5DD57E69FFFF2D670268242A54A2A30DF8EE3D6802EB60B8568
+F101F3B8081563E133B5589666278217DE793AEDA75F72A50A558EF3C4E2DFB7
+6CAEF16C7FC19C7C2EF3A1288E1B77064CC245CB799CA5DE7D709C1DA186AF22
+1453CB15AED504F92D27201EB935E397D85983135B606265449423D878AD8B0D
+C53B9461A91F46AD34F5CB1A3A0264B6305C01273C84CBA9761260A30C36BCA2
+F9CF25CB60710671DC2EA7D9D48444E53DB4F4FC0803BF617632C87EB04D54EC
+B729E72DCCE2B88CF6A4FCBE878615FC4A1728D456E911F904965FF49CF1CE7D
+69B4EC40857946FD8A761310B2D2AB5B753D6A47C11C789D682A23E7F80416DF
+4834804F7E600AD21CC2930429D479319E970CE129AEC7AEEDB3CBCFCB311693
+FA4F4C645405B6C9A6C5DD437F6D8D320C36DB8C34C8883218B913C3B9F3787C
+DE794BDCF63BE1BE6AD878880243BB1F5DB700A5FEBEB48E8778827FC428A1D5
+
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMTT9
+%!PS-AdobeFont-1.0: CMTT9 003.002
+%%Title: CMTT9
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMTT9.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMTT9 known{/CMTT9 findfont dup/UniqueID known{dup
+/UniqueID get 5000831 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMTT9 def
+/FontBBox {-6 -233 542 698 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMTT9.) readonly def
+/FullName (CMTT9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 33 /exclam put
+dup 34 /quotedbl put
+dup 35 /numbersign put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 54 /six put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 91 /bracketleft put
+dup 92 /backslash put
+dup 93 /bracketright put
+dup 95 /underscore put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /braceleft put
+dup 124 /bar put
+dup 125 /braceright put
+dup 126 /asciitilde put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E6BABDA4215500A0
+42D1A3D0D02C0C98BB1D6ED0B7791274C38B038FC7921FF1FB8FAE7258C09259
+4B8E1BD9EDCEDE9ADAD9BD9598EEA9691589649A9A21539161E374075BEE3457
+689F308A4A7AC9F2FE4B301A6C36B0442FB92E3B002623493DC087800B5A0521
+0DB96A23175AC584DE166F59142779F26FEE9783E28DE49FC3A8D6583EE63FBA
+610DA773CA18ACE6F64A4867A1A7817120ABF9DE4D17782866E6CB6B65A9F6D8
+3667C8D3E61E5356E35343FDD4C6436DF73934470916CB5F0ECEA6BFF092E735
+C7C355B56189D1DD5715EC97E50145FFC17BB1497315A9585D713A7A6DFC7933
+995468EFD0F59E3C15865B87925A3F2930E20D5A35970E2C44F1629FA16E00EE
+EE21EFC50D49F5BC02300D0A7BB85E649CB4E2E828C8B1C5469463013E71D723
+2CB11BCBAC191AC751A2AF7FC228395CE9472DC1809052012AEC2CD66695DAF0
+4CA04234F0187F4116C93F59A7F1F8123DE87F111853B785A20CA8B49B3B0CEC
+B11AD345E1A11578D2EFEB0536D125237086CC8CD9F34A5137AC5DDFD8746014
+D74AAE8239B81ACF65F379CF2153B06A238A2D767F294CAE0D79228F0B7D45CE
+510AC9657A1776202FEF42F96D476E7DF407786AEA12DEA0013D3B4C5D0640F5
+BC5BB72C34066270399CE595827175B23B25072723BD24E07F6BCD9EF0175DEF
+93714BAA53960F81103CFB731CED4A267B53727BCA3C97B0BA5004055D4EF0EC
+F725658E53AC86E4061B489AD4154915C3981B3B703E1E2A8D390CCECCA99385
+45EBE35441B062D7D12DAB2B31569387187D74A4043FD71F1C6D352EAE0F6757
+4345FBFB6DB15CAE47CAC4BAE47AECAE5FF5EC19057DCEFA1B23F47364ABDF47
+088A7C6A2AE26B10459B6D41CB69182FD1472F326CE3A15B59255D1DE3B616D8
+9D1F12561038839781E657C896B8C58A32DF5AEA23732A0966D96C68C988ED7A
+09B7E2C8F9F3D0D56879764781566299A4EDD3588BDF70E3D924D25074F30988
+E35BDD827AE4D0B4A06F55A9976BF0DB3C0B1D09CD08E8CB168B50617691638C
+0EC1A791C228177D4FFB021EC3DF5082CA3487AD2EFC8DE9466A690ADDB4C52A
+FE2A6DB4CC275CD33D9136E735279FBB2008D59E667905EBB04326EC33C98B2C
+94744B7F540D86E90DED64572ECF1EAD3A58EC101642B245A9C7232DC8FB8741
+03F97883BB32FB955C22F878FA0FD114451A3B3859B0B5537AFAB73AEC7DB2BF
+409E1FB41D473714F6BEA73CB085139879FA31710E01915C2938C37BAD6D7D71
+45B897E00857D3931A489EAC7B42BCE4E65F73F67FE027CE482DC47598ABCB95
+39E98DA8ECA3E23F0799D5963ABA6E2984DEACBE7B46B40ADC6213E0F4D08971
+58F68C946C748E4B4217CBA2391BE2086C9758F4E32C9B6413E48D84D33A6E85
+84747029C0A9C9B92841D217A902BA8EB333999D62FDA9F82BFC8ED11F67988A
+0CAE42182E414A9766AFFF4B046A09D476F8E3F15A8C7829BEE982D8350BDF5F
+F215F2BBBF68D4B567BAB798B9604C79306C475926E9FEC0F07A99F43473C6FD
+B15AC29C3D07FEBAD1BAFF75AAF2FBE94F104F1DBF838044FAD94B661B06AECD
+D9AEBD02B60CA4546DD6B5B5C1A3833ED07845671CEFCA8955CE0DE5DB8FC93B
+3306683CBFB8E5B79A863DE78D455DE9D592043C2686F88A43140F8B9F3B553B
+7047420E93E753829F8D47AC7621CFE3626F271E31F0019CC02D0B57F67BB47D
+8CFB63E902EA3231C00EC66EEC0D30FE8394558BD3535C888C4CEFC6EB72E737
+712ADC6300162D5D79BEE0CA1F6E4127A0BC90656C01692F6D82C85550AFC97E
+C2693E379160FDB9636FA41AE9C75B7F6643B05971C6D67CE30971D590FC07B3
+E0B36B4D1C7F25110B5DA2130D574FA292B47322975A2BADBDB39AAE69BDDBDA
+A880F9AAB580117708C79204DFFDC08BF4A48919B5C22228845CE8C3109E93AC
+2479E523B8A1C12A6E541118F121DC6B4EAED83491A03192D5C3A2A45D1A2467
+757E7B377C635CF5CAE11A7CB49D49F3A1BB2286090B5F0E4F89869D1771D50C
+54B5C5E091E3048A2C194F0ED00DD64FB95BAC6FA9D61ECD093ED416DA3A4981
+DB07CFF17C4F55C62DF628EBFF06FAC3F3D3F91C30EBB34052BE1A08F5EDA4B9
+08977197950A282B84E21D43C64BE3AE4BCE22C70E7D392DE09D89B7F23351AD
+6AD37225C12BA79EC9951F5DA1E505DB26200190ADE0E549305B7530CB86EFD2
+A896F13A97E51754F70B609CB4511CEFC38BA579C071E9510A49982389980DC5
+336D6C4A2DB100DFEC4055C7AA9C55880F94FBEA9EB280BEF66CB8E1E38A359D
+E5AFB12B540CD599085ADDA7FC2C72E7C873015773FFEECA2C596B75BC39A3EB
+3C43FA2E53C0D7993042F3D652BCC483E48B7F6C94C3FF6D38E276086A6AE67A
+E5A571B9C72E0D7824E0BC2ADF51A393B9E334649F786EC1923C854382B89627
+1B9E701AE5A6C42E672B2C6A33C8BBCA8F69B9061E787D6B92183F20CF4C3903
+FF5417427B84798C82BE28D2C81624E3920CA61EC9EADB364B5A6E50E49A1A72
+A9A090A1FCD84814B8B2708AD787D2B5015DA1305874F58C5EB62F843685FCB6
+465FCA80176CAB2B2FE65E0A270BCE1E3DB97564BEDFAE5CA44395A8DF4505C0
+3E103CC3B914359B2870DA6CD30382EAE8949131CFE31E9E75C3E47A3834BB32
+CF183D4A8B9001710D0A11390C9DAD116196568591D38C2AF4ADD852F31494EF
+573462759A35415900360882739789D6B89ACEFA251C5ED90ED704DD7C3C80CA
+9F6CDED69537D201D520C99E69EEAD5D3C0EB84C166660B3C190166D93EDFE6D
+15BCB6DC5CDCA825E48D33845CC2FB15291AAB823F25CF8BB0A1EAED8BEC524D
+D9CA016027141FAC9D35B64FB9C224552F29EF6B32497254E319090E698FD8A5
+15491CDFE1B988C79A0E3B9D01E12FF084E9FA86CCAE02A3EE6F2917B61A2CC1
+64B8CAF309D1AB48A34227A7729DFF99CB6EC282E3FAEDD2673779AA7E4C1789
+D93FDC37FE95F087C5F88F53D30A2DA9C913BF205FC6BDD060A40184F4AAEB3C
+D080D63B89CA3DEFF310D09EF0A83F3914BD5B7932980ECE139EF0313C20B4C8
+576EE0FE3F28FAF4D3CE7CD0890BC824A85B8EF4636BDF1EF1BB519F93D36540
+ED09FAF93FD71992CA2CE2E83F5355162ECEB32AD218092F45D5A61A44E67135
+EF0453589CECDC6962D0E8DA7E7567603BAF50B2C8F1CA65EA5320984E7D69AC
+9A7D3D7F92565D79E8C9DD2D92CCA7DE9CD058545E9F98AA47904D70E1897099
+3C4C852B3BA131DDD348433C336BDF5FBDFB62120DDEAEB3255E3207B0C84A0A
+1ECF9EC869DB9BFA3693B03FCB27C5A5D3CDD62630DEDE91B4DD5B9784BF0BDD
+FC6EEC3FA7ACA9E15FAE47CDD9B7FCD2BF0EFA10716F08C0AF25FF67CB6F9598
+C607D2FCA452417D2C69DC808A9441A66492394C3450BD30632AE739EAD654BA
+4343459CA36B6D5B2C12C39495952F2EF93D82C73E33236785A79609E260C4E0
+CF3A3C950DE71DDC3939D42DB1CB1CA917CEAD56979A70F8F3B207C805319FA7
+3C000AE2B21D711A6D78C7BFB901334DC06F59EAB6D94B507734C27971F8458D
+D00193645AB92FB8FE163D5C51AE4F40BDB4F2C51691E76EE0636F071F37AAA9
+BA78BD12459CA499210EB0CE2F8BD317387797C33F5933AE7A6264DA06B4A6A6
+1188326147A16B205D1F965872DED7D8EDB3294FAD2FCDF0D423329E9CCF879D
+4E0B966D509F45527F7609DD09694D286F6FF7535EF8971B7DFBAF608A19D442
+C133207EB1152ABBD11C455D0977F66A9B73E51381D1CA4B66E87C0C7175A63D
+80C699A052F00C41DAEF42E7A40E07B1B14107AB0787E24E17C1462960E3C54C
+AE73BE4924464FB177EC62F116B2822842541543EFF7ABDDEE197D6BD8F8D4E6
+59175D8C5957550B70BE775AD52FFF6E7C00DA7CDC16E1DF7446BB5D8FD82647
+3E9F87D5EA365C82A2D991321ECB14A9E3AEADC5A56665DF7072D6DAE402BCB6
+14D92B17F9E063E4E9D8D239C91F5C7C0BCD2FBD936C9D4A0B57659420343B59
+B395BBD1AB5B6003F653699D57E7581F9813CC98D4F072FB78899D6DECC42D34
+F2787EDEA64058B46C4BFAA2BB96E9BE5CACE8D91E4C080ADFC0FA0D4A29C6B8
+54FEA9E11DBCF53D9CA40A21AE5076451EDAB3593E56B6D453DC8EAB8C78B588
+34D4C4F36861B5649BC1E9F3091E704BDA7613ED45C911DFECA74EEA05165191
+825F95A947CAF382FBAF01F3B8B041ACCDF39718D7DC5BA6CA12BB20EEE96439
+BF2E2628AA3BD2C91998E6247A690FCB0CC95F286F427345CC4F1115BA3A6E54
+4743355F2CC991CBDFF5725902C1F5A6DEFDC8638A26EA456C33C27773D6214F
+66536CD2E44FD253531732D5A8C44B336B1BB47B0477350EB8CF74889B93402E
+2356A9CAAFCA562315D8E0B3F42F08932CB87BA2499A875AFA08D11DA73B38AF
+F46D03B7F639A8D7BF88CF07FFF4E91716DCCE6E2CCAB60A64D5E40EFD8B336A
+1BFCC4CB04F49DE1FBDE7AA5B2092A6EDBD913D161A3271AB6411622D0E14416
+37F81E0102F5B0F2F9A2B27819E4BACD7C50E29D6291AE5B0973C657761545A6
+741729620EF2BF1046B3913399C10982EE5F4142CF461EA31042E432CC79A1A1
+39C607D22E45A6DEC008CB4BF6007CDE9DD5802B49A62C8E02A6D448B64177CC
+887AD71D171B99E7ABE2085B37D90B3BD8513995D9A57F53184DA474F6DB5E49
+B73E04CC214EA5398DF7D7541F94E623E8687B511640457A48A68E9D9D6584CD
+15B57CC044D8091C771D175F2EEDD411099BC8F7B4317DC503BB5E405AEEB526
+5E6E1B1F2705275D274E012A98F66075CEB90AFC648B964DDC0E9C4AE7B24CE1
+80B051022E5781A533A21DCFB97893847D685137EAD85BA708A7E118C72FA839
+A9E460B5D17365A0AF1F53A98319FB64A5819B087F554BC056C4BE44113A5404
+BEF759F890C1CA5E7AE156F4F8106FDB4F8DFCCC640976983EADB30976344048
+2A86D7B2AF4A01CA736B98D52ACE392AD4BECE7E61C710B08B66F01857CA460B
+B8376E257113E10F6DEDF14CE2A4E6A99ECBCD302C36CADB713D849EAE9EB598
+F29DC98531D793B79F83091F9B136809E006F34E423D528CC4309AFFB3EEB47B
+9A9DE4D5B25CE953345C326BCBE2B4912641780637783084D3D12693F8135483
+CBB0AC4EE0B5610D7CEB7DF205830BDB9BB404DC1B28FB0824CC187B26C19A91
+DA0025EC739BF3993700101D042DED86D67F5FB87912CFC51AA7DF53F2162D62
+6314A2CE13810D0B8D81F45771391A236422CFA0F35F7A0CDF14ACB2724AA57B
+7C2C28D53029B1146558610E0CFBBF72A85AB9BA308F846228F299F13F68E8F7
+D963B2EE9EF7D4C21690632B640BDDAD0556EFA4EFBF035F13377ABB5CBC280B
+9E0C12AACB153C93351E5BA95A7D149010E204950A59C7FC6581D9703468C1E9
+EFAE37E7E6ACB892B3F8D1248D9A4A72F642FECC5E0B25C15EEB921EDDE84D12
+0E524FE6133C4921FF4921242392C12FBE69744D53739F7E849C1B96C4020AB2
+1FF10DEA608F111749E2FBD8DBCB17F353DCB3075B4F4B8186963EFE95A76A10
+85AA5BB6DB4095291974221829A8E436680F4860E01C3843BE5BB3101D0869C0
+EFCE08D187BC04F58C7A450A59093680A0F09E8E3F12DF5223E7EAFEFA01978F
+D8354753A68022CC92C71F2CA732DADAA8A466D4AAE5999B0DC077715671F518
+E6277741F44AE798EE50DF44CCF71FCF8BC71F76374005FEBC4883C6EDA854B0
+88C0C2B476709AA809ECE41AE786DB1A32B3FBBCC14921673578D3514C8CA842
+E1FF90BE33F7B93ADF6BFB8B1AFBBD080783BEF056A6BFAEF676F7BF9F2DFCC8
+01D255A9F0391951210D60D4D4DCA93AA858B38C0D7B8FD740D5FC6F277C2A68
+54CC2DE1F40B6347201FCA2A0A91822708D820CE645C3E4E5A09FE25721AB33A
+97871ED448F38FC5A349D81F402B34461D840D5768BFC6849439AB6115104F78
+B87115B1DAE12542EA898F86ACE247709817850B067F537E6137196101D46DD2
+D842EA03EF4501E34074E8458E638ACC4EB349A7430AB035BEF2DD4CE00554F9
+18F9FE32A55AC1E7E50D64AAFDA278D77A7149C59DC5B1E3064A4B281A54C9CE
+A5EA94ABEAE4C6D5674C208ABC72563976487136AF2E21F835BEFD232D7F0D13
+1D19932367F51D5379934DA7F1635AC51EE5CEBFA63D4D32F018DEF13624EE62
+31DAE68A08DBE3B4FDAAFC75291C8C6CC7A657E3C7453C7D1461A36E88E633D5
+408253B673AD87A9FB2D0F56DF1305916D14D5DD62051E27BCE09CEE9A1F14AF
+1D7164BA5FB6E6EC8D38750F7E28BE330909F303ECDEE692E347DE13C8C2F82E
+29C8BE6EFD76546F362A12A1C2DC12389EA95ACB4DCBE95620F0C193EAD91B33
+BAAC5801AE827B9AB3FCE5D11D1D7854F8FA8A31670119CC0CA98628F801838B
+AAC7EF90AC5466BE69CE3E3CD9951A5EB9AC08014285422F6DA6F6E221BB30F8
+0042A11F2E4B765BB0D142AD52F4D85785EA71B2E1CE20728B9E9306CE93268D
+99B822A5AB5232EC7E26EE1160850AD3905864A01357F22722B6A54D4EBE58CE
+480EAD9FBF068EE965AC4B5FD2FA8CCB91ECFC6E90B9C49268CA0B0FDAD23ADC
+D5A74B41149BB08454054C451AD0DA4CCF8B60F2EBD061AA03A011D548B6B481
+FAB00AF9225BB5463F27FD67333FB51F8664536267E95CFAA0BE3BC1B8F889CB
+587A3A4FA2B45864F07E11372C9507A625C0030EF7030A0B4D931BCC48F6DD51
+A4D1F63FDC4B59C1CB18E6242E9F4B4B8AD9755B870FE60D640181FB7EB8120C
+C56F51DC8C47FCC6318C2145EDCBEFA7BC4253315BA67FD2B3D4AF6A9F3F229C
+AB75B592EADE15B1FB5FDBA1C0F786BD21A51506B7A2E42C2D086BA6F84D1B3D
+AC7531545F0B01346831FF36A52CAC1E390F99AEDC265B44B0FC9C581BBA6BE4
+48B723811EBCAEA5FEFAEA7E5B987F2C7B3E9A65D2D14A7B74F099401C57E367
+385352D0776D2A908F7A5A2E4D4160946C5591397877025C8C387CA413EFED56
+8B142E8341E349DB4DBA422A4FEE56A573972A0C66590175158E48850A9F7F38
+4B95726787B8F969FDBC97491CC81CABC976CD00A27D1DFCA7CF467A956C1C6C
+839817AEF8794B6151FAE9261119DD5DB787DC9D3B420FD325ED6599FACADE0C
+320D54C2E0D296537E22C1783670A9D9BECAEC63853EC2F05A990260DC189D63
+7CCC0BDDF2CF7585071ABAC14630666737041194D0777EA4292AE60BD7F7100E
+DB568C90F0D899EA006CA423CFFD6EC70A5D3D8AC43C747DBAD3B02219E47D8D
+DE030631F4678C357A58ECC52782B31B50CFD44EC33F41585E51B27E3997D33F
+461BEF897220AEC80007F13C5A1EE3A0430CA899047DF944831F8B010A7DE74A
+BFD26001472DC00CDC9F17CC435F61ADAD4E9AE062ED477FC621FDDF9242C449
+1BB3F77FDD1519A251B663A693D84B42BF0962F537757F38CE5C5D56B98AB10A
+3B70C8AE8D52DCAFCEC22E7B09D3C4EFDA1841C74CA975E4F8294F7BDC796500
+0ABE197ED3737A65F7BAE601C91DB3983EAE11DA3EA18ABBBA3650DC361C2E77
+EF9F97618B0C337A906FF39926D2B0B7883ABBA650816C4C6B34EEA836994EEA
+AFEDDE56E0099D0E09EB88EB093544B9BF4871200746A0409C475FC4232A38D8
+F3105B0FF44E4F132378DD12D9E796412FD0F9478322215E9F59E69396C35AC4
+097C4995B2C3BAB2DD04B1A7097DE16DFDD76465E79ADEEBA90489ADD0914EBA
+53E11A43ECB11D072C68D2131BE1C7C43CB9DD5FBA0A67BA43D6851AD4CD3BC7
+39AE2E22CCC183A56CEB71D4F9F578518E376426E42B6390426A8434B5A83E78
+77A5B9963BAECD5FA5521C2A29418764E4EC1A72462B04957F823E2817A7F8D0
+1512919889500024B1C42EC107E8B8533C0B314EE4E23313A4C1BDB009A2073F
+9BAB479A3F9DA76CCD65629CCEF78015ADBC2D0D124B3BB2D322FC4D209E417D
+84BC3C758B6AB64A01E25C9C7B71D741AF90A19A339F99A0BE9FC39622F04C6F
+737474CFEC19C890A657BCE192B9DCD8F273CDC5294875DD4507DC572551C934
+9C362FD595A429FDA2D815959461B0CC2A804C1142BD91C7567082699B8E274C
+6A22806D6C51B7DA809BE9F612EC537D4FF3122644AE0718BBDC6ADEFE7EDBCB
+8C8A76CBB280E70ADFE563C01CB9EB828ECFCD365825941C8B7E1B1401AF773E
+0D3E8A6F2D62624F8F5FD1EC3CC76254E4CCB4D8E4DF0D5E6DE10BC1FD8BC325
+05E773E0925B6838E0D7ACF12AE32E572F6642EA587806FD2805C9147B873194
+788B8162F3C20C915E4909B72D0A62D4A2B63B3825F96C42625DA10FC0E9ADCD
+77F50821EC585193A56698ABDF8822AD65F853F06E4171E1A1AC06E5C57691D5
+90523A7F03DC50F41C46D72151717149566C2D356C1A75FE76619AE45B9CD605
+D3A0B33690F9431CE242042149A2E42BC6A9356F786ED9B7674C243C8AED9D77
+636564B36A52EAC1EE25999127F925F8755EA21272E3AFC856EA92F1B1E130A6
+9486E1DBE81C78914A157EEF0414901AC8BF313A9F444FB2844405C263105609
+9E302C68BACCE64BB7945535F2F9C2872DBA3A602BFDDC2C6438B302B8D96DE5
+F537A714B7D2BF4C8B6915011D38800C0922B7089E1F58A5A6DF1D426261FFD3
+8496FC59ABEF5653D244E51DC18D750C61F4AFE49961F461F60F05664DF2395B
+7CF8112611AD3C6BE0D64AD95CD956DA57C6E641EA2DFB4F84B441D627E68C6A
+ED7CD840D1B199AD4B428C6FCC8E0E4CE294433A4C8A4F1E498B5ADC74B75490
+60C206487C101F03F8704FAD6B22DF1BE74DBB61631B2426EAECE3BC8120EABC
+A4B87B7D1C47DC03DC1F132E4A4671129F793002C5163D5A341BF2339A0DE9EA
+F6CE84D02DFA57BBB021EF5B165E47F01EFD7441F57D5072F4649F2C6A9271EC
+6333129DC28B1DF6641E7BDE87E27B19D474DA41A43A6F985CFBABDA93BD0C9E
+4552DDE651D58874023F062CEF99CCB280E75E6ACD9170013E67ABCFB7765B63
+8D5778C5B9294A5F9EB8165B534CCF2345373D744D46DCABB2386EACF24FBFDC
+945B43021D51381512993D0CCE214FDF11143F608964E2E4458BC307618FB066
+D0A09A1D3986B9B2BEBEF6CCB56B060D92488CED8F8657B779DCD06FAE5DDEA9
+AF3DEE61771BEB0106B8446FFF798BDA4522241ED5A3C2201B859CF99E487A9D
+6D09F1F4E15771BD8B827C0C6FAC0C68CA005767EEA79C653D10B357B2F35AB8
+E27E9A9E1647B8B0695D9B3361D5C4DD1C8502307AB8D589E8E7730CF4E79138
+DC663A160F8B48A09E2463A3884F7110DA86DBAC85BCDF0F2FB642D3A32079BF
+3EA12A6EC68F1B16886B92C447C6C671D056C625D983A59AFDEDDB11F5CA4607
+849A561FF10F2D8AC4C7A07FE97CD0D40EF2FA3C70CBA1003A32B6F1E6AF34CB
+297A8161614ECF7582E57A0C28073664DACE0B1F5975CA309A313954912428F3
+EB1FD70B512C6BA2807E7DE61C4DEA4AF0F975BD0813D74C3E7DC9B0FC48B19F
+8AE1D32B736870819CA75057B963C1AFB107309889506B0905CA55B6F3021515
+B0B6A1C0F298421CD24784B89EA18251ECB9E9F76C0A61CB6B61CE4FC18E84D4
+C7ED481808433D1AD785D0E66ACC21F5DD37CFE2DAB64F3D23E0BED8A8E21058
+94802B93AB33E5B66B126C818CCE25F58852380D0A46A10BAFFA90979FE3C5D6
+C1A41AB044D3A12D258AA40B505A7E167FB20697D5607D83C90F512DFBF4B8FB
+F0AEA744390E9D06FBED2D1D5708EDE5C4365CADB27F9126DE2D0D91448776A0
+1CB4091C21D62A253B12FE336DF35BD4B322890B0AAAFE6B917E584156632567
+136AB50A591298F50D9B7756AE5B9DC1CA48C08E564BFD1AB5AACA99027E5950
+E12037FA2BB52BC7F430096C7CCC2E6E49036B2EDC04602B42047659ED14B344
+996D0819CB04E198855E16E34FAB061B23CAB292B6A3A33A692ED38128193D37
+C8CC57648A3E641593A39E464E46D260B38391EC6C54A5866E555F46AB175457
+7EF1CF14F518D86A975E0741C75816DEABB25DCD1BF501F3F7FDBE8940DD1256
+8386A7D8FF00994FD669D6377A279C6833A2D4AFA5BA3B02925B1D4C8547268F
+408B524D3F9CEEA491A0A7D81843317C001EBF830C369B61205CF76201FCE5A3
+B2A5A6D96F9F22212CEE6D220337B2F0799EA3BC4AE337CB463AAA21C79C57DA
+02A2E0A60931AD78E20D5471DA17C2480346818533D131A62C5630ECA98D24FA
+03612960B26BEF1FC3A01B45348CF695D4A2C2B69B15EEEEE49B7DB78B03F39D
+A6694E0E1CDCF75945810A6388412487107C38BC9632D637FA26ADE3EA61F5D6
+3D48E4873A03C7DA132CCA34530F27504B51DD425A3E74DFCC5BB227F63B82BB
+6C854F5447F3517A794A78753775ACC29A61DD380CBA00EB25730E613C11899D
+B5542B8F0F4C80FD9ED2073D9A5EFD3D4126F64CCD5B3626B6B8C0014C31C9AF
+E638C4E9381415F903DE7B554B1BC135138F12926805CA71A11D6551078FA370
+08AB0C884EB5EDD95994D4D1C5D8DB1412DF91DDBC521339479DD06F5CDC1A20
+0E35304ABAC27079C48B688B3E138026764E6F579503D13E2A87C11903360655
+2E3EE587F8DF681F6514BC853425BE7178778B0B95A9107FEB58A69CFC9CC845
+D13AA5DA512CCD45886411C0809CCDA5B28F54E5C1EF261C280E0B218F6E28BA
+2D97F92962D962F48F753A61FA204411DB939E77120B8069155754B663029E00
+D7397C001E098A45D84FC93AA3407F8BE54CF5052FFBD2780E3A78CC0F6292E5
+17A6DDB977B817CD9EE2FF76EB1ECD06A7E36D256BA05DC8E523B63FF807E1C4
+198E61EF3537B05706F8B58286DB806A9F4380AA85982EF8A053F52E26D28D4E
+5EE719E725A624A024AD029984C35E6502FF21CFA2EB865D910F667F810F4A19
+855F8051CBBAB71EED5F57ACDF4718EAC86910C8B38FD1EE596E98A0F95BE413
+885D92B2412DB15C27E8A88C7DC20781CB6D9197F6063554777A3E2AB59A3369
+916C3554B025B6EC0792F09D0396F6AE8CBAAF647CBC58FDA759A4AE2BBA8F01
+C9DD5208A58C25210A8F6B8EE44C2E83FB0C5819ACE93D946A822FC5D1A5B329
+8B7883E0DA2555B6905EB07D3EFE3A5F5354B7A6DA5FE2FAF2A8DD8ED3A095C3
+7D7EE87ED1947EFA55EECB85E9944C9B3D9DB1B2B46A88D2B4F0276188C758DB
+A7A9B5F9EC59C67A553831CDB326C1C6D38528911BBE5C9CAA2A845B6D34AA1D
+4876501B96E9E4515DA1242E6FCA80EDDEA1E3D2DE9C549844D239A9CFB3905E
+984FD2AE71E9D356077A261EC502B8D8BAD6C5CE9C1711D65CCECB52D69BBA9C
+B2A5BF994B7405D09AD22C54D1A8D4893FC7DAAE7D9CAB00AB3FB61F7F56A88E
+A6146C98CDDA05078DC0387E8B35C5D460D21E19372E6056E5E4B23A2F2FB3EF
+1DDB4E5312E0B2A4631C546A7CB1CA2A3EE23795BBFD061A44CA4A2F6F5A5E0C
+4560FFCD520E8F235D6B768D119B83163CC1B13547DC447575DFCFFE1E06DDE6
+4A0F0AD5C08BBE48432B15FC9D144E6ED679107C81D1117E7A7ADDD5723F4EF5
+235E44730BA14F7AA0737B933590C453162240A1E712FF1436BF8CC9312ADD0C
+2825E46187ABD85D9661B7A84F57BD78A35E7684F6F9E6ED1B1552D2DE55119A
+0C1CE4CD1712EC5A318CF4B9A389C8120F332043129F24E341BA41D5C1FDFEDB
+B3777549F7ED355DCECBB56EE36622E0F2D22B3F37B0DB808920807577ED7230
+35DA36AB230E3D914E653D94859F257149E617D82F5EA6E6D1B6C17C96008260
+3730E3370F9F979A98CF71F9E38D592992251AD5B1DFB03FC466DBC7485D641C
+97E5FA71484745A41CD87B4C1AB959A4B7E1404E30E8133E5707258A0236461F
+58C7F5FB1F0CBDADC204311590FCE4C7B0165690CC869F221EE486217770B65A
+980677F4B80A045587EF3F0C71E90DF404BA8F1BD7A3DCAE406A9EBDB2CC2E8D
+E4D25A8ABF1B4F67D5A1DA34C6F67AD574F71E894A52DA063FBDC6A5F35E2385
+14809CDE8D4C549DA24DBD6B41359F474C0ADAB4B17F5FCA1DB304C685687DA8
+510292B17FDBA634EAC57DCEF505025DD1BB9AC7D186AB560A57871840FCBA7B
+7FC606D2643015E570A3917F89A7586D71AF8CA24D56E71284C979F37F59C921
+7E7F33B1F62A556CAD6F0F43B0D31BDC3FC92082C3216A3B4960086D578BB797
+0ADDC78CFAE010530E09A86F950BA7DF855D0CF9EEE48E726D32DDBF97469277
+0856D2C19F819DD0086BB19C9A445F76C4745E3EEAEF48A86FC7F62EAFBD0D3E
+E5FE58DA688C278CE3C4806230C33DE2E6927D1A0621910C75FB0F6BBF85FEFE
+8F6E8B55E2CC59E2E33F1CE139E08C3195F0BB3653A45434BAF26A3D8D150CEF
+52C48C478E651A5F413E89DC60A7A16D7B73F7F90B070AF22F560A7CD2EDE5DF
+D3136617AA3CBDA07AD5BAE734E54A99C00EA3B4B46511C93D5ECC962E96A35A
+EB39D6DEEFB06D6E2E4C027A47E8EA8EC2FF0F4A9C84E5D3CF4273E50DFA722B
+5D60C918C6981B8627F1B4F4BCC31426317D3EBC95C25B53255557AF2DF70199
+1974A9F67FA7E7F545081C54F3103E4A45FE2C439368DA42D72FF4ACBFB14B5A
+73597AB5E1EDC92A3A0BF4FFC68E9E74D0244573145959130142D903015C8D82
+F0558015D3FD56C45472D1346AD727639D26DD574C9DE0A4FFF51498B78C9653
+05CFC327139DE48316D7790E8CD1A9D0D5606ABFAB745F17C5E90244A209CE56
+298384344A2A216EDFE7D5E7906BA6E7E03EEC80B10E2F3ADD160ED4A21E5E0B
+B64BB6FCC7893D6074E8884BAD38B4DFB61F429CE906062D8C37488433BA7FCF
+F305D8C59C900C6F36BD72C2F48344C6C8B69DDD304212B539C950B9C40ECDF8
+01134774881EFFC2E7BBB8465311A852099D9379C7522BF903496DEAAD12D7E8
+C662DA12A6DA3E3A99D7DDC0DC81221BFB27F1CF2FC6CC1679F09B89FBF66130
+4CD106B99AAEA0AAB0FB6C3C43C2405FB979459C27CFA6CAC2A453157AA7712C
+E4C4EB0D03E6F4DB648CB2FF46A7BCBCCA740AF8D03F4E032BC1F07B58A28C7F
+20C67A9F5DB3036769493076258B474F7F2B11F78E1600A1AD228963B37E86A6
+20440597F89F67A08C07AF0CF3E3628C9698B4103B7E296FD5D78491695958CB
+4F61366EEBA51C3A7F22D7DFA81FAC74483D6BD1E17718D8608D728D45FFFF41
+AA925D4FB248EBA78A31BC2E4EDA9B4BDECF75E69C1572B02724AE0E88A47C2C
+2606B0D5A952E0705AC500DDFDBD9653D4CA984EF9CCC2DB8F0E70853D172D61
+8510F07D0CEB47AF4BC8EEC06D2AABA4125CE96FD28D9CEFCF6201A70C139900
+1AF6D4CF7DC807FD1A8202AB8B0C005067BCD3AEBB482BA2F8B8FA44D3DC7338
+CAAA8D46A5EA05B8B1A868493F8B503393678AB75C5F7649332BEFC624F1693A
+3E34ECDE22A60891F423950A854F3BB1F6B4959AB0EABFA8955D67F42734C8C6
+23F6FC71518A86FF0E1804E7CC09CAA830479D9CC01CD03EDE50DADEDB16FAE7
+9CA4ACEC7AAA5E704290A2F7527DEBA2CDC1444F027EC86C81367F54516C1654
+5E11FEE3F10FFCA2D74206F365D53655BD8FA76BAA8F8C78696D47591BCE88DC
+B12AB8176EB03BC115F99B7D88C56F2A3400040637386FB86D093CFC38814F2A
+F1616AD54EC908AB3AEB11C61E3AE380D99FEA37B1D594559A904278CF2425A6
+012729A40062BB0AB84A0FCB86A3F5D04561B93A77CF011F4DE3ECFF5E0B004B
+933084F930F0AF3437D59447EEA731352339492A0685B45101CBFB5B8259E6A6
+3583582DFF0529E4AA5806AC2F6C9C448B0422C8125CF30259325E05B0A85EFF
+C20FFAF525F73604DD2CEC421190B3A47875BAD36104DA1D80283DF395B6B87C
+961E613CE164B60DC343D3AA6D7065149B412C3CC3FC1BFF415652F99F698B52
+31FE11816B341B2E2BEA3F7D7732B5C9E0C754027486D56B1D2268B981B81C30
+9FE2AC2F949990068F30403E3243CB7E4A448A4CB05CCC59B9C19CCACD03E428
+E423CEAC7B976B59ACEDB3FF08B094AC3E969C99AAF5EA974F3FF61C5C663B53
+8878F3885945B1A3299C219976D2842AA5DEBB5428E1A0864CF48BE957C7BE41
+66861F3B4BA7CBCEF06B80137F83E351D8CA3D5051BBB3D2E1EFCA8905061D14
+643A240BEA6AEFD788B00A807FBCCD4557E191A51D62D9729C98D1FC4BDB776C
+781E824E0FB8B5900C41ACCE7831C4F6AB814BC7CB47ED8031DF80F517AA5E44
+45046B25AC5F3474135E429142E5BC33D924CBA166596FAF5D25E732C79C2AE5
+F3095A5D565B855E15A585FE57EC321B7D904BFB9EA2D724A085F298888EF252
+938DFA23FFCFF6A1A1AB9436CC63DA9B560B074BBFD39E552DBB8D174ECDF5A0
+FD92ECCD75EF488732377DBF97C7069851AC0EBFC3AC4226A534FDE26B47527B
+0DA64B77BA16385223580B784D1E74DE433186809AFE97A7B51514E4F665D14C
+D1968CDCFBD8E50ACE4D76442D68FF726EB83685DD0FC3B14DAFAAE06A894CB2
+D2CDA2C50FFBA709023472951955D39E7467E978DEA8371A935390407C01FD50
+C8B393DDF202F0BB76B7572FCAEE5FD588C6F01AAAD38C99B277C501DF5C25B8
+56F5BBEB4FD1BB379563093D54247A365CC66E04A09EEB1702FF946B2DA1247E
+15D82AD0078AE820CB71AE2481C3B23EB86A5295CA58E00BC638EF541D4644A2
+748E7AD3212B1E297F583AC4EEDB93641F2B7C0817245326322B0AF2C2028EBD
+6EEA236F8E774B379AA00D7BF9B9AA8D9978649FD1CC8DFD7C145F36E2CAE63D
+157480ADE56A69DCA2BA077F8AFCBA252DF716D99442EE7286DC74CEF7F539E4
+11EBE1B2914351CF6D12FBD2658285129176D0566F2104CF95589AF2CEFB1DF7
+CBA05FDAD557F3279007CF49BB3783470BC974F47408BE287877ADDDC30DB1D1
+1ECF880973C5ABEC997DC089A91EC2781B77D4B1BB436C785B9EFDAD04FD6B17
+22B53DE2A271A527E2A4A98875A041F5E1DA7BBB96BB550DD32ADEB761B561C6
+71266E345FE58024F192ED4D918892CF596AA20791D196AF8034F94F8EC9AB76
+625595C86424B94BA9143E035ABB4405A6CD2240CA82A6F38ECFC0629C877482
+AC4DB88AFB832A4659B60CE2F2781BA482C8CD801D55C165055B404F1DC8D6F9
+7748CAD55829445A5985D4DA6F0B2BAD86A6435CBA6D314712C260C4DA58CD29
+BDE901ADAEA60C3AE82F9D52CEB3E29AFDC1E03B4CB387987BE958F3DC449A5C
+ABA0F3E720378B1FDD5D4B6F8F96432380A83E0664AFD7C9D8F85A0034403E2F
+8CBE7840B219589C7E7D7E20A12684F0D01239D1D41CEA6B48361C390BAED783
+DC6692FE202F3C7146F8C4B799A4ED5D6558DCF34793CFE86D7AAD1B27CDD541
+293E1DFE875F5F397349FFBA48015435855269CE3E82E320EDBF3DBD81243C85
+E7235E75A98EE2F7A8F5B2C90E2C213B13B9CB1776B8AF2D5F4753A812B2EFEA
+E9BEB45F4B3CC3C35DB9526E3B2AE4C1AEA573970E588FFD894EEA7F4F29DF14
+61AC620D18337395F04E2F05D2CA8280BFFEC6F56E1862D19E891D753DE8114C
+76CB8C88429A0706B68B2FB53D73D80DA80A88519174D0993427FC39CF7CC668
+F2FB56CFB3F26F9E2F35743AA8BC2530930EE7B330314BE7A4AB21882FC84522
+4AAF8A9B58AB8CA2E316B29EDAEE4A140FBBB591398A86BBB933AC07B0931CA2
+086842ED8B3CBA0EA117C5B0FEF0DC8D4293435CF92998916C53346435048556
+A36B15C19BE595C8055959299645BE7B56E3A3353F443E90E0A9540E8F5433B8
+FCA78FBD369DCFCA049E4EA27E890FE125DAB0AB6DEF649E23F34F2FA46BB1EB
+CC1A041CF273F94DBAC2ABAD5E225DD6046B03CEDC518E8A13DA56E4AD6E36A4
+BB319081EC89978E4215940DD715795D07A61221705ADC30DD8D6343BB3427D4
+DB7B910D256F65B9BB9202C482B190C7FEB04EDBF80EF23EB3C17DB117B501BA
+3CB89B34300BDB9A0B97ECAC87536EC94FE2D74B48CE2A14C0AB0F50F54E6D7A
+88DBC59FF9D3C33D8AD4D3F1CD47F3A4E7E181500A4A96EE73A2954DF83F1D64
+9C1257D65FDCD057BFBFC9A18534B5BEE8902ACCA38D313F992FFAAB300FAE74
+5D7FE062C4C1AF0EA71A1F4C2D34313BE0F6DB1CA515A9F10DB27560D24B6D0A
+6090E9099E59F59C0AD9FF714967B00A741B691A5D11B6042402C5584E487295
+F4DCE8FACE662E1FCAF88601F9C076AF879790F742B4B1C00A15642E3ECD4661
+995F0151413F513C28A365634A73596D5DFDC010D53C07AE9052A8F9E3C5C557
+D5434ECA23B77A3DAF392919FD782EAADDC4D121F91EF04666444661D94783BB
+240252B7C302AD0D5DA1994246D768424B449A3D1B160210C0F3296D34D63290
+D40FC924B1956C2F21EAEFDBCD302C1DF97ADA7748EF8BE4D9C746706DA02399
+04FEB35B54B61AE0131EAFFF5F410E586948EED156937E836A5DEC3204DD8C8E
+E556B8EDA52064864FB9776CC1E05E6181C549C10F09296924E6FD7BA07CA23E
+783F7EFC19B869E903640009A37AB5A47A3F394FAD97F7EF0A1DBEF5C74BB515
+70016BE28E8FA12F9A10E15C1EE3B31E4CEFEDEB385FD9B5019A5BD57681F9B1
+C05AFD6B83A1FDEF4E4789245BED5F4CBCFC4838A89491FE93FBC5773A89737D
+35588EF3CD0C9ECD89FFD27A7FF414A9B7CB89FAD15E692E509C65F3AF36A346
+6C8AEFF5AC7CC50262B24F75CFD7C44A977D9A34F89ABAB25A957B3657C76D31
+0F02B398202E98A8C65742FF5BB296BA192D3FA12B617A0F3EF5FA1502B4D519
+9D2301D2089CB47A16606CA16BED608743AEF37E9DD4BE4B6E90AAD8D12B27CD
+DD26A6B8B67277DFCC46855EB23EE26492311CF9A8DC0C39241284284DEEA02F
+4F358E3A47A2D5A7B349A22E46BFF61BADBE1C86E111B50E7297459F0F18FA3D
+CE461031BAC0D1DA78AC387DE0EA454005598217978529D5089EACB059D99642
+5DF928E23215B6E5DAA35DAEC505AE112EB1F8E127898FBEE7C8A54EDD0C2ED8
+C75AE6DA5BDC0BB86086AB7E64DE8EF6A1495D81ED8DE1A59796769164CD417B
+46C45C9A3686C7A8FCCAD6F7BEBBCE514655FFFA6228A8312A5BC50538DC2CCD
+3E59DD99D6E4147DE8F3983B031C03D07125107E20604545A43BD7880D3423C3
+5E0261158F004423D18607C2BF0A39BCB65A685BCF2A391FBA8844C3ACC37067
+64B2803C5FDC03D43668E31489BA7004B06E7C4C874834586ECF7B00035DB428
+E4421E6A6651393FCA5057DD05AF837AC75AFA4106B354F3026710B5E101CE9D
+830602A5D6704780155DE76792D9A3F2EAEE4734B3E1E87C85801C50834DFBC1
+DB501193CFA6763795F2387BE9218F33072ACF3DDEB08946119F3C9B71AB2F1F
+D1FA74C1AABC8668A8770B120DC488F988F68F08FBF4DD6B44104673D927A39F
+27E00683A10FA6322F30244431EC032DE80300F6E55414BAF8BE15C308F95A89
+E3665655592F74B91FD7F71B7638CA14E0E1C273FAD0B9F84BE5FCF3533DEE1C
+9E8E5A654EC3ED9693A38BF2617C0367229D6FDA89B2288827B98A8917C65D11
+5F47124E457C20FAFABA69E18044169FEFEAF870ABEBBF08BCE5F3C7E1EF8970
+66B5B5AB84F3AC7EB3E55C9546DD38C096F7221AC728ABA58FE76FF090164587
+45C0C6C83A858307703AF33E31ECBD76350C9408454F90C04E9F106B659DD02D
+5824BAC124F4547215C3A1CC3D38CCB90765731744736903F24271B9D8D3BE66
+5790DEA93EBF0C8E5EC7F70721C00205BAF4C7BB4B6637F5C4CB0F2858A7E1F8
+93F56B29E08B5CB9185433A3CD281F9AC60576DD1BC993C08D61111347350861
+783244234AB06A2B5F94134721164E3F09296B2CC51D09C1CF55211160A43837
+3210EFC0B9892BFFC4BA6F4B37F9084382E4C8329C564DC321A88A4AEEE84812
+2863DF387D3FD8F5752305598E941412CFC362BD40C1B3F30B42BE007C52DEF6
+0570FAEB855BD314989DA4590AD1D4A89BE78DAF819D776F9ECA616B88FFB866
+7A0E1F09D20849ACAA5D08DF3C31ACCCB086F55B75310685D4E3ACAED8B1A467
+706F72366FE39727DEDC6DBA504D24D9736EAE848E97C61131FABF70740BA88D
+50125D6E12D3AF5644475779C0EF186EFC4A63FACA5D8A2A40BBC627FB743DF8
+6B2E912FE4499B9D5FB2A75DD37A900A01FAC066796BDBA13C9E32B86F5C272B
+4B0480D4FFF49C5097C7590BEEB0224C91ABBCCCFF307BDEFA90E08446BBCA0D
+3AE04D1B6B27D672617C8F9F88083E172CA368109A7C982B5B696F74FC9AA09F
+E1C83A6ADF5A458985D9521953259835D0AE78E1E5F46F4A22F4CC5766EC5220
+CD8E11FB08D53D5F37AEB5E88E48D20BF8CC58E870A59B125059639581432D34
+99943D762D20ABC4D1D3DB1E97744753DF3B3C975952D6FBF22C0A2BE79551EB
+3F63FB6F3F4D95BE06A9C776E7F1FDCE2318EBAF88D9F39CD438EFF576D905E6
+EB8984AFB3975CBF69A86E7D7585BC830EF5E23E069147106302D1EE530340F8
+347DB627B7A0BA0A446225E964EFE1727EF63CDF7D015C3874D92B642CA3A4C2
+BC20830B3475098718D29588F44504B7BBA9B3114A312EACFFE8087F1CAA7273
+7C85F63CB022B89433E2FD51F24F08F0026CC3718CFB2E80D116EE6F2F970918
+B40D5CD8FAFD1B3521C30FBA07E165F6EFF498A37E458C3C2748F8B76FB6DEC0
+E544DDE2A0EB0E8E13FE9F6BFE93419830E428C5D359470838FB7C28317488B4
+531ADE2C830507F77705AD6891DD9A9FB229D08EF1AD6320CBFD44AEDF48F270
+A5E44BC0FD3AAF090D3AC47AF8E60C24F39E1AA2187387CB1E2E95AFF46D6035
+AF7305F28FF3FF34232E62610F4A042BEA25E6DB4C13311FB2373405683C31EC
+AF28B816DC2DE3A755FA83BA05B76F3A9FFC64402CB2B1FD8DDE4503FB0FAA6C
+487A0E98B5FA21D2D0E0C08E95D4853C6B94FA64420B4156F604EC2904AF7517
+D37608E12E15E4A0694B6D156D042DCF390D2FBA766FEAC58202134C2D830D5B
+6C73AA9ACCEACC970166FFDBCDE630296CD3B2EA3E358F2B664CE2C483157344
+22E31B86E17E87BE0D226E3CAC1E28FCA18E0BDDAAA4911B4B0CFC1611DE0D36
+9476DA0B14A81808160D1AF72B3596CD9D52F422E49ADB32631337F434445CCE
+79AC26BEE9593567E6D3EF1C34F0EB319113EB747A222A9BF802502AB151E8D4
+F7D855C4722B69A5C273C55BEBE22C6EFDF368E7A8C96CF52633BFC5D8DFBFB8
+4D1869FCF68D5F12805505EF0AFD01C3363A2761E074C8F1B65CFCC31676E8CF
+49DAADA1DC8A4083EDAA612B511D11EBB48C8AA68B46C9BE82F02111BCE83751
+4B898EF55DEB2B08C623F6BE1116532AD67AEFE0AC912B6B6A0CD5DF0AE34305
+3E0A6399F9583688D9A6CC489D3A78C6E91E231AB397870A35772B4B3E2A21B6
+323D8D4C0EA2E90AF4F1733AE639682987390BA69229A5B1250C707D7968C24E
+FD0A41618549071E30C3B9D52726B19169E57944B1B308DCC548D33C37112BD7
+F40D3E924A44344EE55DABFDB38BD54527D69F0143F1531CAC341E2F6DD01E1C
+2ADF7600DA63A36382CF208CC0A66BAE48C602264F24E531A15167B91BB7AF0E
+1C26FFBD08B83BA63CB1AA44C10EFB8BA65C69B6E7D1F9E31E59FA199DE21D04
+214497337A255731A41A1007A9467588B8970A4DBA19A82B5AB3F1A625F41986
+F30D0FF266F1B01E6C7122CFE08644615006345390CDDC83DC092E21BCA8A10C
+FC90B8BD2840189AED7E8454F2892A27A5F1EDAF3DCFBBD0B6B70E0D9382005A
+453216284D819AE346D6625BBA0649CB036993C81BC8DE47DC0E7A842229D11E
+CFCF6B6529AFB2982269BD9749D705DA9C50EEED1E170DCEA5FD8911DFACF3EC
+B611B64A8E5F0E6C832442937EEC88C846E5D1FF75F727D46A06985171BB644F
+CC176EF60C923F702D7DB188BE640A0576235B348185B1FE7BD4ADCD3672D721
+27D2C69A59DBB5DAE9B8D0D4FF08307C836C96966BC34AB4B86291E5128293C1
+BCEE06A9753BD16B7A46BD446B44A0D13DC6430C035812F0F7DA4AFD0D28F149
+CA679E12FD6B84FADDA55BEE84925D5C31AB08AFC3CB7405AAF3401BAABAA91E
+DCF901F1C02D33C3067F2C70A7ACFC4C64D6028079AA8E034EF5A5827DA7BC27
+EFCCC8D9BC327FC1C7A28391DBC107055EB1E72AF7D7C5B2A0FF5FE8B87FC6EE
+E8719B150520D46D80A7D04129A78B5D4352885EC2F0F00571842ED025FBCA12
+CECDD3C8872BE5A946C227D13DE562E04B14B0E8662A86E99FD207F7CC7C03A9
+10E7D4BCF20403E31BA872D19D919A2E62878D85A722A7FDF6C9647077560503
+80E15736CC7A15C036E0E393D40EB0869E04875142A7A785270E445ED15A0D31
+79682041D4E06BD186ADA99B1114D20BC49EAAB01165403C71FE0753F1DAF1BB
+CCEEE569B7F35D05AD3A350914F18543F58B4217653FC1DC4E11B6B4F551F3C3
+EE7B4E155E96360ECCE1725A52E092247A7122D2CEB207C4515E161C6C7DF458
+4CDB8A7D169013D0B88DEA979C0FC29B0823BC382FE5A0A652ADC92C205B2BE1
+E56E7F8A6C2CA338DAB9207C4B34D6BFA688651F33A4AC17B9E4E233677ACC38
+819100D84A65658C0D534EFA1E4CD6711BF1FD9A3D8ECE96330E30D98D1DCDB6
+9ECB183FC19F36D5557E8CDE45A7DEA5F2DBB7B39FB12655900B54383E159B38
+BA15EE7BDE96EE0FCA3826ECED79205EF09EC5D22B45E9ADFD8BD63A930BD880
+A257596D32D565B22EA79873AFE995AE22D80CFBD17493103EC15203DD451D77
+9E5FF077766122DFA39C19A75F725249C5FD6F6172DAB38104C8D9EF17C59976
+2608766EEA72D15D016A14B61224D3B7E036BAD6DF9303C09D0303F938190A9D
+896E2C51DA6F4BAB7E4125FDD6BD7F9E8F53A7B2BF06767D34539156BAD603B8
+0FC62ABC3AE2E2F87FC4A2A02493840EF44EEEE69B4CDBAF94E5F47469A788B2
+7DD2B0F561FEE6AF0B9A3A32B4398EF8385B45D44B093E507054F87483CC7A65
+54DE0F2D372E93AD7767460E35450ADAA100B66A55774D603E80E977F2CBDAFF
+48D50247FCD4A9745C549BDEA2A3A484970AB11C148047C070A67766ADDAA645
+A0E69F0A798522A9DBC96C5A3DD2095ADE685AD822A19904F07BC9F124303FDD
+2AB94120A04B8451843E2E17D77AB45AA4CC5EB54D656D04EB50408019EB5823
+B09E7E03A1FC293CDCFFE0AE30AE4F10A674FA76B89F1C77E0F1D1BE8D7D6340
+7D2B3B34817F51067AA93013B2807465E774D3684CBE3461EA7077CB7D3098ED
+B90F319B4245D49EA0C0E941180CD5DD6E5C7EA09FCEA5BEABCBE65F172EB8CA
+FD3ECA8939644924DDFF6563CDE2104B71321DB5621BE2BB04A47C9AE0B4C089
+1CDEA1F22ACA1AC6D51E2BFDE746AC5AAAF50E6EA8AF1A8511F3174561C72D77
+3E31FD25760D29E06BFC439EFD31742A1CA3D80286BEE71D52541FDF1A4562DA
+086C6E8FCE2144148757F04199D70F1F5C815167086A7D2425ADF1B847669F22
+70D989E9FF76C9B8A78E83359924C0A0B71C0839D813FCF5AE63F122A4B29460
+354A69963C86F84B2C45271FD4A55D17EC3AAF29CC912F17BAA000B6AC6C1F8C
+16F49AD587D291B5FAE5CFA1C14248CF27C26D7041C10BB062153AB19C533A7D
+36DD9F4FAEC118D7F6BE81AC93E5DB9D518D363D2EC9CCA6680DE4CAA10E0853
+8AF5620B8126F7CED1C74902DBDD7C57FC66FFC8D9161D81B4D8ED83396CB0B6
+969124F5DEB10BB2CF08941FD99C12730F943A156ABD9474E00CF928EF98A85D
+4A54CB66168C6353F8AA45E91E303EA35F9A2F9ED1934F01044E8AFF92F6FC5E
+23234178CED72963406AB794EF3EF1CC77065B0C34B61ED9B8FB9E012B932B1E
+C571D76EDAAC5F5D1824D33F3B1870ACE8511C58380CB1EC520251FCE68CF0CA
+CA867B41EA77DC779335472A31CA940D5AF95226E6DB5CAD012718519743F5CC
+953F4C54096155E5208D976A95F949ECD1F60CED24153087E43B5C9852705C63
+48A34256DE0CB89A7D3D8672975F67115106B253ED23F3F047F58B28FFB51C95
+FA8DC5EE05936CE3FA9DA0FCB262B1352559BA47A777CF7FE5203ED95715BB7C
+CCAA97D93652BD828F28E0121EEE2636559DBEAC5C1232C9328E59D95F7860D4
+E41D8A0CBF0DACD52496D758AEBFBD49FC98786A65FFB437F8F771A68AC6ED14
+6ECBADA8180624157386803078C0ECB02BB7B932C39F6DC6E8AAC9332564795F
+5230E53F828495C18360B7B3EC221247BEB7442A5EDF74227BAE75A00C20FAF8
+573E01A5877EB85DE496E36AB3794AD3515D2AC9E13A955FE19B1F3DEC1E4455
+D5ADC17D98EC3C2A9EB4551DD05C6397F9B929DA17A93CDA0960657C6F86118F
+393755BFD5E968BE8D0C2ABA8CFABA4FF46921C939C3FBB3B32E00F768796DA9
+35B2042C3A83A5FC05ADBBC1A9867CC706272F852B26733ED874A8DE1548B87D
+9D603FD4CF61EB969433D53A0066F12EC6B931383A848AB71DF468E6A1C34FDF
+72321140796702414E04E0ABD984300B9F9D22F16E401892E6184A67B9434AD1
+23C83EDBE48F392B49251F6206E84CE8360F241D651A7F9B62B5DCB8F0DF22F0
+AD6ABD8F2B9E908367FEE467160E89680B9378F57D243DA04C1434FFED253524
+D0F308D1F311F33DCF829E3B5BA0F07C3EB16C2DB9CE9FAA111C0DC01AEEF1CD
+FC2A587D9A041DCEEAECB101F1D597CD36FBF647C015B062DE5858F96DC10F74
+1021A06EB06F283820B5C0E62DE4671F72985444AE2C17AC2232E6E49B9BA13E
+2DFAB0EB4B2B24EFF70A777E892F5B7B7C44153BA6C7AA19FC1315A857F1E564
+93990DDDC452691ACC8A681EB658AC0B7C823B7D3A8CB995B30CA3C44C352D0D
+C4E253B3B694EBB74568E08479B87FDFC05F239297733C494FF8C3BB84558666
+316BB7B1969B523A58AB2FF029F806A05B72F6CE07083F9555D982058E10DA3D
+ED21DA3E40F1E9CA9B6428984A7DFACBD366591AABB0DA6E17F401BF99E2829E
+C89A71F2AFAD41C3EF856A40473E9C463FD6896C5D2148029F4FAC4C14C92E13
+A8FA2A50EF4C33EE9E1BD5C61083DE92CB45F426BC5A58CEAE29E823A8652F19
+CF88A03CAF9D697FBDBD8CBA47402061EDC788BF7A89521C86128CE4B4CD0D13
+4C7B36766649B401B0D10B686F04711890C1AC5997F2B2D2E0F3D2C8D7DBB266
+BBC730A2502FFB7E922F57CF8F52B3583873440D139B22FAF276FEB94F75D912
+EF6CFAF3C580F26DB6FBEFCF66A1D4016608E387F69B424D841E4A2DFC840FF4
+6497E03BDEE98DB3D397146532B82B54549CDC76D79B8A1CF1B492207AA39B5C
+C68A13CBDC69BAFAB217AC5A76CF46F20E2903EBD232639EA413005776B1CDB6
+76EB3E52310A2D99A5CBCEC16209F5218D91DE873B767DF5A35819F00B3CDAD0
+548FBA1EA519D97B3D2A9F09330376D70E07C8FA0E38254EC50DD93473F86E99
+AC7021540D5CDF0AA97F7417B80E238C1AECC55286582FA4388218AB1FDFB4D2
+61B982926FD6CA5E1F3750C7DFCDD5715869092DBDE4DB0164E551567DC87E7B
+003A41EAF47463A0F677BBD3ADCF4709E08ACA108BD076CE993068A6431ED97A
+4181BEA89CCFD7BDBBFC892C0F4D15A75FE208DDFFFDB1544062658D9A587ED6
+E000F66A1F17080D187A6D8E6527B89E10551AF1F8FEA3AA87384AF4664BE52D
+13FCA2C0081613F0CD796CEEB06D03C2BCC2E42C8C1B4D7B23DA0DFA7C84997D
+5556977DF44F7224D82CA9DEFFA4A27569C6ACC8AD127D4A39AC6684040E6799
+1EFB7A0F795F7AB18C9702D352A5A9BA8D7FE7CA709DFAB6DB9155D2D1368A12
+90145D1809E05625C37C0D71E23D0561D47195232FAA5970265F588C82A6DA50
+26A66D7CA3ABABA6B937C469583B7B1237AE6DA66DBE7E91B4E80AC1FF8F6945
+4FF694AA6D9C3B25029FBDBE37453274D6BE1A7914C8EB57EFDA0C92559F3FEC
+72F8E3CE874AFD49FB15BA8E522D8CFDE1C69A840BF0D7E45784642F6680C1BA
+894BFD16D7DF40FBD111DB9DF3AACD08AA4EB01BE973C98F6F3AF457AE31C452
+0008841418CDBCC2C21339EE42E41ADB6C62ECDEA8BEF8A483402CD363454F66
+BBBE0C2DECDC90307A59EF912EC8E4CA6C14993FD67D33954F623BEDDBBFED3F
+09C23C55596B72BD878BF68B557A25A25AFEE1A3C605DE39DCA0D586A081E263
+4FE2F07228ACC92DE650259A2DE812D1FA36527BECF5DE7AE586123DFFB29942
+0E931039D95774E0E961732ACCF261193350DC60116E8C469BC5482B51E717B0
+730A03A27EC79ECDD9306DEA21534D2804C745F45CE4B113F20D1CBF8458684A
+3462795E7901BCFAD90E2812654EA2966C9064FA05DC20151EB8971CDB9291FE
+CB6F8A18F05E30EB7BBCC169205D5FF17DC78FF18324EF97E647F64D73F0263A
+69C2D2D49119E36D310749ACCEC23F2F435B967598FB71D4AE7465AE82F9C4BB
+F5C980CBB9C08C9E867073726625B84569ACF09E2D4B7A62E3C824631BEFE27D
+54C2D8E5B8511F987E96279EC67672ADAC8A55FD95346A89A5E98273E6805C84
+94BAB7BFD758AB05D898EB55947C52B6888D6B16FF3C4F4EBAB8D03BFF4773CE
+85A1C9C1FFEA6736CD22E099515496C142D4841450C6493C39308469BB4CD63F
+CADD4660AF12E09176818321D89D6250962D0ADD925E6360A12E4459F8A35FAE
+4B2E60ACA34F95BC7D9F51EAEF17E005D85ACA444093DF4CB08976421B9D41C9
+0DD437FEF4E85C68CEEE5C0DBEB7BE7750075ADADD6F53A7D44C3E4457AAE62E
+C917BD7DFC8E76A0520AC474570DDA5D3B816720DC627DFEE065BF1007129438
+875D9ABD264033847491D43C9A9711714AD90BC5FF3CB9D32D14C143991C090D
+0E8430AD22ED7992451FDA1E5179FE72472FEB568C83138A47F0277C81857F8D
+F44A93B07ABC2E874AF2E8ECECBDB9FE26164CE6A7A5DE4DF18648447751EA97
+AE6F927FE9090BD42FB13C65ADA216AB7D33C6BCC127F42503E6E90C17653751
+79D3FD5583E815AE0440DE02F41042D91FBAF80F7289E7E4F4959EE4E7C6222B
+6D23CD8C79736E8325A50A4C9FE3A35CEE9BAF5F51C02932F8FEC830B38F0240
+B502334C036F4E1BA4367161E7AB3D4E36F4A2BC9C8B5D37F4527AB9BBBDB585
+F8A078
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMSL10
+%!PS-AdobeFont-1.0: CMSL10 003.002
+%%Title: CMSL10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSL10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMSL10 known{/CMSL10 findfont dup/UniqueID known{dup
+/UniqueID get 5000798 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMSL10 def
+/FontBBox {-62 -250 1123 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSL10.) readonly def
+/FullName (CMSL10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 42 /asterisk put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 48 /zero put
+dup 49 /one put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 72 /H put
+dup 73 /I put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 87 /W put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7
+5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99
+8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716
+EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C
+02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D
+46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A
+4B60D020D325E4C2450F3BCF59223103D20DB6943DE1BA6FC8D4362C3CE32E0D
+DCE118A7394CB72B56624142B74A3863C1D054C7CB14F89CBAFF08A4162FC384
+7FEDA760DD8E09028C461D7C8C765390E13667DD233EA2E20063634941F668C0
+C14657504A30C0C298F341B0EC9D1247E084CC760B7D4F27874744CDC5D76814
+25E2367955EA15B0B5CD2C4A0B21F3653FCC70D32D6AC6E28FB470EB246D6ED5
+7872201EF784EE43930DC4801FC99043C93D789F5ED9A09946EC104C430B5581
+299CB76590919D5538B16837F966CF6B213D6E40238F55B4E0F715DBD2A8B8B8
+80A4B633D128EB01BB783569E827F83AF61665C0510C7EA8E6FC89A30B0BC0EB
+5A53E5E67EF62D8855F6606E421BD351916549C569C7368AAFB714E22A023584
+8B1D6B52FC6F635E44058690002C6BA02CEC21C54CC8875B408A8BB84F445894
+5D6B3E4841CA20AF852A660FE9C832F773691DC6F7197FF3DEAEE97418A5ED2F
+F2AE65300416227CD3BB03C29003C770CD7D2A7A2E4C1DCA193651C2CDDBF93B
+966938788694BFB562AB0010268955FC3555E5984CCAB0A9B7590C77C9BC713E
+A29E5BD7193A4E971D1752DDD0F0AA4648E7E87BBCE66A1E836C715C408B07A5
+9EB56BEFD4596706CF839BA4CFA90CAD4038C1E006B51913279A2C31FBEE5BD4
+A7D74F9103CE6124F5B439CB860987DF44FE17EF88EF1BF62C67060D25696BCD
+94ADF08F04E349CEBDF9D3389D870D94CC05E393B3F4362A13A6A672EE5E8F5A
+DFE7046AFE3EBAEA58FFEBA4A47BF61F92E2003756DA643CCF2C9DFCCAB62669
+E3C2A18D690B64D907F50BCA155A85E47C3A6954C6FF7ACA36D8DFCE777B7929
+5F5D5F787B9C247ABF13D6D7B4A8F06BA25CCB342F8A5071325CDA86AD71BA23
+8A9695C7D1D50D0AAC267AB7CDBA7AAF46A264B7B081B7E79AD937FEE4969FD5
+155A99E652461EFFB4BD010E5885631E2B2497D6B8C43CE77D7D47FE201DD46E
+4482FFDCE150A1183C22C004A0AF0E1F42AA6804E038E1DFC8B0A3CE26B52038
+44D2E7F759DA5C252489E5525963D68BC27C82247BEB18818C7D4CF0BC5CC97D
+8C701034B8DF798DD4CE36C3F8B1FD40B2DA14EA75583852875031AF8C909EE0
+04495FDCD04B05A5EFEBA56A8CAC1F57F1B8AB91FB25C81CD51EE69D6E0F52CC
+A0E12CF7E3187D67DF71A599FFD895FAA7BF80E2E6B96592BE77AE96905BAF0F
+F547355A36C443797DDA7C414AA606CF9153E03450B77D1BA4088D739DF55F07
+111B9E11AF37F45B6EDE6D7AC126E05886A57C83886DA87761BE600DEECD1344
+8A82BD652BE7ABFE6A0F50ED7C6F4EE12CDFD80CA7A5518692F267C51C3FE76C
+567BB8DDBE09A2AF901F79AD02B435287CB8057B3D5EE6655071F67B00438728
+C4C3EBD648BAF650993AFE5E2B29074A99ED0FB725D9B8CE8B0292B08A280214
+C3AF252BEEAD30C88F72E322FAC3E9D78A1038F5DFC41F7BF1AE3744A0677094
+51B77C2D630B67853FE5E975A395C06A4D4DA744040B272C2B88D8B7ED3A2C01
+66F503C9DFD3C7DDAC865900D2A4F2CDF517F449851DB1963468D0266D7A3E58
+9F6B2A1843E6444274F16A9930302DACD8D2BC4588765099A86BCCD8A31DF0E6
+2853114DFF2D19F812F19AE6C2E419D7AC1BC024D1195074FD0C6717BFB389A4
+4D5428E7BB2E4F9E9FDEDED7BDCBDD3460805AEA0B5F6460C2FDF19273CE5BA7
+5D3AAE0DB94C6AFA8339646191C23B0149E7CBF136FC4C844E025A38935DF256
+0A0A6466A45EE8B9B23B6A055856FB084F87C73BA28F1883E3B184CD813C72F9
+233B78CA4E125ABD26F29B92CD9DF39D6FDC2A217E2B6B45D9B0A4D536790A5D
+BC0903069565A442FA7466414D948AC432C6B75D8D0E1DBB217CA3DC38A52DEF
+62E9D5AE9E753956C13819D93148C7683BE4F71B80BC066D8C19FC807FB1C086
+B49215DCF56A91A42089F0D063B9981925691F7DDE3237403AC714F5CC3ACA88
+DB2F1DD205578C00472FD70C8BA4F752E3923ACF3164D442A6B639902ED060D0
+C5777BC20F9A3BDA60FA3BC986C38136FBD2E8F910E32EF36377C9CC187F4AFA
+CCEC423DB925B378522B748BDF12D523804CABA83CB5A7ED69FAB9AAB75EE8FC
+38D9866E3754C4E2F2B9AEFA804044D878DED0E114EA0E9682FCF38F6628E63D
+FE1C1B5615E54FAE8684566EDC4B616F76EEFD6207E0386F06D3BFFA26425F24
+303CC7C8A8D7021E7D09B202616988287838C3DBCE3179B4FB5C726E603A47F2
+8248CB508F327D1291CF3F08F7C88298DC2D0F778D24304EFCF6E074182BF5B1
+8E6551811FD6991971692108E289B61053D6DCBA2925B3903E8916EBD09D97A2
+C6D08E89DE4C0CDF7185E1E00DF456B249F0BFC686E04FDAAD2772DC2C39DD53
+9C23A41471267F53A87E5C2B8CBCDB66CE0B9844BC506428E6150B48D2FA6363
+4FDB2CEDFBAE0B7DBCE4D83E29B2955F8966272CB865EDB360C8A8C19EC62A29
+03066483E4083524A1E8D80FE3867BC1AA91753C26ACBE8489AB0E3330206212
+93E07ED473DBF457EB8489E66FB4B8ED8A9EA8911CF9308CFE3E6D6F36810EE8
+91CCB11BD548617B2C683C354452B9229E7C9E68828BBEC324420DF7C188CCE0
+FBB514547553A7E9B38AC265783891F42DA472388569C8E7594F7E8810895A27
+06E456902A8D9F65CA808F1FD475D011C4572F8A654BA01D67942226A663D179
+95149FFF41A9F55AE84EEB9A6A39C017D7E4FD6EFEEE7FF3CE847CDB064A4954
+9DCD273B810E0F259501BA4003A3EC1ABA6E13D24C0B57FF82D6DF077833B6A2
+7EA54801BA81DB961C261689C0887FAD83771E55D3D137AFBB21779397E11972
+6C6CA922F45AFA5C0526863A5AD8B9C0775CCBA17FFD37A44CED4710884DBC31
+5C9D3F5441595B86CF7CA2EEE42AE87896E9E60EBF5F35C2B7FDBF9A9CDAE262
+3F48396F0F741E9DDF1D4FEF75E68AFB020D06CC29B3A7B2ED819D1AABC12B91
+CA2A65F1AFDDA2F3FB322E0268DBBA024663E49EFF076455338FE31A16B04EC1
+797EAB0B49AFFB906A0690A1E8E2F5314773E1CCFFF43E6FB3875AC907F0C5D0
+DCB9BCC127014D472463560CA0CB1C2CE614D94177C7A52A5B089316689C8112
+CA57E35D716D956DBF9013B1E5B9626456B1433C8C15FA906458F957133B9E19
+8D46DC3AC015F7602538C2AE3927C6DDBACF38E59220C2F5AF36B68DE9117C51
+04CF7DF32B1AF55B87D1D8A5F4BCFEC66F63B32B6548DEDA3AAB06C5310E4757
+78AFF947DA22809B360FE535506A554DDDE5A6F2411246653710ECE5CD3185BE
+730520A766C47E1ED01890059882BE1432586864E1A86A7F586438C8DD35C00F
+021A741ED47E0F16DB6070ED0C50038632CA4AC2975578A8372A080CC0447C79
+CEABDF2BCD5E78564247B0F0025F556DA8FB62125227849EACFB724A4AE3EF57
+90C07A5B27D2E59425F56BF8AD84C5F5310FEB1BC73D536339FC2E6A5BE2DAFD
+97FC835E0D52F680F80ACA37DB498AACF152B9B44626CD89E3302C3EE1623EE0
+F998FA78305960AAB9F483F731F5F67A8C963C23DB8E48FB804EF8B86FAFE7F9
+4C09641915FA7E3930AC922682313408BC1607C76751CEEAFD660206A39CF394
+40ABE2A313AB7D5FD6444E219DC5C26734D322BA268D330AC17959A390D6C8E7
+3A155095BDD66516DAD5D65519A7FB871ECDA77061EFB21F359158B4470EF79B
+362C35C06B85C9A9505C8361939C6AC013F2CFE8EEF46FD8CB4452AAB3EF1FA7
+DC066557BADC2ADDDF7DDC2A0E1DD4A357E27A2073427EACF9B9035DA5272136
+7DF37E26D96ED4B2ACD60596E039BCB15E259C72FEB3344E3EEE3D4F17DF4233
+04C1416BCADE80BD483DD8C9AF979E1C7D50C4CF015870703F88B92C4FE46AB8
+DE6717B55C460C805B391B84333097E116F4A51F631FAFAB34CFC925BEE8B72B
+C9FD5F5A79D8F2295FBFAE649DC6AB47794AC7D73431FFE5BE992F2B5AC67049
+B5208251C0E442385A9FACF25E3A98D7F5D4C2A1ABDC600AABE84769CA83350F
+9B87F71CEAD3600E02FF9AC03C1B5C21C84F911511A0CF0111BAC7605EE31229
+3C526A79D943D92E1CC3C38ABE82D560CFD4172F318030852A5FCC0534B8B3FE
+D7365987C8B48A072907B26CDC2108130A33233E8E0BB5FDF14FB55098A10EA2
+B51AD9EFB119F82B08D256D396D3263FBD9DBF172D43A90ACD1A31F3E89E8571
+74BE98B9560E2CD661A2F93C69FEA3FF26B00772AE2C2C24B98D3D122EA2AA8A
+44652CCDF4EF4F01CA7D62A976E23E8A86291F43BFAF38FD9C325E70F9C36CB5
+A181DAD30156E98339E6A0498D3420B7BB3B4E651A9090D4A17604AE386273A8
+3D4AE8CC18345E6E19DF06BA848F203F74B161D6A8882991CBA7385F308696A1
+BEEB0130D938A764B98A2001A38489B1334025EA848CA44A116D64926D460D64
+01159E77EA7ED9ECE7BA77635BE564A4ED89315BDFF54ACE6AA1A26591D13CD4
+6D6425CA7933769B842192858D10998509396829263290A3A7CFEBBDA3EE6CDD
+DF1E492AECDFF7941B53573F01F623CA0A5ECC9D05A3D0954F7AE8CE94AC3B2A
+CD4E27519B2E16F033EB732AA024BBAF74626DB55DC74B1FDDB07FAE98B4AC5C
+683CFD8744F361838D343B657EBF52DEEE7AEA7565C5BEEFE455DDDBC4DCCA7D
+87D6D769C5ECCF14118A14A85A86865777C8E28F953160D5E82844AE54D541DF
+550D5F1519E183E0C42BE88F0458CE8087F2CD4B1B49A8E9E3D127C4A4CB74A6
+2E73BF4CC317781D03FF04BC36AC0E4AF99E2ACAD20F6F8029DE8A035DAB40DB
+17D237850BCDD05931FF4B0FE2D0B79EC5A88FE0236271CCB075BD194AA25AFB
+3FB93A5206F61A14602E4EB6F1C31C654527CE0C02D04314DF9AFD710D0EBB9E
+F8721B97F5FB18E27507E1F800B5509A58A1A8296C72B7B73F99B6CFE42E9C2F
+B63B3555475E562672645CD374BCDE937A9B05A157FB3E74C8297507253E957B
+1A9DC421946734CEFA3D5EE357DAC7E9DE17A5BDDEF6B2D2A740BC58128FC514
+61154664412BA1C05209EC992A77B7CA45AB7C0EEBF590A5B5652866008CDEF7
+124A3003AE6A7CF9DF3C72750CBD281358CD2FF25B162B78CBB971DB3477F8D2
+ECA3EE9CBC90323B2C236E375337EA0848CD7CB5781A2B0A42DE7E4D99DB2746
+0B26796CEE129D23C76794B7CE21C13C7D4A998B752C8CF43A4821B736EBE246
+D2A2BD7BA3351FBCD1B0A501EC1EAABE60D06DA2FE39BE1F0AD629769FDDC933
+F9D02F9686EC8C2D7455C26AF4DD3F6860B2289E3A30E1C254AD17D731CB73B2
+BF4DFE90CAEECE3ED0CD3FB4C8F4C7BE1C056AB4E9B95781A8968E3CC1010003
+75DFBC4AB9F6B27C5A9AD88D94441A8ADF09EB275E5F0E5E6F3BFEA0FA8C308A
+8593ABA0645ECA8FDC3F0E264B35D4B0DDB86B93CD8A047FC409E18196B501C3
+B003622999C47BAC04FD1ABD8AD359C977766E9643EF3BD6385306B08EE3E13E
+7DA5A06AE33D17A3D574C6390DB6E9429754B210F0C349C359559C7EAA2350BD
+F61D4D8A92B1AF697BC620FA0351E67E0D9F41A95A47EE0BF210C2C48691901F
+F905F65693DCB85BE412F097480F6A7266AE0A928729DA0F691CBFFF3B276EA7
+322BCD2206D96E3DAFDFB992CA8F2955F0E8B882729DFF840569D12E4DA1775E
+523AA734552AAB6F2F16B89B39F1A3FF0E07EA08D13E612F201716C67F327017
+6C041760DA30374434808273062C1FFA2C47B3FB578807BC26537F542040FF77
+66C995EF3E8B08B09FCD3EE89C30F157158A739606D2CEAA26694A4F1CEA6633
+B54933141CB85C60AB262E2D4E824A3B85C2BEF810DD774F296AB37D0BAE7182
+5648CD18556ACB124246A75474B232D712C2358908B5D9A76F82C626BFDE01A1
+093B8FA6AA0B32F2CDEF737B28BC0448FF816DDB5812131DA0DD5979D77C3838
+B978CC3F6778A4BFCE9A7087EFB19749285AE4C92B99A6649DA349A2E0889D72
+6D4FC664522F06C8C4D86D30BA43ED4E42211217D01636A4E17E2A132D26F394
+EC34EA12D84594AED9C6CDBBC0908860F39B240FA7D7B3003DB10322498691CF
+A294C0FC7ACC0BAD1EED3E9D60AAE3F7429695892D1A21CEBF062C6129B33966
+8B2EF6E932F9891DE6028B81C5E9B23278D35B7F0D83989BCBA25E20E9D503DE
+144DC485F09A4EFA1268AC5E4B551C5B2F1D51E9B9B9C0FEE585204F869D0BE0
+7287D7570A12940A47C1F51AC6134F03B415C30E147C49F89228855D093EE55F
+172711F37776E97A99CC4B36E2F10713E36FB279FD3FA5A0EB9F3938F42E2BB9
+254EB8F0C0F30391735019E02BFDA21D9813C6A22279B898EAF01AA892B14DC6
+5912B9275167AB46EBC420836CC1A5F38A4EB47C039A7BCA62BC3FCE4199FC71
+011DD6E5FFA0F3D7F04AC02AF91B9249B9F993AE346572329DA852115BEF8460
+B94690E790003586F473F37EAB5AC2922F5F663EE2C3C0C336A8DB71650631AC
+0A923A389AC911CB215EC2EC7D50CF8AEFD59EBFFA53A9F1FFB7E6215F17093E
+3975F186FE23BB5FA5474C11408FABD223E1E6F62035B5A5C1AEFD8899F00FFB
+E729C2D5FD551E80716CEA4E8281660286A802AAE8D5834F37F2EAC46297E57E
+993B09251DD7789D3467417E393B7DEABD06676B96241B0E43ED1A1A9FC3B12E
+0D34B2B0792B79AA648FE9450C3B209FB6D7D91F50C52A5DAB0BC81A8B698BD9
+18946EFF691912D7348D48FE68CD876FC6F71F81165D0C3272DA1A992308D9E0
+ED6D0A4DAD679AF495F62B78D462B463BD4A40931172290C615B3B3B6B47E45F
+CEBB85E0A6AB6832067CA6D403C239530D07F199788AA4DD52553836851C5228
+1072406F6D7323A334E7A7FCA588897C4FBA6D4F7DEB65525EFB74E539C988C3
+A685A98752F7198E77E456A545F0D23A1BEF81EF58B02D289CF980A3F17BEC8A
+6F83DD90C4A917EB0E5E2B444A608E2E9D2FF80620E16AC1D7775C0A10C1299B
+BEE0E1AB24C50647E5CA1DA65CFF3B2C295F0644CA7826E1DC6FADEA93D66A20
+DE852F20AD224D28DB900519EB1569837139C833F24B799F7EBE3FDC14235323
+1D0BCD4991C861F38DF413A5A5588B73AEC3BBFDB885CE17BB3E97B4E6A79761
+93EC8418C2BC4725CD61B5E30C07352F647C3FD50083878C13CFAC241DDCB082
+E53703D182068727F9EB6FACEC25F6D901D7309ED7370867E34E267519E22D62
+4FC7093448BD0D6B1C43D318A3E14C92032325C132AE0FF7ED707E1FA4A955FB
+F5224BE0045CB14ECC321D0F333FE24EEFCC504F7C756451D7693C3E6CA87526
+4912E1B6DB935BDE76FBFAFCA4ED473F1D2618812CFF25A6859C626A216603C1
+361BE3E071FCFEC2D4BF2FEBDE07DBD56A1BFF8303901168FA06488BA6B76F36
+95B0A90D7724E9ADB567C2ADC65CF3482CF47FD1D16F70AA19A97D0F9EFC611C
+AEA5E1ACCDA7FB2DF05E9480936281484BC329F0B771775E73F7FD72FE3F45F0
+50ADBD03932B38F37A8F0A66B2F739EA3AC8811C8F514E68C5643E4AFF485C81
+88475A523D7FCCA5C8809BD49846C77795A38DC6406082000236A4D2628B5932
+AB7916D44EC2210CB941B1422DEB13896DD78CB7B7F400EA5A6CD639D9CC828F
+52311A11F2A84E566DE98826F1E28D55FB08ED70950205DE52C207CF14238446
+084FB4DCE04C781858BB4E0744C023EB0B563769751AF1D807EED20E4AFFDC46
+3C1510C782FD92902761F7557FEF701AA67B20A9B019C760B2BBA8A048BA3681
+35DB440925CABA05B8A13B2D30D14FA875D3E200A018C78BE2E930457BC33AD2
+FE3610314A268E9A30EB41F7C771758410E7D1179567B22CFEB5163F7CADBC40
+4D40860E83BD5DF2BAB4822B55B863D0793D3B60F0DDDB6DB993711C4C7C2F39
+31D02C7D8EE36FFF8FF2179534EE4F2DF388C96C9AF6978D929610EBAA615EE2
+FA163D8C52E5810E94456BE63570A6878E791DF4958E60C057FAE0FFA4C2B7F6
+192AF8786E14A6C6379C6E13A9C528A198B8EC8654AD69CCB5C209964A2B26E4
+E636DDD749286B80A5C22474B49FC5C093A8215D49B30ADA383485030AEE93AF
+BABB827D996E563D1681528F54353D1245ED78D1915CFBB5595E3B9272ACF503
+8FEE0B65C4CD9D5783F948ECAB51BA25F77DFA440C1D8B636FF6A15E6BB0800B
+AD6C7A22C4F0BF6C9A19F0E696B103D8150AAA337C303ABE10C87D87549D150C
+2D9665F99AADD64CF8FB790966D2E63B22CBF1B1F1DBA95E3E233469085EC593
+0061E1CCC33F1B16293CC11C0B056473F6C8F7949142314CC2B8CA8582DAF280
+9A41AB9C8FEA6088FD3044FA72A6A754D4E46610BE64E308209D819B23894C90
+085143D0997EF4DAFC31A250BE0C3A45109E895B0612BC18513B71507D0CE5F5
+052E003166D1B15238ABF9942D4FEE2451DDC06CB4101F11D261B9318D0BF6E5
+C467A31637743F2DAA90E874E79C2E402EC53CFA9A5F4546BE39A838B5572D1D
+1B5732C3B25713C60BA9DE651D74163A0F9B5710261E0D8980D1C8249CAD7F6E
+FE7ECAC7BD98B3D195DACD921E686C510E89FE720C180F04C9BC350E6569D98F
+A47AF940C5AAEFC1126AF1B85C57E2210E5354A5219CA51A3BBAE42C02B584AF
+FF81BAC8673F4A37A22C8BF682898DCA81288AE3E8B243375A5BF77526B5AA60
+1549E16B2D8D9B5151D27055E5702D895FB238EF2A533E1A8C85E565F2D5D0EB
+BD23CE36C8DAE8ACC54D6F30F68A4C513404B11D78A2F5F19836DEFCA67D2A21
+B75599819E576001830F03E7056E5E485F336EC4A4BE51FD2D46064A8D37F346
+A24BF0E1A977FF91DA4A22C604D1F6080524BB3B040FE0A359E15F6ACCF22CCF
+FE1A903559F0DE0DC0E96EB5D0D11BFA464635982378D6A160599702C98D8F2A
+E6E104974C94798F458F5E74A628723172377477D4E5E2694083BE189224B59D
+A1DCE9671EB9E5DF532ADF8AC863018D7E8C602F9A6E698D3A353DF3F70CE34B
+5193795E0B96A2F3B4D964924BF553FE384A914D58E5395E288FA82B71D64DF5
+CE4873425BBD32BC37404F494778872BE88203C113A12496B7C0A8331F58A592
+3376B02CE5CFCDE0E48ED0FBBA4C257CD7EE90C3EC862EF8175698926DE0B68E
+462B317EC6A1148DBF9BBCCDA4BD4CB905C7BCCE2915E89FB30FD70DC83CE40B
+A698FECF8278CEDD28309C5B1A639F987830B5ACAD2D66305FC2D866D0A74288
+A49CA23BA8857DF6F63DCF7C1A425C48A8D36D4D65CA427754C951776EEBD9D6
+6A18FAE4237B87CC59D2A1CD47BB12A877F00FE69838FB242978FA21ED6CA2AB
+76492465AA22220F58A181D7A6FFEEDEBC8FBE966A2353247EC3D8330E9CB18C
+EF1D61D9909CECDB6B943673C127AF7CDB6B249F9E202A4C9B110423B9F7C782
+66357A31DCAE814615A5A319182B42A3582872E8DE39FC9C6579C64AC8F443E4
+97840C614357A81758DA9F7FE5593160A2C5EA3BD9F7250F65E00A127A35D0F2
+91F02F2B7CB13D558D362004ED8B7126005C308E9CEE7796682A323B2AE86A30
+9E23684DF6FBE6BA8616419D6419B1830FED91B1933EC68B290840B300B10370
+B58EB5E097B674B5C3E7509174EAB21C7452FF9B52C2980CFFB1230B55348BE7
+4D9BD6B7AE5E1B1CF2F1C95BBEB0A6CED99260EBC0B344D036D1BCEA9FEDC85D
+9EC1F2C9B6F2FE607E2D24F771C23E03C9BA75D8C8799094DF3C4E0304BBCF3F
+25E0C964294228B1C7AAB6BC474449FD8E699B65D311A3CFBA80F6ABB9CE5926
+497FFF0CCA03755C4C20CDE7FF1B317E71412DD8E82B08AFEDA6E1CF6FE6DC8C
+4E38B7416EB6373345C36E9CD7089B0E054A6594D8B0AB88AE4DAFD9BF6AB83E
+32EE0923D01E66D56E0684FA96D3D3325492FE933F0E1D3A7C74BAB6AB15BB0A
+3512EA91A63ADF032B278E3A13F71BA8DA4E0CA6112BBFC2D15237FFE47BBB49
+3EFCAA4139E445306633370700E381E1C001337F82009014A092E52B491061AB
+7F8019D9C7CE4B358E5E8E9BD41BF9B50ED6C2D79FD73B716334E51297085657
+40B6428AD16333CC0108DEC3E57CF0E7EE528663707187A44DD55954AC5CEDF1
+B451688321E2E825A259FBB7D26DC8BFBADBAD045C0077E5BE68B818ECD13765
+8C636EDDC2B6433BCA62599EC4B2593D7BEF1355D549C5383ED246AB2C3E6FAE
+5AC81CACB0C3A84895847407DAB75B5786B364B13FE0F246BBF6869BDB3117BD
+B0B85BBF14F699A315DB6BE54552D0C9CD10BACAFD6A91280F4AE599F2BC79E7
+6FC2289A136E1A07D38376C2D3173EF851A097CC87101F638F27F7EDAB572B81
+6C02CE27E16F5A58A120D3F57CAA19090C95AEB29CAD81F7451C9D23BCE1F3F4
+90813DFEC50B2A82CB907AE154A161A711C039FC174E1E35BAFAAC8F23EE8542
+1B29DFD1272E1DF5FD019AF2A477264829B8A1CAD37BC8EFBE06105E74DEB850
+32D99CB23B7C73C4588DBD5082A81757A29661FD48C26E5F912C8FE91A8B4F34
+D824965E08E9F09F07566E0B150C472FFAE787983834A7DD0A107CDB74E88971
+C070FB0E9CAA2C89F38438F7A03FE86FDD1952A3297832BF47482ED86A1F7C3D
+417A40F376FDAA0C5C2B4ABBBF81B7A7F98FC188DB9D3F24105A5C46F8E95190
+1A7D3FB0AE4239F449D511BD67956B1EC1F525FB18D59DB64E85130B5A0AACB8
+49F428C3E0C6D49F427F9D8F46C8215AFEB1DC8E7826FDC15743BBED087943A5
+03268D2111B030FB2AF950FB31DC9A586A9AE5885611A41D472847A793024FA6
+1231C822056A467806328FA7E5377ED793B35F63573F732F37E2CB77542F5202
+971DB462A9BC62FB026804113A5D5302D425F0F0010FF5FEC527D6B186DF1472
+C26CFB745BB58EDB9E4BB82ED93F79C14B02F024EB4A5B201150FE555974275A
+A7EC7B3A43D51CC07E2B500C58CB1A3D3053E8EEEEDB175B34E07F8AA5870B92
+C2B83FD176DDD5759AEB0B2E830E322B79C1594DAB6F1A480947039960E7C336
+3806AD208BD519261EC06BCEBF9644C4E393C341AD01975BBA98EE091729FB6B
+65525C29EF52AE7E192A157B14E9A966AE44F754BCB8921A41A254FE73004558
+C24C0104B05BB03F2D728036478234EDA8BFC50EB7AF9E3DE533FBCF4218ADE0
+CCBAEC68D1E58D193C5C8E44E09048ABB8A424BF47095C3026213A737D21811C
+ED6D5FB33558AC6DE47E36F895AA3F28BB8D2D95F47760464FA43F651C8D1AF7
+8FDA203C85FF5E528DE450A45381F6E4EC602D60163FB6A37C5DCB71BBEFA92D
+F92FCF38A84961D4ABC19697A787FA9821B2413A442358E1E7055B60958A8441
+141F65BEB4FCF018BB5A03AE7CA3DBCC895EFF8603A58D1F1E4A5738087D1F6F
+658E8473D006D46182C7765010DED78D28FF964BC738EE4511836BA8E37F476E
+CCD904515D8AF4F4D55EDE81CD9A7D0E4882A1B1230D3C3B2054ED59CDB47824
+6237B62DDAB266F6182FA0DE3C6A6CC8140FFC9CA0D1AFDE2D392F9ED900AE6D
+D306E0269C8392A77262AB2BAB9622A78B581D6B5B25135A45C86E4FC44E1859
+8E7299ABFF56499E0D80036F1898C33D11E086D5109165D0A65763B58784E4DF
+A19184B3CE380708B9F8064BE7A284BECC8A7E05A7E80EAFE929077887FC5485
+979A21EA5C3464B0245EA502125F58D12109F004B9E10EB64FC70AACDE12D286
+3866345A485C6014B1AFC036EF065ECABF161963CBE455FBF38FE747AF3D87D3
+9B879F6601C8EA1E53A47FE615E3D2449674B731FD77F7FF7558E353D85927B1
+24C2791F1D7BE9077673ED97E09E9CEF3F1CFEFFE483A4C85FC66942107B83C0
+08B334BA91782F11887BB695F8085949039303FC16E7BBE6702D86DC4AD3F016
+721E0727FB713005968432C736C922F28479C4B79D47BD822F9EF2C32B53258B
+CC9F638CC7463F17C87D714EA9FE17CB12C9D52991498A99BBC00FEAA9459D3B
+0C46C260B3C26A235674A22FABB22342B1B826D55F26D6FFC7C8B25BB1AC8D4F
+C5DA87FA9725BC2CAE75C46BAAC2497A7B82AC0A5493BBBEFBC8F4C20454CE54
+047BCC7D34652F3A313241A2DFB5C0D5D2044FCB9BCD362B782ED0C0C1C5DD8D
+644A84F13EFC98BD46B9D6D49BC1893C05E74A51F920B4CD231216524A833C18
+C0C67EA86C86F556F84D15E829275BF4727A1090822CB62FF416BAD2DF0C18C7
+045120FA62D43C8F1577E599E5C76CC674742E7C4BEFE404C8648DF0A9817FF8
+DB061845085EF12F5DEB46ECBD3FC434A4F28104D1C96147BF965C89C87598B9
+E08B55487D12A8BA75494EA42D647BC8B1BFEEA70115EA418B1D76BE05EDC032
+BE66EAF3E08361D0CB03AE9F87AE76FD60D22FD28B6355742159334EA6C06555
+377F938C762AF675FC18593FF5917EBF6F9BECCDC4F1E4B844E5632F8722B459
+F3F62EF90B2EBC752093FFAF98578152000F2EBFD23B8D811C811AEB1B7BB623
+692DAC3C3797214E2E50302CAE5A55A1A81ACAF8C2B93722857441653DFE9B5A
+B22A0BCC5CCBA2193DE5EE973F47B09D9DDF8BFEA812308A500966411E4C9813
+C4128790573AE6E8BEEC11F442AC98EE1DF17600D80281A3DC33ACA9A92ED59C
+AEDC5005BC9D0D4BDB75FC84F23977D5265BA8D5C40267A5FB948D5E914B2090
+A8CE7735EC55A70FFB7FC6BB6C40667D9DB75152746C5B1E04F44EC49EFC78E8
+7511FFE34892778437B27045839303B9BCEF1C6266C4FF22FC7C0719D5FECD7A
+EA23D1ED55B7D774B8A235D811FAD3BEC77D0D0BF0889D3830D3000AC07E2BB0
+49568B90D869CC9F6E9C2A4803B410E33A464EC7048D27526E3EC5BA95949A3D
+3FE96D48DB7243324A5181DF197181F193FEE8691C04E919E8884F77CD1AE088
+8D4777228CA4C9758D346DABF4BB658B44B66AB7D02B2FCF07A9A70683E8D03F
+F421D37C558BABDF1389102B2E4427448CF9D3EC745F87C6B970C7AA2A0D0373
+AFD00324D47487B33E335ED4A850D4195FD05FEC6E864BA4E9C72CEDE18207E3
+597838606BEBB1150637FC79798BD2CD18F7FE5FA60F8FEFF89AE6B0FA468BB9
+C38089C05B49BA1CDBDDB40715BB20F659A8553D4FE63F2CD5A4C3C627CE252A
+9058EEB29BA9F90E69727ACC6CB705F3A51D1D1B4A3A4D7CBC53FB9916CC1FFA
+2DCCA0E1BB275480F173E9E565D5B3581F2CD148A2D7AC0F072B0DEDD92E2320
+0D48A2D1A21F00D8EC27B2840BFF210DCBFB89B0E7A6ACAD1FB9F73ACDE3037E
+CDBB9B62A0B1CB500417F36A8A70B309281CC592B689114E06896536E79CA043
+213962462A6E79BA5AE61D82EEE6CDE9A7878F8AAF84588727538A70E346B80A
+24A4C5EFE6342C38C335FE9B46A7F7DDFE091477F0C020B40D2352D7F50AB515
+795E60906ADA155CFEA213D90C11DCDE1C9A8DBAFF45E562C9929DFCD863FA47
+0937D34E73B01868A0F6772F7E0353026097B916A2D952A0289B7007E32C074F
+CAA9B38B81EFC7B1313C5D00F88C5F068A02224AA46903836B20C5241C3266C7
+F18C157ECFC0EDF5C1A835DFB194C2C1112E02AF28F500FE4C680F39042E880E
+FBB55CB05298E82E7EBA0A69CAED282D56098212F8B73801D42FE9505AAD177D
+3422E7AD6EAE8E97512926073E2940F9C9AC2F48CE3B13497843AF201D6B6B64
+32238DC319F66C3E7E2118CAB1110F5DDF17B5A0ECCD97FFB1CEDA94FDDC8040
+52FD1C57F7E66BE37F1A33D440BF2F4AFBBCB38797E32D9ED00CB78D9FCDA9C3
+4B3E98B085C9BE53FDD4241324181A62493942C21F78C88A7D8D2345382517E4
+42F191649B1A74C5D7C2B43164666282BE2956CB777A838B879F044CA1D1CD78
+C2BDAB54A72511C29CB289655E41843869013840A68027DAF0C549CA3760B60C
+B8E0819AC2B88F09F3C6D31EC3CBB473363EA397BDB78E912D724C9E3E419E73
+94EA9BF281C2BF8F00CA535B079C7DEBEB727E5E7D0E0204870F92D71DE705E1
+1846972B3D45EB1487A77C218AB7852D683730B5CA16F599E00DE83226D80516
+5176621A65E12D48284DD265D56FC330D9290066454370198D9770FE4E10DC7A
+EFAD00E7717CAF5931D1BB8307D587B89B535EAEECD6DE63AFDD6D61B013202E
+CBCF3337F7E982EA2F32BEF54F522F9F1867DD30B628861D15539359AEBDC060
+A756F4E6B5867259933D91215DC32B2CBCD08335A3A2F5C501AF422A961EB188
+76622B3ECCABCBF3276CCF83B07D20444DDCBCD728784649170B7CF1E13CAE2E
+DB4423DB8A6AD7ACC12CC0EAA93B48F0A82C45E14D6DB4D88ECE6724E1D3512D
+7570ECE04BB2DA767401E742205B4962677B0F04DA96EC4143917AA9C3C7F832
+0CE3E99FB8980962968C8D8C77E40EFB211029C725A872AB549C0E44CAB2D033
+08BCE7D54F951917881E289D411B7F9CF62E850D979CA9A9B4F1B993AEB8E40A
+45A6F7E178DBC7DDEF689DCB3716668FE53809996A636B187B0E5136BFA883CE
+F2FECF459920E58D453937FEE8DC4A562E1747531860F1DEDCFA8022B40ECC6E
+0651E6E710337D5C340C1B5E7315B6C788A2D7B2A1A2E17AE2EC1F9A19137D85
+6B97EF446C16B33F2EB9B5E5BA62C9ACCE5A56880D3C052B40A5B4F6DF4BA7AF
+63675AFE59D925C328E85956F5E873B3199D1587EB3786ED7C223AE9CC580377
+F9312B24BBC20C89AB5894D807D2ACA57AB522F65BF8C2ED5FA0394761BCE8A8
+EFD4DD67954EA00127D6DCDC1F34BCF10A05D699658DCC4BA2002623E9488AAE
+037E2BCF2872BD4757BCC1EABB3AC5BD53997109155647E74606E36BC01B777E
+B5DF4290548694898999E0D010E21B15A9F9952644DEE4BFE4BC9144302F8CA6
+0ECA6DB2CB809729B51AF8AA5EE0718CF5B888D26D968D0C6859C513009D06A6
+A752724C7DBDBC0E44A1519A4FBF3751D45674E1A48BBF77511F10916C0B64F7
+56A6397A6F87470433B5D6B4BCA543AC09BC6EBC2AAEE66366CF2D712AC54A9C
+22C8EB38DD43A3A9259E65AFBB66BBE006C91BF3A33F5C96140EA1909664A52D
+1DD8AC38E0874DD82C3C1DA26F174862691D6FF3A184ED4CBE325FF0009F3DF3
+58063B1B87DC2082BF928B86631C8AE7B6E5E6F740A22CDFDE990B85C8C95661
+46E1C9AF820165F23F79CE75BE8BEACE1A93BB99F090D77A5001DF044E8250AC
+50D1132E13C5DA0E3AB87B8032DEBD4172AE3C1450773CDB95778C038029D7CC
+B9617DF174352590FA1A5D59A6409FFEC99BF0262E2C9CA86E3FAB1D7B3E2B5C
+ED9A12D619817A979A37E8A795E65A2C597A5FFB20639E02162CF3C89002C9ED
+79357F3C287213C2331681A5A83B19562A7AE8C7F145ABCC8064F754348836E4
+A9149FF7D6C902698914027F26270BA0B900DCA5B54A7149946F450C3F099A0D
+D7BA65F2A63F85B2F0AA00C1317B18A981C62FDA579BF9D4AFF8935EE4FDB17D
+86566BE4FBB131807B983D7E435331853B0E37C1F081864BDF90E616CB6C6225
+7743C718EEA4427EA841C2B18CD64FE10A97C4F0F312270CD53B107047194E94
+5F68F13D1B7A709240DDE46B5CD930179CFA9FB55FCBFB6735E7424DD1DA7389
+87B3CC0556367AE585BEA4794B973B299BD3EE4D9FA80833042297973210041A
+97D389C51C7715FE143F36F0600682A0B2D9FF2A32752F385AA6431DEEA4F4F7
+727834A01CB8FB8521238AAB2840E0C0B8D8E9EA78671AD5FDE58A29C3984917
+92674B76312846AA81ABCD41AE8FA2E606D014E0B809F1392E77286995D05DB0
+0B6707915FBA9CBD725428E6BAAA754DC45499A430CE931EA84A432C88003580
+42ADD71F3290FD1E099F3542C1C0058A88CBBF059DEA3DCC463CD567231CAFC5
+6C6918ABB202A048B710C2762E6BE6EABDE006A2557CF525831C42F6119FC97C
+BC5362C9D26C535CC109345F27C1EFEFD7BB6C851B94FA8F041A7DF0647C4189
+2F36858579E3A8117C8D166DA1203E956BEF76B53A96229D17B9A0AC825D0D8C
+985F5CD86C6BC4410FA3FD976128C2FB3C11D28C42BF48C412CBEF8DC43A3E82
+8ADE7AB8FEFBC97A7C56A87AD689899B3E5D425178BA486D128A441701812B2E
+155D773C36EFC26E895B1E42C266C0A42FFB9843B1543D612AE11A9BB79F667C
+BC1EB4B71F90EAA3F76E7A74E14C67A702DDFA7D47527DA34075E55513DF8CBE
+9805495F6D9465C9E6C125578FF2FAD484A20D1236ACA83CB397F36758EF29E3
+008B29781C8AE84EF10271631A505802A815EA85DCF750C94CBC7078FECF2633
+461CB3786651E2D9A1D5843E346360BA511DA13FA80C38AAF32FC71F83760C17
+2BAD518FE7D7F3BC4D519D00242DBED65B9DBE9CE156DFF29A8BE5509A999044
+E7C773C7FCBC7DE8E39CCD8A2AD23847A5375C668426024577B92BAF13737982
+D0F4FEBFC0B737ABAABC60413DA58E484ACF4CFC5D000AA7F716D73CEAE4EF7D
+D0583E039FC5581D45B20BC7E997BA580900C317209B3438693B81FE56A089E9
+2B45DA8FE45ED4B4495EB7B7DFAF908498EB1E083FFD92F6BBAA81152F2182FD
+38633737BE1A8F1306C28BE15EB1A9C62E34695EBC19FBA95616C5EE9011C793
+44451F7EB64694A13BBACF00BD13CD1A53723145B924A7816B8BB903AF48269A
+5A2C190F02C5796FC21DCCE0E5E8ABFEAED20AD3AF2986E166079D6E4E724B6D
+295FD7A137DC0827C7E7BC12EB5E852EDB1D8196141F5DCF225D797EC491BD58
+B40F99AD789075C138C7111C0CD94916861E1635B28A56E7AB874EC147A9B520
+D2747FF57C462C505031BF269CC8B8944179F52BD89309B0EF555BEACE3EE882
+DA6D5B23900D951B52DBBF6D599A456E1C26A764881E4CF9B6441E614DBC6FF0
+22E41E54FDDC9261BD091C14DD2CEB08E465664D9641B90D514D890952625E89
+C8FE9D3683FC9555D345994554DDB1AA757554EB7213ACB5E23F2EC9E0B366CC
+3918AB38BE0CF3142B017B1D6A82930035B8DBA75E4C82B3F05C471C16A39F58
+5BE508CD96725D68622D374B2D9DF5E20AB55211C688D82241AEC10C5F34524C
+713F440298F0C972EE583D7DAD6DF8A4ECA94D74E386580FD6F17EF1C500407F
+93B2289EA48CBECEFDEF0FE42468B8F995DCE0E0EBC3331030F9E643DEC6FA43
+B217D08818769349B66F543DD4D615BC7422811B515DBFE38C7BCDF873CCAA9B
+229E05B247B5E1CDA8ECC2B2DD9EAFE1ECB46A9984720984ADE2F7CAC17F29F2
+AEC25F3569706327C9B1874AE5CA3D9EED82789A97E5E472D29B44AD4F067205
+57713A251B3E0189DC75DDA15AB7AB5C8BD70408AAEFB7C2D64567AFD28D2441
+C87B3A24F95BD0EFFDCD4AC40AA1654869FC996DFB4BF398A3BE1615B42A5BF3
+51CA13D3EB4DD8DF09E042254EA1014128C8F3A16DDCFB327D1EEAE7FBD60210
+52896DEAE39BA93CDF5EA4CF44B5606C894327FB1384F1631A13A40DB6C9A171
+FE440F2703849E0BA34FE0CA0D4C1FC9325096107F7E0DAE33972DD7EA56B64C
+1143A671EFA91DA6164FAA378BB47717AFD582FBBFCC5079179A014B09BA5E4F
+1921B31139230E21CD4F51B8ACF4B124FC627EFB24C59D537584D2E0176EDE3D
+F28018366A9DC6D32A524ADC1AC95FECAE94F6BCFC34BD966830F89DDD183027
+81DEB19FB81642C2248BDAFE1E76AF63E2E5D7B877A35E0EFA8B31560281EF50
+C7E30E6D51DEC5815FF32C8D77E4998A9371B77A8E0011BC5E11491CFFC0B194
+82454CAE336A9D3B86CFA3A511BDBDF5A9FA1BB86BBCCAAC317B20ED0CF5B808
+8120204E23A07F6C0E13446D6FAE7C5F1A72C2A205FF0D805A63A7040CEED398
+22969E4915A3B9FDE22FF9B51DCD706F80D1D6B564EE47F6564EC8684BEE04DE
+7A737A2AA16D61CFC9F1FC46679D110666B558C597C25808CCD4E792B357FAE2
+48E81C572A431F77168F45B478C45AE1F8D941972BCF70322EA91042A3F2C2CF
+25F90D648F6DFF6BF44DDDCFE538195FF0509A630C430315D82C6B6AC0FE40C8
+D6326397CC9710B327289ABF1E7A9ADA9F96A0EF63BC555BD3EA6BBE56C8E8E0
+A5B3D5C2A3242F825F865C87A9958509460EBAB50FCBE4018297038650A0A988
+4503FEA808399FDBDDFBD0448A26AC3CC0738301BAC87757F68455764C04FB46
+DA8ED6DA80738F50D45D1D2BB96B2ED4427C8D115534C849AB959E0ACA334ADB
+C1213FE6A99BD6647FD6EC8EC55B41D0FFFC677D913D48FAA4F2203F43458736
+71B4C678BE42D124DAA986A6E0BC1A634308AA35AA5B1BEA20AE164CD35F6343
+E2E21E4F339D471D227E25AAB6DE30F8715C8C1F62A66160833E07A78036AC10
+6B3F0B6E559E6049F6C65E25547E8270CB82864B0EC463621CCA7D76EEBC9361
+5F56E1E22C476241F9D804997C5353AD62715113DA0AC722B990527E4BF6D172
+4BBFA0A0AA0C5CA8008FC177A05F7908111D61865E8737DBDAF30E92164B39E6
+58583B4A0583EBA4203AB1532DF32BFA8A72A48FB4B585F9DD9ECF88622EEBFF
+EDE453A1C00148A6B718D7CADE28C2DF77B7EA48C81491E94852D326738E92AE
+29ED6ADD34C78190593E83404AD4BCCBB6CDFEAE9D4F177F71103206CA4B2D30
+E4DA7DCBF952616648EB555A445739868AA4A14A75B05DB425937450222F9BBF
+64F7C19BE2D5DA4EF552F40503BD7F3EA50E8C2A162AA8A844F0922DE1E577D8
+770FAAB2541F2212D61622683CBF025160174F914B098283646B37DADE179CDD
+50609510739EB25E11388DEE403D1B9CF2D5ED8F472AC9413069CDCBBBADFF24
+6BAA20942B7F8374DEE26ACD9411DBF4706C4B892A9DD5817FCE01C0494CC23C
+047EDECA0BB875FD5244550DD25E62EF09299F74205A66978C912C5A53C6B4E8
+D08E5A1939955FD15E8E5100DC6EDED963DB99B422CE461EDECB09BAB62CF8C8
+0F1A5EA6C6CDF8CB80FD3C042CAF38404C1C316B9FFCF8B52E4683B33EA525B6
+7103B83C2B7B2538FF157C564876BE135246768C9FC7ED67EC6AFB708870AC09
+911E384A83B35E00B44A3A4BD1DD43153F2CFD11E72695CAC8AFD5F3803A9435
+51BFFC367448EB7FE9D193C58661E3954E42EB60F72CE9D30182144F78B9B127
+B7305C61B97638530B15715670AA4946FBDF19865FFB380C1CF5E814E27D8C27
+9112A309A85846044215AD34ABD5DBB9A6CD61A02507B4D6BFA05995BB8871EA
+8E9695A147EE66A210F1E217A2E52B345BE95891AC31C6B3E95876DAC5891FAC
+5CCF1A6C451D59491398614DF4166041B9C0CA71F52FCF46D85F080185E5020B
+995458A641715B12387001934B33354349522715A6B6AF9510AB8E9DCE3890F1
+7310B5F8024E0B402B34B4F152BF4696D8A77614D3279ED6AAFFF6FB8DBF2052
+5AC7675F7EE907A6A9E24F69643A17D96284FB2ACAEF0327833B91E74562841B
+9647D4E45365EB5F143C068B560BC54627D2B4AC3E0CD6574BEF0A6D8707FD89
+182B8613E9E0C43CD6CA97538CFD387DB8BCEA74F30A1234363407A511DC27B7
+5F32A3C8ACA1F86D2E9043880EE84275E68419E79D161A0013E0A109EA37BD68
+6B1E1AD4D5B50FFCEDE468DBB54D8CD564A02699FA10C65D87E5D8D28E391A5C
+C3BC6AE2E18F71DAC5EA7F271B6C6832FDBF0D8D25104CF52BD93912398F6751
+04F081F02D01ADC4F8845493EB11C5EC45C3673C2A785F70E3E3C696200C54D0
+B35553C773F42057F10A7977FAF61697CE1D1E66AFC9ED7FC59C31ED12814343
+2DC663B506C6AAA7F416065EF6830C21739FAB9FBEF85236D165F8FDB3ECBFE7
+A15CFF27A4D6011C2C300A813C00524CE6C54EDC08920659EEBC434CF13294CE
+6D31A137A49FAAFE7ACE6A13029A3F1258C1F00C296BF9838984F0AEC83848E1
+90616090EB1CB156E5416B06F57135FBA8513565364070A315EB58874FB05E18
+6EA1B28F4218F4BCEB6FD1308175FF6C279BA6E003E984B6701BB4E1FDB3524D
+DE45A62C8B6CD6D076263BDC8E2DAF770ABC416980141AF61E93F104FF825EEE
+38C47092D068E8A387CFC722271EEB54977366BAE5B59A28E2907B2FABF4BE0E
+3B213D8BFB40EB63F6985405D1322FDB941168A14D5908847351C613DC9AB450
+F30F2FA3E7E587CF0BF5C212958396DB53559E255813B1A3230847383DE89757
+F8D5DB7B2A40ED6B17851CB4F16C6B92E36D56AA8879D35FA42741E56F8BB482
+5CDE18EC31720C3A4ED4E1D9B0DA78F33BC3766310EADBC2E62EEFA37E5B6F5D
+548954B8BCF32391084B7624F90CDC81BA7C859B328FFD4CCB10037B74B6AA2E
+3490B6792BF8AE8BD32484BE3BBC6CF4AA9520A5453DC57B84C0191593463399
+3E0DBA9A650C7C4E1EA4B89C92EE2969FC3DECFA3476857AB671A7C448E9E34A
+ECA841CFFA739F5AFC35E6D79874BD3E2EA8D296AAE4CA5B6638B42B4532D73F
+9A827505C2FF61C679FEDEDF42A89238EFF0ED6262CCCF1C83D7C853582CECD6
+ACAA428D727EB24C7D73BD180BB4656BB86C4FD851E0B4630BEC3A26E8E8AA35
+EF46DA4ED0DC5265BECEF32EC4276B232028C0F838AD7ED8302840D0028C8D09
+E6339EDC71B1296946153D0CF942074774A641BEC0EBA5F8E1339057F5894EDC
+71C129E2A6FA176658ED2ACD7624CD0A1C097B1D2D473C2BC3B6AA57FE523C7F
+8C8E440D35DC20742596B4CB3BDAFE616CB5E62AE65D31591D86404824AE822C
+11A005FF2126019C235F46E97017EB522D9607EBE470A7829E7C26644E8FF329
+14D99E34D496CD5BF856DC28DFB0D444F1645B91A66BFFC2E8BE1E16FFF6C014
+531CF12A160AB4A04C60AA8128FD963C41BACCB964DA973BEF5E9A24135D97F3
+F5366C576598570701B017D6B926CC26EF1B5D542CE5E1F70F6D1E87503BA8B4
+03B6FF8B89FBC69CE1CE1D4350D9FBCB4F82911F1703EBA205FA9334D610AD4D
+7A1CC4D1E6C1F4CEA2B44EACCFDAF8E03380D28601CC1D9348C97D8F9CE57EEA
+E47FBBDD1380BE9DE4EDB9DAB33DE3902C0A21658FDECC414EC3B3A0EED730FC
+C48AD1E41183A824E52F97BD1A2A2064A57465AD4C43BDE090AECFD9D6367BDB
+12BBB6A243D46477EE41DFDFDB2B117932EC0D031D72A308FC31A15F849FCE51
+8DBC93E3E0CA7616450E70FD78608545568E5D6A48671984C2DDC3E1E1D9F1A9
+85D99FC7B17BDC29A205DDF584A84547DCA587C2A954DF22D576850847B52D68
+BA8030B7931FBAF0AB8D08A765E24DE5F0D8B221BD705E2003502134DEC27581
+18E341F63C4E112C22870E7BF587D2886C42E16F206900F3667B3D3383E1304F
+DBD345CFB73716CA68ACA9791DF448074464F4B50CCEEC86E21E3C3A914AB2E2
+42336C063BB1236E0D4D48C957B4B6C9ECBFE9A96494FFD42DAEE4536A1FF654
+A9C7C34B296FD670C6C1C6BF3B6FA4C24EE3758C588A47D94E96FBDC5FF9BECD
+A8BBCB4BA781008B6A5CC88493CBE3F6D74E67E5CD30BC3872077D886AAC9F9C
+C070D36E84E752A2A636CF68F451FBC903450B9FD36792C1CF9E49CC98B4890A
+B65231EAF73628ECC8B3C318901FF387326E2CC40A3218A79071ACF1A225CB0C
+FC850EF019A47820388A26586AB2979166B97F1E167A64426E08C03B4EA97213
+61F08047F258694E32087F982EE546B9B5A5BA3E8CD96377A0B5690C5F0020A7
+96FB7829996F9D25D67EE802E05AA9A40290FAB56CE8F8D1447216BB83AE7B63
+B96722E3E9466215BF614F1D8AFC25E59C2EB9C2C7D13F5B9D00D18A998D618F
+BE7ADB4129B33A71C35B11E2E9DE1961E623A39AA6276FF6E4ECC389360D6075
+554162F67D69D66D5FB21359E375E528E1E14D7CB385C3E8476F900207C7E8AA
+9474F526899E8EC5027BE24D551E74C8C99B39160551F7B7BE2003F8D9343939
+49305B8D3522FEAB0D0C413FBDE5F6397618C5E7DA59ED5BC3FA4CD95CFC98CC
+ACB69A0A7803ECEABDA3FB3589EAB7551D7E1E3D0DFA60D4F1FDCECCC2BD79FA
+C806C2CCE4DF768D8454893403B10BB44A2D23629372B018D10F184614DC9C59
+F10DEC6D77AB55A710C807E7D555995673508F2228F427A37855549508A6F41F
+880D9E983C9FFA5E0B1E8829525804536BCF213CB21E7D0A94F2C13E1599B2EB
+135464B3B6CA16D1A3E5424CA492C77963C098F398B61CA9D713E0D86C7F223E
+CA4C83F02025A632339487C7CB700CE2B648A84B8A96D405E93F686066EFE7F9
+3601B8A93E1E17B4EA42FE70D24C7E18CDA5CC7CE64B6B5C96888935DF566C84
+99AA5688329E1DAA4073F7EC4FFB0DDD5D3E430D2ED49E31D611F97984AB0D7E
+7E151E6B18DCD4DCFF6F0952EDC070C71798CFE7F458A3533D7608C131265743
+B34354738E20F027AC853F5FE6BFBE06A9431C7BC6E86B9F74EA06843E71E749
+8471F0F91BF4C9EB8AEAFE5C7DA3B6317266AE50991E4F658CB22077273441AC
+D8788536F218BEB4F32A95F802755A902AAF18FED775CB55BE2301E115BF3834
+DBD7D9A09E6031E8D366B7B1F5B2F6143406372388354E221E736BAF04DB167E
+423AB83D3FB3416F3FAB96FCFFA567CE33E5C684EB6A5FAE0106EDE8E26D86C3
+916B4BFEFCBB239A592E0610F5B879CBC0CFFFC5C6F1C1D60DAB644ED9671882
+89787E9AAE0779271A5E608103DD84A19D22651FAD3F47E1C71A0A429B751F25
+405C770D8F1F014892446E7ABB968D5F30AB29EF6C00F45723E03C9C33FCEFE3
+778CCC1769123D59372C1260DA94D75D1FEA47B8860A6674522C415EAF1372E5
+A2F0299CC85619A331EB47B492AB04C22D02977D239697703ECB8FF91FCE19DB
+33EECA83DA27D6C99679801EEB419803F8C78EA9AC14B7FA77B4334D09C56980
+BAAC8CEB54DB7363EC708ECDF3A858996BF50D9BC98E8825E3D0731387EA967F
+B16E477EAEE8486B8B428C497004A16777B440C1BE6B194DAFE214C8512085F8
+45AFD6AD0202D937F11EF41C09B62A76C4729C4720916EAFA5CF0F2B536337B7
+38167F80AB0393FCF141E31CF356199858645544DF50965FBB2AD9738E22FB25
+7CF67EE01BD054345DF144731D396FC10418ADF0AB6D860358AC0ECD35576567
+F427153D2EAA47A94FA141D9A90D5B06AC547F873647CA5DB91FB5EFE02D764E
+3F5A7D7B1B79A48B876B9B1131FF3B7E3DC14D3CA47C9914277CD8AFB4D8DFD8
+3FAA28D06D9C98CA4F72B6FA1A3DCF8B62559584932A9E7000EBA74B76304119
+1CEC18643B0C195D48E6AB0596FE33C56265F76F580BB4AEEF851BFE33A0386A
+A986B0963ACFCE2954D72840F6C47A20A842F4030C7E7CB22453957F4510F279
+BD8378CEFF2CFCFC864A53299D02EE336E820566272A7FBD161969DFCBBCF3A1
+FADE251D3A1CE607A21CF3A07E1B40F4D303E8000C3AF67612D7D1040EBB4008
+4DCB1AC2E82E0F96795ED044FCEB28DAA619F2499A80430D74A3DF6FE928726B
+0902342AE27753E36AF2CD68DA7A39641D76EAF425E6079D0B01DA2B0033B22D
+9E28588F45E886A3BB1CD5DA3194F07670BABC5FFD5F430D3B5BB616A809ED06
+EA2F183D9D6A672A93E92A36CA61A235901597DE9812713A118A51107EBC1A25
+7A6CB70D73ED31318A7314A3C3D0C35C9BDB25155878F4AAB36ED33D8DC1294D
+84EA63B78170786493CB3CA7EA7A3DF8844758229829AEADDD93203B38B2085B
+81FE224939B203E64E400BC0D7EED4DC438E0942928E89DCF80F7C510A2B1F87
+97D83BCE1F0AE770D59E03498868A302E40147792168A9C07A60BF308F2F689B
+5FB4E9BC9F7DBA4068C52A25CB31F180DECF0C5D80292D89B5F61FFC3846AE9C
+F0D774B011044C43F547BC1E6B8A0D32E5B25D12803EE8F260D2F8A956A5B46F
+6B795EC9E40D1458E7C2D416DE04456EF0624DFA0E8F4279C50B3DFEFA57E3B4
+7EED73A53F4635ACA9CA58899427418741803A65BEF5C12B58221E6C685C4B04
+04AA4391E8B16C9E7D044902F38929BAE586471ADD2C42F58BC7F126A3BE43F3
+736935703A2593B6909A9075582D57731EB5E73A8CD2568620A99017A021FD0D
+0F346DBB9DFBEC179B3070968000112ACD77FBF93F9882CC6D171CF9F3CF19FC
+F87F9312E9A30ED4245588A00DE6FC587EC478361CECB9FFCDF1A47A662DCADC
+218BCDE6C92E1633F01A1C5665FE00F722A48AF55A373A4349C35D866BC4AF64
+429E0BF610943FFF401A8EB08A0E6674E171D994BB79E2FEAE8ADFFBC4A2FA4F
+FB80E16038BB2D7EA409374AA194754B711868431B3ED8EAD9D7B14616AC5C98
+0F2FC106F7C6A78B838D788497F0BC2A7D4598B5F11380385E17D9786D5AEB00
+ED987B1047EE244A645F458C8785D372D90E71F89F73B97A4CA9B34535A29136
+9F97926F249DE89A572AB57A4E5D82C484CCDAA5DB645DAEE36231C7472F2BA5
+29F46FFE55CEC8F4770031564696B5DB9102C854E9EC60C5BCD6E1EBC8623DBF
+891C89C4BFB53A6A2C7B9A7004A58D0A1B7E65C39361B88D41E392938F09B48D
+7B82E3C8BF0129EC393F1F4A78B0FF832CA1A7A702C7FCB85A7FBFE1A9CA2403
+F0AEBBBDB6D490F6A65504B5A1F8CEEF14BF73D7BE2FFAA3665A7ADE79B73085
+D4AF6BE52B26E45F1368F929AE47A25AD81E36FFF85B048878BA7E500D22BDAF
+3D3C08BC57D7B546F54060C1F42C5A13064DB85A3EE7ECFAE562B1D8F759555D
+
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMSS10
+%!PS-AdobeFont-1.0: CMSS10 003.002
+%%Title: CMSS10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSS10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMSS10 known{/CMSS10 findfont dup/UniqueID known{dup
+/UniqueID get 5000803 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMSS10 def
+/FontBBox {-61 -250 999 759 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSS10.) readonly def
+/FullName (CMSS10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 40 /parenleft put
+dup 41 /parenright put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0
+7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81
+DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91
+511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6
+1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD
+028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86
+1319147A4A219ECB92D0D9F6228B51A97C295470093CA270C4488BB4EB864B48
+63941B9739638D2E6F3CC778582B46AEB4E466D89D1C211225274356A4BC90F3
+274C6AA56E200249B7D0949A3FD4185DCB3E5286910EFD7CA72D5D8E8052C96F
+388D12094B87D3705CE64459558CF024667C0FE96CBB32B0BC9E51037D7BD62B
+E4B05FF99384E71D78441A79B0B1DBA1CAE02434A9FAE46596FB86B873B1670D
+AE0BAF516445A0DDC127F8FF3ADA0B10EC30A9CC1F7E9248828B5E8AB46C3FE4
+154B80A54128A08777F5F9B8C519C7E3B632B3476F007FA156E9F39FBE57638B
+4214CD2BA79BA9DDA0F4C073AED814ABCCC2F7906C57A872C00E67FF03AC1200
+29DAB92376422FA21C67CA98BCEB8C431CA2D3EDDC16972F84BF6DB2F705BAB5
+CAB39C82D139FB1304B9E7BF1F6FF447596081D5690B1519E468D6BE49C329C5
+C9C809023EDEB9DCE4A6D52A8049E0CC134E8B41BFC6558CFCAD3D9D2773EA16
+131567AE6231B3235869767A1E7C1FA6C8D6FC1B276CBB1CAD14D376188C9682
+302836A9290E587D4225EB8BB1DBA2C4580A81FACFDA197174FE948CE757C575
+F23070FD84DE121955D7D9307BF986C5E739FFFB6CB76822C341FBD9FC2E3378
+AC9332B40C07D5B8745D74E30F1D719EAFAEDBF5FBC40D0546F69A66072D8A49
+28D2CC2E76B9B1EFD191E0BC7510C2C8761BD92EFCFDAC263342A01398A56D18
+121A591FF5CD4AD8B25699A7897E60BA940336BC17B9EC9F97C2464D031F958A
+A3548D0C97C50C580B6EEFD0FE8330EE2BB0D2E7FD1DAE33448953544A4B1C5D
+8EB57798D0ED4B22909FEA78ECDBC4D8A124DA05B9999242D68681017285A0C7
+69041C1F79442279FBE328733EA0A6694D68BA89739FDB9297BE0CF1808C07F7
+BBF6F1538DFE084EC8C0EC24D883F6CC08A51DFEA23EE920F44BA55FFF58E960
+C7BEE551FCD2D5814DE7E3F835608073C2CB80EC57100CFD484C837881674E92
+B217F4D11165427DACCC29C129005874C05CDE5FBB2D912368EA2B98C45AEDD8
+8A0D2493F60EF36809C8C6EBBC7856F6656E8D398BCB29DAACD4F7D4300A0B01
+161CEF51195D2C58DDFBCAFC1C03F49304ADF02789889826F1E20BCC14827565
+F2A45CA57DCC61B52E33638A0C6C5A59B145E82B82571DF1806EC40FC0E8634E
+A34A791B1325571E19F3AC2EF6FE68A14B0ABEF7EBE0EDA3942E85E5AE967A14
+0C5AEBFF2A36DCA8866700CB7082D2ABE470864C44AEE1F6D180D511304C8674
+D02FAB12A7079ABF96E1CA3CDF9D75532123E87663B1D524265AEF63EB5C2169
+B67A651A101E1C7EDB008D3DB06DB1FC1A81B41B291D6C4A58FB57989FFCA434
+DA84B3914D1D80B17AA3A55A70BBC06C49DD5F7DDD03FEB0055088558FA192A5
+261477899857CF598DB740E82D035E84CF17B33048CFED2DCBEBC2B75CCAEBEA
+B6C5AA1C6978FBB36ED98D9047028360ED430A0AA69AC85A8F83825EA649E1B2
+64B260197B06A24A1DD969CEEEE136FB046D713D0630B246BD41CA285F076038
+F7F8431913BB9A3E70311844D4C22AA446E3CA217A9DFD75A898997130269B29
+AD4AB7D9662856E677FB2DAED7078639CF31C6E6637C74DE2B5D0ACB88BD61F3
+CE3C5D56D3D4B3EC1ACB33EACBE05E53A133EBFE93CE6A0CBC8F24BDC5B31BBF
+5B3E55D6B40B1CED389076014667E28BBBD60145A06BDECEE8011A2C6F06D091
+73767A8045CEF2A110B614149FEE783A2351FB2938A9F73CA406538EAD82ACC5
+A3DFD3DE00221E1B4EA977AF8C89661357FF7D2F1FCEAD6CFC9D6AD81F95100D
+EA1F328249AD84AE849220E6593D45015B4D7C9527F3063E9F6DB6E572092A1F
+1F460696227D5F0FA5A5484B1F0D8B4A35066451663BE448D924DBBFD388B6D6
+D7CFC87C9E75B7CF79A4C9207E29E0BAAAD7FDF529B860F7731EA978E335334C
+13CB2F0A4250F5957B44CAA0674AE8356F586A24FD137103973B9A1FC31090C7
+C84DC5D380404BCDF3FE20C6F74FFDD8BD1DE845E99DC6FE09931F003834ECC8
+08C5D962070B6C44F901A787CCEF048A2C584A2285506B4D4E82B1BF130E2220
+B6C8B3240A4CBBCE16AD3676B23A50B75F82CD88D1B8F21D30A12716426112B3
+23DFDE5A348DC9DCCCE5BB5DB5433A5AC125DE1229FFAAE0D8319B2929986EEA
+56A93BA1FBDBE617F30852A3DC8C712DF674169C6D656F75E252187A085B2788
+2467CC4DB08D48EE6A98C61BC55E6EFB1938FAA718802B7587B94C8F1477E9BB
+DCF6E02B5E67FE3AD9D87C321CD9BC0CCD36B9C4BC601E6BD552EAB8E1C940CE
+3A22F3C2501C3C939CB4F17CE97566F0A04602D2A22A05CECDF4A49CAFD6332D
+5870E1F31AAA5F86867F71610CDB83E473B9D20BA00D8986D7148E0EED03865D
+9622864B52B09D12E0C5FCDD023D29D5AB1CACFA92B6FC14FC84E95F407861D5
+2BEE3301AF399FD7ED04DFDE6679A345A282E7FC08D47E3FC8969D3B00ACD7B7
+F8769647D6D4F4106340EF739583374D023C2702C48FAC1B643B5897D2D7DBCB
+73257712A0FDEEEB98A021D218CDDEBBA34687E23C4828D7F96D1ADDFAED7EA5
+B279322E6D55FB486AD8F3A8E7B2C67915564FE56F0C9277A06B29C47FB7D007
+11AFDDB3FC1B173B4E449CC6B198041CCA0624D81B4840FE5B63BE72157AC6E7
+03E5E95D2E2CE2E40BCE8044A8F2AA45F855484A891B9F0F8F70188AC66A8DEE
+F4D656CBE216E6D9AC33BA8DD0685D480833E1226784469A221D9FA3CA600AC7
+5574B5226649A9C48CCB43339942FC9010F86BAA2D181AEB487A92A96BF2EDF1
+60F3B93FDFF4137A25A8AEC5ADF8613019CDB103DC4367EF3D8AEB4FED0E6BF7
+622AE0CD3CAA0321D26CA4280CFB60D08D9560AB8AA5698231171B881BE9A27F
+BDCF3162134126212C523738D221AA05E31CEE73D9D40F73C450B6AE2C1E70D5
+C37162BDF55943069923A290A6C720042566E55A21CD81C460818883AB016C16
+8FCCD1255A66977DC1C110261D7642199D466DD3D2493A2D47694F842241C474
+1752B00DA03E69CD16A8A14BEB8A431A315D19A39BA978E46EB1189089FEF647
+F9DBB58AAE6B3FBD475E4DCAD241A051DD100ABE81D40ADF18A4C50F53BF749F
+D6F7C8E02A5665B4AD18DDAE79096DD447F8BD32C68F9F97F05E0071D9E9AFEE
+257B96D48ABD9920418E17C8F027E9E975E4A08DFB1988E7104CBBC1CAF356EA
+7750AA7110BE116AF1BA69A94776E4356573B38472A8A1292C63701543B0F315
+611A0E0595B30424A1137478BA6F990AC7C3AB4DB69E75C222B617F373C521D4
+246E954E9857AF59D1E6C36412B643733CF5E1C90389EF0E5E0DA55D3AD12E97
+E7630C315F72A03CAF22E0ACE3AAAFC1D496CF4E5ABC49C2DD5E264BE7EB2698
+AFF36089B5DD2C53DB1C1FCFBE1E89D41A95DDD278CEB29DC85FD1DB8B83CAB1
+EB37C531E9BB8466ED6B8B60258D3C355626CDA43A32834DC89DFB11E5FC6D68
+0F78CFA871113DB81A1690250A6F842ADA15734CB6DF7C6ACED6D8D586BC4E1A
+94EF3052FB0F8B9454390B882CBB6E135AF1F9C777AC362C2A758C3A98117120
+73C6E2FAFB580716D4B2889A4331CC658AAE996245685B973D9C184541385680
+AEC2956107DAB00230FB39BE98D3CA898D917E5F2088F26CBA4F8B5B115B6443
+8753331233B10852702FC26D9DD4C990C13CE4D0DCEA23D62A826A4B4FD16070
+5F3638C0A50A3373A33FCAA6F3644975AFD0560EE5F2D1CDF08820373468E4FE
+6679A229D6955CFDF7ACAA92A87E6D8571AD18CF59F84F88A674B2946FF20A28
+B9798EAA22442415EB46B9498DDC0F4BA6ADD347AB43E9293CAABEAE80127378
+129D5DC69F6DFFBDAFA5D65580239E8EDF6833D0DE6DF75F0FD090A83CE0974B
+AC947BABBD1B1C7194DDAEA37B0CAB477ABF9433FCE0243C8D308409427D1DCB
+8EE4FC36C7E5CEE104904B520B3F6E677A5B92F694BDBC2C799991667E0EC14C
+B95EAE7DE1854BF4542F05B4AF401CF67FC3E46EA5A0DC362F3CF177B1796DA6
+753AA803E724D1721DDD1BCB0C12CE0859E172D2A370C3697286F80D9E138AFD
+A0EE016805F847BD30D11D8B891E54C77AB51A7CABF76BB14B06153C7F811FE4
+93FC4B7CF161051A458EDF767DF94F487DB939A2740B4242BFEE234F75084DDE
+207E84533004B933D43C712F0C71DA4A00FFD6D721EBC93AFDC4200E3B8DE433
+3ED3E1DB799BAA27548ADC853AFF5D9D6BD92D644E3CF394789C99D9DC054A26
+7770AF5DC5BD6563929AE11BE341F036584DD573D3F43D9D975201EF77BEEF80
+D1EEDD1D4AD5D4D4DAF6D5B9D4C1736CB111D6FC74C236779C0ADA430323A825
+09EA8D0CB1772220AF28B93098BDB36913159208D1B2D7ED45808BF7B686419C
+5C0E3DAB5BC9830FDF3B494D624EE8068BF6F5212BD69EF466B9A213047BD105
+B848F056DC544A8CE66C546B1A4DCB4BA29CF0EB4DCD9C2452F22172AFF33B29
+E97E12D8F0D312B03BD9E5377BF0C81D884F1E79DB66E8144F106DFD2579AD26
+C693C5B68F3AC46BF0D6281032D4D4BAEB2243151AB1AC0BDA2ACDDD4D590C90
+F29B335DF8F57DC593DCC081FB56924028E3161AC4865B49D1B0F63F5EE866D9
+7A71171C09B09A44B0E32F03494D9EA63F3C89F5E772BE25A6557F119299E989
+99BA041694ED805AA4F3BBDF00D88171C9D43A9085A287A36A1F0F9386F2A98A
+96815CA51F06E1CDF20B757983C5FDF4003F5438232159F325C6335B734FD982
+1423BA77D0EFD044381AFBD0704E3DE95D23A70E2428E9AA355A9A8A25C6C74B
+48488C14DEC93A766E112D74C83576ED355F17A809E8D3F9C65C4E3E14EF484F
+4658DFB57597E2A4461D8044E95844391C1275D63F282B37888C842A5151937A
+45007547263D70195ACC018A373D498B88C5A028BC66ED96A343EEE74D61EEB3
+D9472B6A549CEB8699F4B35154A0E2ED22867E4F9E4A76311EB2C9F9078FBA81
+838EA49C2966BA64C165434DA3093206B70186BE80600B891D9979F730FDC794
+5DD6D8B2090CC67A634B719F441092A10C447A86ADB78DAE45823ECED5FCEADA
+ECA52E363D913D9EFC0ED98A5A1F823DDA3350EE27F09C14E4C7298CC0FB6200
+DEBC640C68C82D70AFB7A7BA668F1D7948686206884736CD03D9F6E6CF9702BF
+E3C932CEF3CE07FBBFCEC0476EA6E8D5D4C5C6450C8FB236B89BB82D51886240
+5BA7462F50A88F69228DCBDF26B7250E90B3DF8E94ACA1CADD9EFB5C73EF9DD5
+46052314D445CC92512BA231F79A09A2F0D91976B160B8C9BA055DA4AAC1300D
+491193EC66A6DE12BE01EEEDBC3A2291DA1F27AB76596A236B75E19FC5F1FB6A
+DA1AD835CA08B6CD03B97B4CA1BFCBDD2500BB09F1A1B0438E4A759370EFA318
+F062BA9F3D352572CE232E6FBADDAA5363807D0DC5320B807FE5485C8CB09B6B
+0BED9F5B1300FF370252DEBAC9DB25CE2EC494E8EEA45FC6604B3C104E81B287
+EDD49F3D7430EC9176A16B4FCEC5DF68DCC11ADF90BD5337E2E4B59BEFAC8298
+E5ED2C7FC5928635420FB1955251932713236DCE28012C86F63D12AF1DB634D0
+0B8CB8992B8723548177BD6822A808FF221A9E38B0DCCBC1F3430A9BAEDA89CD
+ACEBBDD8CCA5E17F1CC37E35A01E058BAAAB6BE7124314DA19962BADB74EE73D
+8FB13FF6AFB6FFF97926CA045B62B98BAA753AB0FC78B881D3FAFF9EE2FE918C
+8EDBEF87637F1530E3E13AC090FF81F4136E08D5F3734327E643CDF621278741
+A17AEBC56E21217888A6C8B5ED4269731910E7E25693CFBDD4EB4A32698F2447
+4C45D73E810B627D8719E4E34D8FF378F9B68BFB149AC67B3B1E55F20D097FC1
+AF74D46F5A3923C63DFEBFCA210F6B257F5FF3F2AC34CE41C15C9977634E473C
+2235295C05C3DF6B3009C7854BF11CC87471CBE085793AF9C5D05C5479B9E780
+14A5A6F3F6DDE5A18243DA15732CCF26ADE40C566DBC3C62B71D46DE87A12C6A
+647CAC923254E2E74AF882DBD5C9E108A9160393C5CD12566AF7C824EFEAC56E
+6F05B92C73A76824C5ED1735BCBAC61B98D509250C854CF1500C212F574D18D6
+4426B8510FE9785B814A70E75C9234D42483E736D0689D3561E8EE5650F33A36
+D50127589401D267BA6442E8616E2CDB1F6691D3FC4A2A377E5E154972E890DD
+60CB463E9EA9A6EA61087DF452FA5646F69BE879337EAA0F5DA4438FF0365627
+4E3B16851C2F08E976FDA27AF451CCEFED00376FC3D6E0C160F0BC19544DE289
+BECEEF9A067FD71D54DA3A4F73F06E2F522BA07551296214DDA47B1BBB1212E0
+1100ACB5F65FD30C655A3402C83058F8ECFE48FA60B6A3DC86C4996414130194
+6676EC7F37454023AB53E9D9EE60249ABF6953E76DCE3123DD268BBD492412BE
+65D7C3E5A5E483C381182A8F19B506F0AF6DCD55532B89852D1D96021B22E9DF
+D9D072BD7DD4450577E658B433A84F92752B260AFA2EC4A118747CBFE36AB7D7
+6D5DD96A119AA1BDD0FDCBC3AFDAE5FF72713EB46759A06CD09B5CFABCDAB0E9
+85599506AC07AA525978AB157496163AAB387F079EC9FA1F9E91B9C2FBCDC9EC
+7027D77016760539AC03F1C1DB242D28D6EE946C42DD2262D82ED48C3A839853
+BA977046F0EF373AFF884AC3112D2FB319421C3165DFA5710BFB9AB9595A10F4
+9D05704B9E22137CF27F4B2DA9CEF6D8801D5F792969B2E58FB539B8038DF440
+6DE20C0313A7BCD16F279290AD6859B0E657CC3041C7928CAE35B9D3A681F2A3
+2D40F8EDAF1127E754276556C95E1282514B6EB6E43FF4F0FAFF28C715E3F39A
+374415B62C1F5F8E31E006D6ABC736057910A3729AC60360CEE1B2C8D9F77336
+39CAC45329A372205FD551B9E9EA5082411207473D9D90E76136AA70180172E6
+AF6EF3EF6B38B1906B904BE9BD5251EF067738840C28877659B649C6C4CA328F
+1BEF8A9CEC2CB062702F58CC0B8D2D097FBC278F9FD894E10ACE1DEC4530CBF8
+E4E467B6DB9C596DF0C3D43E6AD70F30B733EEE692C2EBD68756D0C16E1F00B6
+AD011B5DA073A769B53C2DA2E7C9B7ADC6F551BF4DF4C39C66443692C3DC62CD
+B1E094013F364D04BE2FBFCD1C7B2836180E9022E0434421FFA4317A50096684
+CF0B8740EF680F27F4A84AAF2AA92C64883BAF57BDC60C6467A8D4E09E6316FF
+9BE73053045E5F3586DA3BD1298DC15D751913FB1E72EF80047F6B33591B97D3
+DFAD34EB224D64EF60F5B4ACC6EB42E1BE0CB2812FF2F3C264AD2E44F5EBA441
+670CA0A60E73176ACDC4E42E74F8F489C73481EB5D46A61FDA1C0FF9F8844DBD
+99CECAFE2A72833E4522981FA13713AAFAF8F121E60FAA6F379B2C8874CFF23B
+8FECE70654E5855E525A403700A96CF7F8111BF2B58386E29640D82F1DD86900
+E0E203F3ED554209CBDA2A61A5641D4B39D98C5C43D4575648D06BB82B6C4D4A
+F043EC61B17C208CE8B4F43A7BCBBE588A3D13A183D79A47404223037FCFA4F1
+DD237344E589F161BB9BBF3FAD2E28749350DB9A74C09E894BBCA85B82E704E2
+99788B24642A7D0F0FD96601CF1AE4819EBECAB89824A0DC1C03BA4B546ED36E
+DABC8D49CFAA53D2A9A5DD6B3431E364C99ED0323513476CDCEE49BC413E50BF
+51EB93563DC03B62F84C5F96ED713F288D109C79179AEC41424822772032035A
+40E84014F5BF40948F05E8562C9CA9DDD71F89021BE238E74781A92D64E5F9E5
+AD6C0D954C6686C714BF189E78EE47F1530CDB8376E52631A1A26E3021FAB977
+DBF01167266AD68A779C0180E034A90CB77B86747395BE885E484BE4028B4093
+8BE191D58D0BF85308C72E6384292A2E1CD06130A091F8AF9DC6C3E12B1E4BA2
+BB2C37AB4AAFC0CCC7964C06B9EC1C7E3BDCB6BA265288D9C8625EBA35BD2A49
+BC50472D7AE262237FF1EA8D9DEA3C0DBCF7C3B2DF5AFB1F31E46B48E096517A
+0CEDD60F43DDB684BC6E4C3F6F3D70BD58AAB5052936EC4ED7140EDE795223D0
+4E3B95161D16B0402EB45FE97ADAFA0433FCAF55E22BD7E4AD2030D9DC86F55A
+8D7EA00901EB1351EE8A0F1BFE75CE46DA4165D78043F8F0741D4D9DE0CCA00E
+5F7D89A849AD0F0CEBBCB948613028CFC39617FE9184753372C375A9896F5F1C
+7E24255FD49D2109CFF9ADD9A118CA47CF58975A9CD3A960A8A08A078B98A50E
+4DE619C8B2D3E15938C879D785539445AC468AABD6A6576AF0E8ED368A9350EC
+717B7D3BB55AF58941B47FF639CA2946028CDDFDB84FF0060D330DCDEDF13BE1
+FB1F743317C15C7A9F34408F5FF7CD9745217D9B809DACDDF7DAF9D821C06B37
+25738F0D20F4A86A079EDF71583A9640173B3EC529B98899601F0EBDFE45BEF0
+
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMTT10
+%!PS-AdobeFont-1.0: CMTT10 003.002
+%%Title: CMTT10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMTT10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMTT10 known{/CMTT10 findfont dup/UniqueID known{dup
+/UniqueID get 5000832 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMTT10 def
+/FontBBox {-4 -233 537 696 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMTT10.) readonly def
+/FullName (CMTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 33 /exclam put
+dup 34 /quotedbl put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 55 /seven put
+dup 56 /eight put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /backslash put
+dup 93 /bracketright put
+dup 94 /asciicircum put
+dup 95 /underscore put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /braceleft put
+dup 124 /bar put
+dup 125 /braceright put
+dup 126 /asciitilde put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E5ECEBA191DB82B3
+7A69521B0C4D40495B5D9CE7A3AF33D17EE69979B82B715BAD8A5904C5DE0260
+6C15950CCF6E188A0CDF841EB68E5A2F88253E382140F87C87E55C9EA93B8C89
+14A36CDF630D6BE7CD36DBDCE22B21778E8648B97B7EC6742EB5114BDF0454B0
+0EA7B1FE236C84C0E5308C871F67B973892890557AA12E00B2C20C71F516C397
+3F3BBD14A1D0149CA064391056E45E9470FC7F6F556ABC82653B3C8049AB5CF4
+BA83C8F2158C236B2FFD4208846013BAF4165E8BB8D334C8FF2E8D74AF5DAB2F
+D44788869B08399421AAA900ECC6A2D594641C121660D4B5F512938994C18DD0
+FCD9B008F68F0351D21ED735B2740CB1E0C1CCD25EB548C35B844601D98828DB
+556F71D07E081A593FF12DAF83676492A0FFE16E95717A07082B43A966C1EE8F
+8A59E1255E1705C43A23CF29A5E4A6547C93F1680A870EE7BAD8CF74D838CD5E
+F806911D8FE4262ED8E7F5BC58B92C9C6D74F8AD45FBB021EC7E97393018B9DB
+B1B84E7B243ADB05ADD3F1DB3692ADC5D47FEC7DF93080669E63281F1576B673
+125EDF08016664BE73364F65389F7C3B66623AD1754ECBEF9E5CE6948D933787
+A5674279ACB2EBECD3B4E6361419AB32028A27670C9F3E18B746A10B00AF6D77
+4EC00E3BE521C02A99AE5BAA98F793EB1228952BE67934B91472E01AF7B816BC
+56D7F19F631A1927846D800C107B1E9CBFF9D2DD513B4A8CE2E0DFD77B1ED178
+E43FA7052765E9FAF89989D490D8FEF6C536EC0D4AE27A74F474B98DA9E6B92F
+15E063DB260571979A5DE2423920CE1F59F56EB11E00E3BB9D466A8263E1E385
+2014BEFDA8D1EA3EDA04BE32AEE6CD15C5C010A1DF7F705A2C0C18E87C8DCCE9
+05D9163181CBA56C0FAC8C06A2990554C8E759D076B01BBEADE3B5FB8B551390
+6C8E4A2A1C6E7D9C708614626F3770C0AB7DD2027469C77975C27576065862AD
+04E5E50CEBE907E3E991FA0C627302C0E207B4D5992BEBAB5853AD1C0D271728
+C76F40A79392ACCA7358F948AC65DC823CFDA59E1FF69CEBB6B7EC3CF21669E4
+70D999508F9C49E2D9F8818CA53C977D93E15FBBBAF75B1E84F0BA62BCC4BAFA
+4EEC82D804C8A8C0210F3E5E258BB1F6921AF02BA9861BAD5C3D5FC8CEFABA8A
+A607E547B802096F7AEB09FBA99C83C9A494B94408DD607CA6561A6E6660C473
+62CF8D35F31D052F6C6C8138A8E1430CBA7EA6973D6D510C1A06B3FBD79D9364
+240C1A00272DA44B89A9FE8D5BF36DC1B5EBB4A78ADBE9C5EDB485F093D9517D
+69E1AC9A8E6C9D7C324E3797CFEAD9A18E82E03F69B2CED7D5DDCD1A218BF2E2
+ED2293AE999FE2A4B5213A10083EE0407BCF8007670B8C737EAB30311C868D84
+121149ACB4A27F3ED6C0C181C98AAAF51B105F264B5672D7F745131ABAB5BEA4
+0C9B43C0DD9116D6DC61F90BE72018F290D26D5E9D341055CAF09C9F45333CDB
+D45B7954271767F638EEC499F7B53C2CC5774EA7A7F024C4CABFB93D9CB1856A
+0C671A4ECA7C62EA5242648A84E7F3AFB9547A0AFC29593CFCE6D8B873A78157
+D337CABD291431C0A2CE1F37E0CD7340567AC206FF98E4B5A6410F70F750451C
+550EFB54AA259A1B236CA9CB730D2CEF125EC65D959441F7CC9768F777B44844
+CC9842A307C72B740680ACBBF6AA35FA7A94825069BF7696ED81A371A9E5475A
+9D997F2DFAD339AADF797F7E03E654234455AC3D17702A420EE0A597BA31BDE4
+FEB8DBA7C61D311CC90441A620164DC22DC2D373973EF84CC553453AB1B3337F
+7B39983B8DFFB3A9425F119B45C1CD37A76F905777B3154CA6200792F1759D06
+E017890F4041A385F2238E3C48B6C8EE6F5258463FDBFF7AC762F6C4363926D6
+50F004D473B7B7F73CA686B559C2885F1AA761653C727A77D73431E9D110E76A
+2E55C68CD50F43997C9B2FC4710F8C8540909829E215678E63BB8363C4B8AF05
+9986102BB36580D9CA95CD216B7C321822CB41B2E0422CD077F3B55E0246FDB2
+44D5976F67296B5B0BE4B06F6E43535C21164E6C5089C3E9BA2D6B30888C57DE
+49DC8D9D46C0D5EDC47ACF2C03B72DE3B69512508539019B759280BABEA12BC9
+385308A0395C4CD33182A10A5A229743379C2075D82D8BFCE4A66E1AA087A091
+8F5372684FA5037D1B92D50CD9CB4F50AD4F8EE7D51F1C9E63C721CB5B9BD011
+6F0A8DD4FDCD2B008F223A1036D90F0F3B252487DE7898F9AFBB3A9D9CD49E0C
+EF4ADAD5155A98D2125ED5A3D3907F67301649519419F33CD942E8DDEAC1BDA0
+E90C431B198F646766A8FA9F8D1561B57E126EF604838C0C1966655CF31FB7EB
+C8CCC434FC1C96046D38203E1791EC824A3D7AED85C029288D4608CA7668A2BE
+484C99639F121845B22EEFCE0A3B808261921AA042AE19E641769E91277BEC29
+4594082CCB3058F90FAC4A700A8A827ACA00FCF574ABC8EB7DBCECD97F2B22C0
+0AA19E8739B81AF8C6F621D69B8E6F29BAE233FBA655A0AF5BDFD7F5C6B9167C
+6BC7AB693D45EF2AD999F5DA3CEFA39BA48A17EE6D9F2C4DAB91AE3F0044DC3F
+5D5506CE4675AA928B0092D6F173644F91295216D8BBB14CDDE0AD524A4D545C
+1B5E284A3BF0396664081CFB4F186A84A0D24D61E82F4767C1E55A0642720CF3
+909FA1AB8EAB78030B59BEA067DEDBD2F1D0340E790AB2777DB18248521934A8
+BB38A58B7F633DEA4291B0D5D13E9A882C974697CC6D3B49E030C94EA29B5506
+CC29C44D01B4751B453A46A9F6BF3BF135AE87A4CE232AF57B66578310DE41E0
+2A6AC422117F1963C4D7CC306BD25A6E724E51921779F22F029733122E23E2F0
+CB340008813ABB104380C80A492B3FC6D0BB07CB8D8409E9576891EF6E5C9D08
+EB8320DFA31BAFFBD336D0C2BBC3D3B2D30368B9860768FC080D30569C7F7811
+0EBEDA2962476113625EEB555490B8CE4C5F99D74ED10F738C61854CFF8B41C6
+9402E56BE8856144A1A05D0B05F4CB7EF728B2F4F5A439F18C3B68CEFA41E59A
+D8308ADC92EC1289DC84CF48D2CDEFF509A145BF945E1E00D552D329EBD2A7C4
+21D58082CC8FA790E981F4AC8EAB99950678FD3A7DA3DF13778681B208DD71A0
+7C3CBD0664B37C9EDC6B601D79A2C51FB54DAEE849F93209793849104E722D3F
+52DFAF7047EEEDDFE744787A5801E4AC2C3D58EC5DDC15FCEE03990C53B0C57A
+FC54F125A04C8E4A0ADAA725808C587E7DAFB9F784FA2875689979D316DC22BD
+AA36B306A1ABCF907B63C6476737B746099973CAEA8C1E2C5C41F27E0F7DE8D7
+F0D942E34E92F43FE902653D4D2EBB6F3B9F7928B1550A82AF234D45D028F429
+067652BD3D391BF423AE72B9CB1E8D91E898161BE3A7849D456A861A2046711E
+E934DC59442AE7D81661CE8EF727D8D7DDC0270E937E40F896AEAE6171661431
+C1025C53172F9D366834BA0054FBFD84503FBAE328B6FDEA180F8EA35B1DA937
+5CC3B8F00C206908C2FFFFA6A7AC6915D15EA44BDCF29E2BFCFD4A849535F19B
+0D307C696BE8205C7D84B9C77F02EF27D911056EDBB4080E4D3ED72788666CAD
+CD91B0ECE27A177DB23320A7FA9C31408B4D02D2A4B1CC6DDE1A6CAC3D8EC1EC
+2226EC98E51046D1EC26FA20EE62D24747D83CF4941DCE5CCEEC0DBE387149CD
+E05B19FFCAFC0D117F9A3E60DCD4C815228D98EF95EB559AD0ACC0D50FFDF714
+56C3C812EA5ADBB013BBD956A7C4CC0ED7D3E25D5C9AF5E626F18297F75D4957
+F5B0B33379114B903FE98BCF35C3FF76FEE1D9AEB711F2962276531F7380EE3F
+E368720E0292A170A15C5539B1FC7BB954EE2624B504CB8C805B8D31AC38307F
+0513606F09211AE64DAC447693B2A0AD15E9A64C34F5A911ECD0ABCA90E9791D
+67C6BD202B0858EF96E7722305B8AC02B01AB1706CC6AE875A8DDD15EE349046
+EAA65005E7866B506EDFB7A5A2AFD5C9E9DCC821A79EE9C1EA2C7BBA32A40BC7
+CEC26DB1AC473C8C3960ACEC581B37D6569E8C8C42950BAB7930B65E1570E3F8
+9A7FA719F1DCFDA45A3BF2AAB32C9A93BA3552608A61C623DE59BCB346E87EF5
+9CF025A87803161221C5C1C6F6B3403712C76E9D755C7BD68D7F2DC03C14CDF0
+C1BBED1D648B905B4B17037B7263C1EA7A7F06FAAC4E09E08483A8D714C19861
+327CD9C32DDF850302DD6DDE24912D00C22ECDF3CDFB18FA831A41A7488EC203
+F564CFE30D506F0829A96D35A7E09C3DCD107D589B627A15B55C5D6649126BEC
+60B88C55ECCBB4E680265D9EAB4CE22965D3B1AF759B01ACB0D0E6C92B6B4EFD
+A81E6A648708979487FC591CF09631310D46891423F4EC159A73E30D8DD147A4
+B0EACF6D45D18CD16CEB8176F03ABCB41F2234747B9733C8FAF34AE5D43D3BA5
+0CE0FACFC9B087F84FB6C68678BC6E76022B1526D6E5B3A48EC1A110BD75F45F
+1C4DC6D39F254976453F57DF873B7D635C80C42026DE020E5BAFE0DA0D54D1E1
+DC634D2621BA184347E5252F645A6A1DB7657C48124186F0E4C644077457C24D
+55753C651A9A7B6349867641464B515B821349C795A645420508673B93750D0C
+7A3B33EB1F09782033742AE8F3A23FC02284E6C03818FADD1731361542E3FA3E
+75B8D52B668C3E18A4AE967D0FC3157083D952AFB8144D549E69EAAC51C279C5
+E5D88A0D9D53013DFFB4352A1598FF84DCDE6FA32FC377306B9B92C0F96EE149
+8CD55E7B2445B86CCA7A547FA732D52D59025129FD8C6333AC0DF4F0CFF6287E
+F2036D5DBBB3B91B92F12FEBE0B61A313A4DB5A9CF0BB3DDB781A56FEBFFACCB
+8CB9D1D3DBDBC4CB6AAE6769E470582403CB920630221B68BCB625CD4605FA8F
+D3D5B7A1A28D15E44B38E92E906C138E72C15B86F64C38E23BF0440052A8C914
+54397F49DBED99D0AF7CEA3B0A05FF37C2D7EAE1412567E6776333237C31E3C0
+49949EC8BFD6E0F6446CE2D4DCD2C1524A288818CC5D159BF8463A847AE4A2B9
+CC8C58F822804B81B13BF4F2DEB6229C4F51F093075581791D02C36A13B855A0
+34900AA7CD4F1A797652656FE3A8425A38F421C4CC0ACA1CDD44FA6B31219276
+1CDE1CD63D6A58CE705CB56CCA1260F9B86E989019071563A9B4C274A87558CA
+6EF1660D574EDA276801F0057740E2C3B80D253D697736484D892CE1AB128B8A
+DECD69712F5E70E895FBAA927E8194D792A04AB6CE205E04E38A433BBB793FB4
+E8BBC4279D58A223C6673D909D6AFECD246E66A52F4CB35E5931D24C828489BD
+4ECAF621A220D8ECF702BEB01C4FC7510197D3F6D15321EC87175ADBA6434ECD
+2B5A306E91375CAD22CD94301763E4A8B981472890422C5488FCD523C9CB17DC
+ED22FBF12D5F7525D0D6BCFE8CE85B0DFB1D6F989C267FFBA0A996D309E4A934
+3DB54A9D29C88B9D55D7300DA3D46419256C5A07A2A529A8DE8BD1727281F5FE
+97033D861E0531B14E811378EC1AF1CC7EE9BA2B07D935843D3053F673979F8C
+FAFD59D555B56CE338F606747238B22BD62C42BB7238FEA335678D474A643570
+A9E7B4970E8C541CE9DBC7BF70ED7BA33639D6744A18379455029E934C95E2EF
+639C4848CE9A0879B51649FAB023A71782444B451F92A34CB8A124270CCF86D4
+D18EEF5C1D2B2A29012613851C49F50702D63BACF95EE2AB4D72B375E0A62615
+E0991E130A67ECBA9E05329B740708F1CB148724C3A6E5E3AEC1F88EBCA398D2
+1CA8827C977D72734310233176D1AE26C55CF2CEACA62223315C28FCF6305C7E
+A22414D4739A059F552F1F9372CCCA5FED4F9AC987942848EB498900269511F3
+F408CBEA0659B954F5F1B18AE4FB270213646F9B28AE4439D2BA2D3E0AAAA780
+5E530E4EFC8A060EB979E12191044509DA0C14397AFF949E12DC970658D5EAF5
+4EA963F5BC1407A32F3837CA6A24B7F3D60EB8E6222B702E25ED903F9D21AE50
+664A095009BDEAF4B78DAF94E5A55D48366CABF07791A1684B2F54EA69070844
+4F031AF8DF416C2D3679F8BA038B0DC9DD0400CA6B34667BCBBC07E62C1668A8
+35A8C57C9048A7227E672E89681B54D662079A189A9E96A3CA96D8DD10189B04
+1DA49BA2729F1CA585B1BD5C467295285D52E47CA904235A1A3E48EFAE9EB6F6
+01374125CE89D53C276858668CF45D2F092DDCAA52418E0BB94C2B8266B4D88A
+5D911507BB1DDA3D8F6E7C14A91CA11AE799EC42E993098E18CADA70BD2A1D82
+2C39326C6E3F9E84CD9758B9AE43D79BF99E6A0CD713E95B3D9B7DB90D127DE0
+DAFEBF850CAAACBD860B5DEF2082F1ADA64B44B193C4A1417BE221FDCA36456C
+BE5934C8CE3ED55AE3A11697C2D682B7D0F72D48976451D205783BE25DBD2507
+39C14FFB4BB828DFD187104F38A7F11D5F0698C11E8C1D4F107CACE573FDC4B1
+C56FDAE47024D6FD16A2FEABB434CA320300FC4B6C1B6CA08F76C60B7C08A665
+99F404DBA8A2A1EB18EF6750E4EC186E31561A3F080BA6562967546715859481
+7BA782940F5C5D06626D6F6A412CA7C13820EC7C1DF23E15E5829F698CF617BE
+D940523E4EE4ADECEC48C24297DBAD528BA1DCE7AC335A1D15D55415B108EFC8
+6D45030D27B3EA63B2B4CD771DBE66AE0218ABB1153D4B7482289D1313CEF184
+5C960B1E3C3C953912CC6F4521D1E15636C1545EEE457EFB87B88C9E43CC2F38
+6BC4BC96969F4FF28ABB06F4454C01CEF1B6DC538F1E832FC1666D977E5A881B
+F72F1B4C7DD4BE167A5535F1163A0706F9A0B26400178DF8A128FB5EBE6A7B81
+E478AD183EC06622B591337B9F1872AAEA356F4FC67EE767B34CB5A4D90702D9
+39FB846947F4096FB3DCF16EC81455164783BA0B5D723060DAFF411B68307E81
+7BEA1D9A47A5AA3D648E618C83C60F060029E6EC4D46B045FA7415BAB2AD0AA5
+ED9C729C24136F6AF61E6409C0B5CA760B16225641E268A68CFB8260BBEAFC77
+6626EBD97195E77CAB425CFB0096D805D9EE699E41680D095AE9FA10122A7882
+2F00F495C9EB2102DF0D3E61833BC0A2E468C5CF7AB430FDB7C0BE3DF2C0D230
+1580BAA25D65F599378D873165482A1FBB224AEA89C6BCCFBDBA42AE1C5DCF41
+06969F585CD3B737D1388D6359F5468D88FCD2279BDB270F6A858FB7D2ABDEFE
+5EE8FB79FA437F8F50237B92C307B73B0DCB808D07A9C3255CB9B3B17039CE5A
+288103D05D132863FB522A02CEE3839EF9AF7F07D99732F0B8B384745369FB3E
+7901166478F4A16076A1504C5E98D17408494E270BBF4470ED12B4332422679F
+759F1D93984D7E506D16950DB6C2682FE1379EFFA6F6C95DD71F6E55BE3EF6AF
+E0CB25388EEB436E6527806FC75484133F6E561DEB979D5C1FFEFDAF2A6D964E
+03BAE0BD593C2992AD84569C81050F7A793C5263E50C2F50B98C4CC703EAE17A
+6AEDAACE312DAFAF5278D125B6EFC5587484F61DAFF46B87B7C9B1EEDECA4859
+314A9A9E2248467DE1E54D90DD671660B9040B3E0DD982260822177EFD757266
+74A16C83A7FB168016A320D3DF3BD7726F1F4EC90EE5DFE810C96B099FD4368D
+906AE4699049EFD37E8EF058D4B97BF71106445AADD4FC6E90615A0066823A36
+673B8DE32322BBE861AE251226B4385AB28702831270DBD25D666FBB0AD7B96E
+A44E891EA1EAF0F87013AFC982E33D67A28E96E0C9CB99B9E4192536830D9901
+931A8CAFA41289633B20BA3BD7AA3414B6DA8D57CCF2FBE39920CC06361F075B
+CC40335DB9A0071CFF77F6B7BB47F3100DBDC9C4A58C2B81EC99E8E966AF3390
+E3FBCC28BA1D79961C8A1584266454DF772FBA99664D74D4A89FC82FFEDFCFE1
+4C9E4A04291E803D142E37E7ACA66AB279378F2F192FFB2B5BBAD18B95F03136
+2CB594A3D6D3F8576B90A6C4DAD6D6C8EE07AF682F925F01D0B26CBA347C03BE
+F3B0585CF4539FDC66915E22117078CC94D621F31DCB3E021998A5D6EE94CA4B
+E214D07517283D56973D8E4367392BF6C1150DEBF459D141AE0941C1C8C5CFBE
+E735D796E365A1B0F60BB4CF2801EAFE4889EE5F338D3C4885368281B3C95CCE
+251C28A90D318A8A0384439B38D63B94757252062EA44E88509FDD2E75FAAB71
+7329622828B2785C1A8B26351BC74237A6BF99216652ACBD4CCF54CFC8AC72A6
+46342F1E32D4318E7E27C7B2DAC943B3E72C472FC6F1DDA8684AA922516A672C
+E969C047E318B5E3B1270C1BEB1C4071A15BC81B29B268C679B41FC5E381BE33
+DD95F0D68118CBB60C521E5CB2BA46A10E50E9238163713290DF6DD8A27D3813
+F871C07E725D4518013D9A84CEC96782541E5580E33C2EBCDB18F08EB4655A46
+507A8526DB26C854928B81FD502B0CCE4A68943C12078F57C10F4E85FBEE1025
+46D925B8B3B447D4920410FEEB9844FABE985F9228FDD9F58392F2F3BD650E49
+2E3AD5A14984874DF4572816931885CE8A448EC95BBF40DDF4F85653AD90A88C
+C4A879C0C7596E61997B972E8A55E57B17F802C738E5C7A8FBF6424F8B131B23
+CEE3EA3747DB066246C250EAD335A76FA166ABF75120CECB59076AB31A51F176
+57176CBE8C802A97B0542A5CFD6D5E6D7EC848B923012E45D9F065BFFA0D03E6
+788B68BA4DE51DA37994948F859D41C28BA939C3A82BFDB44DA585AE80B8CD7B
+A6EEA79B70BFB4864E06F06A9751BD2D2A209D150D7135E0A25D67263EDD2A7C
+C63B5B76ADB05A2BF747D5699036377F1A645372E5CF6497D8D4465492780B56
+0D7A64F4AACF00DD611A0D4AA2A1B4ABBCE41B0BF87A7351F26E125166E2E07E
+2E64639C4DC21B996EB744C784A145F80D07676331178ECAA4967195803AE02D
+1A6A04B38D721323251A1B1F656498F5FF255E4F1632DEE1A8C2B197CD7BD5FE
+3819B1998273EA5EF8EE032E0638F6DCE419852021D098A19CBA9A2B675BEDDA
+B6513BFA1F239FFC92CEC9ECC612072E87FBEF1ABEDF6804E605AC8979E970E1
+3EB524894E3949BF090C1BB477C45FC0054DFB6B6816C5B0312BB9FA09EA87A0
+9A18B9B5E0DA687BAB199267EC6668094D1FA853632DE7124CEAB78BC994D6BF
+FD8BB4B920B89A68DC0D60BB73AFED84D38925B4E8C4D4E239080FB47F44979B
+7660A9C57F1CBCE1AD69AE3E7782796EE69BC910251DF8406ACF78CDED5224AA
+B13F1E17BB454BD4B5AAAF0143570E5FB2236DD096A2607B8D24EE238110486A
+0759B4AA276E3B5AE6BCCD2299EF7EC5C0ADB9E3A838DF0A0541FC56F62684E2
+F165BDE1EEC719A7DD44D7251B0D28C63304BA3758C76B1FACD54A4E73C9B32E
+A49366083906EF8927B6463215012B3927CB643C0292688601AF2348D62292CD
+5E20110FDD05739D7EC6A3BD1B166DCC421ABA7901FB926025EF88A54B0E695C
+38E9C894A2EF7F33E5D0304268849FC3D2F972148ED6C631EA375D67DEA1F8C3
+C44173E5FAD943C81B72D818D7202AB20B77EA0299D4FF7FBCFCD7BDB0C9655A
+B02646E5BA32F6A7033BEA306BE69EDF532347B24DC7E6BA226C6005EBF841E4
+16430F8B4405B2ED05003F10080C12CC74EB07708FDBADB821BFE0DE6C8A3278
+C2349EB88B977D15639695B35C35235E00862E70D7E9BF6632E0F2E342FCEE2F
+16880A993EA9BF5FE7C0220D844C5920A2C334ED030FE2D062F8549508589F66
+66B2E4F66E249A01BE6CC56E73AB21117213B7502DAE7A2CDC2D8788C24F8F40
+74B96C17464510BE4F2543E536BB32E943522E9113DFBB56096A34BCF507E7A1
+B17451E6AF90ECD2A3E0234FF01F93BF0BF1300FAC48AFAA064419428256019A
+A55C94130C7A4AF9ED17AF615FFC9C10517B0D210C464C8C0E2B344B31D33886
+5264577F17CD7137CCED2612E1B01DBC93A98CDCC6C83A858307703AE11DF924
+BABC5FDE240C80CB0B4DE1672AD86C9BC4773E95182C70A6E809D336B71E25E5
+17C60BC4C8182FC222EFE5419EEAAB8CB1C04750631F7B4846D75651244286A3
+3F87AC81C3DE5937D4545937DF166D02B0505EEF1F744A2A955DBA5AE1FD8453
+8E3AC7E38B333C7A741A58472B543C870CD2885E812FC88DC0E3A56D3340144C
+B6EF013F04707315145E4B41142BB00A2BE5F6D17EDD30DFCBEA3F099010C431
+E2D5BD261DCE594B5E0FF7F1E836E88494B7489BABC9A230A7324E122F40DA62
+08922179B7EDF55176E4D11F985E6F3CE8B6695BBCCFF8AD96CCE92C0CE3E8D9
+C27F103747346DE482B3A922A19BFC5E18C3556B48BF53EDCE941744C43EF096
+E36866CF42D145087DE6A41F205D04A802E2E26EBA56BE4BE182B460E8A7DF98
+8C160EEF6FFA866EE54AA2541B1595F5B1D0104BCB313E5C886A0519311E2413
+CC40CF96EF3E05CCAF796A3FD36BEE034878238A40C77C6205904A9ABC8CCC9C
+7E1AA1FEAE4732BE0FCB9BFF9044486A232D39745885AF66470F281F7CD076F3
+B11CEB70BC1215D944D65357D0967F83E13EBBABB3576B89AB755A14A4A8D292
+5FAE31DDBE3999E4EAE54E5892C6087C4B6436DEE581FAFD1F33A8DB8000B5F0
+F644C655674DEF2BAB3105EA12B5550286FC001F5BA1A63F46E30A2EE663C24C
+F5390CF05D72727D7AF09433ED15A112E199447E0C516C8D2E535D38F5EFF96C
+763F51F7A8656D90DA6AD7199EC102AFC5D65DFC505E51E7EEA199D39C2CDF80
+B2CE3E35B688B79D566F1737C588D9CBBAD02F9782C7DB3439DD85BEAD21C70C
+5628EA55B38F9D2BEFA897974E09C2413E9C51A2400BB2364D650BF71637E7E2
+99DF9E4BC127FB7367DD9F74FEC16E339B19FB70A20A4A2E4874E110880294CA
+C90712CF08AD98C8532E3B730962F63C8F8D3DA209A0E23FA25DD02421B4D4B1
+DFAF5D3548FE36B0A1637ADE5CCD1672FBD40A3D1CDBB9499B4C660A27F619AB
+C06F37FD8EBE08C838060031735E43E74F649456956B785270C84C96EFA7C5FE
+2404D77480F5FEE892AF6534497C7AF401A5C9AD95B4B4D186076AB0A32315E4
+E6D7185675405E6E483571A3CBA6EF76403567F282B2AA8FFE99D988D612DEBF
+7ABD96797B6404CB5CD95D39464213DF90944C3ED33778F3EE4FCBB1A5F961E7
+9714553A81472BFF2052561C22720C0C8493D1B2FE75019255AA8014F437FFBF
+380BD498D02D7FA6904B4BC147C8D75C4863DCEAD5EA7E6FF41C609583BB7E99
+03ECAE65264FD63E13191FBC5B26E034651B737000E6B894C373B58DF4002F04
+E2F7ED898A9B029B671A19934263D92A0B8E3F7594FC90F62F937842E614689A
+238062D2BFB7C44482AF7C1556760125086F34A76C83B27717F322D190D30308
+EBD2A7BAC65B74105193942208DD78056DD569B2BA9FD4066A78DFB0316C1DDF
+C1B960A6AE6BFD9F7136870100916A9F8598C1647E1A9F86A26A83111433584C
+D0F4804BA5C3754AA9C93A9054C4591D38CC05AD1433EE5318458AEBD77ACA20
+5B1FC97F62B5A90E3B75C7A15FBF4EA4B0A8D1134E117D38C82781A68A3EE04B
+80DB2BE38196EFB1CFD47A5DC9874A15F21D156A23DAF2C7D31147D76599F8FD
+4A575532AD29F7203964BE4C153AC914516D33A54F97B9BA83562DB89D40DBF3
+4AA7BE547EEF84D1917B9620FCE9E5FC8771BA045C6BA72DC3CEA88BC85FCE2C
+BD04E17AE45A9D871930CC49F4F93447F43312888794162962428B915A6DF5EE
+0758D1D24AEB9792A9AED3489EA635140874BA43FD7FCD56103FECC4F4306C09
+8F06A031F5C639184AFB5C97A5ED69D6A974D6BA2144B4ADCE8F1285ECE7AA41
+BE46EB5473C5E6327ED45E1BD5D2721856E2751E85112A44A04F54556B41DBBC
+224A1C1C434FC53BFE371231544C64E64BEF27AC008BD468B51708C46ADA959D
+68C73A16515F09230DEAA0408245960D54D12C1E3AA868E5DDD8ABCAC5363927
+4C6EBFAE8F7B31C89BB7E1196C4C9FC9AF846006E838F7245B134766D83698D0
+85E95121BFAF5669E54B918FB792E8F7EAD1FD1EFAEB2AC98A1144F4A2081500
+2FE1E7CD3E1FFF00BD79CCEBC18EB0552EA5776E6A52E1AA30E3CA1FCBEF057D
+EFE38381A5E9A53B3ED386008C162188E393E81EEFCE3D59300CB1E5845150C9
+35D129A662146D504FC1DC23DB26E958D628DD312A2682654356C3F3221269FA
+A8725F1D52B5CFD7ED9FCBD8F4D2CF53CD7FF2BF435E75732BD9868155B6A9FD
+4511BEB18944423CAF5B2FE4EE6AB1CCE21927537FF3ACFE2D3344A471FEFB32
+D3E944E0DF6115BA76E5FD1C6141FE96C397B59F7D3270A605727DCAF2BC0D4A
+AE8D84FDEA284931A6DD9AFF9CA3AF16D21187533B45F77515F6FA432FCF53C7
+DCFE593148D2286D448A5922B774F0200EE756E982B3B4F8050D93E031488398
+8BF46569A6B233A0B2AC6DF78385C9A649DE07BE3CCF13DF7DDFE5F163D523AE
+46077B52147BC1C7BA80BA33607004F0B289CAB47DCADC7466F743973A546CEC
+939AB3A938BB362C529C4F71232FB9341EFF9A7CDDFB740BEB573F009E19E9AB
+79AFECE39A6D28F0A70937175399A045C2C1AB3DCA0ECB1F7167D07440F53910
+B8123E6C1E5EF4F5A1FDDF00D1AADBBA2182D35624A8170D346E40B117781931
+C79988553558F7696EFF44C0A4FBE8058D7A94F0E7C8C8B584E6790D59CDAEBA
+5B634EBB57DEF241E9823194818E6DE24985F2AE341E878C9665827155CC918D
+7C3CF4E508303382907BAE5DBFF39C75A49103AC5E604FF20C2649C30A70BC1A
+63B54D38C541D76E7616B6132C94D9366ABECB27D33CEE252FD573BE533721BB
+4311CB5557376E17EC4952692396BA291A5E593396441707B48037A84F515C13
+C58D372418B8DA762B731A8B15BA74837F2A6A1A1446289B247E7A6F05081B32
+E928FA2A972826D39C4A2CBB68274054BD284EC26411D07CE7BC2D06D64E2690
+C724C07CD5BC7F2DE4859F83F548DC0CCA56B9FE4E1DDC62E4B943B9F395508F
+F98E980279D2E7C13DE18A22A76CFF59814F2FFCE93978552A0F4E01D78B3C01
+B45A9CF8FDEB42A166A0E7678201526CF4773259EAED7B4099865DB5AB295C98
+FCBB1521D8624B87EE1CAC6B9B460E76D4B4E4D0A4BD69CA06A02D9AE0DC14D5
+55C47B7FA78A0BC299545C89FCD1A5449D45FAC62E38A42319DC318AC386563E
+4CFA1E3E137ABEF3EA7D9DCBC7BCE914902EC7D7B1AE6C9E19E739EBF1BCBDB9
+983829702832E22044F9A5B475718374F1A60FA48508D815F6810008C1299759
+EC776C0E70ACE3F719FE1E9DD554CABCE3937F54F38D5CC3C1392070A07964F4
+26B7CB30915F7586B31C04BAA3CA5EF956DA352C6A8A2A1356924727A8EB829A
+48C9A8894D29C2C196C0B731B6724BBBD84FBB94AC9B9DC80C435C5387D625AB
+6538076BECB3C21D19FAB3551075687E1C43CDD9BE49CC506D3423B5C2A6754D
+87CA10D3686A4FCA91AE60466045A328F996EDDD3918E2F56C029D1992A2A1A2
+78B2E95B99C822822F3630378ABECE2C2318010BDD2A492E112602BA2E092693
+54DBFD0367AF9552B11E043BB544644B079ACEA1BA6123CAB40F9E7B2ABF6969
+A8BFED3FA9C3CD76CE6DA595C63956DD27A87F256A7801330F603F21DC8195DE
+04BE9EA43F308B2888F5EC1D51DD43C6B44363FD277DB689FA2FED1D4B587210
+3F2B7305713987C9FB5B6992F23646F5AA9DFC71C0B3B411CBF369315255C1DC
+BE9357E76156A356902148517DC6EEE64AABAFBF106ECF4E55485756C801AD0E
+81961033CFA0B2DE0B96B88B38DB562AC046F65F058682E139C0F882CD795096
+9557336AC81FB537E37CDBBEC64975FF3BFA899236778283770D540257D3524F
+8B5ABC38B9DD4A240502ED8AF2A7496295A793CA1D6CBA7C2C50E60880B73E96
+84E0E5C85B07EDA8DD48A8249D6EE25273D3510333287C71DD0ED8032EE04848
+0410C1E0785B071430F4053AEB3042D5B9C3E34E4B854D42EE5044DE5941DFE1
+AB6DE585C02B5FEC52F0C565E6A5635C377AA57607723A9D246639CF06A2F4EC
+90CEE93C2EA2C419F3AD9CAFEAA6B2ED3F2D4F9F6330FAC9972903786AC09B7B
+DD51932A1378BED9BD5434078442B9C13CF156FCB4060CF81F98D5EB8011DDBC
+049806FAEC29F3841CF0BAD050713FF0CA75F4058F86C388E179710300A21312
+72915D0C9DAE32B1D6C092A9E5990178E8A11C6A2B525E0D9E006C135D1BF185
+FC7A58576F23CDE582A0512E54798B634B2E5A06F4A107D2685EC1578583515D
+19230589279FB9BA66E6DFE827387C5FB1E491CE19739A4532C5CBE869174A29
+F1E27164210F9D924B835E9CFD9356643C3DFEFDD21D733DEAADE25DDF15EF88
+17A9360BB2281613734FF66126A90DB9AE008F6DAFAF9DCA23A882A38A0F478A
+E6465F8391002417637A87303A9168632C68A031EE4DEAB32D7E6FCA721FA484
+3D01D2877B2CE55A8F3665388FD2791200FE69D692EE6C266DCD65014A9BB1E9
+27C1F5E6857D5923F56D3AA916E50802FFBD561FB9894C1A75022818A6CD8EC7
+06DA976DD2609CF7023B0D2258311F321E064D956CB8D55C1A4CEE12254DD6EC
+68680A52FCD777EF99456BA60807741E0845C47E4F8A93E11F4CDBA611DC4B50
+3B5F83C5475663090CF0450893E076132C6D25147C260D4D731A03C715BB80DF
+727864AEA432A5C95E688313C1C62C95E154E00E5F00713D2B27E2F64F7200F2
+C52B3C95376242DB2233B50B988214FD47A88F3C4F15001EBBF541BE75CDC0E0
+D4087F5DCF70B0814207C43690D2D9A2AF382423515B7277E4D3A990D4CD0F25
+9BDBB2350A8ECDE52D641B901E94E524E9FE6612037EB6EAD9C3A887B45F3B02
+2F60C45F88E147512CD1D4A967AD6FFE126F3C4E92FE3117E38FB2A662D90B1E
+12C80B32C9C547C7EB719063E25157F726885481D0B2EC9472A0108693BE337C
+2D7EFFD1285B4F507316529357529D3245AE2D18A4DDAE37225D682D8D20574B
+0DAA73817D1B70CD37B2501CFD087C0DBD704C544DEDFE282788DE15703E9D81
+F5A1AE011E6DDAE53728D2FAF938EAB8ACAC0D07F32CE8E8C8E8C0262A76D9DE
+B533DA266E44B2A36DB0E19710EC9B9E99E9C1DB500D0D8A293EEC71628E9842
+A8CA8C99F9CC5B6B26E4C96F7D840C84D827299489D0F9C7E952A91F78EDFFDB
+83554679AD863C2C64DC49A33E74AA4F58DDEBC9807A92372E227EC0CACCA61C
+629C34C083A21F278CBD8747BBD7D00AFC2BB546FEE02DE9892EF88FAC0EADD0
+4EE10387D6386E77C462864180AC2F655ACA5903C751F060835DBC1F72AACF0B
+F4F48B83FC85E9A3EC662222907A796938C8CBB946801696FFD8630E897170A4
+759BC269834173D8EBDC70CB16EC918CC68DBC61D8A53EC5F6F63732FD4D7EC6
+234CFC1408CEE045CD2739C71BBD175368731CDF9CC19DB87B7B974FEE39BC9A
+80948277A9676968840537A4DAA22EA9D970FC096ADB6172577DC54FD7B57BA8
+7925FADBA77E5707C51B8EC45FE227B13966B45C39DCF0F315EB7A6149134803
+E18FB6CB61F252E09A7720804C6941615CD2B01FC5F8B8E12D3DD1D4984D0E16
+0E4E3342253C6CCF6EF407DF245C19FB550CAABF4A4F6B0E251D2EF04F18BFAB
+A10FFF86ED39BDDC366595AA6D4B1DABA39FBAD8620E7638FBF54E34A26487D6
+2EA281D9D2251055C510A401023A14F3B97193C2B038FFD1C728AD75A186721D
+23CE5865389B0E47DB6F3DCA265B878950B567895A10EDB5A6B3F3FCD30FAB63
+C6D09D90D2FB1C05D8839D0B4EC950006F996447840C8DC888EA71794A23C27D
+D77453DD43121B9B78FE67913896A0B65033060072CBE1992DCA145C1C88A88B
+B516B239797B9B709045266E742BF9907803FD36953C9299BF788D3BF01E9134
+9FEAE5F30EE1A8E7449093FDB9992D74493DAB0BA265D3974992F5D4ED79D6BF
+99EAAA95DFC89ECB4799BAEFC10012A5610194CA9DDDCDB009BD6436BF30B1B4
+401B2E4B6FC0EDF60FB188878A822073165F0E0399ACBC7E72770F960AC46061
+F89852A0205A8A7813450A60A16014AD433C45388A3166C15D900597B37DB638
+9DB6D76BFC3395CE83ABE084B5DF3E616D5E13CA29C7BC6C19737C4CFA04B514
+7727C2383D4DC36CFF04142A1425D1A420DAD27EC6A779FE4FA9E8E44B0A71AA
+2DB0DD4C5A4AD2EA39F0FCDBC0CFA81644CD6F86683FDB5D97E7FB3B4C5C9BF0
+C3F0E49BB2031EFCC6770FF520FC24631DF7DB8D2B5A7E672F6352ED95C3EF41
+80B53CB4780B779A2C870E935E1F774C2B83299A9FDD5447EE674A157B7B51A9
+DB721193CA4545B4EF0D312DF015F1491AAF251B16872B689C2938053BD3843C
+9E4B4DA7B1A9ED3DE85A2D848C5DD26F4B3D6CD96835915EE86169803C6ABA5D
+BC878F9502190EED465E574E5730EDCCA3B4D5FE7B1BFE3F5AF5FBB466475A0D
+E6D2724FB9C11AC63B3424F422DFFD3B72A168522CD943D7EF214A36B19F3C1F
+8FCD50591ACD2E4525078561EA379982D47A010D6B7C325E8566BB370E6188F9
+40F7934B2DCA11D58A5EA2A42FA79F8F5A69E4C8313E2ED201C6AA5E7FD5BA87
+3F819A807799AC8084E2FAE69516236284A571A5A3CEB8CD0A73AB1D67EDE888
+1A69184D68842D02BACC239C898DC171A8EA05B8D2811A865BFE2AFB428AB6FD
+012B295903DE73A0D3A393E0D9D766FF470401C335AD8623A5EDB7B0F35332AF
+CAD6E222B741973EB894361A862317BE692CD4B855E4042F7228A83C14CA28DB
+926EC8CC9BFFE3BF98AE8923E6B6BCB248663774FC2DA52C5FDD448A5B85BD76
+6493998AE13C84B4D8C1CA3FF66982244E7197928E8CB91C71D60CCF1F6BFF74
+1FBE8FC9E0285ED3AB5610393B7D11301D8945C71B3AD01F1E7F97E9BB9D8737
+C4D113FF9B84E8D84CF3D04C01AD7E9F586FCF5B20FC9662A5D6440478134FAC
+BC580FF2FDBCF7A494AD744A9289B8358D2A14F6DC4ADC0A343D857D2EDB65F3
+4D97B49CC92601B90D63C5650F895A2485A18617B7BC02EA2A9FF1E0D777F393
+D7A6DD6AE36E73BFCB74560E398583E0B716650B24FF5F54AA73346A01D76967
+97E8E1C8B6DB6B4BCB511EFF3237A40960F3EE230EA142EAED3F73CD0B13F23D
+A1D51F490DB90D37ECCEE52B9EC135E26F36E509535752FF6F9135A1DAC1AC81
+3701EE34956ED7BAD6C8CF1D70B9CAEE2644F94B10935F9DD1B03C5D356AC0AD
+0B6F327DA139D31FF65498675D193540EAEFC3FB8A119ADC74536C152DA82D2C
+0B523263DDC88E048ACC64DB32B259989488476CB0D351243A09A2BA6697D0B0
+6C8D52A51C0F631E9EEFEF3A2042A2EEBE5046FB670C75B4157F7B5AB507FD34
+6F52BCBA13FCDF4C923DDF9908ABBB26521FE2A7F9A0BAEB7EF7E82830E596BD
+6CB249A0F61C0FAAECEEBCF556846411E352F468F7F6B404B3BD3B92712D362C
+4A84545661FEE4B5FA52A7A7C461B9F7ACC3E8321B30068F609DA42857078152
+1A00EC0B51CDC27C8B505B00E49BD1439EF1C861173182EA5BC4CBEE7CF73255
+57E6AD9AEE58B43D54F6E22DB3B8F5F9D58EEB756B672547B521CB7D82E78B26
+32C27B3F93E5122482F87852C2F357E666AEEDDC369BB5DEA3E02EF8CC69DC4E
+31F677ADE63DE168D6A500055E06FF746F5FE59864319FB3E49DE62F5E2D7005
+596F22D88796164AD412D3B254E8D5F7E7CAE3EF1D35D67733BA291BADDE92CF
+70BADEBB6169228447DB4A99473D865A7E105DC43421491AB8563C62C215EBF1
+564E27BB8C008B2617DB934E0665D7208C441321AB5EFE9FF1743C357A9C2E5C
+4AF4039F16367C6B9837A08924300E6ABD2AB033C146DE6B2821DD9172E5D7F1
+53785578BB227092E8ED1BBB8E0CB70C2E23E640AF20828C09FDC2421ADA6DC8
+2D117F0E3DF208E70F00C9C410E8F77FB1221D1C07F6C25C1930D0F2DC601025
+EE0B877941CC9F82621D4712CB9DE0BAFFCCA38DB1CE1896D6A5FB876CE944CE
+97A297BF3468B264B32B7C8BDF5777F197F64EE9BD2C6676BA50752CFB9F5051
+3C14D6D0658F7D4841B9F3C47B9522E1696F32838ADB3E877FDF5339F6721A8C
+7F39D070D9912AAE0A69B6E1E27F4727513D78AD9F1128079E3100D0B559B179
+FBF88885A0681A7847F26D70D8F7A3286E4958DD615CED53147A5A50D06D55F6
+45808222273C6F6A972D49873290654057517F1E067197C5A863324BAE696A25
+F250DC419B5428EA0655E118F77B1545494C94EFA32D34434C0916BD6C62F9C1
+2506EC7CEE3456B012DEF7C87D19DCD3F197047F3C57B2391A238839884A3F19
+CC0B1814255F4DD8977E61513F7FADF4BB98315C72F84B4792243022B827DDA7
+FEF9E1434C631FBBD0CE34CCCF4CFC655D0F9BF1E22B91FA21D95C6AD6B0C098
+E987D92C862954B2CFD8E8CC0132432A40ADC155F8A0F97FC03B38B9738B4317
+CBDBB8E7B4BB929F6D39338AA69A5A11BE27316BE370800C82706772CE33E367
+29A80B24D41F520D993098C4B04F0F62F9C74679BC076706F0969545AD65D6B0
+44900379A36E940359B6BCDD0F3F5FB0A8F30BD5456EED4DF5CE72F7A7B93858
+14BE51729E4F8AA97DD6D134279E88C3EF28D61D7937837DF831BC8A314F2D3C
+1353E96806AE841A57EFAD644C8D884758880415F91E7683A88CA150493EC28D
+6C7272E3465DFC48645B2F722ABFC1943CEA4B5ABCF8D76C3D032F1B3264E7E5
+06690EFDEBE83EBF967085035A199297BBF94EB3D884AD4C0DFB476B85E6BFBF
+F69BCB9E57ED6753285C36AB62CB8C98E676D4D23C44416DFDA957CB93EF7E78
+8379C6328FD6711EB9B45D10681B56591EA22DB43DDEAFA65FFCFDA65075C6F1
+FF96A492130ECBCF265425FABDE849C62767F6B36895CCB19CF177B8BA4C7163
+D9DF847A42072F60B3911D8DA23A30D63C7FEE986F939CB35F7C47298D6596F8
+9BD7354FC35915C0CA8CF2A60F2DE21F355C74E605DBECE35A70FA12BDD3D915
+729B3D75FC8CEB2BF67DAC531BFD24A2E975375F85D7AC7CACCFBC62FE51F11F
+F877377CAA80F8FD8DEB1B1FA7C1ABC73B88D4ADEF4D045708657864418FB434
+7DAEE52F2E2AD61680B4E5E229C12EEAFCEF8184B3B03D16BCCFF6E0EACDE3D8
+CDC8D9185DC2672784EABC5E55C8F45AE77BD18C9FDC3189D24E3C93CA20A916
+1750AFEEB67F95016FCEE6BF60016FE2097AB01CA18B0EE0CEB254976858635D
+13D51A80F202A59A66B54E81972AB98BF9BC188EB653F43FD0EE5E7740487B5A
+6102C31D939943905FCCB91C95F54E69CEBB4F4A66027B2D03AE23F09D91B676
+4EAF654BBCB61F084EB153BFB0839D882ECDA35D1AC2C1863A3C5F0523FFB7A1
+A707C2D48E8B2F421A192E898960D888212D488816628740CD9F9FB6EE1DC21B
+82725168913244FE38347B234317F127026147CDB4BBF8BA9274C987193DBA07
+0DE6596DE26FAB1618D77E552AC34F71D0B77AD262314963C69EC171C1EA0706
+905BD2BAE70C9806CC263DC44FEFD2E7742538B2C62D782D6FE9AFB6464BD9F7
+7C537D1CB46E93F998D0AC153BFF65D71F72DD0FBC30E427C94BEA08A51FEDD0
+E9BC9C656715B761EED9E0DF6F1430BBC2F5FD6F2D5A31FEA89F7D3B8ACB3524
+56D36998729CB9EB6C464A709387869BB5D9062A5798B9C3F6906CA8E9C1A53C
+BAB4CFB6D6CBAFB766754CA2D15E927872427EDD9E73BD16C3BF4DCC479B7550
+1623FB8E04B11986EF4A3916248BA3328BBC2DF30E994B20ACD597FF14B91032
+274884EFFF7E94BDE8963D41E9CE9F192C84AA7B2FD2F6242B9828F54759ADBA
+352CECEE86152B06D785DF2781CB339BB1B1571FB31D18C3CC831B15736FB91B
+3C95834BF98DC3B42C9D32804F0E1B0418C30E944E103B1B381FA9B54CC41994
+78B4BFFE0445D1499C19B4577513B2324B7A3A752047C36449C2EAB3506DD87A
+A5A7FAE639C0A70E71A32DB71FF4D8C741A8FCA4A26C886DBB89AB5ED74F7B53
+025F00F3E5832CAD54696CEA99BF7D37950143F74A1A31B139374778438D0DCB
+75D125317E14B837147FAE2B7DC6BBDE62AEA6D74C7D8B2EACDEFFB5A61763E8
+5CD01EAB644B4FE0CE573B681C201BE621EF353ACB26BBC14DB249CFB079F488
+1ADF1C4E19CF04159792E40A5E63EB9DCFECFF901DE04D02604C195C315AC187
+34DB4F6C850E9BD424D3971CC3091A41D5B8F5020B3C79E72B99A1CAE66C959F
+55E4C6C1C1C34DCEB68E8806967C638D01E8103A6E886609E5276FC013ADB053
+AE2806AFD0E6CDAFF0D97E75AFF72A027F2817FEB32964ACD45FEA9534996A50
+53ABD80249F5890C69BA0D650BB7F0AEC076CC809EDA4BCD8265F334DB581361
+329C2530144ED7073D99EE1959AB477C6149B3A6547F024AF983BE69BDB9BF4D
+827728F2423F648185B1FC0AC9C7ACC727AD43FDB6B0D433C8172EB74B8B8AB1
+8C0C2C0357458E197A842358705883EC22E7162967172C0519820D5994DF9D7F
+D50B52AAE696F603985E3504742D31C0B69D77552E9396F18C71DEDA17BFFE67
+E1415DD4BD373819A33CBE990992973DA11CEFBE7B81DC910273B315B82B8861
+63B2E66BFC29A213D5526427B723B4856DFCF3559FD701F77857812B0C6C0FDC
+4AFFAC54B1CDF29E882BC2E2E9BA0319BB084DA04A82539AEABE7FB793B7AB28
+E755B8B1CB2F0EA0329B29816B127EEAB2E16B99B9FB1BCDC5ED2A5322F3A271
+99A1981B3212711FE1DCB32D0638EF932D00B3C04F896BF7DC7F67EF8F3DB82B
+0536D186F24BF7ED544AE148F24F6CD5D81059F55AB8E24128F755991F89CBFE
+75DB53CAD6129E392EDF60FAB2C90396568683A0C996C46358975676C6A8E3CE
+131C90FA98570DB4E576B4F669CDE352F19DF7652C97F2357C4C8F0716E5C290
+1354DBE5105A874C105F541DBFD7E6A63B1231BDB998EDC392678D1EF93183FB
+0815568798BDF68665F37205546A6528225B3B91B3A80C0F433C8888B45BFF9E
+A972D7C29B2647DF29806C4113613512C117061E7DE70F763D097A7CF236F371
+4BB3BFDE60B73EC884BDAD2E7864F24BED01210DA9F229F7A87D3CC0B3AEF75D
+D8B763EF2B7591B8D2CC201A635C82B771BFDB42FA533E321B587735AECDB3DB
+071FAEBC9ECB06F06A0EB364ED723D12EB6E7BB479AB013624ABD11060CFFFF3
+5FE5CC50E86F9224466913EC8167158FDFD81438BC1522685CDE8A038F0C8A35
+8AA1FA8E38ACEB99E18B55075D594DF39FF874DE7E7E6C95C677F35B2DF0F203
+B78369144DD99484A35F26414874463458FE0F6D2C63481260398F5FD319DED2
+19C9DE91CE63155DF12CE842E67B8DF8E61149FC4563C4ADC280E564505F0F80
+2B6CD6BCDEC7AC194C372BE1A4FBB457739A8AFC4A7727E37E2D3E5AA30E7461
+FD43AA99CF8EC08CF47CD67B820899D75935C6DFD775619CA2D52E4FE3A5B0E5
+3D1231BC641544611EB461A1991FC02E040C574272D428419F6D0AEF4285DD7E
+4731CBF498243B66ED76F66CE3F33DC996BD10334741D351DE2294D268EF045E
+CB360B89A5E9690FF21C91E396E686C67B5570A1FE2182A5E78DA735C70162F8
+E978C1E449853FA9B6494F2C38F5FF2A27F8E9DA96EFC069145C844402B0223C
+CAC1AAF9E74C8576E524A2E5F072DA0297AF5AE4F1B0F1E3BF24989DD836C057
+D18E755B8296E8402CEDD8F34A258ACC0D34D341ECA9889F4B2A06FB778D591B
+157DDC8D7F54A289F918E980C367E46575F05CB8C847000C6CFCC939867C78AF
+8A0980B0352250C063F3960D06E88A86694879A6DB159C2C5CF831ABD393A174
+C9BAB470B7EF87F10A5C3EBA5716279D525D51323BA98E262B1EAEC96A61163A
+44F84EEBD3CDE74822FC6ED53FA7C30A4167B1BF8BB9D3347665A33DCA967641
+E4739C8A7ADC90369E7C236D812BD03144A282176D5E906B55D1274AD6B5ED2D
+CBC01CAC7B92D8D919D25D80F0E0CD744B33F303C43E0D9F1F0E778056C43E1B
+5A300D823B0070C69DDC9CEF534DA19FFEA924A6D20D50D3CEAB46949288EA59
+8428450CE0960400BA1EF843C4D538C6A2087D3E1DB7AD847898602ED66F9366
+3F8E07233BE8331D36C159E8602B8193A5534030BEB136E24B24886D063694C6
+4A86C6F0B74CBAD19B83C2637AE35A07221F79860B87754A8042CB7489B0648F
+50BD0B93ABE34188C91AE0846406F063DE6FC2FF17D3E39B758A9182F258E2F2
+8FAD163152FFDBBC23B122523A2BC4421B025B0D8E876F80F12977AD02F2C393
+F8DBA9B7DE3D98B21C2FD1BFC42AFB3A6B0C303E94EDEE21B704737CA349ED48
+8332A075AB14489FBA412E4950BAC4F79BA0DC7EB6AFD1D43311E04F7047C851
+02612F1BDF9549A1C5A4E096C7946749A9E6FD356FAEEEE03C196042B6689913
+2912AF6EAE06BDA5E9F7A85CC503E22008CDFDB0F51DAB9C7821BDB79D1E7477
+16E244E95AAA34AD1B2084506F7C22CE2EC64C2EA5E2E2424E265173B01CAC83
+5A14B1FA3CA554535FB71CFD640E6F04917771589AFD81CDF19B80F2338A462C
+A7931133B7609357EBBCD05DC82B6909139C5D9ECC63511CC7FF28601260C7E9
+B3253E2B8655135DF5AC5EA5F037233C61495895D1499C5A00B13A90B8B3A886
+42F3F12F7A902F5520AE4F8E5AD9380EB5063BB93D98476969FA47F2BF6EB1A3
+94D15CB620277C1D586661CE897F3526DC5B52C447FAEB44FD3377DCD023293C
+CD7A75809CE202165BBDD0311E1E793B9E44C747FBCF9AB319C9F3BCA0F65881
+D85A2549005C27CD2A477C5DEBE1BCA541DFD153BD6357215CB195A53CB1AA0A
+636FA25E28420EDCB036BDC3AE3D522E912C00EA6061E8EFC7176DB1D106BCC9
+F7420AA98E67899D2AB3B63A14B966D06BB785067DE6EDFAEA7567367DF1B9AB
+24C2194360006894B979EC31B09E92440945036AFB89155DA483FD44C1F9515B
+4B576CD51A079C22C668B72EA35E21930B701E7AEC08100BFCE2891AEC0CAFD4
+A71401645287CE15CE5C4A94409B207D1A8B13DC9D1CE2CF6E09696E7793BC1D
+8766A4FEFD11FB4A3B13B32A5E994D010370A0890D85A500FAB60F60D8EC607D
+CD3B7657B32A4B99C89BCDB0162BDAEE9CCEF0B52C54C8EB5CF320DCD9803405
+10B060667538413E9BB43F15C72510A68AB688C9512FE05E87AF5CD4C2717FBF
+F0B5E605CE4360D89C7BA422C2A867710CF0668BB684E83FCD47888C92216068
+B03655C718AB989492A6D432275B1F64005849A85ED0D167C121134A59996BB3
+8029B44938C401192B96DFECFC6C7EA90EEC009AE79F2D94926581B2073B81F1
+E995224D452AA32115134F7C8B0AFCBAFAD316F2DED91212E5E2715A9A0F59BA
+787C811A7CE37859B9BFD4B6648010C449AB624401ABBAD5D22623A05B127FD5
+F6C3FDE7966A3AFEB0BB98B38E8DAA05643EF7A9242F48837F2552AA6E449594
+9BE7E93EAA719FEB29077A5B86C14B5F47B1B86D9F1EE50A9BEF6F6FB2DCC4C7
+D3EDA4FA1744310A2C5BD39E8EFF9831D2E91698BCE0D2E9769525F934D7F08A
+FB4DF1732A46D4CD48BF73322E25BDDA632CBCD9F0571779CA52A60775ECAAF0
+04A6ED054E9527CC85F67D2C480D6BA074A3D73D5386C7D3B06AFA386C931512
+AA015585BFE18F6B5B79140570B655295A0C56F6D3FFB790185D4F1A10F0AD18
+C143DE30A7FAAF80239CAFA2DF1CEB743341B05E8FE1D90FE3C0F75398B6FB76
+28FDF55AF051AAD341AF59A6FDAE8B1BC878A52E5FC2B504D4C113979D7E7524
+F44C86A5C12F5546024D792A0E4FF98AC19EC3850D88DBE34B4C2BBBBDD77E62
+67219B59243B4DDDBB88AB7AFEEE234F08DCA63F51508BEB43BDC3B00A3A6F9A
+B4EB5EBB12D928D2E1901A0D9799F82676F6E158A6E521D11EADC606176809CB
+82687208E6F491C6B92901015A67A67508A68FD8F910A41FCE333AC61A17F772
+13FBB7DDCA5C17263946D38738E019B016BBC294F89083A2E8AA6A9433272CEA
+42C8A243DF05FE3AB837F0793AE36FB9B1378B7DF1D50CB48DAE3F9CECEFEE6B
+7E372802B2A19C7C1BBB14D3B061C5DC6FB29EAAC558386C58D87E1CBBA07AE8
+B66DE0AC1AAD4D714C00B528E0A10D54AD7D99A3F5459BCBD196C0A86DA69508
+C4C780D2000407BCF22ECA07C1FA37DA0E05CD0D1A78AA64AA9F4682F2F2F05F
+0D219E2D4A1B55D836B36397586C46E54F7E7B56B969EEF401B7BA9AB3B71491
+0B33E2694C3B10AE3702DFA3EBA9A42888E2FA495B521FB5B860EBECD878EE73
+720ACF8DB674DB5C4A3418E5C4B1B93E8BD5FD6FCB334BF3C93D6825201A02F8
+A8BD1F64CEF4D6E8BC96948226D8E0C34A7C65978BC66563B39BB41098EA4DBD
+DA6D7CB34A411B9A789775C2559A9F90B7F643551156FDA8B8C3B368E666A546
+0D9458F1BF0649BBAFCB8A2B0B35633A873D5F9B0E55A1A1EBA070DB4636B725
+BAD1250138E0A08B59DDC3BAC64DBA14313B8937275F8E8A506F6D6EA691FA5A
+D37453B2619C027CC5E6DEDF6C6EB248F182A7349A21CE744152BED4F91508AF
+AEC8563F1894734EC9BEEE05A1CA429BA1A134CFB7D7D533595CEBEA887EFE8E
+8D41BB1711FD033A6D6707CDCD2F1F3D02DDAAB98311AD5BA5DA9EDF971FBDD4
+BB4EF7EB3641CDEF6CC694948ADB8D94D39106C7D4E8E788627991A6AE33D7DA
+81FF3259C745D3C3F53FF8CC0FDE715D61801FE115F534FF3FB04CF5324979D7
+2AE393F01B9B84992F16390825059AE1560CA637AE72CA56D3CA686CE9514E1F
+CE1859CFCEABB3DF9FBD8F0E3A1E8B1ECF291081A63A86128BDF2DB251287810
+DEE008FD4F5ED49D0BAB3E7638B975CF6C8528B9B8BBF490F9632F83A060AF42
+1469997731E304C44B80503B391B9632C15D209556CD5FB94EC7CF4C98B51C7F
+284ABF771FB70ED5F1CCBF4AA789AA9CF8C9EAF42F9C9725D87820C10282679C
+DA104A08E1AE5F01DD4399211C62C5F3370C9D159923447D15C2056A0F840203
+62903BE8B5B1994C9D7C6052077E5446D54444628AE19229209F815677ECC5D6
+45E6E1CDC2FF1AC81EFB1D73ABAEEFE54E185E3A817C0506CD754393CAA3D30A
+B2F401490D83B72BD07B4BF1D1ACE8AE0AF145A3CEA0E05439EA8EDE1C4597AE
+B5E866BFC94E30C9E8D8884DC900862E23767B9F8781F5623B4F5F74592F11E2
+DD253253D176019798665BE833997D2ED432380DDB144EAB37C7756C6F729B0B
+D13D8D02951BF2C016DA02873E4B589EDA8021397BDE47000E0BBDD2AD8D5160
+C7E9F69831FAEF84C27C7342C8CE4092278F767ABD3C7220870D40EF9AC505AC
+FB5F3E1BD3F0905F71AE8751C4E6BE02B392874356C7F25B37B16D7E8848A9C5
+08FDC51948C71D3031BA695B44891D7C56F5A06113C1DF9E7A5B2306053AB76C
+18B3BFED61C8E196494FCB0408DCA9389D6DE9611CB19B793D286011E9AD6E78
+CFD74396029C4ABF7075143A71D14EF93B2053A0E8C8789E176D500DA7945DD4
+B7F805169681F4033DA8A2941F8BAB7E4A1A0971E017FECCD8738DA3186B0DB8
+8C63476272C63364DF6C3CA5D9847A6D81736F0BE388AF95A7F9B5663F55E3DF
+1C740E4358B349DE17A63CA2282B03065A66D9FE3D6BDCEF932193E5F2E2D150
+47984A57B31A7AEB54A101DF328A74040317529842B4A5A20E3448077C331626
+9A5EA78E5EBFB81778BD4C9B392186E3C811EE82CFDD6A57E050DA15478791A9
+65CAAEE28B55362594BB58EDC4D01FD54CA7EC5C4D2A3FBC6F399D5F35EC2256
+EA0B1472A99F3349DD62F3931F193C322608E6452472E00EC22BC13E2E17949F
+9F00E979D5D5E38CE6C6EB9CFD7B05E724CB49EFCBB211953A36EBB3A3E18498
+8CC2B96F8FDE18C678282C0A707ACF03CC41F735E5A4173B45A9312944D69B2D
+4D448C4914D987DE531C6D3EADE9C94F9E6F978AF50F6C25CF8586185FB7CAA8
+5C428C606709C5FA5ED63CE6C0456664A552BD6B6AC8A321A97807279CCDD27A
+EA484CFEAE6FC10413A373A9E041D3CC05B48BDDE5DC89F1B9D140F95C9370F7
+1126CAF6256DDC8081BB304F294398A5B5994800684B097444BB35D4D293E782
+F61C8EA1AB2886CB6911B260127D8A2D116C3AB62F07920E37E0405F516F47D4
+C4E865E9606301B86A9013E5244E1C145D515251089F62C780C17B1C2A605DA6
+4E8F113081631041C38512469AAFFBA750A16A4921C2B809CAFD80F17DEE5BBC
+6A00C67E59A4C3B1C34DA41EF7D4CC836CBA67ACD86822FBCD160ADC54D10A5C
+CD5A1C1D01AABBB900776AFF0BE76CCC484037C34D348A7BE0B15109BB114DD6
+F0EACCA18800AEA8692D875F761C574B90F586ECB60183D3DD81C3B1C0EF1822
+3FA0688E244FAD05F5AA4490DC6E0F515E174DFC2F26821E9C4B189830EE8D14
+56BD9EE6BE690E62E2688D180B231704148F643873BAEF2466099D01E98D0A22
+8CAD70DF0140C21585651CF257F62248FE2418DE3087907355F88886BE1DAD3F
+043C30DF1CAA28F327A71B8EDFB5470F64298B899596DD2236B23058E3339E8B
+82A8B27BD3ED46D1B5F2CBC333B4AB6C8314B26320134D8B8479F2824DD9AF44
+D5F10F431F64B832D1881F59E8832C8935765E9C1ED9768EB864E3847F4F4928
+71D2CBB138BCA7085D5E619C17BD6513F53293A9F419A74077EE0F97BDFFE479
+CD960D5603C2CF26A3B4B3A6372F954041FEB600A528FEC76BF86420CB8FE902
+C978E8D7A3D317683FAA98F299611F900FC0C38E267B9D2295AB317A0C65CDEE
+214DE4298121B7385D9AC35D23ED48BC980D8BDF0ED1B3DF469E74B2FEB07B5C
+F26F8C6A61D4B1EF1F95EC93F618CACF0674C625BD9E960299A92E12BA082080
+7DDB8D06817185AE7FB28174B530DD2EE84660606AABF27A171C33BD15173A09
+69DDAAAE380C89FBB4FDDF271D3FB5CD0A2D62A1F1BF8EEF00A9FE22FDEA08B5
+32E6995008D17A9B885BFCBB80E9AE1E3A4E75A8820AE2A7845D366F29CAE72A
+9D41A40B32DB7F477E218C646A28FFDA6E58EA290AF7E19DCB764FFFFF8248E5
+179AED3D8F1B91480B3729C79B3C96B3AEF105E11E370AC65F47F58917FC5EEF
+68C5F518D1079ED2182CA6B149F76312133A4BAABC1E1862CBAE7AF59AADF2C8
+FE748103948695737AD7BEBC52DF8C4BEE11C346D0E9B07338A1E82B86B8AF42
+88A49CA23BA88579F911319AA8B7DEA4CCA6387BA33B217D02D121FD38FBD51B
+C100B95B21D41606B40B9A11CC731F10A8F4B86C572FD9AADCAB4CAF8F27353A
+C05EE5A9F372B1FD74B71522A6F9248F838630A8DE2429CFC5B34161E83B0B38
+9713AFB911C246E5ECC6AB86CFC463B46D0358841EC85787E055ED7C5513B0E7
+960D05F0BDCD5DEF56CDB808B755396E2F16F43B6D58BD13DB0A6B9FCA646521
+5B114C3DE7253500A6D89A0DAC7F9EBD1E14D7EEBF8EAC1ADC5EA574781EC870
+7C820F1ACBA1986CC55F78DB10F9F76E9392FC9265F3B370988CC56BAA379B46
+E5DBF4FC5C1A5EBFC1DEE04AD79977B8B9213DB98649B6F9AC0F99F53A449CA9
+FA33BED4F5EDE8D1B53EEDCACB0A883976C98DD719BE5C2A0A948535BE0B324D
+4CD123FD9E346FB8E5C5AB593049CD5330D34DEB46C4AD0D21BF6E5D715B8A62
+40E0BDA591D2727E4245B29089FCE0A2238B7AB0798FED91B6F8CDD6C2FCA085
+3993743912D66BC8049C30643F9362D510575CE4926D53858A1BD2B8309CA46F
+F93B3941D0822B182AE4DCDAAEF090AB4DCDBF403E4BED69B62ED62530AC3A6C
+EDCCE216FFD057C8A388145720BED9D31A89D149E9A26AA4DDFE8EE93924FEB7
+97A0DCDEFC84F9266A86D2B88495F4A9B1D33248BB0861BC4D38825D1EE3C930
+11077737AC6E307B12ECEE27F82B554F40053CA24D2520DDAC7F547407A77196
+41E85341D1D1C10411003E66708BC4FF4F31AF6E689321788C59D63DF263FE23
+71FF6C27BA99A5D9C16E08CECE622CDB8517D14644BD03A5E7DFA8DF8AED725B
+F6AB8971EC1AD359AA0290B31A2DC818DD2BF80EDB07EB81F7787965ACBDEEFC
+05337DFFABD0786D1C71B192B04618A00E90E0BB3BB704D1AA86E1FE5AE09B9B
+256B82ABFCE181CC45745A0B2E51B1B780A91FB2387EFF75ACDAA8AC13B1F44B
+81AB96DF1D9CF587DC8B9F926D02F81C8BABA56DFC79E25883453E84E22CADAA
+ADB64593275CCFFF770B53ED4F4F1B0A76DF0D5AD96FEA25AC42B8C350061A2D
+1C97513C9F7F921ED913F321CFF95EF57FA1E19A9D3F3C927568888E1E7DFAA2
+D12525815F2C65B72737B4AD9BD64F922526C3527693B552ADFA10C281F99A79
+26513709301215BEEA51BAB631ADD6DB698BD96006913FBE8AAF394A051ABA45
+D4C7F093DAC9707CF64509D64A39EFA0207910A575932F928CE105E6A2745088
+4D23F6EBEBDD583037106433728693D9D24462F3E75DAB68059ABCB05B2B5633
+D46ECEB9E1A9CD67317F5D1197DED31050A102F739792CE307D6928681542F39
+954589A5187E9FF713B1D0A3E5515C5C0F935B7921E4B37E12F0638352EA1447
+7C5BB21D4CB3181B1C056A3B4D98396DF351BA384FF61A170C1FABB51B025E1A
+206FB57FCA26D929BB232A9CC3249C1A0400FC039D3EBB543812C5918D6219D0
+882DD96CFA770A03BE1D0494C090D5F5EECEB305435FFD740824EB85E59CCCB4
+AA411710DC67EA2489430D8C08423F00C499323ED1BAA4EB1B5089424F898D86
+BDF5CE56C028B107B8972433EDA77EE397A193B1793BE61F8DCC0273A0FCED9F
+8A98FE8D1A49469C3A4ADEF38888A1199DBAB63DE30E56B82E55C6B31D70FB4C
+5F9514DF02B648CD3FD6860E426DB1D853910F1F96EA328759229347ABF6C503
+A7B6A63D729001711890C1AC5997F2F352F3130C760F49D0510DEC22B51A7FB9
+F2A7EC4939171B82F24440AA058C5522681A0A97BDE06B15B88DB1F1246A095A
+E89230E74BB7B404806FD2FE9F698C167954184129B40CFCD711D69D7C1B4F8A
+7D2A8D496A7EA0FDA901AD9D79D067614D868290F804649280671903D1085A1C
+E2E3C0ECEC635D975D66CDC5312568AC5C85F87804BE7E60EF787F5B97DB71C9
+4DB5F1AB7069B1B411319D3D70E1554D56120E2E5C9D474DAA7C93D5371A9DF6
+10A823F3105FF629CB8A2D564545638B9203283F6D70E4CD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMBX12
+%!PS-AdobeFont-1.0: CMBX12 003.002
+%%Title: CMBX12
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMBX12.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMBX12 known{/CMBX12 findfont dup/UniqueID known{dup
+/UniqueID get 5000769 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMBX12 def
+/FontBBox {-53 -251 1139 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMBX12.) readonly def
+/FullName (CMBX12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 44 /comma put
+dup 46 /period put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 89 /Y put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794D2D43A151FEE81296FBE
+0CF37DF6A338C826464BA5198991445EC4BE80971DB687336AE8F74B516E333D
+2D8AB74D362C559AAE6ACFAE49AEEF4F52E28C869222C1301D041E7A0BC1B608
+1BF728EF9E98F3A12EB2714E7F16B14E055FE1FA0EEFB058860ACADEDA9D0E4C
+42E3C6F1E4869471BFAA3760175F3FBD842755A9D7847EBF605F18293B42F557
+FBE2715002669091BB033E1AAD657532F34F7C66E4F04D63ABB07E6CB9D9AEAE
+78EDE8B79DD9BC87A1FF445EAA05B5572BB880E69F4DE1F82D7F0E9980AB0C18
+22C448B0B1722D3CC33C56FF287CECB80658B3AF5E7675BE82CEFF3DAD5942EE
+A03C955FF979E41E54BCFB5316A9AB8945C403A73180D0961416EC9C92F49811
+4B91BC4C788392994587517718521E416D469F69952149FF7F9224377EBA1065
+4A727BF806A112A7B45B0A1BA1D5A23683960575368D9EAC8C04753BF7465AF7
+95F25C258C63E4FDFFD0B412FD381946AA38C0B961652BCEC30322C47BF4755D
+9F91880688AF066E32FFB22E1A52DE741307AD3ED830D6BAA1D1F562919666DC
+5E8FD9862AC8600B0AE0BC7FC779252AAC57248744ACC8A8AAFA836BCF09B0DF
+9253DFBB1CB77EA8A59D42D1B18FF25E9AED72FA62FEC3F126F030F5D7DED9C3
+CF60FE890BA4A48E39E687BFFAEAB96AE542A6387F6624486037C8924002A511
+BEE5FBFD780AC1D4BEC3FBC47A930BAD0280D444259528B6C565DE11DE36BB65
+9BADC55C1EDA1A80458E98896D782DFB5C137897419602809F9BF8CA39F00C68
+EFB9E076FB324C2963F23CBFED28B9EF70EAA4E4B903225D1F199A7162AB239A
+D92D71C18B1B682D04C6A48926275BCB16D413B2A0E953E1257E0B12D8B717CE
+2EC84CFBC046A4338A69F454A469B12118E562B4F56C5FFB3CA5D357513E6FFE
+947A564B229C7FD873057D5C7CDF03E958294A1003B37D8DF565A70A00A3734B
+0138AE5277D383D10C2BD853EF806D3CCDC47739F0E374A3DF3B63638B949ED6
+4EC25869DC1C0B1F4DBDFFCC97382841D8F10F3635C792139A1EC462FDBA379C
+BE0990CA2E70FE73137AFBBF30CA54954D7E7377CC50BDD780DDD4C7FDC77AD2
+F3EB1169F14A0041F18160F43C24FAF556DB5D621709FBC544CE55424F7446D4
+6AC07A51C8CD5161AB0AD5084A96FB35D77F1CA155147DEF8D7A590EA6939514
+D4A226588295CE0007BA8A550895511C8D80BBE5CDFB8A50D249C3BDCA974415
+F5557914A9B805782F399E4078DDB6264F1A49A9A5BA45E284A5196E9828EBA8
+481D357B8D9E6ECA631A6204439FDFACE7D7E6A2392726107CB7D2517CD19A24
+FBE592C119626DB221BBB635B6EB84845C16A9585282E34958B961F4A543AF9D
+419B6A9105BF185FC767712D923437BE08A9C0EB92AB6792DBDC671029B6FCA6
+7F717FCE379C0F3B51C6CF042A762ED04898FBB4B0105C3C4ADDDC18C51BAA3B
+70A93666669547081D9246732CFF74C83EE90DA17F5B4F8BAF47FE4D81590988
+2858C9B96071341FA0A0D23BDD4947FC9BC2297913CFBD4FD6CA4303AB3179AE
+0203F1BD502065F90CE9BEA3B52DAFE4A29446082EA0E6B1D7AF1F31D0AD02CC
+9A7FACE2CA86E5FE0F6A425B28A5940ECA306891CECDB3CFC7A5BBC76B5D9E8A
+C754379ADE80B4D72CE493010317BF21A0CF4A0A55C1246218839DCA3F4D626D
+1F4161D38F54AD5142C1CEE95C61D8BB10FAD4B772F4955777AFDE8AE5A837C2
+A2BBB11D0BF5DA2E63D0B75ED421DBA9C789B281B01846B65DC572BA69591969
+21265DB722AE86BD8CAA3D887C975A617ACEDDFB7AAB341F47532AC0F354A530
+7662C089DA3939588774FFA16FC4A52555DED6D6F51DE718BF5F345C23C90198
+17B77CB8B5D53A5CE7A79F3E286B6A59F3F6178AC8BF15C0A15C1A8A95D03B60
+30EBE53DE328CE085CD9A1D49C69AA299C5B58B24334A546F6E274C1B534DC8F
+3289553F560C2F81E413ADB92FA0E7DD1C2F39D5FD268EBA97AB7335ECF28257
+96B4EADB7D0778706CB41C7E9C882760E7670936774A1088FFB2011115FDADB3
+B69EBD5108760762521C25C968C3E282DC3400001AC8FB1EA27FF643E3025950
+1D617BB8BB321281708E496277E11DD3AE0023DA9F25AD06B39C7CF527FED27B
+57397E88D3DF70EE4FCCEFC8A0927D6B05517E571B3E70ECC99F3CBA32CCD4DE
+B8BF22626B6C94FE65598A88AB90D238461EBD9A098DADEA4091AF1CDD7560EC
+8E1B9BC2321686E1759E6B8A270C8CB4A254F7368039602EAEAB86ED21CDED91
+8F2DB9889F46981C494C7EAF5E819B91C129F0740B8002B510014985E5791F59
+B16879CC6521D8E9F1C4C1890AC85A78022BE614BEFF318AB2616F0C3F02405E
+BB425D1555472A2642BA7686E431DC3FB8A1688B76660D9957C3FDE8D58109AC
+21B1234C9DDF3F0FAF93BCF7B2F88A001F23162E1A13E5E9118D51B485B70A91
+D0CBC39CF44413FD8686D9030782DAB58064F5B987E0402AF5B264B17BD31BD4
+FDF63951BECD73ACA6138854EF35B062D01F33073850D9C09A818828C581241F
+A625AB3638081DD0F00F946BE5450D38489CECEA4E66B4D85CC8AE0157E2AEE4
+A22A9313829F24D573101D84CC1784D1CED7DFAD5DD966601370C6CCBB723082
+A86BBAF0A5D867D0D2E3CA16E14E5109A29EF02649C47E12E88B3B397D65CACA
+DEB9940B92100744D686066F8250FF30E5F13D81428EE238A2E4E07ACE0F5C38
+7D79D4A336D0D26AF9C2B84088ED8ECDF94A1E3FADB45AFDAB46CAD6FF950B0F
+07AA2CDF82374DA76C56D29C80138841EB13F0D02ADD32F88B23E282ECC845F9
+BB9AAECE9CDC644AC2D49577A92307A83A99434F6493156DF25DBF0FCF2EC21E
+8C50A312C3D19E0609C0038554CF4FEF3ACEB7A833FD54B06EF0D617C2971C89
+E4C06075B09B84A4F78A82152B9A9C540B1D881313C2C74F20ED064A9606EC2C
+B56D7BB4797F1EEF4A9B13579CCF311FA4A4DFA62D80FDB7F535CC6526D1AAE5
+45C008EAF024B48C377522F74D939A475970533E645B1BFA81997549AFF26F67
+2AAE6C2EFA357DB3B525276EF330905688777057F4E4CBF584520A534A8587E5
+5A8360891E75A15205E8ADAC4A4E5A6E27D0C4A7D492216E4BC023AB027F37AF
+A8DC7579BA50204D5F45A51460C5BD8A5A7F87668CA6451137F2F59E117BBE28
+5C40820882A5546FA76F0CF49F8A6EC445F0647CC3227C400F56E7E9B84A6975
+E85E243CC1666DBAFF4E07EEAF3AF71BDACB30DAEA792F2B8504CAB071544F01
+5D66243D529C479D276FE22F7E275D9E7FA9C6EECA18716B2F213916E32C1D94
+6E32397B41AC6779543218E506569E3544803BBF9B404A983EBA62A494187B30
+8D3DFA4E1237A2E5E08224A60492C09ADAD8775B7CDB830520829BA164209ACB
+BCDEB2D574CEBFB7AE4BE72DF4EB1945FEF2458761AD8DCC0D378AEB7DA002C6
+9C14A665DAAA532B0ABA98D7BFB5A6151FF6703385AF7AE8FD315A492FCCDBCB
+B825707F9566B3B4943A3C61C3DEFDC31A843A2D67AB06891F3E110DD8C73D3B
+B5E4151B51D9F13905D7D94DB9ABBFCAF35F43B6EEE256B1A80ED6D1739D8D5E
+8C767F6F0E8704C5345D028A2A6DAFD9BB7AA048B8B895FE9423A7ACE858BADD
+595CB074A128DAFE08FDFFD6BDAC0114159A702FDCBF8013804B0CAEAD7AF38E
+FAF086A3248AD4FCA1401A85AE2F72E3E6956DC0996FE8ADB18F89B14A208A15
+13F81AF73D0DB72F78C4DA634ADE3C73756CAE6AF2E149C26316DFD93370BE1A
+FB4A79F77A67C07CB0A53C78367F21661D4AFE9E27328E077B522B50FD9AE2E3
+DA087BE481515B5DD7BF894A96A84A6C78874100505B7DDE1D22EFCE8D58B3AB
+313AB5495F72E2CA4E6AE22C0CB854302B9990372F1661D9F0A517F90686F248
+C5643008B3D29F7296E5C8FD4049886662EFDD4106E17C879F5D41CE84F87E89
+F6A3117C968B95A35940CC29C43E1E0DEF51C1E46B676301F40D59615C3F73DD
+DE37B72FF7105DB84227DA5241583272AB1C3CD97AE11C1EE98FFDB5E5F44844
+8FC41BEA5C54B26341AFF6830D9D0A5A2901B0653D8BD0746838194D240FF753
+E99750D3383373F453723D86BE97B571B8B84D8696089B5CFDD53E6C562A2197
+A8C4FB0CC690C27761A816B441029D3D306245052E0C41B53025D8CB7267CFE3
+C17FDFE348E765326F91AEB700CC49162DF748171214252CBC821493DD01AA20
+417D66DF47EBEFFF3E9BB2B0A2BE7D9B8C68BD570FC2EB0FA54CECC318F04C43
+19598BDE93F2F13DC7847354C99059AB20593EE51E94F9D4E9241869D605AAF4
+9D9B5FD88C3798A039A67993C5EC68B6326B132E647F67EACCA7F7AE7F718D85
+12666E90D7C73EF210E344964A38228B236679A2B18F5E081234CAA2458F8D83
+3F0CA308D19663CB12EB904076EF88E556407C33C9380A6A3D68A9EFE65387C1
+A1BCD2D26DFD2AC0881EC30E81C0A4E76C244A2BD822EE88C4A60B480D107E68
+90E419A1F512E865BA922A7830909BC2611A80931CB2E9344529586726614D94
+3AC5200FB9FF68AD9686506C5EFA8788C0AD0251AFE7F95E84683380CDB421C5
+B1A783B6D5F3A6BD1BC1C14B363DB01C87C0796DCDD5BECF41A1A9F43183CF6B
+82C2AE49F0BFDC5DEF7729F2E638EE6EA9E4D059EB9BB1B992AD8C82D501A550
+1BF73CBBFE740179B54E193E84A55DCD61B343C1852780FFB44248FC9426AC94
+AA2B3FE20FBA30F6C4D1E0FF3EDCDD8C0F57CCB50CDB0EFE2E04A8927E239C1D
+9B026C7929BB48461D4D695FFC766C8A0E545B1BCC2AA068D1865333108E7985
+2D93F9B00EA0A90939D0D3840D59B6CC0CE2C147B2E1A9A4F14270FE3ACF51D5
+99F7349106165AD627CBBB0ABA01ECC6D3A14C1DC1ED23A9DB9865BB4396C51A
+31ECD001EAC94B33C34E29C5611148EF3E55DD61813470B8F3CE32564C749414
+3C93C77EA5A3538A0B5AE3FC4DA32813B06772E0E48E25BB39F3F6FDCC077E86
+F86FA50E18FD19EB2F37311CE87F18F3BC85CE7FD71CA92D5C3264E34E04A2E5
+70C79D99F54D6C6D9D527AE45EBB48411221134587D2253E7C8ED7658EDCA34E
+5E768DD14E0200470F73C44D006CE8CB35DE1CA3EC10ADC668B0662A7774C891
+84EC95A31DD872F0728D9F65CA80940080E04630BE4DEC77A2C49E3913C39978
+BF145F8832AF2C4385EBCDB15F9D32C22CBA0CF950877717D6F1591D7C0B8047
+8C9BFCB16AF7124ED83137695F3D69228DB633053208C29E0ABA1B06A7FB3EE7
+5625CB44927E2DA6E038A6E62DEBDA2D96A03177982D8FA33BAAF4426E05F4B7
+9C1748B3FF7691F9888E7FF864A10B9DF761A41E6B5CFAD2BDD7E1C4924AC97B
+F4B352705316DD1A58637CC12D71C18A5CA691AB2AA8F171590EC24582B1123E
+94D4DC587D8F99E18A711776BF4013C96446BFECFEE4C809EA94B169088024DE
+0CBD20199A915AA406F0BD5F3D63D1467C49B4691AEBBB35ED6624F2D7BB74BC
+E80FD92B9FD04DD9C2BE9B6FD29EC7EC07FAB447511C61DD299C783BC09AE2A4
+7B3CBCA6A20C6631D06D0B2E2482A50612BB7C29B7E7D0A205EB0E8436702581
+596BC996ABD58CD8D5BAAE4B1478195CAFF98FE0141287296C4EFB8D2E7A8442
+F0A3AA9F9264329982532295A176BA1867EF732BBAC49AF485D9D0F7130F617E
+7F7DEEF935874D55A22240F8EDE4F247D5F73481373A392D40A8076BD91079E1
+1CE5998BA13D48D56B49A92B4A18430E316405D2E2E391B496A1934671FF1785
+AF42BA3B2D14B8E04014437FD194455C50289DFBA61B5C377BCBDADA48E82DEE
+4E70EF5E9DC03064907BCB8BE4D59DE069FB0C0CB140DA54708E630767313F9F
+744594AD8A499CFEF733E640A11FD74E46A749F9C7D18D49251BF85C6EB4668D
+67598C31A8F90922FEAEAD4B83B6E7184567DC798E4BA1C4C9B3461A478D63CA
+054F13B502DACB674EB49D6BB935E5EC82BF99FDA7D47C581AD7F940DF4FC6FA
+6C6D25D647033AC69505F0CAC58DE99087F365531A6283CB89CB644688963C3B
+8B2203A94294E58739EF23C7803630A1F9121D62BE1977DE2F41687C8CAF87FE
+CBD7AD3B98E0D95C8C6E1A7CCB0E09465AA874DC90A0F5DB2C5E7C130297FD39
+EFE63B0350B5139D09E6864D22C3F1150B29196E40EEF9723E71158B7ECFB8E4
+C426FEDCD439420B7F1C251FADA347C9A2C49738B5A17922E1EA93CA7B125B76
+57449EAA9C1D591CAD327D0E98EF2D44D614EE9ED49DD31ACAC0B956620B6BA5
+5BF6D08CA7541059D5ED2EF00AE2EE95488F5645BF6837D9241C0D3959B7580F
+C9ECB2BCF3E65C07D52EC9CFB21C11CD4C883E44C173214C900C44D2E1E43DD1
+CE8DFE3DA93C38B548BC4EC46FF91F30CFB97525E1FD4E77686433B20BABF8D2
+848C1CDF1BCF185CFD7A81D2D4BB826E837E2AF35CFC4F419F698DB0C43E9F9C
+B0FB628AC9A3CBE9B1FF4A067016E70333E78B32AB2D89C483834B31F5808FDB
+77492E099F1504DABCA5722C7860CDCEDB2DDEB512FFCC7D287F4945FD711F28
+87BC3D36173566B81FC2C1290C717A09697DAC6072408E20926D39270121CE58
+3EF97CE12EDD7F87F2C8CFE36C3C0400869C0D813B71C425343EE0CDF717BDD8
+409D5297D0F8F7FDEB0257C0A391F5635E0DB1116058942FF3E7C94D5F2873A7
+A3B0ADAFC3835AF2BE474E6741319BC6695FB37F59AEE388F81F6E66F910000B
+72E6BA7531B4378CEFEEDC79CCF4947BA1703823B5AB4F4AD73D9615C66C489D
+99D68E49C9BF765B7FC547BAB9640D51D5A7A2396507AB5A4DFF3D14F52422CD
+8FCFEAA06A56C6C7FFCD29C9A7A59DDD2A909A9363FE5F1E9629616D25ED38CB
+E754C059E4379318CC491C3B1A90128693AC53F80F8210FAEA7EE638902A7D3C
+82B95B3F5AE340EC1B648DBB9FB679D6E80B7F426D8671FE7136D97F51E2D2F3
+C9CE9183E4061CA40091A2A70DBB9ECBB19CE3F65ADD0FB346B54BAB182E2CD0
+EAF4C0F402C25573FB344EA771B297BEB615FCD0595172E84ED2A62FF8962634
+23C19076C2A9ECEED5135994EB397303A9619C76DC55E032DA83FBA441BD484A
+59F70A5110A8927F6239A14D4E223E189A5462E4A92EAEFFA4B961A2A32B320F
+C2B4E8C1821FA67A655B5042C15E4DE1FB3652B55078DB123573C4E986B19DB0
+1C5131F3DFAB271C30A5476B4A19D8FC922E31879C34BAED94C07A4841B8209C
+403369FB8E842610D1EB4662B6171A4465FD0E819964F62EC5B0ADC92F08CF90
+1DE0B410FFBAD16F6D355E8AD72CCF67961EDB6CDA82398021007C2D0462E893
+75EB0710AE4A6CDD15077C9DEFC5774EF4A657734D703CE42174259B58E5277E
+0DF26BF59AF8D1A3E7DC12E3C12AA4B67CF35B19962F6950C2020B698D971B35
+82FF84E72F72FBB0C54A112BADBAE6C4CAA358BDE6A705AB59332C3850CA3D25
+C7564499BC1319121CE0D93218210C68080AFF33420E3CB3A48BF9EB66BC07C8
+A79D8CD8E78C200FF7CFA3DAED0B9E87E6141C88B436D8FCBA50AC195FCBB9BC
+9512B95FE3A37FFAAB39850FCEBD4D50A243EA416E73F53B4B00F3B6EAE0CA06
+0693AFFEF215D00BFCAD02E45496D7C8F5E99EB9096FC4300D038C1AFD31EC4C
+5ACA6B72C1BE7204E37A4CBBCB1EC26AB87F2FF82DE20601025169A5FBD2D060
+62B5B2DBC288C79C33B596832AA18D730AD572C6EDFABCBD36DEA87C0F323C3D
+6E537AD3B43C6F3A905597570A8C6B0B4A5E08C08EAFF9731E745F2BA8ED0C0E
+1ADF7821CFCD4E38F3F4C243CAD31D9F8FC68B9043740852B4CCBDD37BF728E5
+648215961FA82A0C847ADCC5187331D0863A4573BE520C02CAE14AED4F06B3F1
+FB4A318AB54CD86DEC824707B29F858FD726A167F2333855C0575EAF4EBEA0B6
+754B1775F967140641FC06F82B191244186FF347A351FBD8FA62E8C978B21F6A
+E124929876488AFA97FAD1A68A0C3496BCA768F4AF8016D7A65BBA3AAFD7F5FE
+E75FE714FFF3D54D09C9747ACA01CEFD260985C6E87477C9C7843343C7E9E3F4
+0537D461EF019E046DB8B5BA258462B2FAEA1826B3410BA3333480CFE0DECE61
+CE2731FDDF7FCF2AEF7CC2B1EE7095F480B3B27932ADC486BD9CC130D94BBD05
+43872FEBA04FB8866ABCB4D379696E73B84BBE98FBC4A16CFF22F8A7AF754624
+2912C228030FF7EF23D51DD61BEB5171AD31E2B630475E16B6E0F3C78D44AC30
+712D165DB5ADED89056FBDA355CE0DE5DDF2A52DB851879E39085EE9D44EF757
+9B4BEE1ACDB865002ED4C5A98683AC13D9E1F818EE88E0A0408E13888A023B87
+31F35E750C4DE7EE68DFCC0211A2860C0988F6E682EF84373DB982BA28162A69
+64E9CFC6ACE0A25114F95EB7FAA7E99A68533FC4888AE57C5C104B219CFCB938
+DA518553B57BB2D9E462A5A68F1E8E0044F1FBC52560D53A6C2EB0393AF5CBB1
+55D81F9DC2C643F2E2DD0129C306FA3A787149550BF32119399076BC885D150C
+B3584CB2DD79AA0B27FF0D59D7CBC477D5A29F789E37CF19F32D9D3F6914961E
+AADE5423667209A686D8BB6F2293659E91D09CFE321C53B34D830CF72F00D3E5
+FCD3B6479BD4C862429A52E964B3BF8B81906F32517E927023C2AB14AAE1BC5B
+6B0B906F420772505D76FFF558C9D3BC3E980A1FCC61E9AF4B9A9843EC4787D7
+C41C6DEC165A5299444976F34F301F2950FAF95C529BF7A74514AF883C50B4AB
+C21227588FF0A57D1CCD8A91EED659F63BCE43D5ADD1F3CEDD661CA2B68654B7
+01E17109377F92C75135E060CD805F98FF47DE13FEB6C7FEAC15DBF630016448
+6C7F12BBDDF1C248C3B8FCDB8DF5F93357AF164A7114606087697E5021AFED3C
+0F775E02982C4599496B71E4B6F3271396CB9B581F70DCBB0435F111D2216D73
+0C78C0A5C2AA5D2A40758BC181BAEAF2641B439D4FA6EB46D03338BD95820ED2
+D57CB7AEE41EEDD77FA59FFD1DD7B805B567A1164AE77D8DB5F49E8779938D9C
+875AABA87925BBA4B374E59AE9780D231EC4D1B192E7CCFC31D87F5378200532
+F64EFA6055C148898D5E67ACE7363D8AC3CA2050EE8C47DD1EE29FDB882A31B5
+E8116DCBA78D5B9329DF559EE4F7855222AA01E676A7CEE978D9881121BBB96E
+DEA72B73FDB70E170B93BE01C4159319F4FAE38ACA41966CCF60A8F9424C098E
+69210A0ADB89D2CECD169D5448BB34DEE20D9905BAE45DE37F41259185F8B175
+B8EB2AAC102E05940B494BCB1F3B79458F0086AF241B063D7EDDE676BEA3055D
+E3D18A35A848A22F9B4B79DEBAF97466F8158D8E782331B673D4FF9C12177DD0
+CD62BCF177DDD0F950A8652AEF529AEE43BD52DD513F8D6585B85F4896B45B58
+6F0FC7FFD12BAE6B0E477C9D6510F6E87E3B4D75C9DED5592CE95B6E8ED406AD
+D71F59197A116377319BA68A214FF237B591757AE362289F2782350C12666847
+91F72F0A88E56827097522C55B3F44D76ED3EAB90B7ED0ECC3FEF34DC3C0D391
+6E06E03715926E3AA986E3C5DC076EF9CC0F5B71FFD3F02ED339B1CAFBCB04B3
+D7B17B617003BE14730CA3341A003EFBCDC8A176BF4467440389BFDB7D331823
+CB278DBE285E6732477E017A2A9B1AEC5C113A491EEC6141D7B9C435091FAC4B
+6C393AC995DC79F0046B3CB03CC01F714A30BFA08052C0BC7C888B1E615AF648
+256AB8F551EFB544240131B54C3415265C6716F9E852DC4973525332CD5B181B
+A4DE4E041BFCD79E978E572C2A53A7395F23977E60B61057111B47AD35A580A8
+769AF52AA9067CBE946298D77FACCF06BCEF0514943EE8AABD1C54B9378F0BDC
+CFE0D81EB1BF9D0082FBF97648C763009B41E8610D6904DBDD4F1C5D82E6A663
+2F6F7C4F99B83C0A327A90E16092E7963848B243A7E718E078A209B1A830D978
+73588ACBD3E1F872900D4C3879524F139FFCA71066C96424771C19E5FFA0285A
+D0E051214F11F4D7557C8B376B7E6DABD206AE08307F20F12755B39306B35011
+E5EEF050AF9118DCE00ACA6B266E66C0C63D579D7D90134D82268773D570B7CC
+5E4C183ABB09646D3B9E70D06E2CDCB9EA0B108A6DA4E3AEC5733CCC0A14EB34
+1D39DC8EF3308FF55CCF1F736B2DCBCC90207D6D484216A28C5BC32775C91D2E
+78A63A01BB22EC15E69860AF1EBA0D74EA154F044CA403E210291D18489EB661
+40786D375568D52BE04A49C51F2E294329192552E084BE826B25EC6A254D891F
+6C34A8B08ADD1BFB2FEE17B28CEA54E4FD352E2A01C649D05BA5E72722D42F5F
+A2C90C27FECEA6E5C21B0DF46E6571358C04287147DB535DC397A958A90F9A64
+6A60053642B8607ABC3EBD65B1A46F4B22017F945D059975D7A2A465E13651D1
+96D111DCA6B3AEFD4F3B5C0B51E968F9C6E1C365A390850BBEE64AF381E7929C
+9EE72908432B77B9D58B0DEADA36802520B699766400B2B04AC92014D99C669F
+FFC0E2127416F71925E7579213FA266F9803C197F2F0722B37C78C03A505C76A
+D86B400C039466E4D2E2DC5CEE614932A0B8600811EE809E21446D12A4A30D8D
+32C6AB1BDD383C05897CB4A08F719102D38ECD71359273F623865600455A040E
+EBE2FE4D6D031A0F96FBD7CD0EDF88C6D092755EE07DBDD793FFF279D1C5BFC5
+4DB4D3E4BFA1A8850A608BD6F635A7AD717C45407607FEF9E14576EAFFCB5EFB
+2B8C1B12CB88CD3D70FDD0458443046F85CE4DAA12FA4BAF6FB1673A1D3C48CF
+2F891D1BF832037885457B4E46A2D2418AEE1B46C30EE4E524723B7842C9DFD2
+60A72B6AA65B88031BD577A546CB320EF9E2B980DB8E85BA6652FD2BF20BB637
+2753016E7800E540154727C01E6ADEB5422B91D5C20F9E8B2B2AB9109EF13F05
+15DA2ED05ACAF566A51BED58221EB434CBB6EC3CC34C083DCFA54694A1E9FD7D
+2FA520B3DA37095B92844CCB2958E86484759AF1657B5B6966E70E21F720B0DB
+51F4C3D14EF63A60A5383CD166AC41860949F52A9EDEEBE352C64DE286D9FA70
+7030FA4357196B56E8FF52E2264DD8DB2AC5057E448DAB1B828DAA153393C805
+A57328D0583339DD7AFBD7A9A5B0D67FA92C62046F8F9B2FD8FB424EC1165936
+486A469AAB12FF9490BA39D4AF4EB41D682F278423016AA6C173A2ADA81AB2A6
+919412F56463799ABD6DBCC68A96C67C18E793A4B84027DD9CC233310E84E4A3
+1941DA5DBBBD462F7C7605ECBB28F46E6089E9B911CBE04C207C579BD999ACDA
+F9A39FFA4C396166DBA3A7286D8A6830B975CFBB9CB99DCF36A3057015218BC9
+C05CCB01B514AF78D5E3F6DCEDE6816E64719DB53CBDADDC52C3E05E2075813A
+9238E39CE61E0C17DBCC3D5A321950FDFA8F7DA670821C1F37032E6C52EC0BD5
+81F698295732C4248C634449F3F8DD016D07583818161066DA6D1F8F97F09423
+E887B17579B2B6AF2F4D18DA593C0A0E7DCD4A21AB3D7E657D12E07FD63F5B23
+2F362D1664E293E7D85957D450C025C5B9B2E8889283D8C8D395B135AA50942B
+AE668712615EDC2100EB5EA761360E565F06A23BFD436DBFFAAFAF6E583E84B1
+AB02C5418E41B8CDEEF026EE19139441F33DA61F28E6218B0F2C7FC79D2A3AAE
+5C7270F0032E465BAB57AD5323F4851D4C231A66D4038562DCE696F2DCFB0F7C
+B85AA1DF6068D85C017C5C95064FD4F0C3EA966E1E94CA3C9C9A76AF0B5E981F
+4CC71CC9C686EA4ED348CE57AA6BD30A16F7111E092D81B6675F7EFDB30E4411
+C0CC449A53D60F13BB248ABFE7DEDD56A03A675707AF1B1F13829E41C9226504
+FBF20B944E575731B7FD1D1D16B18275E7AC756800BEA08B3DB6F505127B6BB1
+2E49246603B265FEC2DCF02330C86FBCF9C9F83D335E363744CD49AA4CADCC4C
+EA2D570C6B130166F100436E50118D56630E2B596F44D37275D61DCC9C9D365C
+DD280B1E3C50F7CA3CF3A7AE08FD2451ECAC08092472D660BF787D04D3C3B936
+7292F46A57441B15E7398C7A2E139DE61729D049484B9E9E29632795AF3C198E
+E450BD4E843FFC0B8EB45D3F0BCD408A33F6B9E6B83E19317183654B196D9FC2
+BF327E50BF4F5CC83989D88683FAA8851FD91BCC64C797370809623DEA519BC0
+0F6637F304BE66317FBF98F8C700D28D74B643FCE8517454412D0F56D4DA901A
+8C8890F98BDCC83B836F806A4BE2349868E7722D6D8A260FC3FCFD39AA2DE620
+E8F5EB6FD9466F7135C436F9E86937631BA472EA77E9FD4BB9E5772AF4E19232
+712783E10A83A065E1DBE7F3DC45CE16D1BB35113470C88FD7BACCCEE874208A
+43D915B0B6D0A497D55D5D4ECA65FBBE334EA902D71766F00B1D950FE2F1EC77
+E4ED0E969DCC78C7F04BFE7D03F1113DD85A47FDD921E4714A59EFD829D62F1C
+98876969C68FBA644BFF55B3FEF54D99E081FB6CBDA470A2952E29F52FBB59FF
+778B2A9327D0E12964F34E1537E81251B2C910E6F75497A01EF0F24A3C85B421
+AAEB193514A26869B53A9C7974CCAD5FA2CD9E3598353D755B04597048C5F740
+81CB4F80AF5EC07078B84458A0EDFD58301CF24967ABDC5CE8B6A9737748C494
+0F16EFF7D430328DC9B04E0770C70E68BA005506E86737776B763EB88E64C5A6
+F5EAD4C4356F4A196900B9D3878A0DFB898496EB0C85EE207C50C868909D0847
+87E9D16DB5DDA440CAE1D609EDAC8D96E0E83BB67C74AD1271559593CB4733C3
+58D54577B35CB1CF9B954A9C422482682732835019D1FE22D6A0A6EA8950D25C
+E30AD2985C44267209498029F8FE133A435BD5009CB0A8A1099E95B34BBAD9E1
+8FB64C79F6E1D8C09553B35A952ECEE66360621077435F8E6E64C1C6D7713BC0
+91DB1434B9CF86CBF48B2FEAA908AED5691CC81C09D87EFC6FBFFC2D1F79EE9A
+836F333D6B473375BC8F6E8102B0C24700FF38BFD7025963C86218DC1E077559
+D4B80B68208E317E47E4B6816F04775C64DFBF621883955BF81D0DD586B4AD09
+CC10EDCB8A82C0B6D4A7056BA14A113DF3B35C7300D43772EEC5C0309A741CD1
+1A26C2C80D520DBD1EF1256B746BDA0D34DEBA442BCD33FFB6F103EABC60C585
+D885AAC3E1B6452B48A66C83F918E918EFA6034829C898440E436AF1A3D81AE6
+E74AF9E8F505D5DBD7BB58432C5AFF73C5406D78C8BD85181E5345803B2D1F98
+0C81540F82A04C357AC31E9AED37BD4E8D5FDD95B058AF5AAC0E1D35A7D11095
+31D1F8AFD1DA22506B8E1B9D72D91BC9F19D308C7FE6B85C2B8D5109276092FC
+718C3892052A890B3F785E57F91E83FDCCF702117E5E81A123C53218F4B74355
+65BD683FB87D87527BEFCAEFDC83C019E7FF741486E3CC1597B6A2E493D35603
+92B57EF508876C54193887DAEED97A41B66FB83412239066EA2E1C0617FF7B10
+8BDA62531DA6C6F8F06B7F150DFB3F6905A2B7076442F7C4780A41F6628E3207
+1D1FB86627C40A84D9894B73FFF000CDBBE088CFBBB241FF16C982353936EB17
+743EE092F93894D92E9BFD73E382FA5E618B21AFE8E593B35EDC97D82D5FF8BF
+485605DBEF4C1C533AF217EB31852B6D05ABE12BB50F307C0F59500B5F89CA28
+D7FAB89BBFE04B93474B3E6E863F5BD37222A6EDFE81FC5AEDDFD128DBDC1ABC
+EDF98F9D5AC4888493B4208D2B7C937BED3A271F4C0DAF78D3F5809B3697E28F
+8C8C00C6AE930844D3B54C6C52E0F48DD76BF562C67D4B035AF36201AB990445
+6DDEE6DF82A8E4242787B565E8DCEF69D54DE590019CD5189053A04342E2515A
+CCD0D4F3DBC7ED1FFC82F35407DB1D4D5A322B7957A40C30B3DAF4CF44CD096B
+B8C19BE6005DB525A0462BB49665589DBBDB111CD21AC2F7B6AF3F61D6A97FEE
+5103DBE08AF0826660BCCA78410A361CA68950DD6A0AE6408C5964CC8C73741E
+4ABABF4EB49D61BE53561577CCF022347C3DFE48F5913E45F1C7E39A1747A0FD
+E41B5800AD5FFCC50DA109F2B38743A9566FE6098A85D27C1E3C069FACD059A4
+7E4A706761CEDADAE28FAFD44A8C3F9CAD93CA94FAB838D8053CE56E0B0A4AF8
+CEC76D72955D888BAB4ED03271BFEB2A41EBD7F7CE463286D25F49894E8E6BEC
+18346F4AAE8B7C2524D586C937020B6FEA4A69562275E28C1CCC37987E6CB9E4
+27F47C1B45D60889D8C40A5E3CAF5E67DDDFB2EC9C87142074CDBE0FB508EE5D
+7F9ED4996F009B94E0FCBC38938DA56EF7E86ACF4ADC049CB2CFC6B9E2B4CA10
+699D52B2ECA9AB025A104109637D50744B218924373D1D0CD1138D516408B64A
+DF3E3A16F462AF6BE00DCA51EC0DFBB796313B65D01E6CE4160E071B17979990
+D6337DB92F3F112025DFB0DDD1E1EC1108F55EAE8F96788A1894F59B525F9935
+CE8818B66542CD18D019EF18D77DB8FA541BB47445DCDDA30156033BC031C191
+5039096D293D1A34FA2EF1551E243E1D88A55EE6E2736DD1A725A06F6A78A520
+BCAD87F68AFC45540ADA3D8DE97841178A7FCC969C159FD2B6F5153F4912198A
+A555B9250AA73454E9DED6FE1060661BEA6283FFDACABCB0207B3A48E036C39F
+731833C66AE165844344678A3D9A70AA3910473EE01100585DC37E364C3DCE0C
+E81306C3DF3C6EFAA67A8DA1F07B0D7B0E919F4C6E7897A4B3AE49A29ED10788
+83FAE69A32A97E36A29BF854831F84534C1F36D962AB49551028505A5FB3B84F
+6F0D66A06D333596DFA8F3384D6C74022523B58F1E96BA619278F79B6D24C63E
+138E241ED8ABB23DFEEE6B7B2B7E16568AAD039DFD22E5B42AB5B458FB8E7239
+57282147B69E6E3A3C5C70BCA065826FAACC8552FC0DEE5560FBC1084255DAA7
+2E8D48ACFB4C3AA1C28F0A6F7D0A6AC1293AFA503A96B664169944D0F31B4618
+C09B8D108D0F77B9485D1ED26C487FBB8B47F83F782A0206B625A4A81A350D75
+A1DDB921F0610A4DEFB93C2288CEAEBE0AC68F757D11D49F3052946BBF4B11CA
+2B9171A4A18D8C5C095703ED5F10D93C6EA3B4E46E0C9E9BFF3AC1CBDEB4E019
+123CF2099D469FEFD70066B214C0C76C0B2E0F4110DCF2FC8E8619707E025927
+8D5E5CD3C4950A055ED20CF299DC3127B7FA0AD747533CE11921DC4F110B6ED9
+21B9BA08CC207FE021DE4CC5285829F47A92636B0DB68ABFE8E26A50E36BFD2D
+C2641EFD86B588DF3AA72309788AE3ECFE10347F41F051BF51F54F05007C21B2
+8B4F64329200E21994516DF419BB3E10224A92D7E5B7682D0FB7097EC5672780
+77DE4BC4B1A343611F79CCF778793766CC0E01795A83B3171421F40A144966CD
+41A188F56F3D54E6578732D53E21156993E78B903572BC184C87DB3FAE64D5E8
+597D06D882D5C0DA5F8F8AB03014C5886E836F601A0C4ACFF9EF81B986E9D053
+55BA66A303FDD1AEC853A9E30DC0C1F42E850C02FE9216A86E9527C1BED627D1
+6554C85BA07015A2A7A7F00FB51C14CC19DDB920C41DBF56DA249930D58C034C
+BDBF98F17F143EE5C635BBFDD3BC81E4A1805085AE6CC28FE3EB47C2818C35BC
+ADF57AC82D142E1AFB16106AB08A3DFE989519E5C5903F2D8C42B13FB114857D
+35B75B239DEDC70163B181AA43D7F9B964EEF1E43CCC9959AADE728DA6D08463
+854EC66A8F2114A2200EAD92D5003C357C0B42C113A0CF1095D6375B613FD68A
+ED6048680853B5621B55CA62EECF5C4F77F909D7BF361C53F8B90D853930267C
+A79CC67A446B0087B2B4FE074C242C8F3D8F203E73B1FFDB2433010E00AE80B5
+27709B16EEF0EF42DDD56B46D1C0BFEB89B5194A2285C9C2F9B62541C0F86BE7
+ED1903968B13FDDE177F877EC6B9ED63DFB5DC4D26385BD85E27B86B5AAF00C4
+427FF5CCD7D539D7912CB8E0FEDFCD4641CFE9922C4A3A67A72C363A18E2BAF1
+15B2C145CA6A6C07461E113517D6383A03120286883493139D48E18DCBA93714
+A936C2232F79E6482E870BCC7E1C22355316A34D521EF8405E91BDC56C0F6DDD
+FC53DD99D9837771A89B5B8CC3F176A2A9815AC1B6D2E43C394C43ADC530C84A
+763886ED0DFB2AC863D8EAA55572732446A31953620D920AFF34E2590F1B29C8
+EF50348330B6C718E8C23165CD739392185CFB2970BC2148CDE2D7D3C1A244BF
+AAD43899E41254AB30FEB10016E5F11AC0185761F73ED6285E041132B9F094D5
+FFCFB4C932DE1CB65666A1B7BCF0A610BBA9578B8414B90FE0F6D5E83C8B9335
+D487A8380FBE1570A01B995284559454E89DB607E434BEA9582AF8900C1CAFA5
+9411C8BD17F37969432F7CA0E7C676D77511DC2037FA3461C763809022E1A8D8
+6646FC08A21541654A5735BFEA2FA68D9995AE458C11C41D563418A13D5FEFE8
+E7E3E3A601A362CA2422A749AA1B226D35110B03270B6C620F851A3F50D34707
+08FB5DCDB10D33AAD6728B0E76AAA7E98767D997F144ACAE9884F8DE2B3FBCEF
+DE7463CED6C95DBCEA9AE9EA9E666B366C5FE334D03B0097EE7148A3DF2978B6
+FED5E4C262DB969A775F941AA6653FFDB7066A24FC6E19EA0868AC065D5863DA
+0BACA600CA715BC1A23AB469530F4D7730131556FA1B3CF3C78F2B37EBBB801E
+F108203B858D2CE1E432E9319BF6CF57137216505A8DF7F307E70DE9A2387853
+7C028D25FEA6C83C2558AACA0B903E4DE917B872C8226FA349F587E482ACC697
+2F8726CAD12A19032AB62E3814AC6D2C3B36C09DD4E4D8B518DFE2C21306FCDE
+0F030AB52B41116486DB9E5BECACCCF97C0CE60CA33F5E81E2B1E118F79F07F8
+51F02CB58E8F9C63A81D61D6AE819C82E5F473C9AB135AFA3495C8363A3555B8
+7EF46153D5D277B5759558BB7FA70D96D2B0F26EC3C984DF063A14463DF7BEA6
+398F4CC4E105522C359F8352D6A858A7AABA0FBB87168C7D00D96E1B3F15AA2F
+19F1838AA08018509DF7443DF50AF59511119F193D4F5B3EE8AC9B2FB7D19240
+CE2F356E4BD77087232CD182E5ABAE8F6E5C47B5F26F4EB75052CBB82F3A9AC8
+FCC913DABB75A51F49247BBE4369FC52A6A24344DF6926F3DEF4D4A2847A583D
+FCEFA3EEFDB13FF245D6A0B0D1B17BB4A1C4D6E94D577F9936B1079766C46960
+29B365FA82CAD68EC00CA7A4B89B4F06BD1B0790B22C5067B2D26AA3F178C749
+A146A1651DD02F0397673C670E06E6BF5EA920FCE3FD23BE3DC25D9BE67A168F
+07B8D5EE0A2A97DDEDED6A2707CC2BBB455A07FC27258E85A640C51802B19ED9
+E9F43E95A190486D28B70FFDF5D89E3326F9F8E223470849C3070250A94F854D
+871A511960C2B4C857AB6B83C6F56E99146C9B1A4FC2D3D192EE0AD1B448F573
+7BDE711B9E3C47EA284063F1F8490A6DAEBF52677F8C20EB7D6A9086084296E2
+AC144156509A91CCA3DE861398DEFF7E74C844A3ACAA79B860579AB910E5E1A3
+4C5A81109B1BBF9DA1C2C81928353A443031AF58B5E1A545EDC5613CB726B3E4
+169FCE4503C5FF09A1F402F99D4EBF27B3D8DCB127D6BD615584C311E3C1FE4E
+B288205B3E9281BDBC52A949E8DAAFF4FE860943E7810B65B4B000A5D42A6F01
+10626E1596DF0C854CE2F3407FE0E864EF4138422F16CFE2C65525E3972E42C9
+A27BA1895C8F2C386FB300CD73EC7DC03EA0846E3DC5B843C1FFAC25BA59F47E
+AC3787E294EF256061CB16EE09FC5295F5803BD3F24F6C4188E206EEFFD2580D
+94BCE1E6F9C606698BDB3218301D3765973C2B75AA913443CE6B1D7438F805E2
+5D5ACC016A8DD0B71E5D7EE45E019C0B7BA0C149B9158021B6F472426C655275
+C645CF768BAB03DC70A9488A06BF62BA784F44A74CAA79E4332DD8BC1FDD95DC
+3736404A100258673E4895B8E22B1A123E0919D5CC599CDFCE0BD96C10BFE421
+0CB3A7F194A2442E2AE8153C0B531D05F1704C4C63F8CA19990EE5A7D08176B2
+38839E6BBE2CA42F629F7EF5163B64DE09462BE9C202455EB083C529F48AA41B
+7E0342F4C28AD3DBDDBA75880CD30B272A212B5C3987D27EA1726956CBA39A5E
+4C83EC82BBDE3103C0BC11B5E03D951DD80D863D6AB24F1412B31EB47A1C92E0
+038E8796D09C6F32FE27EF73BAA5718CC8D84178C53313D4FA7720E706AB0B16
+8D264C86CE1CEA0DA942FBC8DF04241F2F84BD46A97FA6CA390A8A791FA8CA47
+085D532C8B72D9AC204A8F2711CECC595AB286C4608FBD36C82A2FF545602010
+41B69445CEA932843CD24B22261E1532E848148BEA74579989C0F3450468BDB2
+11E0247514C2C2ADC66820A65FB9C7683D50D5961C2122CAFCAB27AE613DBA6C
+911BCBEEA62D981B55615D47FF6E49C7348A680BFFE06EF9DE6E19DAD5424965
+DCDA1B655D803CE8581BA0AB7EAD32B7EC4C9CBE0BCC74DF132F5EDC9D50B438
+D87A96B3FF181058A150FBA16390766BFC98CE986C3875D8C6F15F78D88268E2
+42ADD540D06525B10F6E80F114E8DAF907F31B639FC62E1B824F3B245083F708
+C50D9CBD333CD4BB33F0AD549BC51BB611DDA9CB4520ABA377847C5F4C7644DE
+A3AAE8A48CFA03011ECA539AE646F47988982E09DFCDDB5E25DDC32772885AAB
+BF9555F6FF946A53E9656D625DF441C32CC63137FE4AFF164836EFC6718A8DB7
+B4D81E86F3D4D1A0DF6DD22ACBC23A2ED878B9BD43617DF539EB4431E7E49CED
+22EB650937C1188C750CA36E20C8F374DE68B7C79007729BE085772F7A3A8DBC
+9BF36220846630924F317CA350E9173D618F81DADACFFDE09E710299BF6001FE
+B5CF89F66F623A5F7CED70EE024B8ACEAD657F63F7CAA773B59B5620E72FC26B
+4678042E0BA4F75F5596600CCDFD7972806E1F3CF64C7EF3D88240C4A2A8E81B
+07B93F8060719905C7F7E877C4FCA35F46ACF97F7128EA1FDAB570ACC9B8CA88
+957A8F91D301336210FD59D3C5F365E822B90076231477F49C3CB4EC2792024D
+6864AD523326123254C7AE2D9C11D30A4ADD2CB8D8CA14CCFEE0FEDC8C49D2F4
+99C69EA518C7EE58E94403C4C20DB99DE800588BBF79C27C3A6F03D653F3C15C
+8238B0E8E607D425028405BE81042E33EC2B5595677AB24EBD08BF1858CBC0B0
+154D1E3CAFD2780D6A73BF7D8DBC5B800D4328E4F14955F6D86A2F5934A4EC50
+B2D7ADF53A532D6484677807839039F9BD047FDB0680C50BF89D3924716F80DD
+0B421DFBCD32F4A7C454B4B91C6C8639BAB5598951DAC178E2320BE563AE0F14
+B96CCB98F51AEE99B83098EF77FAC10D8B88FB29B839C094785F46A377BD655A
+68787E5A6DBFE78ED1F304AFCFBDBD481348A65D004646E03B5AAB0EDA67A779
+B9014D14750AA488D8DF9C9DD347AE5B68DCB3C28986D9F09C48612B8795BA3B
+702415A816258790947FBEFBE2B85BA0913BFF1C4F35C7464DCD0EAF8397A769
+8677C8DA5F89253B1C3AB2F41C3C5448F17C5DCCB18DE110CB9020B9E26F0BD5
+E0806485FDA93F3B54AA9B9D445090A23123BB399318B4771EC426CDDBAB6BEF
+8E24B165DEFDAEAB660649754283A4A3BEA95522F058D118C7892EAACF376CAC
+877028063F1C0429B5AACC47CA6874B8A83C75B78A64D21CD14214EEAB0F4FB4
+D26FBEEB479ACBF5740230C9943EF7B6983AFB683855A877CDB8238CCECD8156
+DF9271A64D6148560A81EB5DE5F20564E2EA814A974DAA436AC36F107B289E90
+111B28D488CDED75CF61C3FAC18581D21E7B517271FE4284CFD0865A6FCEFA3D
+E26B649A2F392FF3A6A0A781E090FF5A98594BF0341D065E8E68B0A0969DF7A5
+71356D718C2933003D218218BDB35BF0AC541180635FC8CA3C777008B09FBCF8
+8BAAE9D764AC5A8CA2E88E11247E8512B6FED52E7C2339CED4E4F82BE578E342
+6DE6129998C520F77AA5032191A68F101D9451651C003B33D9A0DA25E241ABA3
+A29AAAF4B3C81DEF8C36A52C0D8A42999B63199295BB479F171599CC952C7F59
+B18BDA62685B45AE1CE46CCE2311789C46E155ACD5A8838C6E392F5CC2551401
+399F83BCBD4DB6BD9DF2EF4676D900EE843BD07D9CACDBAA05855AE2F7993A7A
+2FB0937F06186306D7C788FB26B536C1915E570863E5FB2D91C63E6FDEBA34D6
+A2D27DE682224614ACB3A799B3604026FF9F9EE56ED3A9380E1BA58057A036C5
+5550170FFA61924C47BED31688796BEB3927C3CBDC9CBCAA0BE5D685D7DE241B
+24C6EABDAA52B245BBA14D214CB61FF044B0EC7CB8731958F61D65D7268C7FAA
+B5BEAE3192ED338920EBDE9B6F625E10CA87520C72223FDE13C7BD49FFE99DC8
+5DB87EA56CD6C06C8C7AC6C193340E9F913C83B62CD5BD580F5CC6B6D8C1470E
+BD09AE843D9EF28CDEA143B7206DBAC3B896CA9D6169DD634B30C41D73310BE2
+DABB707A86A5FFE942BCC7A75FB92EAE77EBCDF26DA07B07D8ACE98C3277995D
+B7B1198233DC78136FBE39D3DE9B6F1F62BBB311D451B46D7AE0FB28A3EE7AD9
+323547D3399AA95E95811CBB50C5EF6680363FC8F7C7E5230B9DB9815F8697FD
+047161AC68896D17821504A87A73775544F932495C55174EF14A8350BC2C055F
+E095F53B4955170A06721543827E3F1C90CF48866685B359147BDDF8FC42C423
+3A6ECC23FB9353B3B6B90C3E8CA4E4E930AB97B2A5B8E348F9242F479FB85CF6
+C67ABD6A09ECF1CFB93CAB1960FDBFDFE108570395385765077565E82107CCF4
+95612493959FEA678C601C03115D6947A0B14492B04053FBC7CCDBC058DA2D32
+44E1CB3FF3B4F3582002245707F20494E04D681627A2D084AFC1B8144F5A21A5
+088FDCA63E160ED588C28FCFC523623415D2632F2104245379D9BC5E067E63DA
+3A320036E60A2A65F56997572166E8E6DD4AFDB39F1F84AFF1D5E05366F0E2D9
+0FF1BDD6A98C9405CFB576E4C96F747E4BBE12569018B5123CD9EB8A5C0CABF4
+63833B489B792596B97231202AE359E0D9648F7A350EA0304B7AEF575212C851
+788EFD372B9A3220E6C647A317FD31663D1F6E6B0F14F7A8EC8E7A7C291792C8
+A9EFD4191C8381B62E8BCC7B14C8755FE1613758E94FBA6EE7F9DEAB356EFFFA
+20D359112A8CF8AA6EB2990DBD57020993A4C0D3BACD910A25F318009C253F49
+CF460E81F4B942F009BE7909AC9EF593E7050DA6F7E0588F7D70B7E5E3982855
+29752C3FED27CC39C420E8A1A27CC22335798C214CFF18359B85F84CAB375769
+035A617724D498437B8AC8E7C3DB12389DA206D271D4406913F37EB48C820E07
+245E5E87E4F2CF38FA332B539A8FC1F5A2162A1353DC27C2064FBDDFE12FF7E3
+9A6A7690B8E0730C0F9B78F275DF43F5F5FEB0360C0DF657152846DD8AF2186E
+FF6E19B7E53E8F992451E1CD7E888417D3168D1299CA31BA75DC2EEC6DD751FC
+FFF946411A8C48E3A5C98535A58FA490DE9F0C5ACBB228A5255C48BA98736095
+7CE11E73BF3C403915FA14A4A8144BD6AD1D79843688BD5BAC427FF96B6C17E6
+82266F1204D00801F0274E8C05587957458527D7EADE10A03C301578C8BC4111
+334DE9BB4B78FEFB8154CE0ACBB95316CF7B5A1BB4547722DDF513E013A23B3B
+3899293091E25619C0ADB9B66E3C54DE2A257A5BE8CFCAA337DB1D7A01383F99
+F5457952EDA9C68E89BDF8E7B3F557DD20834C428A4DFA5B957A0BE481889125
+02751A25A687F5CC5E679329CF50F644BDDF436E1E3178CE27E0B87115FB5A98
+23065CEE85BE84BD37DBC82D94ECFD6FF88284F98848C73E5155D425609CA6D6
+ECC71922CAC6F81B37D3A0BED469A5A879673F4D7E623D77F2C9533417FFCBD2
+BB09CEDA826AD2945904619620E7A759BD3BB2E799ECF66FF19194510973CABD
+46EE7FF5B8609B79469720FC8F934AB53A4A39E583EE43E1E3568CCB96A7877A
+923F66B2F7EBA572ADB047DD9D9F25E01F7681A4B06C05FDB062FD346DC244FA
+B3A054BD47B48626907A7CF81674F3535DAB490E275E776154471A5F8BBC9F8D
+D811CCD6B26E085A660AB44533C4A3FE8B1511595399832368D022623D945C09
+B65F2E7B404E11A0BB3AE589BA84520F06EED018D09245CE627E358E24FB4690
+A617620ACBBEC71D374AC3C96D7ED04DC0893C1034226AC9D70FFA094491B64A
+2EE7DACACD7B4712B218AED6786E85A97A0662C261E99FDD6322998B1F95E08E
+D035A977C2DB94793DA2D90F3A14D4EC9A879CD3DDE7B874872E117ABB74A699
+16BE210CE77A1F4BA087E7E5E6F0666CA396FA06E9D7582105FA8E9B702B5654
+7323554BEC4DC645EF7259FAD81D36725394F94C1F1B0DDCB992F4F6692C879D
+D8DF61F743B5BFAECCCDC1C7A16925D8E99D7D1BCA04A6ABA8E8327063B97FC3
+095EC36F6062A93AA99E39DEECFCB507BD677899A2F170F612785DE13B89C7FA
+B32BAE429661C35EC5CA6F6916F6FAE1B03BCD6D1EB88DC99656BBC40DACBBEA
+C5CBEA244B3A44EAD417B65554C8CCFD173CB9ADA94F5D55E802E032BE53F6AE
+4C024EB9D647CBCD0D05F4CB0E49C7D1E9F573129B46E1168DA84DF1F7E9E657
+A1C37AD37489AA8509AE5B71C4183A5BC9726687C167702EAA26DC959B3553D0
+FEF8B04A46FEA60A7B66F83246725DB510C0D7F9A4C274BDF5BCB8EB9EB0A5A4
+52D7E328AE40F0E80F7C388EE93E434F2B6ECE185FE729F5C25F4169043CEC9A
+42B0D432D25F97A3F4F2849F5E11B0F2D7AE49F4FE5C59C4181664F8938F9B7C
+6DDF4EF92EA98AE49948AC5A70AAE737835C9DC33973AB817E1AD6C5DDF42BDD
+5F5CE7EB9570DCBA106D45D2B31876F1C5BC94D2733E603D7DDC1AB7332E66BB
+EA9A3A8E95B7372BCA6F841B22C2B6C914710373CC20009E07E417F709A540AC
+78D58511DFB85F629AF125DB14480979C68AE774184EE8759064288C0E794D76
+E6F80729725D0A6ADC875D58D6657F0ABFCA16FD200C48A45028B4283E3008D2
+244706006EE511A84882C5CA0E307ED3A9A4F50450900684A655918269F1D146
+86656A3600C0391A4C6857F24B3ACCEE4E782FBDC0EB487A85A2B575364C905A
+40E70F0866ACF299D231D624949692ABA887D56A0D94065A3FD6FB30E9EBC027
+755DC262C0912EAE5D330614DFC41F66B3B00461682C16EE71FFB95AC0670259
+8C58380A0ABB59BD43798091F979D6800E92EFE12F50B499589267198C9E6602
+5B4B6EBD6461F78D7F24E647F4FE4E4844460ADF4CFB5CF60B1FA0D42D02B836
+3615E35FD7E0E6866206485BE7C4BC920431799F14C89C17D4F82E7ACF1C012F
+40BA05E3337D56EB9B56CF8444402109A9E3DF297369C6B9CFBBC781E17DEA3B
+68886370468B45066C6D6158E16924079282177EF599F66ECA50BBC316E9935C
+7C8047EB708F831FCD7EC7BAC3CFF9DF196CA7CD583F9F69A65676A69D957C31
+B98C1512D62AD24A9A860C34B9B5699BDBCFF4FAF504F3A6EE72F75F0AD14BEA
+716C41BDC36A7B8213E98A57D120D5CD3E1009BC546EFFF690D73E026E7F32FD
+D60ABD6DC5057B11
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMTI10
+%!PS-AdobeFont-1.0: CMTI10 003.002
+%%Title: CMTI10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMTI10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMTI10 known{/CMTI10 findfont dup/UniqueID known{dup
+/UniqueID get 5000828 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMTI10 def
+/FontBBox {-35 -250 1124 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMTI10.) readonly def
+/FullName (CMTI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 12 /fi put
+dup 97 /a put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 103 /g put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 121 /y put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7
+5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99
+8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716
+EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C
+02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D
+46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A
+4B60D020D325E4C2450F3BCF59223103D20DB6943DE1B57C5FD29DA32D34C95E
+2AB2ADB3F60EEB0600C8ADE15A2380DE10AC5AAD585FBD13097B1A7E8E210D4A
+EE96785449E07F0C8EBC2EC5EFBFD0897DFDC15E5BFAC9584D8DE95C5AB288CD
+8AD8B9BEF0B8E5F887B3B0B331542FC8184DCCB753DB6ACEEF98B85756B988DF
+CAF1AE0DBE7D37D5F44A2E760AAE3A5197C27B15E32275A64946C3E4D0476FD2
+7FDE148C788DD2106F7C825E270588AC05B57E625AB17BDD02306F9E5FC851DC
+32A5A6EDC43C770A71419B2C0C8074EF3F222C8A2097CD81A91F333A521B3A09
+482A4FE1CB231CE344AD126AA284C3280AAC3AD162CF0EE241BFB4C8F20502FF
+118507F5D1B5FD898571015E73E5CF2281085072E00D401F6F59761EEC3E8381
+1F26F75DB66C504AB6BABA87D121B1E7040A07AA2FE01F80DBC246CC03C4B2DC
+C2A715980C52B7F96BC1A78FCC7F4F52EEED5F705E08FC1E5BBFCAD121FA88AA
+8EBE58172C162AF409DBB0728F14923ED02A65EA24E5D52B6AD07777455A70A4
+61833D3789C719BA92E901232599767E423D5AD9C807670BE0E7B5CFF8256A20
+C7BF7214FFE0342809570F5966A2C43E784F35015D9040BA34FEAB6A6F089504
+3A40A9E9D711A2721D3F4998371430FB3C94BFC619559B97D49627BB630F4B70
+9D0A8FE4E916235335C3962F3CFDB04C4A3CF714DB5E260F4E66FFF2F27CEF2A
+D4AA26BBCAED23B8BDC98F8F453BA27AD7758537561E766B82DC3032E92A9EB0
+125D98A22C5466AF069BF72A9BFA052A8628FEC6A6AD0B711DFFEDE3AA2D7CE8
+34EA487038EF50F953B8B4471CBA6FC3C53877EC1BC94582B1123EDF44B4056A
+30F49394BDE22CDAD7F01951C7013D26979277D18EFA594E8F4F2B5E615187D9
+39E842EC28461B9ABA52020A127D2CB9002A673A435B13C10602EEFDBBA6BD49
+9DDEAB9E68D655443A5C2492BA061C1391A51592BA8C353A6F6A0708E8860184
+2B5D031D2CAB87D618E9F6F7A0BF3F66B3FD5A25BB91F7F1F5F99CFF56EFF4FF
+0A35C55658001ED2E97B26C869292F6274D433A5443179DBB8EE987196306348
+3F9E87C6422AFFDD30080C9AC4EE7FE5E2DCBFEE4974331F4AAE479FD8806D4D
+9C2B85FC69EB0453AD827A1E767E5C484BDFBF5C8D6E2B3C96298B390F22D757
+802643A79D5E29CF3AEDF0E12CFBECA4663444FC87F2027571DBA9ECF688BF28
+FF0DDB3AEDBA0FB28447CB4B5D5205F40C1E7A525FD7373392EEFFD910AC82D0
+98E71660A1B3227C4A2592F3E853CA4CDF64DF19A52582E167234F4036FAAAB9
+5446BE102DE2BF43E82F0112C2A20F15A3F92C6571AC761665A905362C4F8BDF
+AC8705519C99862CD9C0D75113C4AB5FBB83C880E46B82715B5628890D9103AD
+A2329638B95D93C4DECDC5E6C588C9D5183EE6FC28FAF9825F02DCA567306D93
+5440987A81B51EE7291107A08F201C609FEF91A8F0587E8B13D4BAF74A5A6815
+DE9E4441F46AF8E1DDDFA2D611C889614040B144A5EC064DEE4638C04EAB2E37
+4CA8F50FB8C4D65BB296DCCCD39F1F554CFBED96670A91F515CA10EF896874BC
+8EF48C6447752C70FF5A06F928DB55586354076773BFF7E94C4C3A7A1C1F421B
+A9B4E3936EC26E0C19BBBFC90F021E877F54B62108F6DD1C7F6D5B8E64FC9362
+E173F01BF2904B7E5A08B3543611562C2714099DE7D4FA330DB148B560A9601F
+42A84452811CE213DCE782A0D7809CFD954D6BC1EBF2BA4D1B18F50FA8174C96
+3E0120E266AD5DDB40B3F6798AC28CDC5C3C4BC34583528F5B5DC8A222B80B59
+A3A93DC715D061EC6915E6E6E21A25425C25E8747C60F170D61047108826F96F
+7830E220C108B441B6EA3198E33C49BAD8D43086E49F5A2BC7958A1A8CD011C4
+49045193394696EC3DDD0BE084E8F2E9F0B9496F035C0DEC1CE11409DF566428
+D50043CFF5CDD1092F6E0807E660B68163BCA738E8D98FC6EE3F713164CD204C
+0BA84FFF4F33F47BC31750B448603D7ADB9AE92FA91AEBBBEC0DCD66980E6955
+CEB425ED07115B24E40F53B29B9D840842EAC691B4F591F866DF27556474B485
+1C6F53DD72499847109B16C7093984A6B8487D4F3870DD517945CD90E648C1BB
+8A6861E540FCF9D75B984B5009B5CC760CBE297042C240DD624111670B703388
+6FE6FC0E89C6B4C88F51DFF3913D0CC1FB4770C8CBEADD4B86393605C0B6C468
+83CA5594754411B6FC331EF56D7CD6D247FAE42E966583C29239A8F862348D29
+60B177984B6B957E733DB4D275015691D91443BBB13C2DA96097A29733CDB284
+42F89C85A7A743338C9DD3BBC4EE53F695E5163E6E1ABE5791ABF100B198B9B2
+1C21E2FA2FB4AFE7F9BB2D381260CDD3A2CC05BF513AA1E80ED69FA27BC5ED5A
+21445BF00BC2F997B356D94AF13736C6D3B0613EB6F4CD96A685FEB672661DCA
+206105EDC3CA07900676EB2FAB37F48D2E8207BDE1463894DA3C5B1488AC1EE9
+D39DAF691648048F5D7A384B8927F8DA2BE3602669F71D80686E427F395134E7
+7ADCC611BA91AD4B7A0237213C60CF2C905359C90795230344FC3C50A22BD44B
+55B2044792509F50F5C21F53D9F9E9F063ADBED3AB99E2613B23334FE8DF70B4
+6120F2EDF69F50BE793EE145B9FF9C73179DE640FC2ACEB5C6617F918CEEB762
+4CD81E665B2E544864D13230B058717B207D3CC5D6647D5343DB4D0356082392
+871EFFA896631A7E0D6477942B632074A9A4EF7B09D4701B1639BAAB4E03A40E
+9B54A7A4F845CD63F88831EBFA4FB847847CB98F3455CB5957F2E0A0F5623645
+DBB5C5564C7F8B117D6E27E65C0F3EA81AE67B4AE4B201E7C4FB0A8364FE53F5
+41A7CE8F834C2C4B322809B353A5E63BBA7BF3B7DC1A85EA700BD287C2BD3FC8
+2832B0BB4695FC937FF5EF06FCD87DCE6DE793C2B1EE10E6450352C17726155F
+220D550B1759E15AB2C1D5968E52C8080CD280E99D3CCC0E80C2EF8BBFD96001
+A226FEED7311EFB4B67F424B557A877379A15BCA54780F0CD2CCA00400B9B39D
+981C6B552AFD2506D1B23618FA9AE6D8143CD7198A8482CB416CCE62B992347F
+337D505A4078713BBD91E5535BD58EF0351EBDCD749CC24D4AD39F8CECD7D6C8
+139756680A4C03A58B3374CEC658D30160AE4863A3938A891BB59CBE02BB451B
+1BA4B2B6E68AB61DEB85F95E3C909B8B66E220B9F18280161C279F10F7093CDC
+100A53D542F071CC0A5AF834DC1D18738F5DD62A5573E884E1FFD22BD810828A
+1EA47F8218C15A2E97CBC609927DA3CC2B802EA4A0D7EB57627C135E3B065905
+F97597D818A2C5CC6F328AD25AD11FA50F1E4FE637980B7474D6F85A521892FB
+72989AABEBE02A2D0EFE88A6F67AC29F5D8DDFEDAAF465C439983C6B84389FF7
+A6434462BEB7B07DBE4BBA61ACD4A60C55B5C0AAE527DE381DFECA2E6BAFDC8D
+310364ECB42CAFF72BA93C067B2F02D1CA7C34AE7CDC46787A0E234C8BE8A928
+7A6F3DDE0338FAD532A9886E8E3525B85DD39364AB03EC4C0DD25DC179CC1989
+1BE232E387E857C78332D834679195E10F1E7B87B7966DA3B2238F53D1E13FE2
+8F55ED6A92A750C7250C9B91E29796621E7E9520373214D7DA81B2875A986D33
+80382AFF6DE1F829F048E57664D9C4ACE91E4684A51023943A4964AB5657D610
+3A5405EFD4CFD1EBA684243E15093C9667797BB47617B66054EE02C41FFEC45C
+C1BAE8AD56B00D323FCB1D2744F061FA16E161988741A319B1564E04BA210996
+4F9F02A3268CABE450D166A763F5284954564A1C86B76544C5F5ACDFE0D758DB
+865A1CFCF9FE8CD5F9C3B2998C56468FD52DF8EE60C6935A3D221EAEC7714E3B
+301371C7DDA0B03A2416238F2B47BAD3A2C5021C886DF51C695AF9C87A864B48
+3BB3FE0B355EED5454B59B25A0D8A1B8CBD356C24F64D9B55E16C30C011365C9
+1E0380753BA3EDC0868788D5F50B9353D0227BCEE1BE36998B2622C0759BD66B
+E4444250589F9CEDE766D8B940770CB6B89503E925B35C00CBEC2873D2DC4A29
+0823FB7A3717B69A7DEDBAAECC067949932728E89BEECAA91DE3AF9BF070B9C0
+30EEFA8C0A55C8388CAA2F0515915C98E67FA095BB98967D14B0DCAFA9622E4E
+2E0EBFC768D80585ACDF28D8A5C2B6EE2FE7AAF62FFB90F569F84A0903996DF0
+C1D5723366C436E4088F3E2BB9B47F9789052A71CF5C49908CDC1DDA194BFB89
+14D7E3D7D4D72A150FD6FFD8303E9DE5A97A71B808B8BDF2AE466F31BF5D7A4A
+44F81230BBE2B456A221E2F72A8B59F8FEA8D31F8A005A5BD93B9F49CFDC3DCC
+CE2B67090460F632271C7157BDC2F05BC2749FD562FC28682A616A52D1B67654
+DF78B7843A9EC26A7DE2EB168F874904C2915B97534B2D4D9F74A9573A771D34
+9F7BC855E8F794621BF6AD471BCC347E2DF5F620F5C209E33A4CBF1EA85AEA87
+4492A77342DD33EF615FF34037D660B713C908786D9022051B825226545827A3
+2AD1B05D654DB6E6D261B4E8AF0933AD1F0FCFC7201E1A7C1B4199F160C38676
+21ABA2DDF1CEB655B3EC3226E0B122976EEA998F7A5241F062E54AD1DFD6ED26
+47C99A439E0AE95415059179867CDD3F0FF751F3141309F40E00A6C7C28433E4
+F649BCD5DAA64177580E05C495EE7BCBCC5FBF104DAF360CC2711386655B26F9
+D349D887EEB32ADE595241560FD5924A1745A22E6A01DB9C285EF14596EBFF0F
+03F36EB2E0A7C3864F819EF7B0855121292D49482F046A55CD7271FE03F02EA5
+886864D9D8EC22A68C23089EAEFFF03DED6484D8C341861EF8B6FD3C5BDF5AC8
+352DA4E13A1E30D0CB71E090E9CFB9AB2CAFD0CA7C34AE7D8E3B2EB4666834BD
+9CCD1AC2108348AFEF6071796F4BB2FFA4A67ED917E76A109FA2DC2A30D744A0
+9AE653A748C1D18FB52595D84E87F1C1FB6B2F32667FE203262C66627AEFFED3
+92B23861E5EB238BB4EDCE09DAE1C65BAFC198CDD1B45D42CDF93E16BB82D35F
+821E9E49067E966AFAB2AB52928F8DD6359984071FC37AA652FB834A09E5BD93
+3AFAE161140E74C6531E413E8FBBFC42BFE8A464B71EB1D8CAA93B33D7BCC3B0
+47C7EEFCD3E9FCF26FF9441DD9BDE68D77AD7251C06BBB9A2103049E8827CAF0
+F26BEF33F656A690235DEEC623CC519AFA82DE2AE16FB99F780FD7D8290DA40B
+9B604AEF36B529FD184239E7D50561A07428D28E51B55546590A1AEAD4B7F2B1
+AB8C5B9022C1FA03E33F8F409B24911AB8BFCF6EF4A8E415263C789F89063E71
+C0910DC20347469380B7FC1EEB87D4CED7F4A361E58B61C91AFCABA35C03F978
+B9FB5257C31657EE48504C355CE893FE3C553274C641DBC4004F5D5B879CC5ED
+D3F21F867F6DF054127067DE86189F0B59A1B90FDABCDFEE61423609D888EEFD
+F4A1367129962110C651D9481CEDDB8C5C2576A59AED64E95F7ED042AEAE2F7E
+81AC0C408E593DC30DCAC334EDE9EE27D932B98F040DDCD195D6155607DD2038
+970EB78221A94C52BD4F0EAC65F1FC10E5DAA93C17266F351669CAE56F42B68C
+6D01E1EA03AE554D63CE76D800FDD9CFD89F80A241EAEFF7EDFA41794EA25CE7
+97BD5028464D2CD45B53834B4AEF8BF0B9E7C6ECDEACEC887E8790A47A93F668
+A9095E5FA1116A122C0E5B74E2226C654D3187C6CFD8807917820423DA3EC1DE
+AA020EEEF2280C44A15209EE2F3FC1776875308CEAD38571E7BF889F287E4594
+971A83605E0B4169D4A23EE790515223DF8724054EDAD905F57918FC0BC64F96
+514B4BF7DC9BA79E763C22C977FB6146B10D26FEA1BAA7BAF21312F78D1625A7
+8E242D743471DB5821408AB786E4A7EA9D35E30E85533C617689F95758FB2C7C
+392E759C299DCCE36689686DE0C4DCE32649493650BA194A6208C5EAB670B170
+3F2C70BF0EF0E3BE2FB0A79224FF4ECECD6BB3388C6D06867A0E5E3DB93C1B2F
+464C23E44D3132E7D4086E3B59B1D13F49EB4772DEDF8EDC4F603217233FB7BE
+C13C28648E9AA51D53F11FB896839F97AEDD8834BCA53CB0021AE91FD8E95E2E
+F8A094093AF556B9639F508A401542B06821FF9DE1A745FE9AC5CACD5E8E1053
+911442FC15CA5333751ABFE2C617D38FA1DC332BFEF44AE569DC631C93EC54D6
+261583A695F5A392867A57F59B741EFCD2DCFECBC55D1EA5F2317601C9DFE9ED
+D1EA466210FFA905A8F85BD58B98991BEA58DFD1CDED5C9B086D42CCE632DADA
+147941917B879139E016B0DDEB8446BA017FC8EE5A354533D667B0835F5D027D
+C2D580C16B80B3D05CC92C0465CAE077729F0A15B2DAFC89DCD349B3F81D0516
+C65526EB5C10E45A8A85D716EE35FB9AB201FD7C89ADE5AD925A174169DA20FB
+61E96C73A143DF964C20589EF24A0FCFE6195317F2FA0D2249C0D8E649C3D9AD
+FF13332EA2E4C9CD36D8443EC8F027B61CEF92C6A6B72DD4ACBACC16E429A9A3
+F5F29C1631360E32F8C1C93ACB22F810B86D2969A7480F486F62F8488BEEC74C
+2C1AF13BB92BC578E8CD30BEA6BC8CB68ED730F54CED0167605FA76AD7B7E88C
+7AE7688E598F91C471BD65A542E96D64B1EAF19FB4F1234308C48C2DC86E2193
+11ABDB4C6189C6F201627C693691A86DD07FF55C30FDB3F72381E09C6080FD7C
+9182762E5001E30F52A216E0B71E4D2D4E2F3B20F95DF3A11FDB2D2B5B5FAA66
+C46226D5E0C77066349770514E5675550FAC9394FB27CD2C2F974F1FD58C04A3
+1EF53A8AB3B2202CCA1CEFA66228E1480A0709436C44BD3319C40CF888AE4692
+5DBBB52B15CF3A518F627F672135A24D5DB9B2EBEF04C860AECF231EBB5A3BF5
+6DCCD5E72FE4B6DD29E896691868A7DE4120AD06AC573F5608B8449B38E71CA0
+EB5CDA3F942482EA7973661170F81DC88D54DD5B92323F46F833DFA757107E9E
+F62A47CC50FAA1B68ED535C3E0E1073532A05ED339C8D70B3B9864808ABACD23
+AA95E9FDA43D54C66A675FA074E0A5B8777D3C07850A09087F36852B5351F35D
+8BC4DDFCA35CF29CD5E3DE118A741FAC4DED36847F2E2C6CFE08669301722D94
+376F540982958074E7F1383C409652F6C99DA39FE90B38221E75BC1ECB93ABF6
+B00F410A0C5651DB418566AB350FDA1789AFD88286AF3BCB42B98386F7BC144B
+02DEB8940D20A6B3062F0C4244EABC50923390064F1D027A8BACC3DE45156E56
+4A942D1B87F1C4A76B0D4D6801AE792CCAE3009BF25368B31B6AD5476FBD3BFF
+9759EF463EF5E78E10B7BF64005B2ABE0E8813950A08A1808587A98E0021D0DD
+751AD515E8278F1A0759E85D8A084490BBB0F8206484AA36388B1013643D3198
+3509078847BDAE08E76FA5BF3E3A73C323CE093DCC148E3C02C2DE1E26C94D5A
+40EC8308ECB02FF7DD04EC1005A2A0DC74D4E587F10A3EF349E828F69FD38962
+2F0C74D5DAB3ED6CC9F97008ACCE74C086A503948DEF1AAF58FC8BEC703CD360
+D32098A56AC776B1BD08442052A2A4EF6C8798F7CDC102AF1A2009657254762A
+0793F79A39DCD6ADBAA5EC84A7ED6018BBE727E5D477893D84F157074B24C13E
+8D4881C7DF8ADC13EBA0D89745EF93B7616EC5355600BB0D2B630AABA3CF2946
+AFFD0B2B724EF0F28393F2034B2E69DA5061426805353EB4D80E20739BC4C510
+6C45275B8261DCBA10DE1D104B12F46ACD230977EE7D7D1D35D2814139E38C4B
+CA6937CCFA653349B1EF64A98457F7B4B5D8F2978F16ECCEF7054905863AA46E
+DD524CB33459220C71E9EFA7845A3A760A507B3D3ABC525B35930B613710A13D
+098832C58EBBC8B0CA6AD516E6385792C59220331D0922A1F6F838A8DE13C337
+900462F952EABBDC2EB1FBF94A66186C177501453CD3FE3582073DD86F04406B
+41B6AEB440DA475E13240445D46726A6D45185D56BAB8807CEC8A8F7CE1AD149
+7CE2E1BB5DE4E5B9592241DD136479A65905FD0062C91DFF7349874BFEA5D9EA
+2F610ADB9AE7757B2307A1BB9D6797D9F9C4844A59841C7C7682105E23A374BC
+A91885E7410F56F60C29AB8B417E2D6092F8BB70A2DD5DEDD4BA1077D7CC62FD
+EA43428C6F79C332342E15F75B08A1ED360B3511F823E75AD49BA7AE63B19238
+2AFE8FAC2715E2FDC895E95036D23127557837506A3B542B0E4651CE2B89C252
+31EE8ADC26E2C04E8E30A9CA12F066CE01953BE7867171FF6C7E834742C36C3B
+58E74E4B482CB85FD4D24DB03D753F260A585D552CDC9E1941446F2F5B45FF24
+2DA4932B973139F328E7E92828B900BFD398B6F41DAA0D6861C66AA7F5E3299C
+87A5925CE0E0F9E09AAE0792954A1F2C0AAA8288DEEFFE579E38A3CE8A943EB4
+55322A87C1634074EBEC25F724DC1BCC1BC10458CA6C4395659B0DB6B612C151
+557CC669D8DC37769E59A5AC6BF061C79FEE265DBB59520EB8FFEA273601D1E8
+2984B8AE31AE343F37D03E2BF97DC48AFE50BB6138C7B9F9B5E28672A37BD8F5
+8F8C98DC43DB22C6537028798198E2D3B0453ED72487267D653DD50F1BBBDA92
+833A987A95FC1F275B90B581B4BB62B6863A4CFAE37F715EDF3EA5A33679FEB6
+4847ABB4B3D170C275B9F1AC3156D731198DACE0B051674E85B758500AC9FBEE
+ECC75EBBD85F8D62AAA328FB09C6526F853077AEF7EFBFC2B6A29D6D508B1E19
+EAFA4C67EEE44045B9F15B9762B3DDF5CE5C18B23A5C2F73A1F6DF7F8679AB78
+843AA41FD2A7DC02B45B729EB76C66A89F5F76E5C4A0C0563B1EC5E75D72EE35
+A7F1FC89216B60D82F6F2B8DBE85E4FF4D63712C689E696F60B52AB622C2A4F9
+37C380775EDB72638D3F81F61D8D74C76D813DDFFF35ABD9A502F2BC7FF65754
+2A8660A5A53E0CDC2E8A95B6E33CA153EB711DC796D313C8183D707D3F0E3EE8
+BA65E0FCE3F1C07F3D93F77056688B5496AE35A6BA0B59619DE78640A8C3F7D9
+7DC5E94894E1E63A7D80600B945B1CCA50F1B85F57673C6CE09EFC4E229D4635
+48AB466118D273BAF7C1B52A067A88C00EBFA7FCB378F1575BC0145F294E6F7F
+8007602C6560476FA20BDB91831B22404DB1C4C167594B1216C25226D262FEC6
+F5D0DBAC4B8D743C669CFF2068CB9BCD2DAE8CD6EE1B33BBF7514C4941AFCDD6
+89B75F67339B25AB6E267BCCC5E2118879AACCECB5CC2865802BDB4D7581F5A0
+E81AB0F7AA143FDBE743E16D028E46BDA94AC2CBA77DBEFBFA32E462EBCDBDC5
+B86B63333A0C05C65D4B351948D03668F7A86A8A1388C4604675EA7384F3398E
+49404AFCE19832C975A668FBDC29D06268085022982F01A2DA1DA8B8DD5F4584
+75F98D7606BD6A45A403CC026A4BD1AFA63E1BC1034C1F617E14A1EE9543BF7E
+1ADB8019F7AFE089150EBFC613C414955363C43E0D82ACBB01251C070E7F1040
+602A58B2BF55094DF2BCD2689320899F987472681D0933A4BE78C2ED69D76E60
+2C437D4D3EA9C8D25588F1689224D92CDC65AC636325718AF7EA47946CFF07C2
+DC0FF0BE3642ABB0CC38BEB60E00B41D45DCEE44A71F11B99CC4CC22C5A0C62C
+074F3C2FB093560B7FE9B3AAEAF3B563D1D646046174516991A196A915CE6918
+CEBF16946487E546C6E433A5C5B9FB7D5B97F2B4B202F892CF5121199EB48642
+4448B45EDB617EDB931969D53B9C200E954B4A6DA6617E3A56D72EF332FB941F
+4694BAF21CAF8473EE2767CB5434E955C5A08DB04F67508AA1F5CFAE25FBC9B3
+9FA855CBF2DFBD04C656532230B8A2A0B33C7EC74BF3EB2877DA369035C976C2
+F3227355AE2E740152A344AC5E0CB3D04A1D4273A54A35BF8B1F247973158C4E
+2ADCC0E93E456A8F099F28C99EE6497EDBAD4A0E7937FAD55FF114586FF56F02
+D7DE3994628E4816B2D15C8370B95E334D9D374A9C1B6C7A10E83874B380B6F2
+A527D6AE149DA8AEC229DF8964FD62D697D99C3CA805CDD28742348F462C2FA5
+6E83657F5587E0E9FBBD2540F4E14876CF5BE9A38270E56C85C0732DC781344A
+A480D0BAD09DE7839C3CFF2BD09C9A9A80F985DB188B8C1689CC8A4AD620196D
+06D17C44063A9CB2F30EDAE6DAE4FC7751BC8CB7D2B54CC5FED51A14354725A5
+5D3568B56A54EEFB5C20E38A336DD50BAFCB061B051A0AADB33DE07516535472
+379855FDFF2C07BC75FCE7E930062C334CE95B6B538CBC41B0322812E1E51679
+1716297E204395DA31ECBF6177CE515E88B4F4D61348CE6AAE02FD0F1D286114
+3BCA0B5199B0505D786AB3ED0CED56A180DA736C3EEEE8825A3BAADCE6A49117
+B0B754B2B53ACE67F02AEBC31A4665FF2B023F5ADFE660CC2E34967D5208BC6D
+2F686AB71E897B3DFF0BEAB60E661F651F6BC46DC1FAB62EE9BD004B03358262
+32EFB3F4E4F7C13275442F3404888CF7FA12872A463CBBC52B993DFCC8CA0981
+991AE2D8738573A60531C13C0FC33A9309D9C99F3A68B7BB3EEB118E0943DE7B
+5CFDCA5615AFA20AFB7467D2541ABE54E4DE0226A49A72C2DF120A6A1E9CD16B
+143E9D3CEC3D6EACB409AAED738C066C9F8714E1D062AC775BD346019D2B86EB
+21007D2847DC4F694FD547A5C1C3C8089E9F6DBE130C6EF07766D89A5BD25778
+27056E32DBF97F975EA2495B466D643625BDE7F55B35FA5FD47F2707F76A3D25
+9117398C915A3BB4B461972B136CE89DEA6304D5D99C043F3CBFAB9E1B68AB10
+D416CB8A4F7760D76F3750D41AB01151F36EC6E47ED148FC15FE7DB2C0AE91E4
+40222918FACD5EFE0F8A2093D487E9C7E840C25BFD2E49617FFED0B13490E86C
+89A9DD5544A0CE6B49162B950CAA484227A5BA5C6AD796D57A7F8DF7DDBC1FEB
+9CE33165B20539DE7DB2F0B4FAB376000013828B458F938375769B75DF7541E6
+21937987B397872B880D350D359A9183D1F9B530C3FDCE648262E1E10B8BA95A
+D23B1EB3C38FC30A6A70A541A31E626427790AF8ED201B2F813DDD1AB47EA8C8
+370E1591073B6E128BA9B02116F28A929A0F34E1C12C091E4820C12FE47E31A8
+B56EC3E47D203D61DFFEF269A4EB9B7BEADE78B9506CEF4F200BE114A7669473
+4D16CCFDBBC2B8DF7AF87F60EEAF24BB9137E58CEF2F83F0E9116E9ADD2067DC
+DB5C9E05440EA0DCE72F3C98B3E97D907B63DE8F2AB4F06A572EFA28A395B653
+DEF02B8BC01E79FDAC8528DCF05A1BC986C9133FE81B274ED656E8F54087F85E
+9AE42FB250690B927A0378FAE0FC32602718E29AB9595A48B51E0914D9A5F6B0
+45CBD36D854AB5717CF8E645D7DDCE370D8B555B2DF0EB9E3CFEF436F4306065
+A8EDD52C19D9330F2518B1637D69A72DE1903D5C7D246A5DBB7D33AFBEEF9217
+1F8DFE2E5B3CF13AF8F74B728479B7E7D227FCF6BB618140E795916010E7A814
+F7CC8B76EA35BEF33551819D6EC75245FB5324775E1CAC860543BB7931404BE9
+D535D9DC60A9C43428E03CAAB2C5530DB97491A498BBC8A03361C0DD06828CFB
+AC3E51B672D460BBE1FA0FADFFBD7B6528D96E0496A8F62C8E3D4AF463CE4D4C
+3DEC985D05FF44FC710605EC1C7F2C77469E7C4DFB13DBD74DE4AB848D81DEA0
+B974766E14A6F2FAEC6BB1C0185D6079BFCA713481EF5872D53EBE1630DA0FCC
+977B484D15B1B9BCE324E375FCA501D3C2EAAB0A366AF151DADB9A45EE0B7D07
+3F6F6D7B104411688787A811D525AE0273989C7EC61F4211B6E982C9A957617E
+96933996835140D7F944DE6AEC922CC203C63798F0D617C1946047303B163B10
+2E9EC86E4AE909B7D5926F97BD05F6D4B81A5AB5F2CC682B02857AB89C9058D3
+4AB595E9EC0BD0AA10F4C35E33B6179A0EE971DC7739BFF1235C7669D098C848
+A8ACC9785237D6249D4DB97E3EFE29B4C2471A9475E1A9B1B238FBC5C11E6E67
+D3FFCE034BDAC6D8A9C679E06FC504375FE7C5C2CD713FA67A8A3CF2912A2A4E
+AC61EF89F0D4BCCF3638857C2525E9666109A1D529DDB3A570ACC33718E43EF0
+62BCDD2A6259292D5581F0076287E1A676D1B971959A143CA314D558DA5337D7
+2241B07CA926C8FC0771D56585CE189318BADE9B63A4246A01DAF7B8A58899D6
+5D5E95F4E0E9D0DE0E7DC14675DE607204E0FFC429DAACFA6BC3732B0A3AAF09
+14D5B15F9972A0D4E5483CD19DDB3D4142994B6687D1096FE57725EE8342A3FD
+62997C2DD51B51F4872C985D8C25827B40ECBA559450C7B275F6592704CA842A
+B24F2F28E0A4D1B2BED9905C9D7D527B4A09C3E1F56C0B954F6B80308BDE6E2F
+2CCA155B1E504D0CE5B00203A3DC21E281FB218340699D3D7246E16696EFBFF1
+C0D29066F8496F6E83FCC932AC2B66A12C91D27E7E7305C4B12B6F595F77664F
+763EDF055907BFA90503B5C92F8B3B1D9F234BCE872AEACA16AA1FE701A4795D
+93ABF4030B0169EF2084D46D96F011158139337D51822A3269827770ECC3B6C5
+A302C2884AFA7129DED8420B9E134EA54FAF797A324EC2310D777432FB630605
+AD3A28F2363D7B2FEA9528AB95C7B9B2DCEBDFA94D9391CC8893C9BC0B68D2D2
+7793B9F2DA30F6FA0045826999B0B8F8B103AC9F35A3174DCD3658A4C924377E
+655B9A37532B3BE2109EBA9AF8CCD5105905934C28D9F8B82D413F1F8D844D1F
+5F36F7540A97445D45D01C92CCB1C3DD1F11E3148E9FB14BB414CF383504298E
+43F21314C75676E8B8F0DE47FE006DFDB857C015EEFBEB3795B27730693EC62D
+B25EEAEF20F83E1B43C0E860024CBA717101F51049094FBAB4D0F991312106D0
+CF1C70EDBC10CAD125F46418D620849DDA9868A20DBA44126AAE63FB50CA16CC
+6F8BBEAE9F660F9141F14162C2CB22AA9F0ACA1D977733E250C492CB0F281D0D
+4104E440A2B60511BB701B6FD9B894909DE4D6399663896527DC894C0C99CD5F
+0164897CD14A4E73C9B32EA4931A0D1B629C5F78DFC0EF737DB040458982F808
+56A5E2136FF134199B00782AA6B90D303CF3BD557A5127595F54155F0394B7EF
+7B1320A078EBF18A81CF8B258345ABBC744858039176956A6A9FE480DE0197D6
+AEA79AD19158C9099DDB125F05A2D6591B9262788D04FC6C62AD3E1F15030EA4
+1B1EE0EC169C3B33FD21C55F75873D0CC4441A9ABFC267EE406E8F674636A1DC
+1926B470845050D61E3B368731C0826CBD0C9D9652D87A166C3B72750F629ECE
+42CE84FC05BED43AADEC7B2790E23983FFA6FE909AA195441DF31DE62A694AC5
+601ACB4E3FB6DF0D0672CEEBC1651885E7344B873A1CF9EF7E3712EEFAA5E329
+3FF7A2CC06427BBCFE91750070B65471F7F97AC3831F0234CB49C6E15C59C9BE
+F528991410DDBEDE9AAFAD2DCE9060C3ED864CB1AFD6A46ED385A33918D90EDD
+18476E09EA8BD621C5CEE1A171DF48BDC0E012A2038552DDE53D553DFE6B03B8
+1579FF629DA867302F75DDBB32899A26BE11B8F8575DC18D67922DEB40A3DDB4
+596879E4B817F39FCF678FCEB94B19C5AAF076D4440807A320AE1D2CAED5790E
+3B2405A0C99736B7E56CAA78CDC63A3A62C462C9BE9FBEA067AEFB9F7045B6DE
+DA819A42D2D28D9635B83F59DADB671D33A5AA6022FF8C406907A174EE9868E8
+302EE498ECF450911F8B4A06EC07B81468029A7E3CE34EF1AF35DBFD66B2E804
+26FAF5A3D3E0E41205F3584C5FEC21904297196C53A467EA1FE56E65B9D87A98
+2B8884E1105C47F9BFAA57AFDE233E09BAAF9C5A7DD05C45674A951CE1B2CDA0
+A176D473F1949221DEF2AA6E35FE72627DCD1B920B5B8CCC4E5BAAF3F97D8FFE
+F15FC0B0D07E01B3A7DAC22DA34CED526708B049889CB600E61029D9C7D7AB85
+05E5C0D1D14CEB1248D8B889892B2A5B2F7C10AF3395A0EC02F9A3765FFDF0AC
+17BF4202576D48FC88280A85495719114C0DA6D1B040C832D25C97B7C5A31D96
+E03F0E502FD0115D971936DB5A8808B9977D7107696041B997CF1C3CF3D2558B
+05AEA679512B9CE6518DD10C408B83DC1EDACA0D0EA6434119AC08611CE1E2D8
+39A7354A2A24B2317A8C1C17E8E314BB6E0DFEC26AD1A43076625C96DBAF488B
+4C76B2BA32DCDA9161B850B428D8EEA0C034E8C9FEC8BEDA74C552D78ABC253A
+86AC5C8CCBE7658AE83374D417F1FCB5836AC25507A5B2B9FCF680880F72CCFC
+43CC23A3019BBFB7E9FC6BBD00166F577BB3F1EB97BEE6368007D9A3671432F8
+F7754423350A5FCB3979D629AB52136FA3CF750E9A96A52F3E74D0DAF9249613
+21A2BF4FC21C9A8EF53AD911AFAA853340CE0E95D8096CDAFA28A1544233539B
+4D1C0AF2B635BD2FDA2AE06485A42B94EC24CD6D08AD5FE186A4B330B7A7E2CF
+7CAF7C929B2EC0AC0CF066F642B1FD77A6299F6FD50315A27A9E7F416D0A59DA
+C5740A6AA35FB37ED7E2631784AB9427C71CACFD7F1BB8A08D466E40C5FEFE67
+4E81C0B6597B886B4E81BEFEE7501BD140C5F34653AB6443210E94B52B092D65
+0C86122ECF14BE14F3D21104698412DBA2B9186BE1F3EC2CC5721DCD12057E25
+1A95D75E1D173C301566B9CF19A092DB1F90793FCB1F0F6671C871E5EDDBB6D5
+2D054B41B59D69CB2C205F7E86C30778B4C254F6606F2BA759D08E4DBD800776
+69F14DAAB8A3BEF3A808EBD917970D254E6BCCDC98FC42C8ECAE8311822A18BD
+765CF8F136485692B2B069359F11851F2AA9F9A14DB1EFBC34FCB46C0251458D
+8C9FEFEA2723AD67668854A5A85E9E1831143D60194DDB8E8059344485F3B65D
+FA047A29CC91CC45A3FDCA6677F836ABEC1C7A9029A0C7461DA9856C1D37908A
+9992810D459F0598CC390135A481DD241E59B85938545ED728D332675BDB5857
+00DC0CED734A5D295D69C3657F8F32130CC0447B8D609D0AD9E97AF80FCFD766
+9018C9D1FC42DACFE999198F9D47A870CE7B48BCF539138B398662537EDA1E9D
+2B7C7F9F75663CEA2960AB88B126A98CA16E3E8AC4F13706443D4F469F9D44F0
+002716FD449285518CD845A2E8BB824F2E03C5393E803A967955B7069AA8EF3A
+2C49A16D753E5A34D7DB3688E5B5C116208AE555A23A13A91331E79541C56F74
+9A09E3A0123A38517511B9D4CD18F5230891AF7052C29E6B9E0AB664331CFEA3
+AC7A1BDDC53E9FE118307D548CBF22DC10017A3A3B606B9760CC286B6D05887F
+357C778050E31D29D5ADACB352B2257234057B7ECC7384A0CE2097ACDB1981D2
+C9C4798FEA02362D04DBE745631DBF9DDBDD479603592BD898712A64FCB981F5
+B18423AC72E311461084CA85AF30F274D84468B319E675C8EE651A28F89D4DB9
+266E4513AE286EC25A6C5CEB8354C896C79EAE31B3D3E0D3ECB47526AFF2507F
+0AD61CFD7C07B0D2513C2DB1EED8781C233EB06E4AE484D44A04E3B3AE2BF44B
+40A6777DDB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMCSC10
+%!PS-AdobeFont-1.0: CMCSC10 003.002
+%%Title: CMCSC10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMCSC10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMCSC10 known{/CMCSC10 findfont dup/UniqueID known{dup
+/UniqueID get 5087402 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMCSC10 def
+/FontBBox {14 -250 1077 750 }readonly def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMCSC10.) readonly def
+/FullName (CMCSC10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+/ascent 750 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 97 /a put
+dup 99 /c put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 105 /i put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 115 /s put
+dup 117 /u put
+dup 120 /x put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5
+45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4
+7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7
+72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E
+BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89
+974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674
+11453BC81C443407AF41AF8A831A85A700CFC65E2181BB89566A9BDEC70EB4F2
+048A6EB631F05C014D372103E37FC3FA317EBC9973565A638403DA02E48B7D31
+CFF6C241DC5CDB470561002FF46437C06EF93BC99352DF04393C661FFFBF4BA2
+0723ABD9B3E9CA9E63BA57EFDBAE684655CBBDBA15ADAE43E1A2C98A3CF060A3
+D16AF8FE3A49B50A24C20EEED716E49AF6013D4D38CD9CC41A91C17E4D04D79D
+567E1EF49110AA9C34464E95D81A730ECEB2C9AF38FBA6B45E253288438B4CB3
+DC75B3A906D4357293BA41E59C35223A6C9CBD6FF5FC90C2D07CBB376C7320FF
+435A6251822BFCBB612CE630EDF826C37E95F541C21B93FCE127591D5E38165E
+2B58A34AAE37712BC58B63FFD70AB80F4F24612CFD2F1466BAAF3CA2BCB45148
+D0DEA0E9B8FBA4C4FF5B8B3CB02E461355051842BD1C94F41066B9B909DB83B1
+DCDCBEF7CD00A43E4C0B8191A29600CA197F0BA227FB8309BB539D2A620BAC70
+8A1AB2DFA51ADC9873B8E5582DCD3ED154E5D727D1665F99BD89883D69E6CC2F
+DB3A57AEB612171A88E22F038461DE03FC357F771675E34E90D4D19B4B36891C
+9D2333960400E97494F4FC4DBCE6A73C34A0409E433BBDC0AAAEBA7D3555066E
+1CFBB4515C8B573C9B9DD12ED5B6ECEBE35AD0DDEA9DB004FC6CB540B5117B49
+59CABE5FD74C6F5B6482B42C20B5FF0467D1DBD7CED2CC651CA57852B6FBB402
+A6764DB342889132C911CAA713A7F2FDD8A5E849345D6C81025E02F5B8B682BA
+90CC9B467FBC37362436EA6BF8EB62D784B01D5430147945BC09D1F49EE89F2E
+3E2B8E6D439248A56F82F2E03EA5C7A922F2813BE6538A3A423BEBC55B345AFB
+3B3C125306749E137C647D78028AE1FBF3E1A82C260132832A9668F454D39C41
+736717DED0A99F6B11F005F0E1D07FE84713AAB4C042FDC166AA146D7B5E9198
+E4F485BE5B135EA281FF1C1E616B5AAF02771F58C5840CB5A427FF9794F93E94
+17FD799C78AED1DC4810BCEF4C6C51D3C1504EA2C6F2B29805B7ECF97B5F637D
+FE92E168CB9029E90404CB54FB312FC7AA8A9F2F524C03E61F03B1E31D4F061E
+1677B39D5D30C9FD4673E1723F4AE3CCF38593AD6D7F61E9DF3C010E51F25085
+35D51105E1464BA146A78D7297D4D310AD91342A0BB942034A3EC0696B467367
+3E39D202D637E6B14D0EBCA6AD3CF22B07D4CA69C0FCBB6C93782B2F0DFC5AC1
+5D8A16CB5EDB671A0C1BA9D10F63CEAFCD0E06E42C730C8EF769CCFD57937245
+658F486036D37E8BDDE5670A212FB488A8753322A5B170C9662750AA958C0BBD
+8E97D8239D2A08B30416504DEEC4E506013E037C91785C674F8A6A44E23FEE6F
+CCC00CC5E4D355B0871FDB8ECD64F70EE32449BB5D6F84F8C8AA2D5B1A489BA9
+D7FF2DBAA8D0B84054E93D64D3E77850A3724824914A0F821EEC3D605DD851A7
+606936B8B9E24D6E932E16C448140FE94DD96C75AECB73850035ED9C04A1D93C
+64B21E7D4657E030483EC5C3554AEF8BE4D0FE5B9743B875340B09E01273DAE8
+F256C50A1A8F2E0417440A8BB0173F59E11523E1CEF2593A4AC5AF2167627B00
+C5EA97D125EB8A4BD4C372877ABF10F5B7B149D73787E0834BFB3084E9508DF7
+072DD71637019599252059738D4D6BC57A9358E4B14F6AF9C4B31DB8E25C29B3
+7A15F9953BD73ACDE5F0445A5DC406BB4635FAE51C1D8202AE31730E6F355317
+1DC197DB0B6177307C60E5D38F4487363EE051B2E609A52BC4D45B14B6558B6B
+5E1618748794B8340752CDBE7756C068975B559615D4CD5A97CE30BAA7B2B1A3
+2FEF2E055232B24FD8A21BECDE1B6A479A28EC80AE2CD16DB50B30B4A6CFCF06
+491C7CD5AC29FB964D4846415233947522676DEABDA0D9535F8507D33693930C
+B4E4240A02B0CE7EA288516B8A6EF908D7F8BAF9012D052C6AC96D9F8F6ADB07
+8984F3559C5E7E3022A957982155FC9CD599C74E18328D3AB46F9DD15D1C4C3F
+9B93ADB4489BA02CFCF57DE6270F3AD2F8597BE71786510EF08142F430EE5568
+4F9DDB792B7C46B6135E341DBBF062FBC50FABA80CD4A384157BAE57CBEA9781
+AA4416323265168AC097DE7E30A0D4750143A4FCE70A863A31876A8FA5327C3E
+36E89589E363AA2B1A6E8B09F5AEB8FFFD0396067173465B6503383DE517A6EA
+88C0FC08578398C2A721E5AEB29F4AC9BC990A50CD87BD35A11F9E81F68E7B85
+5E5B95A4F9A5D30379EF90D78E1E466DEF867BAEFC4F5ED2C762BFF099C1C2B3
+5E0DA1C2FB33BE1379413CDDB1EE6BB3A495331F72F2FAEB8152E8AD5FD334A8
+AAB0082A71D5574B618EA8D487B8FAF1B445F3395B1E21224F5492A0E06F5152
+7726835C900E2E52BE3B7B654183AEDEC68053DD0AF19EF6DBC10B6FC08EC7D0
+CC0E2C8FAF8C9A4C21FB7C34E074BBA4EE64226BEC8C928A784C1BEE35B72EC8
+E9295240B29DDC2539CD118BAC38DB3917D14CD33AB45FE47E827F2A2B193AFF
+53C5396C52CEA4F43F06AC2D08C74CC85D608CBA267175EC31311EE25AB48DD9
+FE811B411AE426C9FC0B6044D1EBF130231623F1566CEA4D1C06D8032FD9808A
+94479C842BC41B675CF6B90113BD681F8D43F51D5016D80EDC11D7640FB950D4
+E709A46184406ED90D0892A4CD9062938A8205697A200DBE1F38EB166EFEA0EC
+4FCB45CDAF82EA103DD6FDD03D146F3E42EDA6496064DB3F4FC1C5280C9E604B
+D5EBCA08BF2AAC90156C11EF68137DC76502EBF216F3AF3EE30DD2676D218428
+F41C655093F8B530FCA378B5769F262A6FDB4B66B83F18F050E77227E28D71F4
+5F4425CB8D51B3DAE872CD86D7804F870BC564A6DA1CA13EDB00D131CE4F6460
+7021661B99612629DCC20C85CF155EDC5111E015A77B0B82A8FC1EBB374B7EF2
+361419BA93B857D5C9944BB5B4AEDD86ABCC261542077FE09701C96370168579
+5F89D5AAA08D700E2643E88C2FB8D1D56D37AAA9744872E7C050B4CE046B47A7
+83F224FA9FD311C955EFBF173042C8FC66524135F579B1397828870D5C9DC71F
+8615FADE2A1CFAEA90F732B6C266E2F3048FC43EDA7A6B6D98E9DB793CF457B3
+F5877E7A055C92B0246FEA8C72B3B3456F93BF36E2651D32CD614C3AECC0B4BC
+F824C8363E593A6458D37408FC5B09883B280005DD24123E2D4B1B85F4113327
+EEDD9186A4AF2CD6439B46C5C168C125CA80F9EE9E68906620EE126CFBF26E15
+B269838A54224EDCFE2A373EB750D4829BFA410DE5F1541E428BB1E024AF496D
+F5F1C151F5A645C8622F2EF9088D57A2811868A8A8BFCDBFCE3ACB8463AC35B4
+8B6F44E1C1232805842F56FA468F81FF37D5D55B81CA56058558544C142EB3BE
+07CFB1F75DECB1E48C14D6AFDD455989AA6FFE8B8DC54F462B3C20E31D270BCE
+8E68E2B43A6625AC7E9792704FAAD6CE8BBE0B341DA7189EBB3E9D5375B27FD4
+12506D5BCA50AEDC6955E6C3C7BAA84BACAF7ABDF3A270C7734EC3C6EC22793B
+E67B0E288F99699D38DA8B79F2D21DD97945FBDDD132A8F0BF947950D3C0B4AA
+EB7B2C435AFE54489E1930610311D718AC610C21A644F34CB2D1959B3066F39B
+EADEAB5CFC6AF4D191D86B02402B00D1C5262707861C5308730579795EB53207
+A291A27A8B5C4DAE0A87A0C6A260026CA3CB620E1002E066A515D7990F3DEA29
+0FAC962E0B82B7A6C86B1EDC54007822BAECED673FAAEF88C8109777EB79A53F
+AF3C58546974F2F56E70E9B5CB59ACB5C27CB01895557B2D82134D7F02029B24
+3331621F38E68717F5CB68A8892D0B9C0A8ED4F8BB56E80505170D44C6856128
+2DED0254ADA4875CF56B4D97372AAE730D4C77A2940DC8C178274DF88A9EE037
+215C6FE7B9D481EE4DE809B124C0270782411ACCCF89906A8B143D0BA8B2CEDE
+E9B90465C3E57A4FD9AD2702323450256ABD09A1F8C26F08480317C08B75B720
+70A161C99715A35A94DD5C9647ED0F8A5337B774C8E54F9653AC859485A1FED5
+37B725A7E4BA58711CBCDA6054E34CBD8E9F9460179DA7DBD243D81A1531FDDE
+BF2BD425BD9DBE75EAA333B1F5793669A215549A774597E6ADA16D323FE5601A
+EDA41092730009A99BF5B5AAE281844A6BF3292D4D4EDE36B4FD8BCAEB6EB72F
+AC5D3CD53D0D621CA9EA8D254FDCB2B5161EE9E80B266563F669805A3A15271A
+0753983004A1ECC7FBADF62AFEA4DAB49A178C231759857DB910668BDB07CB3F
+7E8EC24901863088B3231EE3FA563924032C91CA9D68DB398F9BD9AC0C651EC8
+9051C9F709CD784F3FF5951DECD7E869ACC34B83AECDB011E6594347855EE7F5
+28811F744A4BD70D4E9077EA7EC19FFCF612689F12B34332857AE41F13E6D16A
+962DB9B6AAAC167B9FBDF0068EA13412F318384134B29F3F0C399F1973A3564E
+F9C3C39B5BDD4C98D81A6CB476E565860B50704BD65ABD630A5F1372F2D826F3
+3AD47C08B8AD3176A170C369EF3CEEB190134006D6135C5B8CCDBE1C11FFF1EC
+3F6D8C46E15C4F5EB9ED9F31A129594D542D40DC3815CD075A0DBB648D868AF5
+15A05C4BDB28BF23653A3AD96CF6AFC065DCCCB23D5D9A945F8CBB539DD3BFA8
+DB8F1FBF9B6F25B41EB4309995CA3D5D6ABD70CBB4A2F0C6364E5439AD1045FF
+72F6B45A30BD3A548CFAADDCC6C15D46F6D783D3E520215751DC98335A4ED512
+D7D19235CDF911CC69F3CF4365B678EBF3E87C456A4E77339C74930083445588
+462529C22A96A28C5CE87AFA0C981F26CAED5A1C8DBCDDA612624DBE0373F026
+465185A4D8C73CCD8D71EE97116F8F7D341B87FD78F9CCB9FBDA2A7799711607
+6BBA855AE9D5C505870DC85FDFAAA130A351D56AADBFBD6A7D52055E3200F8B7
+8AE9A00092B55DEA8BDE224B4BA7FD4A191CB1FFC4CB995FEE1AC2883AB69E1A
+AFFC09AB5B9AE311A030A5BA05E2213F9BBF016C8FA80689C069314D91274B20
+53FCC65C7D7B3A7504887525BFFA060304931672A078BCD7F269595686310E34
+E1ECA868899BC402D17EC36CE40D5041D7CEDA77F7764C9D98793F5334F574DF
+E93CB10A5E8ADAE95CE63D2339557091B4B4911A4987CF21B7F1DBADBC2DD605
+8EB72473C1F2EABCC44E0D0339EECB55DA74085606C3F89D57ACFBF5755A5395
+CA8D4BD47E4EE8D8B882D3AB31A1F0C62E74654C7E041E4FF2693A38A9796064
+46526B0A37E6B5BF8E48E80EDEF81E34DA8F6CC9025936A4D0E6D709D61B7B5C
+AB550397117F3F9D2F5A542A64DEA8E1178F7337124D6B56BA92F659AAD694D7
+391028731E01284BFEA635314A8DA8DF7A34EA3B6B2F8803BE6DCB423A9E8015
+55EBD90EBAE8A00298B3B6B1C02BA516AF528122C1F2B07EF69F5466C2C36643
+0D665D6561705509B7582D8301AF3C32E2F3B9433E3E04D62117C7E8A368BDE1
+0D4DAA1C415B2A6573116D2A169AFEF700A83F55D88813585E89C94C07802BA8
+3AE8F9BC3CDBFD9C2E35D062B1FD6E79E1EF104FC70B0AB09D12CA027F33F85A
+22F0ECBB4AD55FE8C616B82C46CE69A600E4F767BD7A9C5F9B37A3196B038384
+5DEF76A8884425FE598A63AEB19FA698C2AF7CAA4983CEC789268E22BA051EE0
+20A40633D22D8F707626ED30E8273EAAD1C065F0B2E1718B5AC853ABE09330C3
+B0082A71D557169BC1559B6D285A3499D41C4CCF1F74884EC3917EB9C574371E
+AFE8578DDCA459B8D22C0188A8D150437B05FB92022C95EB6FBCC954216B5FED
+CBC7C90B9A1F061376A9840FB64390A6BA99CFC8279A86A730C6DBFD14C53C4B
+7277D676BD42203677E9ABEEC8C97E13DAA626474513B06F8734DD784F2FBBB9
+B3B448B8E8221E380AB4A86D3A683B86A54129519D50DD4FE63B30954D805CED
+A9A5D9A39C58B65B08E1C19555E927C6DBF7FD07252B2B57F62B905D6B488201
+213D106A41033B26FFBAC2E616DA6ADA6D560BADF10E68872806CFD6F6E19D7B
+57CF1F7A030A7BAD374F16A977E0ECB8742D034ADAF9C247DA19C8AEA74EF6CE
+DAFD6B1DC562FD3B77E4D008BDE4D8C7FCA9895DA1AC9EAA01C32A0DA712B082
+9438E77230D38FC4153E1711417B918BA6CC03203A5FF082AF880F48518D8271
+C1121E4F1386B30A7F1BC6F10EA98443F8A65C867A109336B808BC9A8E2A75AC
+F950835AA84B56F59DA4C8A18859C3B68F6B6DE09A6675F639EA9107BDB67B0F
+54EBC564BC2D781B61C14363A54956BA78A2BB89C9F966C94EEFC29EE9F4E23E
+C0BF750144DC289F0DEE1F8A25BB52E54F656FAFEE4BD2DA57E1306BBE648051
+1D0CFD6A23A3DF082E3CF13197BF1B7FB22B2CD427BB78F455C9634DF989DC90
+7BB2AE247B1C99AB2062855B2948341B0F857ACD750B59E370A6698C6A1F5287
+72A4A9628A592E313956C242DF8277EDD2F1FDFB07CDC104275FFBF796D7518A
+DF49FF3CDEC3BDFF1D290C382F244DF18005ECDABF0C5C2C64EEC4383E2E07DC
+5C82587C071E59B46B7BEF31D268F39D9B12D534344FBA515E9DE8F166FAD1E2
+7D1558967AAAD3829D3F7EC6938D20E5379F414532976ABA844D97A5E9078901
+EAE4D0ED1F4C7EE7A2D80D891A5013D6409A38ACFA497F5A169EB7F9F4890DC4
+62FA6A89EA48267331F086992B9CA9305E16611E6AEE67DCDD588A25D37F45B1
+0DE75C802EE021E574B64B3969DE2E5061ED9364B646C38D4BBA86802CA6338A
+94E135D2256920EBFB1AA22D9E90C7D16853F0DF9F2D942748EE540E4FCE63C6
+5380D7AB4ADD6CB00FE8F7867E4862D8DB432F28331428CC350CDF7F447A65ED
+D7683ECA35A22ADD06E9FE6BAF060913AEEE7B2B8EE4798E437698CC9EB2428E
+74CE73F84D0D2292DE709D71FFF8901C3505370E6F1D4E28E6B7372492C65A88
+159371B1D60D77CEC93B272B6C5394EE1D2EF9969DB2838B8E128553879A1BA5
+2884B0A596E8FC3D1E648B7E26A4AC57DF09B9CE09B2F91D8CA618CA52AB3DBD
+D005A56A420366069B73146A6F58E88BA49671A1AB7C2070C3D42AA770285143
+40AE7D7868C0E1993506B07C086AD7D4F28CE2D15853FC5FBCBF9425D8012B9E
+DB6E1E5002517659C8DA69DCEACA94F368537668843D281FC11782F1C5F71977
+CA215349EE6F20565DE3D8D8212A40E1227A4B22965FA64A0B02C62BFDE97E6F
+C3C54FED4057EF9D258C42D7440C78C5E0CC58A40DD74ECED4152F70A93CE71A
+1B3A57C46F74A6D27BF98C97CCD31A8EA487260F224A3E40F52C65490AB4098A
+7B9EEB54A5A415C8C88568F7D9EFE74BBB785FA18AA27D9201F28BBC477A20A5
+D1307AA78EB8C7CAD409AB64B29E4115E45F5FADDCC80CA74B296C4265A40614
+37F2ACD8386AC0202D6FDB6711E8CB06442F209D781E940ADDD6D881D4F8E874
+357C533115923B90138FFE31D3577C6AAE60D768970FAAB682CD0DCA3E9A9A68
+6393E4B772691C1013ADFFC90C508D51B02D2518ADCC7E79F7DE5DF9D18B8435
+6129064DD1A3995E5A6F45D78287CC10A0EAFBF47223494C5EA934B1BC2F7C53
+686C5880303F9E3ADC8B100D441D944686E1FD811C646C6DD0224F6CF55FA87F
+D132EF50450879A25242A18683BD6D0266F8F333F3768D1952B0F32AA75106D8
+EC0AB703F287E847CB91FFB88CD9DA174B49171822BDE34621CF41EA772230A6
+3088F8D19CF2364A329162D39E166AC728B267758341630B00398D64538FCC4D
+E3E6CF103794C29AEF7F7E56970F6B1ABA87DC8D23E280EDC77556593D02DFF3
+154883CFE4EF04E07E7539A4750FA1CF1A994E99B656E728D140C83AE1F196AD
+9F049188A4184C84556C0476BE46DDA8ED86888DDA3065C5091D99EEEAC43092
+40B97AE327215024ACC0134CBE91FD761C26A48EDFF9028DA28222985FAED7B6
+A1CC891D07185666E34BEFBBF77C6C32B88FF3F1046E4EB2CD942E70746DDCDE
+002E74BA03A2B15E0529E61DCAC207A71F61C89D81B3C53C5B458EAC70ADFC54
+810310CB04E1A21FFBC5DE2429EC0989A3F2B6AE4290A005FBE736750956765D
+637B7CABF7F9A593D9FF6C322895835C0007A78771D1404671122F9CF898AB24
+1A5648EF8C40B27FD537612C4CBC6E584FBD058DBD4F0A00C63A79077826D3F1
+859589B221F7F82DBE392601B0A89142648EB40BCD943E382FC7758A10F978FF
+6DD9C3C1D284C5642C812DBF29A75A50BF63F788CBEA5883DC1544ABB49289EE
+2C99CB03C1BA72C7320904C7EC94736825A793D5629EABFCEFAB8D28B6F23858
+89A6967942A943FAB5E5B26B8567CC9606DE60329C6D890843F700FC1F60656A
+38164ED7976AD47A8E54940B9E340D61353AAD260C9273D45772AEC8E9F4F045
+9CC576D152757AF3B74DFB9B6962001EA9FF7F62C2E36F71D9B76BB99DA7631F
+774795B8CD1E08480153496DE5E08A1F4BEA681D0C1D6336A49A222B0537ABD9
+75A3A9D27D0B71B8913E9355F8E56C5FB3E14B9D5ACC4F87339FF9D9039ADEEC
+660B5CEF75E7C1772D4A3A4D0C8976A165766D9DBD0CA8132D17E5149AE716A9
+2E255277FB5294A96194C462C74AAB251A36941768EDB3EC6DC2C481393ABA6C
+8BC2F3AB0BF5A6E5619BE16DF43BB099C6CEA5044ABACC419174664232E97B29
+ED32362D219AF109E5D8CA751EB1F9F31BDD08C93AE018E5269AC327FEC67D99
+588CA80F068AEB94A7B943BAD5EC8D89C0B8D153B4345E77A5AD9B4522208A33
+DA92CDF765B44123C6EBAA06D629EB9E8D0FDD29BFD60EB582CB369474767FE4
+C0947F27DCFE0C8BD3CF5131E706E02ED136DBCE6363CB5CA637E08C3D832037
+5AAA88B746B6D915EE72D7B458C55598DA6284F362D2DBF06C51DB50A9FFFB5E
+EBFD69D8D06AB0A6DF2D03F6E14FF290B1A1531109E43892B82B29395910021F
+A6EA74B8420A14FC189741ECF67F81686BD3C5559DAF75DF9FEF3346CCC35AC5
+37A1E30C2602945974A2359EE3183A1AA568978F7732C35BE2B9224C27161748
+515E5899B0387F0640DE1D712F390A8A026FC5C5A893E98F46B418B7B32BEF07
+AD0EEA87737D929180B2BE697D0DFD46CF307E4FF76BC03492E66633F1357848
+AA5A594EB8CC5913E76602C9CF8B7428F67965D5BAAA29BD6C978EF6B22B0BEF
+4203B223443554971EFE558FD2F51D01B35D2194A1F6820293385CF12DC1ED73
+79EA6082A30796D5EB72A67C5DB42A01F18CCBFEBE2F10B091C43C2CBACD8914
+D665B340281C1EBF92249FBDAA577CB7769974B669DA0B74E822EE5DCF3A32D8
+9C6714D8C82CE9BF3F16E6336094BC55381E73A96D45B7A70AE00F9CB8348E08
+2A64E4B40B3BD0A653B423C5D3C1ECB62F5E05393FB8C9B0C44AB26F6BF796BF
+5B51601913014ED708B97731A5642351ECD0F6CA9C06832E0BCD0055E9BA51CB
+7242CD34AF0B75F3594AF9235C42B974074665C5B6C934B08E5C7F55638E7DB5
+312BC541A8000E69A92ED6C63AA6485A50DFAA1DCF9B0DDAD23C43DF22F3000C
+0CBF6F8F64F37BDF8F8DF321FD8F42C3FF774A388F9C033572B177A493814ECC
+BE19595AD285F11763857603EAE0D6AED509225CACBC49351E6BF1457BD11490
+EDA1C3DD6DE8C7036464CF80FE562CDA51ED2EB92BBC79252FA79EAFE5E6BD4F
+DC16AB83B2C902A9027BA4AE30ABADFF6D513BEA850FF35416E76FE62D8E88DC
+69F0C60921B33BA59FA3EDC8F532B47FF2A5E5680BEFCDAEA4474DFA2F8FD68F
+74B5837A22984A7534A5321B83459E436AE4C498702EA14A77D3F78DAEA47BA0
+1BE6CFAD95132683BCE0601F3EDDEFF5207FD5FF3CC9093ABD946CC7C1076DB9
+4DAF08C682269CEE980159541D92FFE484B7440E5AC58D7707BAE579605D1EB6
+42C396807AA13B3ACEDBF3A465CBD56F076FA9319E43907B6522904F92483537
+6102700CEAA52EE916B80AA4C5F8C98C9AC9557F97784F075D37A83649D632F5
+82A519507162012A671F3B4DBAC454D920606E9C87CADCAA1172A04E445A28A7
+0FA9545E5FFD15302664B5C2C4F479C8C760C2A015F5F5CB51EC6C0260154D37
+4A65B01E58B458ED0FEBBE74884C9DF7D50770153FB498E94F65475A5EA6A687
+543DEA3156D3E5CEE23923120DF4D561D2C082F1F3BFC5039A1DFC1C9C3A328E
+6F879AB979F2C177FBA357FD63F8CC21E8AF632D6B01A3AC3EA7DE91C17B8120
+42E78A1AA2E04581B1C434A8147DBE81A87C73782DAF4BD5F309280FEA22DBAF
+586AF386182364E45D7DEAFFA74E338E875B64B13CFC909B30E074D777D347ED
+3A58A82D5F6A6E913054F9FABFDD9ABD8BBF54DC3480F3A90965A0081092714B
+D77604CC7275050DBCCC800BCD8E2BA540B18CB07AF27D66F8887A571685600F
+3FF8C7A4966A8CF8CB25DE0495CD4E048999ECE6579AFA82D1644FE160E2D3F0
+EE7CE89045332B172425D7D1443E8DD9043A12042ADD7EC106CB4DAAEAB310E5
+85F93869A1C519DC0E3CF8F4C05030F0BF7054C5859A74ECE7D6FC5644C5B84A
+F3EDF0C4B2DCDD0D193599CB3CA00464A90AB55674F884001EC896726A9B374B
+3A73AECDCBE06895E87FCE6267091C6CED0E779DEC36D8CC35184E00247AB90C
+37161FFEE7CABFD7499859042093BCAE22D6B811FD16EFBC8AAE6283881C12CA
+98E0792640063169F76B18EF543AFE7951E82EDB1DB9597F2F9C959B69943379
+CC7F5BDBD1BAFF7C77AD8D504D5F17E1B7DFFC515AC237748D33FB6B9D7DD903
+2F3E9768290A90A5FC5EA516A94C1885B17676D33CE4124CED1359E473305B02
+03C28731C0FC52B18FC14360C9494FF2A86AEE929E4022ACB78C02ADD6174FD0
+D35105BB00643F6560A9CCBB3E5CE2F79F0EB9BA774D27DC476867C991598380
+F77CC0444500CF43DAB8D729B31EA5A3184F178F82622A8B711A9CA6A770971C
+521C44969E814B44D8E1927C283E6A38B78D7C258630730EA463FEEEAB263838
+2A517BA176D1C137AAE7430532FFB0FFCA8BF110DECB42B1A7A9457A9ECCABFA
+D6CC11CD925518857AAA8498CEF35377CF92FEA77C09E6AE25DB2D09F1E355BD
+7F7F5C72A76315F3C2B6BEA1AF7BA5D0E8000778A0FB2C60FF677ADBA9156A11
+A5B0B7AE92DB368571C040FD7A29C3DF384CCC29A0E9F40FA385630D23AC1E97
+C15C06848761CC7D19D208BC115A6A2933056BCEB3717CE2488E86D0B0D6D276
+22B2FF1E77FA719372BE62A5B6E10D3DFCA57DE70AE16C57718B86C58B6A7F3D
+C6DD45D7559F9A0ED8889E707FE7622997F2D573F7688621245E0FB3D34A08C6
+40B72F4BDA0394CBF90735B9E6B3928AD56F50FEF9A5DA8B195008164EC03424
+7F5317FB8157C33F6903FD6D4B4728F82F1B02046DA16F4285DF088E08A136FD
+1366494E3F5AEBED4B48B3B9072BC811A700940FF4B2A51C0434ABF225B37BBF
+E4AB11F394332D66393420D4B843CAB6AAD9C32418CFE6A2A1260BF430E61176
+4B1762E3C9F1727BA47AAE4C7589E7099A56F5E1CB6BD64C0C8D026ED60EAFBC
+BAD1476E98F5F12ED94BDB1E4B0D8FE9E36CF40DA6F5B2E1BC41EF5F7CB49825
+EA5058FF7C49C5FA11F9F9F575AB4D8237FFC2573F94B695CBE9BC44A1BB26DD
+C6E55627BA16E5197CADA519CC7302DBE77F1FE4CF68C558D8F6E264
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMMI10
+%!PS-AdobeFont-1.0: CMMI10 003.002
+%%Title: CMMI10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMMI10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMMI10 known{/CMMI10 findfont dup/UniqueID known{dup
+/UniqueID get 5087385 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMMI10 def
+/FontBBox {-32 -250 1048 750 }readonly def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMMI10.) readonly def
+/FullName (CMMI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+/ascent 750 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 58 /period put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5
+45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4
+7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7
+72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E
+BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89
+974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674
+11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBC7878DFBD546AC2
+1EF6CC527FEEA044B7C8E686367E920F575AD585387358FFF41BCB212922791C
+7B0BD3BED7C6D8F3D9D52D0F181CD4D164E75851D04F64309D810A0DEA1E257B
+0D7633CEFE93FEF9D2FB7901453A46F8ACA007358D904E0189AE7B7221545085
+EDD3D5A3CEACD6023861F13C8A345A68115425E94B8FDCCEC1255454EC3E7A37
+404F6C00A3BCCF851B929D4FE66B6D8FD1C0C80130541609759F18EF07BCD133
+78CBC4A0D8A796A2574260C6A952CA73D9EB5C28356F5C90D1A59DC788762BFF
+A1B6F0614958D09751C0DB2309406F6B4489125B31C5DD365B2F140CB5E42CEE
+88BE11C7176E6BBC90D24E40956279FBDC9D89A6C4A1F4D27EC57F496602FBC4
+C854143903A53EF1188D117C49F8B6F2498B4698C25F2C5E8D8BD833206F88FC
+BD5B495EB993A26B6055BD0BBA2B3DDFD462C39E022D4A1760C845EA448DED88
+98C44BAAB85CD0423E00154C4741240EB3A2290B67144A4C80C88BE3D59AD760
+E553DAC4E8BA00B06398B1D0DFE96FB89449D4AE18CE8B27AFE75D2B84EFDB44
+143FD887F8FB364D000651912E40B0BAEDDA5AD57A3BC0E411E1AD908C77DCE3
+981985F98E258A9BB3A1B845FC4A21BCC54559E51BC0E6C22F0C38540F8C9490
+88A0E23EA504FA79F8960CC9D58611C519D3ACDC63FB2FBCAE6674357D7F2285
+4BCC9F54D3DA421D744D3A341DA3B494BB526C0734E1A8FC71501745399F7683
+FD17EC3044419A88C3979FD2ABA5B0130907B145A8462AAF0A9B511D2C8A7C7F
+347FF6AC057E6512902BFD2918E2CD31DE615F5D643764E900B60287670AE18F
+FDE15545D8BC69591A8CBBB275AFFC9B14BD68DF0AAB32268FB84844D4DBC7BB
+C591C1AC5102C50A9C7BAAA848DA88B0519F0F5F0813BF055CF0E3C86F633A04
+B779D2E8E656DB1E09A66A85FE21CA8BA5523F472A229E83F2C4E91ABA46C733
+F3C7B5775B06C97782BC225C46385BEBDC61572458EFC5CF4190AB7A9C1C92DA
+29F84BAACF552089195966E3AD9E57CC914D20B6962BE80429A16D4DF1ECAA66
+36C4343FADF0B2B48F12E2EB8443C4AA29D00949255F3968617F98B8ABD4CC12
+048B838EE243A21AC808BD295195E4AE9027005F52258BFCA915C8D9AED9A2C0
+80814F79CF943FBE3594C530A22A92E11BE80FCEC1684C4F56712D5846B0749C
+9B54A979B315222F209DEE72583B03093EC38F7C5B9F9BCB21DBE8EDDAE9BE8B
+75ACE6B12A31083AC8348EC84D1D29D2297A266284B7E9734E207DAF59A25F4E
+4AA38509E993C5394FED76E6A2F25462685C4C86C6E8CFC9863338EC1428BDFC
+74616BB1BC8948B0ED4C87C15B4405F3A7796F9DB3798FFFE8BD0A94E834817B
+D5E9812E308D0CC920470A6F2CD088FCB80462BF7CB3F039A7DF3DAF5B2B5355
+E083A385CD2EAF0FC181E40E96DD7E9AB9EF5C7E6866A13B8A54718E950FE097
+EF0951A357114F18CE9933D28B3A77AA71E3CE884661F13284BCED5D5FD1A86D
+543E588FF473DC2CF9A4DC312500135F29C2D0174B32018C8DBD40EF9A232883
+710A1F2AB2CD11312300ACDF789A9B7B93D2035D81D1C84984D92D78A53A00C6
+EDA94B24BBAC1AD17774A4E07E6F74ABD90415965616AD540C8ECD8C3A44EE4F
+7F4F6BB6238C5062D63FA59B7BF08BE93FAEA70A2AB08FBEAAF7DBF56B95FD93
+03CA406543BA6C9527D0DF01F5108D31A51778A5EB1C93F27B72B46146A353A2
+01CACBC829603B9989A87CF64528682CCBA0562A8165B185C58A5C6BB72F5E89
+500ACCAAB8ECEFBB2640E99EAEEC4EA979AA793D013D61D8ACF8784FF8D9398F
+F6A252A709324FB39509F0B3A4E725E82F53543383C6765BE556CC897C758208
+AA3AD37B0406E4A79F8F0A6C1983FC73E71CD858C0DB66ED66D5D992978614EE
+1EA91EBE191E082EBA1FC040AF19A2202575C2EBEB8058833E3520FA03D2F915
+85C1ED337E457B9FEEB0C6EF2735EFDA6E0D05FA641BCF698AC6B97751E8306C
+4DF00A39B8581FF53DB8F8525FDB196D85950906CCB59B8EF171349AA3B567B1
+6A00819947A995FB383C3C1709C9A2C113B2E40BB832B7D4A0FBA0B16A2C455F
+55809CC425C403E9668DC66BE45B71A81C332FD4DB279D22A2959962304A8F18
+085893DAC61317D24A8F198FDAB95F3B86F0AFD35047B868A9A17037A2829A02
+BAB042F75F349E197A7EED41984C2859754CAFD0251439921C248B463B516951
+2E1322C80D73F9CBCAA63A585450275AC2492E4D3FB78E800F788254DB5E610D
+CF788DF5C70FF99892BCDF16133E34B24B77C8F097F546B87C603DDB8998B66E
+BACB68BA27462AF54AA405682EC96D701F0D474DECD5F95CA2102DF639EB169E
+D518162C2BAE45FF698B6DE15FC6E7DE48C336C40A670FD26952A6BAB09115E1
+991F0073419F2CC2A1C08BE91096936AA0C37E4ED3CCCEE235476074B8FF1125
+6BDE3701F85532D8BB64CCC927CC335281C95EA689706F0AC717DC2CF680C754
+E5EFD7FA4BB8880B2B727A964C876D4A223069D4E6001771F0E23EAD2A4BBC80
+E76675297B2EF05F52BF4E71B3EE2BE3048CF088C79540113C66AE98B2FD3CB1
+B0741A215FD070882C52765009D7D711DAA2508F19AE7DDA15229A856AC49BC3
+4DDF40814FF96500E4B9B02D412E94623C5FDCC76C0FB8E42DF56A904FE49D65
+1DA7C53901B2EA71AB658A464D3ABDE27D9DB8D9E0B48F64E61A2495AD5D8DAB
+B5E72424AD017DF37964AF911BD7FA21A5EB4775DC8E95EF0C0EB856B00D89D7
+8172A1DE8530767D317B8256103E53CFB877E10686A04F5A08F8DC58D843DEBA
+FD5F40597588663D103689F6EB3EB14D06E18C8078F2538B43E712DF491FC5C6
+AF639256C8C6134B64D560D8476DEA6329D995E46CC4BC78841C59E73648B47E
+BFA7DE0846422F738454AE77E822A083405289247BD7C478BE4974F742CD6051
+E99FBB1D1B3FBABFEE855174734EE45E87D0AADF32B1283B911162A9955847FD
+38944D70584FAA6B1A7191C5C134B73F98EB632B69E2F0C0F94156787C34C8A3
+7622A029D58F9626B74F8A8A1F3803E0BC20E0EADEB1E99B70F1BD9F980FB751
+2A842843DE42EB142A84D5D3138629AE9EAF6F3479C423E8829C8816FA6EFA27
+DCE5580E65AA9854B1C64163DC318420CD993C15BFD76A8BA1182860A6B03D6D
+22B8CF43CFE6C8AB27C64842E239CAE707D3086BADDE1D7C94E3BC96319470D6
+8D26915C575CFDD03271D6BB9DE86A0EB6EEA6E768B224A626C62A9AB48A6EDB
+44F70BB5AF991CDF9736D65933E81CC57A78F623F33EC9AF535F2F25FA4EEC90
+D50DB7E87F31E971A75A33A301CA6013EEC5A4E179D695B33DADF2C98364434A
+42926776000B610E17524162253F6FA638D6581C18F99EA0BD1D2E24D2424ADF
+C05010D08192485153DD03930C7BF45237593E484F9851E6D464FA10FECA5D9E
+0C8CCC97DE029030900CDBB491C5CF226DBF903CFE7735D939C3FDF3A20B70CE
+66579B28B99313FEE914E295388C7BC8E055A2E54EA3A8206D3C8F4F7C0BA5E6
+E519419FD8CE215F7B8E9BEC604A9E3FE272A0328A24E31997C8A91E0946BCF1
+6943A97CBED2AB9FC636B49828BBB8B89E0BBC2653796431224895ABA5DAC41E
+1854BD9764E86147FD7624F736F40DE3B7582EDDFD15C2BDE3F22B5A54D7DF10
+B87A1301CE85CFC061689A890A321412A13314AE96DCD3EDA75035FDD8F4AB9B
+897A2C68263A68457032C469987970648BA2D88B1C5375DFEAA35A917B8A952E
+EE670427942AEDB3CB599C5746180E392837D371E15D860620ABDB6AA7772C40
+A5E346661673ACA530BE3D8E3FFB895E5DA3DC23B1B43C080C77F7E47847F0F3
+F3AA5CA9E4BF75FC5EBD18D19F21A7DAA3B11CABC6E4070A15F7DBC8B05EB6AA
+A02EF1B078EB66D61D6AFE41DA9B36FE7EC9EF94D1EA26282A9871E2CACB3126
+2AD49C2D9B50A6E47D8F2CCAD50992D1B430979A45FD9E76182A19964BB2A1F6
+51779A2B258DC1DF4C2F3074621286831F3848AC152DDD2BA561E6586ADA88D3
+598A2CE2CD048F027CE0008B828BD915887D7785341E8305DF2346ADB76BE99F
+87B02173BDC334E9221C8DF54114A6B24C1C5340299512FA6C8C51AB4C8778CE
+178CEF531C6D1B5FF0A1BE8EFF767F959BD4C345C52699A29A17B2A230842BF6
+4B011217D6D24EDAC3F6D53482786F1CA33169B90ECD499407D37CE9B70DDF78
+7B7547B32952535BA9ACD1E244447AE3FCED3AF28717083CF9590A09780984D6
+AF0743C82AE4FB3E2BB2856A4153A3967A023FFC35382D6C22D84A924900B6A6
+3DDD400E6D2418DA6C27F2FA34C075C902B89EBAE658B3C9A18EEE449DA5A379
+337DE95CB7AB3F0970CF1A5D8FAD8090E495570FDFB2FBBA79244780D8035547
+C5A55BB21A2270F724BF5D442CDC5BB9F09BE0CAE59B1C2270F0BDACE698F2C5
+DE8F66BFB9634904B161F5BA2B1950048300D69BABD312D58D89C4ED527AF7BA
+7DA2478EDC2CDEE3473DD8A8ED9D891CD1FC21F23013228BB3281B71FCE959BD
+6F8E9059D682A7FCC5265A0620992D4FA8D78377EB34CE3ECA070EE3707239BC
+98907DB0120CE42ABA32CF97127E28382BDDFD685674279F588D4F951216C355
+821361790F64C2CC720DE97E8ECB57326C43EE47367628E05769E106868B54F4
+C33C9951908DF6FC4F5ED2C7787BD8FA591BBB3E9C6C1DA94CC5E38D9B20C886
+7D237572FF46DD896A4D6163408EA6CEFAC398EE041EAE29D577E75326CA17A6
+B072D47A7B13EC441CE6DAA042ECD02134CBFA6809A435050413817193DAEB16
+A5882C8AEA44BCF36E74E9ECCDFE7E19FF5A5DD7A94E5AB4F8702C3DA7F42325
+23C808670A0490F5B373DADE40814FF9650241D3D69C91FBC5ECE728F827D9BF
+C928602E05477903449E079164CA39859C4BCA60C579F490AA455F82B5050BB3
+969AFB478E0D4A257B3356EA3CD62051FCE6C6B1929CFF85BFDF166BEF658E10
+3A55E007F38EBBB248B3F0B8ED1925106B499B762E45113AE1AC9DE09644C84B
+9C08034B297314EE69BC32DB6E7D7FB9913CE5AC17E7335979E9DCCE2BAB3725
+1976155551F9706A576FE0E3ADCCF72C87683291528ECB749CB0ED291966E239
+B5E3630676BD409E08F85BC1AEC9A2D4135376284A96EA24431243BD6FE8B966
+95F11A4BB53F392E0AEFEA623064FF8A7002367B0A515635CB2D2DDFB9B4A8D7
+FE721754E81BBA548848A235B91AD4E4F7DB19CCE2F61D277FC00AB956EB93BE
+44AB4970CA56BF59506C94ED160FB1E25D3DF2988A532BDB787BFB8539D22986
+FDC378AC31444E63C4727FEE121A43751043849E6DCAC5B59D0FC703AAFBBFD4
+E8B7C268F21615AD02CE9DABEFA27B5FE6A6441B619539CAB1F810F1263447AA
+633F5DAF483752EF1A0421740E3A811D2D2898CBF53E7F686C9223FD7235F02D
+6F90D2D48CC20AB87778DE3C6FB335E0F0EC20B5DC5B65223FE117526DE2C72F
+FE839DF93CB2A7D66CD900CB325F891E311BEC932F703FB4FEFA29DB8B9C88DD
+375EC71B3D58C7BC59ADA91971A3BDA1ADEA629CE6CC92BD542CDDFAA7706FB2
+6CDDE2DF07E56D6741916AE8E8744339816F3E6C38062747AA9FDA2A2678A6B7
+EFEA870AA3A4D71B25EE3013EAB1DBA34401B867C7A41AE51E0421D41D3BB83C
+E120C8FEABA6E5DEC53A689C21426D4BBCB68CB37568761C360E6D4E3596FB7D
+F4DEC7918E58C0293D12D6DDA7E9DCDAAD7C939F55CD1BC4A228B31E9A904156
+DA6B40B08E6ACE674618B768DD681C772A3E55FE096CF949CF3B0460ABDCD891
+D17B37B355B29AB5137899C036F31DA026244FA25FB798FBE5105BDA29F46538
+D3D3AC1001A7BCECE64DE94FFE6C354166A0F97256137BDFA07F6E22A3D1D2F4
+9588DBAE95E895BC5E64DDCBBAA8D0A22C229B42CB717FC711E7E9DF793DF80B
+9F14754585A3C7E17F37B32924B9F9870DA8635E3E18BD1DCD81EDF01834D9C6
+B33F23C956C2FCBFA47D84422F583459D827D1E120B97694D12F1F54D02379C0
+D288F7104F3FFCF4F76E3494F4ACBD1BE3A15543CC680924C78A473F8E311ADF
+8FE00A04C6C393DE61AD3EDA5BC031E2353076A2489391B52632387CA28A7B93
+FBB065A6EF3658AE80B1ADA47E9B2539E73A71FA75645F85ED8ECC257FB4CF26
+B6C912DE9D0F9899E70BECCB934AD32CF49A093371A9F73DE6255EBC39DE1E7F
+00D0CBDABD4D0383977E694890E71FBE5C376BE5F3A80C28987417504F515C50
+909F3D31178BB9B1D085BE514F71B910A9085BD6122DDC72A150BFE266920E49
+5661BCB4BAB51D6DEFE32B616963DBD989FCDD1637B294CE4E288655FBEFA1BF
+7F25BBF8CF17C2D5FD161A7C2CC9CC7490D9BF15A1D35B3BFA43ADE256E88BDA
+BD490D92907C57BAC408A575EC84D6AEE070148C7C9A91C03B09FDBD792E8FF0
+C0B886AAD2EDD86541E5E579359D40E3AC312ACD3D8FD49F71BD533DDF8859B1
+BAF17F1884E331DD07CEEF93B71D492AEBAADF7A263450A7A72210CE630A0D37
+BF024BDC09ACC882816B8C22C62AE38A3A8D0F6EBC2B1B2C0B8161A8B076DD5D
+4B779C0788546BB4CF57332230D237856B00D79C28A7C01D11F44B7304F69075
+94B97A745DA43D1BE561372CE611C345A843834E46AD9DDB16CABCD3FA33D6F1
+F6B5C0497F5EE5400B305CDC16A7EC286AA4D45D0EEBB9DA06AC9C5294D68EC9
+E4DC3CA2B92CE8FC0526184A86EDC7AB34D67E60AC12D9CA8FD300235EC968BA
+92C6FBDA47572BC5600F25249F60AD287CBDAE980E747FCBE7EE5CD323E733F0
+63553B494D3DDEB9CC1480B5C3BB79A28E419AA65B18CB297AB383419E890E2A
+CE6F98C9900CCB4675280A10CF060B8D220DDA1BE55DFA65715EABCC1AFAA271
+B1F8732341613E17B231231A0D24D4D7FC198AE04D89A99C4536217769C6FBD9
+5EE24A6302F97438F7C0E311C878F674B4477A5ADA3952CDE4055AC408B8174E
+86F8FB797646DFFFE0ECA25D1BAB9A9F71F3926D3D85AA63E7A8C931D71E79E0
+AF1EAC26FADE468F4FF7F3861D14C10E3BE1F9EAFD6D3A544E8108D5DAB5B180
+3950C74818BC8AF4758A108F462EF1826647A49667F5E482038C54716856D9BC
+35F29922846D2148F92F943E951D7438C73D6A60459A8003174036C64E1629CD
+155D47FD04B03C023AD67CD5A70C98AB556EEAB8C48169706E5B352F6505D580
+AC945171BFE62E81F8F500438AC3B64D857BA5BC54C2C4BBB237F8FA51296255
+E66A92A61FE13FDE781D393557EB72CEBAD86511035F775FAC39A0479CCD400F
+226709118F887F47CC2ECC8F79816D4A945B2845F50AFD62D8C9A9BBF4739496
+9E644BC9F7B04803B7EE75A09EAE94365F6F374B4FCEB0B506C76297564B9B6B
+8B812BC3A33929AA94692572B010E6210AEAA312BDFC88BF302244AB9D587A9B
+919823FD01DE12438D960944D1977800FEB49E638C32E5B188B1CA033E0C37EE
+A142F746367888AA119535F0CCAF7EAA461B790EB089D2D6962E28A398439BB7
+9C9943654D7A2D765B46BC0DD1F915327F369162E1BA1BA83110B93F442905E0
+523BFF5E279508A98568CD5CFD18FABBE9D17265A9081E7BF64155A2CE3C0DF7
+88D00671AD65654709589BAD7EA65BBA811387ABA5CA0BC3F66D3D48597A0D1D
+2C268375DF47CCF62166262AE4840AB03BF49BE67A05EF66328EC729F03CA5FF
+AD3937FC053E223303565DC771ACF32E63DFB96D5030E787961D72D02C195C66
+B48E9AF0309DC169CFE8D16E2818DA94693A18F027DEA0D916672480464F7E22
+CA6E431FE38D3FC019BDD229E064B72C545C61C6EA55984565CCA88ACB01F744
+3B4593CC8944C70F30925FB48A16342CC26D444F54CA15E5A624C4A2DAA2AEF8
+404145BBA339F2A2D6FC2F3ECE54387761CA1213C8D56FF96E37C6147CA44B84
+262EA87E7CC10D931E6B5B80D7F09813498497AA84ACB4AC69BC6C8481ED2953
+084F560D7B1CF90555E69BD2AF7C5D944E8E3506165014652462BE1BC81CA341
+E1B0725159D36DA0FFF3577D1DEBC5D91AE683FB0384
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMMI12
+%!PS-AdobeFont-1.0: CMMI12 003.002
+%%Title: CMMI12
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMMI12.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMMI12 known{/CMMI12 findfont dup/UniqueID known{dup
+/UniqueID get 5087386 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMMI12 def
+/FontBBox {-31 -250 1026 750 }readonly def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMMI12.) readonly def
+/FullName (CMMI12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+/ascent 750 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 58 /period put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5
+45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4
+7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7
+72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E
+BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89
+974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674
+11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBFE3573BF464E2BE
+882A715BE109B49A15C32F62CF5C10257E5EA12C24F72137EB63297C28625AC3
+2274038691582D6D75FE8F895A0813982793297E49CC9B54053BA2ABD429156A
+7FFCD7B19DAA44E2107720921B74185AE507AC33141819511A6AC20BC20FB541
+0B5AAEC5743673E9E39C1976D5E6EB4E4D8E2B31BEA302E5AF1B2FBCEC6D9E69
+987970648B9276232093695D55A806D87648B1749CB537E78BB08AA83A5001F7
+609CD1D17FFA1043EB3807AF0B596AF38C91A9675E2A53196FEF45849C95F7DC
+182A5EC0EC4435A8A4B6E1CDBF9A5AF457564EA72BF85228EB6FD244F2511F5A
+CA9B71A65D53CC06EF5F7EC3A85106139A4D312378BC22183C09A229577B793A
+1B7422611C03E84BF809F46C62CE52D3AE29CE01C32B202ACDAA5B72733EB0AE
+C31D7EF7BA88D2D14F85313F7A8B9B7A5B124B03AB923744D336C969E5CE304D
+3AD977A46664479EDEFB69F113024E761C05FA48A54072DF9E12C2F352ACB3E6
+D04F6EEFFDE209E7FA3DA22E5B1D1409461F4286B7F4F8251B44E5CB7805762E
+E129FF4A06A7458F3191926B1CAF70E32C6571AD2DC07C34FF62840896F4D200
+761B1A7FA356526D1E3AB4C542AF13623BAEB9F61B1BEEF79A9205B1FEFDAE24
+8799D516A9ACC30BC0139C63C9A0523E9D5439213B67D490C96F902958779B8F
+68BD8E9FDDCE8A3A2E35877DB6C94B7612382ED8F218EB1157D2ADD090A2448D
+10B99FBC9211C5629ED1C61C74FE93041E5AA03EA4AC3FFDA00C2B6E719CFAA4
+262FE17F66804A6B54D3669836EE4367D2A2991580C5564463C973CA0DA38AC6
+922716E13B4A807B50304B8826CEFEAA47C305FC07EB2AF25FA7945797237B16
+56CDE17AB0834F5C97E0CC5741B061C6FF3A8DD1A79B9A173B66A6A750538E26
+32FBC92E75BA15CFFE22A7302F47908547007402569158F62C29BA2956534FEA
+7DACF1E507AC309DAE8C325F2A6023D2FBD81EF42146BFCE6A16A6310A650460
+7B07BB7647C8760FADDF0DBBCD3DA6CC4645D1732DB3A22D8B76E1D2D48E4D4A
+46F4BEB80CE65F3517283A1AE08391FD1C10ED452133706BC6725AABC80107FD
+754A8BA47B0281D479F052CE26A723EFFACB79B213041A536542AB334769A2BF
+88505D82C498ABDD5A73EB539530F47CAC52825D16A969C8BB56D4A7F2830B8F
+CB63B92B576E7BD922A4B25E634751F8A3B7C4EBAFCB373EDC8B8281B1D1371A
+7844E9AD990CFF09F0D7ED73A5CF873D2D5C9E8A9923CFA31E1A4B4CCCC40760
+8B3AC8FC3C88BC08BD7407725281BB879A1A822D94997826418F1B89D303F2C0
+BE7A0102E6F529630CBF1BC5BF3E4578C164A3DDE45E62A957EF3FB7F0FBBA6B
+CA1E79A1ED195B6A11CFB345B663C5E72FA55D80476F604F6C4257B51686AE25
+8F7D159FE605DDA0AC74BAA5034F29FFFD403070013C6E2D8EF6A0990D91173B
+D5A3AEB98B64E412991505C3CB7C2CDE13C091FEB3DFBCAF30C4C19511102300
+135BD5D444BB55692013F52056908DFAB2ABFACE81A58423ACEC59344CEF7D4A
+C5A3EFFFFF70759BC3E593D878281225060B97D1BEE6B26EED90571FEAFA1812
+1115C0EEC892F5DE6FDD68321A0B3F10A2D771B79BD85476AF6018472A499A86
+07D64CFF4550866AFE590C471C80EB12CB3A989A60BC7BED39097C12D9286E39
+14C7952C4C64820B4DE44A1827B7B0B535244E93FDB80036D6332F90F95B472D
+7031E7E3819E881BD0313CFA112EB3AAE943C99C47635CCA7E34DC0306C04E5D
+2E9F60FF037EB11602BE74E8E6B711392E866E3E55D988F7C856417A2B9C186D
+639819B4786D039B77F8578EF63C088FF28BD08D8353031445C8498A8F445BC3
+D08923D32AC04BF3CAFEFCCC1E77EA894F4E846F47EF62D6841B8D8576FEAE8F
+90044626869D04D61D64D56E8C51AF8C18D6CC3FEF3B6C4F7D56FE3260354948
+10104F69B117FB8269292579A7D52FED688C663B643D8D99F13956612271073E
+1A337AED059B7A93819A28CDF01569CBEB51069D22ADAE25C47355560F402B2E
+8C9900DA82B79C64497C8494F42FABE5AC41791C2010D98FB7E593C744F250DC
+D837DB0EAA4F75D0016970F3AE8359878A08CF9A697A06C5EA945819151265B9
+1A12122B98F79185DF852257BB4798E7DC03712EA6ED34F6E6AE1476788DBC33
+9229FADB8D581BE1A63F596698DBD6DB98A092F67197A4FD4A50B648F2691875
+EE2495D6BB310078F516785A0CEC7EB6E8305FDBAEB1D15690409FE32DD9CFAE
+DBD3866FB63EBCAAB73E3E4BE5D7F3AA44793938AAF3F8341683F0790F1D46A3
+60CE083F9BEDDA22E0639A92393960F86602216FA51E2754BC2F4CD0BDECE3D8
+FFAB7E0E49613DD4956C9A10AEA798BDA1F756C755BEC12147ADECAB0FB73B7D
+203A11D84DD2AB5AA98FD38C1C2573570FD49A4924A94A106D2A7D850E793608
+FB135853E8C4204441CDBE697FD0CB330B1C3596F32D2BCBF263237EAB362D09
+DA6F531B40384DC91F30674760CA7B64BA1968F6A7FC9EBEF431A1AFC5E76D7F
+2D44DCB7F61C7F6B16196B3E8B47343F572DBA8B8B21B43E35BB6B2DD5C7982D
+244FD4304D254D6CCB5E8CF70E77F50812F41A988EEB3B26BF0F6F69BBA18077
+31134B5A5823D10FEF6201D045AEE7A24E0F25376E9FC66340C56C05F6CD810B
+724D85CC4BB8D789834A447CBBA159565D08BA5793D8599035BB5063271518E8
+F6C50E7DCE71B1D186270DDC860C6DC0CD506010EB5B1FDF6BE47A9A18CC15D7
+D657E58BED9EECAD5CE5D49F63139A39BC52C6584BB2C3264D51BD584B40F8EA
+AFCD8B83F548594386EB2B05CE803105E84931DC6E7A1398073D48E130E0D907
+CD0F1ECC3254EDF5D4DDBF44415DC9BA66C673820CDB0FDF033D59BE2B5EFCEF
+01FF9D33EDC88F8D522E07F1689D024DBCD09A16A63519E1764C8630FF36058D
+CFC07027E0ECDA01E0E85B166C613B22F587B4D355EB018BA93E92A36007B4DA
+287FF5A91F7D8A0EDF5554ACCF45AC8066E88865C5692E63EB99CAC81367B605
+8E6C19EB98EBFE0D2D161B447B9A70CDD1122C7B78A413369016E6D8481E2AE9
+9AA97B5DD0ACC9B0820F7742CEB2F46F89F3E2092621969A88DC0156B4F941A1
+6BF1546D4B136657C47B082A8A35FE96016BAF3D9679B8C32EDDD6AE6DF3BFB5
+7854074FA019707FC22BFA82299E72ADF9A980AE29A8E2434277E58B01F6B03C
+192E1E25DADD49F6E3F69799AE62B56E00B60A031BF8721DB8B2CB6D4A4C15CA
+AB1FDE010AB7DC0DDED977389B101B8E53A949222FAA126656E02817DD32B0D4
+A49516CEC2B97EA7C78FD66229B044EB92F502384BCC6CCDFFF995EABE3BB7A9
+50D5D1AED861E7D3BA8D333026C673C5762712E763E59261426044583D789C67
+A606B96F97663F92BF104CE02FBFDFC521EC0D6670B7D4F85A229F51426DE912
+3B729C4A535FB7C88D0A5E78074751B58885DD6BDD2DD9E9C83F105E8CF63DDF
+CA7DB39D0319CA7CC2E73F42747F007574DE25AE1538B4D493D22D0D5F0F80C6
+5F6FA3937C8391DE2F0116F81DB2DB0EF751EC838A7F85F163A6F48804E84B96
+8D715EF25B7E2A5CAECC558D80F421052A1D698F3B8452AC27E30A4E6226E3CE
+084C8A83ADA0818A110923CF7AC7AD4CB92AE4ABBE0A9EC1FF935FD02774C1F7
+92A278E513012AD17722A23C55EF82E18F8847B5CCE47F4FE3EC508BA563F7B2
+AE56C94285A18DED4D432FB0CEFC05A20BC17DDF9FF919C724810A8ED7358A27
+97EC93C1A13C443A91947FE1F6F528EA7B628917FA7E554A1D7B31ED46C5ABCF
+92BA57961C8876DB4041305EBB029B03D8351D5E2819FF87E97ED214D8F1CEF5
+7F7668DDE223721C0B810F4A4AC81CA4EAC86EAE546E1B15D91E626FB9A31824
+5BFF17C4E79FD56ADBF6DBF01BAF6453A81EBDCB38A5FC0FD0FF0646B3B0D199
+13E2E59A1B5CAB6DE5329BE389BA0E2A2AB55CA40B711ED746C24F1E48892E76
+6DACF7DA163CDC90CF076763008E7A899870CDED5A80758E6177BE6B93B07EB1
+5800A3BF7B9AAC3FA825CE594EF5B7546B181375FA8F37608DF17856D2F8EBD5
+6030A9E6F6BEAF224AD2AEF76D03B023E2FCB922CB8E3C6816AABB61FE6E4F83
+F21B4935102C860ECA03DBEFCA461F0E5B93E5A8D18440BCF7D1D6252A24CB6E
+A64FDAC8B67C4888519AA368D9C4A8C08C7155DF5BACD75C5196C571C3C456C4
+7CE8D90215FA6EE8CDD72C48740F7F5930EC3632DB63A9C8D2DA125088C0F05A
+9FC83D16B7F53163F4EB6FF372C6C3115F1E68EB35967D11126EDEDF0BF80817
+E68A698183B3EB0A207DB43786E1B9D289359D75AD5E465328CAA90E712C2962
+AE2A466173F2FF30EB535A6054BB0B875DC8552C16B49DF17CF84D98D35497BD
+F55E273FCBB0C735899529A69990E09149FBD2DDE64B7FA8D50AE83925DF03C8
+0B63EA158FBABB12A028803DA4B9DD6C48C0FEC469C4E730729F4BB420D5B003
+1918B4AE9CF35CFD31E8E62A44C0484E3D00143BF1D330235E821E5CFEAB4D31
+7CB4604DB1F310457FCF9075A3527279644D908DE847CCD00B6F50DBDEF91D3E
+38238CAF550FDCABA2C3A46237218DCC5A09AFAF69997E1EBDA7EFE6FC99ECC8
+5D4AFD5EE35FE2346BE79B499EC8EC436868154A947D13BC02C780EBA4B9E64F
+3026F1BF5DC1F8D64FEA1281EA40B4BC355638A3A59BD9055BCBB232FA45EA0B
+B405131B64F105814019BC55466EE78E9E9ABB62DB30EA452F7EFD7196C76A85
+15B2CFCD89922CADC0F392B0C54A231F3999AEFB53C24EB0C63B0C8A1A1ABB6B
+AAB2F93E5ECC7AB90EADA320E918106BAAFC1F8C425C617639984629018BA674
+6FF4F338AC43E23BC3740542911C058D43A49A11CB3A0CC8E3088BB5BA6048D6
+CC2AD250DE956BFBE83BB24C945C20D9C22E7105983F284EF478F9B68BFB0322
+EEB7D62802CBAAEFF1C2332159DCC7243EA40CE15C734EA905E04C476B178B82
+A08ABCB0B86A7330C75E62EE7844C9E22DDB013ADDF20AFE08122EE1B930A81D
+806A0F8CC584CB7FF5F56F9B35E5FF78FD93E7E4A40C64537464EAA275FE88F4
+461FC6A467C8A69B9A9FBC10D44AC1B753D313A8E7D97F5FAEB60F82855658D1
+4DCEE043C8FCDFD8A29DD091F3BA55874A458B2B8989F35055C72FC411382361
+9AADC717E602B48D7C9521D3971A6F7EB19D539445DDE9EFBC5B58FA9E5E426C
+172C45CDA24985FC4632287FC3B15849DEB56F5A061993AB10A6BC59868534E6
+69888175053108B77E4978D971B4EC57224C0F93EEA4C15AE92254140A94704E
+ED5666FC06C5341F643F779CC88A9E81891565C63B6F7F6286E664F4E0A48690
+356DC96F1B98026C563700772485B83BFA06435D4E0793EF822F423C93FBACA0
+E5D889D2B76771C6F0EE997A5DB43C2F6921132890406E3C33F6F159B14C5D78
+7C151BDFFDD02B697315F191B5490073EB418A4FF2A398C68D44F0CD1B87CF9C
+B52F12728B72F94D752D23151196A256908135C87991E508B8906CE2539DCA8A
+31F86809C8C6C18A09F6129BD7CDC6B37E76B648788056851F22BD3E3B5772FF
+EC01D822B57FFDB3BAE624F05531292641FD6A7E3666152D18F6C653048DD7D7
+98A942C840C4A0FA662F260B21C64214152BB86F03662A330109C5AC0A5EBA30
+C6201F558858130703DF76AF4FBBEE069BDE45C0D9467077D85FFED4F9BA9C61
+AED87D67CDCA453A6528AC5BA153E1039D9CCC556CEA5CBB542265FF54A1B208
+E0E13740E7E7C26AA00AEE909F8F3ADC2726081A744D8EF6BB711BF5F611A900
+76F91C26A338DA13A7160A9F42410CCEB3190000D963D036FDA05A29F598EF40
+8FAE6F8E7E6F50C99C3304A573501C13A00023085F057DF331E3354CBE65D573
+CAE73BF15B3B96B502E0AAF2B4A86237E98A997AAEFFF4227D5A26E8972C48E7
+761F430733E6EF8AB2D903C17FAFBFA21C25F8A0AC157D397BF3CC1AE7598F0A
+2BE4FB46B29443CE57F41FD5F91122E9D86F903E94D5B55E2BB95949C156D138
+89883BEFD634311F9280C7F028DCA6408D3A682DF5B55B9F7ABF08F019190F60
+D39E4F0E80F0594235B09A5320109638B938633A2C196E4ED2B43DCD8643C3CF
+C6123B076B7F73352F906D96FDE0FBF50CCCA432712C574D5857838BAC30B485
+D25024EB254A7EFE57D1DF0892C275CDB3DF77602F0FED0FAEBC644BCACA04B8
+B424DB125E487794CAB36E01B5E1A26F5E1E97A739AA36D77A12F5B45338EB39
+AF36CEBDED55DCBFCF497FD475FC6BAB5530AD6153C6BD982564EE8712185F1F
+D5EA7ADF4104661168A01994C1FD773A50C8AD6A3E4D332E4D59521BB8BBC6C3
+866EB4AC3EA4532477E6CBF6BBF0860031C3B916AA25E3492670EA67F55CF4FD
+207C684A0DDB6F4AD21B2909CBA71BCE2E762012B0927BA72367A6AE0AF87F73
+756C9BC85E4EDE35317E2CCCD138C02C7A8013AFDC1A48C3A4BB8EF257BDEEA7
+60E012F54D12D31D18DC59D5E526F12567B8688B4B67E16B56713870300016BD
+A3B9DA87FDC865246AF8E94316799110D86B1DDADB8A673402D4226C519C058A
+1D1E5A5778584FC28AF12819B1924060BC4F54B1054EA6AB0149E04B8C4302D4
+A56D8A347EB5D3D2A0E12CF7E35059BDB53D9FF6BD25F6D9619BC4669CFC1048
+C6C9978B8751B840F27D82A69075832BE59F55C1737CBB1220FB8FF691FDBDF3
+03BD7D225A9372AC221C38245E48320E1CCF898D9EEDD678E5B8C65B7F588321
+1A3953EEB9B39EA9A8CB72DB08C3E9234DFFF5FDF9DF804C021D57E97DA7622B
+97F4CB6E0EB640E0DC9EA15C5193F92A3A7565F4C7A4C9CC327F7CD2C44900AE
+D9E76FFE62FC37FA376E77131B566AE67C3E09DA80F198BBB995EE8FA47EEDB8
+4B467C6C7DB8AEA745CF8C56B8BE56534E9C56FCB2B7006426DFE93D728FA4CF
+94F131C549814E54ECE7C914C5FE8E4961D3437CE7475D03534B62650F551D97
+201C794AA877445DBEB11C85ADF6119B05360700F8CEDE4766E3A1D7A35CDDC7
+9ABF7C619E3868A39D1852DBE1EEAF5D7898C78323873AC005542B68C43C5000
+CC58F675EB595F87C879694751494676465891E8A897158B481F11A171CCBBD7
+29603F00210CFD7FF31FE3D273933ECC34AFBCC4108D9B76D9ECE63EA06CF939
+4799092A54A749DACB82C1424E9879672C8BC084C360014C9C1B6D5D65C68AED
+66CE329C3AD712C0A36BE7EF03FDF339CAA2E0336D387A693B1DFAB5D5164E31
+14755A158168962C9B399F8F1DF3FF5060D7464D5071058C30C572A2BC7DEE53
+84BD7614A4BEC4C84E18CF7EC81C811724463BD46CECA5FB57B0F55EAE20CC74
+6AD815D1897B037C197D2456797B992C20C70B663BF99FE28C513B4E221C8E12
+49779F8C0AE8517048ADDF7CDF0D698E3EFE60071C4997B7F5EF12B6CB65390C
+224F13FBB99FFC034C0710F05019899689B6D3350BBA65C7CE7C2AB03D81B9A5
+5F3D65E4D462DAB189006669F7390A78A1B8908A4C913B15DB8827DFF15BB9A4
+A6037DDB643103B937257A7DAB025F09D53FBBC2BCB6B0BCD8D56B2B2784E498
+1F6CF8470DCC892AD0CFE11578718948BABF9C1427084643B66BB9181094E29D
+5FBE37708E1D8A6B7518A96876844CB66954227A7A6AF28DD075A462526DD5D6
+40EECC56FA366106E55C7068997B54B7F0D03AC1AD45D28C67C7ECA99DBEDB1C
+E18A79C353113E2E05B837E703278B202112B1C69E42A69D64B62F0E7D8F7E5B
+C1F93F0F99EC20EF312046F4B0CD7DAB31E422070B629A7FA96583CF3F1519CD
+CF08806F40ACD7BB5C960F21E9DA7FB3C72CBA0801ADE83DF738A4EC94F2977D
+2B95A166BA4AE28CAD1E37FBBF49D342CDB4DF615E2C5F3076313AC517C350DE
+710F5D52DE31DF69864D29DABF14234DF13904BA4333B0D714EEA55CDD79DE45
+FF5D64259C877191547076B1C7684CD252C0337BD9DF66CDC5DBAA4F3102F2E8
+FE48385C55727B80D11F3BE0B7568AA9356FB2B180A6B1392D620DED02F0B736
+5F4399FB9D32DFBC8ED942AD311C82250DA8BFE98D65
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMSY10
+%!PS-AdobeFont-1.0: CMSY10 003.002
+%%Title: CMSY10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSY10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup
+/UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMSY10 def
+/FontBBox {-29 -960 1116 775 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSY10.) readonly def
+/FullName (CMSY10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 13 /circlecopyrt put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0
+7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81
+DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91
+511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6
+1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD
+028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86
+1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A581BE543D73F1FED4
+3D08C53693138003C01E1D216B185179E1856E2A05AA6C66AABB68B7E4409021
+91AA9D8E4C5FBBDA55F1BB6BC679EABA06BE9795DB920A6343CE934B04D75DF2
+E0C30B8FD2E475FE0D66D4AA65821864C7DD6AC9939A04094EEA832EAD33DB7A
+11EE8D595FB0E543D0E80D31D584B97879B3C7B4A85CC6358A41342D70AD0B97
+C14123421FE8A7D131FB0D03900B392FDA0ABAFC25E946D2251F150EC595E857
+D17AE424DB76B431366086F377B2A0EEFD3909E3FA35E51886FC318989C1EF20
+B6F5990F1D39C22127F0A47BC8461F3AFDF87D9BDA4B6C1D1CFD7513F1E3C3D3
+93BEF764AA832316343F9FE869A720E4AA87AE76FA87A833BBC5892DE05B867F
+10FA225E233BCFA9BB51F46A6DF22ADCEACC01C3CD1F54C9AEFA25E92EFAC00D
+7E2BA427C25483BA42A199F4D2E43DFCE79A7156F7417ACF78E41FCA91E6C9EF
+B933450D851B73A6AB6AEA7EE4C710CB5C14270D1674FA334686653793FCB31B
+491E870D3C2BC654D2C1DE463EC9BA29D7371AA1078800EF93D3F66263A2EBBB
+F5723697BF7448BD0D2E301544BECF497FD475B85DFEF52AF4F8F8BE445CABE6
+019318806D10C5952157FF8F8286C1EE701545C8F60EFA854EAE66835A2046A6
+915D395F1E0366EFE0C0391583FE001FF16D82A2E2DA5F57754A2C6F69306E36
+356ECF8EFC3F1188AD6FCD2427E0580C97A5B69B4E0E09B85EEDE142F5ADD2F0
+5DE51D6DB72B127412A0D57106C19CA493048A4F815129ABE767D51715B1515D
+9C21067CB5BC88741B7298C83EAE36A866DFA87D8981F179B1C31292F56BBB64
+3C430779468AAF07C8A8B4934E1E775FE3F35186BD1FA6EE3689C1C750678AF1
+FBF9B23195A124C5C991FE670AC0C86FD39D2B07B9A319E74EFD498B45820252
+720ECDF7294F7B0B137CEB86D33BFCEB8606985A3260FD669E461C8BE94216C5
+D434FD8854F44EE66E5A289A9F9E32BC36AF645D53F96652602BAED418C8D726
+BD04A1B4617551FE4DEF54083D414F7DCE004E6BB2DC9C2EF7CE232B254BA2C5
+7DCBD36C2072ED46FF711F121A701E2284BF1B718B3164382B8F453D68FA0377
+DFE106503B8401D4DB87F5402A3AC9A442FA060B0610A9524D530C7157C26B56
+AC970FCC1D5655FFFFA39246E6420CF97D08ADFB7B05822679BD40C638DDF0E7
+A97BFE8918B611A145AC965C203F1428812F9D340AF499B3A915B22BE798594E
+0F520109FC81E452180AE45B170FF999C5FC2761C6CECD8742A5A6FC97F16743
+AD4EFCC6572A6D3F3E4E330C5CB2FF6FEA48A5B64DD3DBE943BD9918D4A18E18
+CBCF598AEFBB6AB3CD2CBC9BFD6099272F6543F3E532E0E21E614BD2880B1023
+0AC234CB705827BF016DB84E00E8C255FDEFA0101A842929540B7B4AA8A089BD
+5EFF05B72356B6BC3727817823B5CDBB1B963103000D7F2A4E2A1472FC3E614B
+5CBCB6D6D784023173DEFEBFA8F9ED87EC1A0A9EE98CA59CFC964CF943DC683F
+E9E00DA718C4425A705A69D99988EC6F152525C790912C2E46A2381A569424AB
+54DF4798BC2D7E7A361E7991641D4B756CE2A7FF4A2848927092C59C2C4B8809
+E13AB84FB6B111E680D7FB9F2FFC2C5C66B0B501E4447C2E46C10E2F6124476F
+A140C404CFE2DC9E0199BF61E035CEB481D438139A9630934E541D261FFD2906
+4CAD99E20655FA746AFB81EDBB5601F5FD6B1D6832A01D585E2C55053F6A7378
+4DAACCAC7608DBDADAAE732D66B3E7F87E79756337C1A961E53A4651BE7C77F4
+038B89C87F650C54A2A90EB7F1D525BB353F33318551EE8D84A6A83C718EA5A4
+B2AC0F7306B1E095819B87015A90CA3ED739B09061782C28CDB36BA4BD5E5308
+5CBB70414E4112193DAC4A1FA30996327230D1E021F3CD8115E12D239D93FFDC
+B645910EB29E40D830E7BAF2DB255FD7C4E776557BB38157917D993EAC245837
+A3B515147043574157B8342D829C7228CCEA843ABC89D1785A9672A5923FC4CD
+2F3FF27E6FCACF84E2D3136CA2C0FD3EF1EE7354CD04C38B5FB874553646ED2D
+CEDF7E362EADD04B18051F20A8FB0DE18E152385B9D05F98A3A7EF177824E246
+455ABE69E2F700EB78185CCFC07E3B4C6FA301112528D977367D30D0D5D59EDE
+FAEB706DDC970A9E296236C725B2B55B09B9C336B8E23CBA5FB8692D56F33B03
+16294E5FC7FAA42E96395A57CE51CA8DDD77442F142E2E576B778373FB31C81C
+16840BB422CA827E30A81829648BDF1CA36700EA32AD888D097C1FE0A05B2D9F
+483AEE40269DF09AF0D1AD3DF80C45DDC59C2A03FBB661C79B87853737C6D352
+67626B657321B16198DBD6DB98A092F17878AE4698121E1006E53D6F9B0A3BE2
+3FB68828EF854A0CDBAA68B37ABCA6AD4A3D809AAF0BAB1697A81FE59C98C472
+1E33CD70A75A22C249DD11D76C2575ED3370A25892A16D2FD569CDA70C130770
+93F493C7D47D6F9A5424A7A542BAD726BFC3AB225DCEBBE6AC4BE006F8C7C0EA
+051424B08305BF2D951AB2986AAFEA04E078CA79B399585BFF0F1ADCED02E15B
+8765EB6BF6A8E4D0901EFF2C3AA104924EAD9637A35D877E0C51A3C37DA78CD4
+8643C8CE6DCDDE3F116A6C2390F948E5371BEB5AD2E87B41C5F01FB5C196C436
+6E256A88D082E3F46E4EFFBF605B2EFF1E9D9AD5EE4DDC323A137CD9451EDEE0
+06F7D82898D71FAF2362C0FCF1F726F97F820305B7CE20728CA08C63575083A7
+84BA28B7DE2B916432475510E274C12FFD1660A717F51DACFDF0A102D85224E0
+D6DB607BB72569ABB8A7BC6A10354CBBC01732EFE35B72062DF269CB25EA3DE6
+DC603B04C90C5912D2C38D7A5ACDCDD3F6F116D884F0D8C528F69D5D47BA20DB
+0A9E585C7D8CC3C324FE8A1DF150279F7E8FB43BDB720E624E5E9918032C02CD
+8020636AE5C38DA2484B7F4B34163E0D0A561B43B80E97746DC05C871AB620EC
+C5D47101ECED4A7E25F291184BEF8B80024AA7BB456C1B83A907652B331DEA34
+754226C39C6889EBEEFDAD081E01EF8FE47751987667836FDE4C8BB8A3FD4406
+1E643B4EA37BD370734D1A2DB17C2F4B74B4ED75098B433601F75A88C9A37A05
+CCB157EF6E32023BFA33973F3E655A4D58289136996FCFA61EEABD70791B6523
+1FF5DE71AB8A17038923118A5EED8D59C4C58D246FFA9BB26472346B40C8741F
+153D19CAFF20DD2A86C6DB89154A630FB1761929FC3F0448EE2F089C1C953E02
+905BA8DE75D101A982A611056C4B237596C10951DD98BAB838B742D3CF7DE718
+617DB72E5268583223E37E029D1C8FD3F1D21690151F76B76C52C725CA135CA2
+8666553E863CE188BFC9B99AF56AC2DB5BFEBEB12FB563D00244EB89E478657A
+98AF2E1223C1ABC25A4500E8119B86EB3C26B8A2F3505A3E5610F89B7C34E278
+53FA0A54A7F46D84A35EFEC36AE660A9E3C37EE3864106702DE5AF6C45ABF64B
+888A4A51323138CE77DB935576FE6B4824B6942DF80625098CE1B5B32B234F1D
+052A9D6039697118A9D793793775D8729D8574A2E74D7109C7B7E23BC5E2E87A
+CA8E019203952A4892544E1AD3D4EDD22971611358AB230E9A2ABDF00A288501
+A01B67C42B33F6B78C39562DB50F4663B922D9BE0D8A150311AE44B83C1F129F
+07337323E9A23211EE58E16043E127C6F9574019179F5635648A011266677B56
+B5D0201A4E1470B952A1579B57AB2329CD4C615395023C653F784D36B5EE3672
+10D191F29EA508CE84763CA4CE7C2C5229E38E241255A5CABCD6C7CBAED901A2
+CA53B5E24111921CDDF83578D33D463D70EDACA0E470D8F592303FB6BFD68B4D
+3F3BE2D7C5EC8BBF10C90111A33E205F2649B56E8443F6FAA6C721C66575AE12
+D4C40F1F46CF9E9DA675AB5D5840D938780CD9E4AD6736ECBEB6A4397613586F
+849B51048AC5F9405E03E14540A5E5582F61CDCDB57EDDF95A8C6705F433EE16
+648F098C03DED8A2AD94AE3DE202D629B9422ABB031318D48F2C85F9DBFA17BE
+84708AA3B6C9F81F4508F7A5CB7B6646AB8722ECF817877B77D473F577556DAA
+2BA0ABACFCF5DEA7498C47328E873019A956FBB250FD9D8885D21D368FA70CBD
+2709D2DA44EE7A9869963EAB48789541906DE49FAE785ECE1F18A22C7E7ED204
+9768896B78E9EB7A2BD6EEC1B26083940656ECD689D92942CC8AF05CBF82AED0
+B45A7DF4DD7AA6526FB597322560B9ED3087A65B5EEF1371C328A021411BFE3B
+D9B5088B2F1AAE381FFED52D2D1E02CD0DA78683E3B06171CBE94BE9760005D7
+135893D7CC2DB097F6AC664D9594CF1C650F84DA80D2EDE04802DBA33CE3DAFE
+EB7A37E8AEFA4FDA6252FF21E8673DD98E67124D5DBC7BACF361E57077B71939
+C1D1FB923E4E35C075CD1BCBE0E80DAEA1320D55B43EAB45D9B26C366B278782
+7519FDC482D98839BF0DF2E7C3A56A1C1A3FC0E57A75CA414F6536C1FE8EB7A0
+4ADFEE3BEDA0F53BE8CF5F64230784A797133E8CD46BCCB3BF38BCE38A73CCE2
+9E073ADE792F7128231DDD1F63E6156ADB2609C200837C2E8A2D93D2A7BC9171
+050C709A71E44E32B1B03C92EB5CF1D3BAB1C38E027DC4ED9AED633D98CD7486
+3F773ACF8AE332631CF2ABE6D606607593FE862ADE31803964E3F4DC3CE3A271
+C76BDD95C87CDB3B87BC26FC7A16D567EEC62E6FF0D471B4853DB8A94D4CACF8
+843824F818083F10E88D52FC4253E8203292CB40F1414AE7E51DD7347007C342
+CD70E8E9F2D2A13D71213B841DDEAAB208AD9EA644591C15DEB084165F9DF24B
+B91D3BBEEC2E34E38EF16A0C3F00700A7BDCBBFED2EC0D09601AD6538288DB50
+3478B051B5E16B604A0341FE621A58718D960D699D3FAD284310DCF54EB13175
+19A75A539EE98E804AEA24689D3540F0F12951A3C01FACCE9A7BAF4D0DAFA946
+FF65A4D2A4C39969607272C6886F44E90ABE27CA3A1F12A29D9B32E60E8E34F0
+17C5FE43D0E69A99A922D98909B2BBCD145E59A5E7F5426B3988F73B09A525F6
+8BD4915663C1301323180E760BE81CB874B020FDA3AE63340E4261E4F3E4949B
+CC0966BDC4426190BE9F5D77F76A72AD925662E5FE1CEF9CCAB68F0BD33DA003
+F11EB91AC4502FBD6AE48DA0F9D07C35B96B103E379B8A83A05FE728F1716194
+1F650F75BEBADB2E3810388F3E2DC7B19F1BA9E32925F2FD9F19F4E8701F3E4E
+4069125D7C401144740691E7A460021A47B1E27997FC1DDABEC5BD0EE0B20194
+2D579C7D6727AA124083242BDA46D8E116E2751C5F298851A62B60AEBE82A929
+9B9F2492BA35690D1EFD16215B8EF14E7A3803B93C28FA41D971B05B6AF3B593
+E74AD1E68A5FCE12A86E63B78BFEA87D3949FD164F12277A4688BE96356791CB
+8671C49365608F3EDECC109321AF92B4C29CAF073DA3A7D73E913D0D83FAC5EB
+BD884D4C686056404DAAAD6F82F94F803FA1FB0DD8908D1DF08FB87A8BB83027
+04DE0CBB1C6FEB6B517FBD7CF065120079E608CE41893C2BC96A347826CCDFD5
+C69E161217F2127A59F1A6F22037641613F191F22D5B4CDCBCC2EE5615623404
+ABA7BE6C5FE475481615B2AC1A2412E54688DD21E44CC9AF5F16E634AFCA389C
+4D740B7B51BB141BFAD1080E7C726C1606A28ED492E6BDE9F800EFACD1513909
+84E98CEB6A0B7A2A6F3E1D1DCC3B2552795E0932673E59ECC56DDD37A1D52BA6
+C3F0E905978AB568941A163F4CE3AAB5C5B16F86016EC47BA6F3F7AAAA77C3B6
+09C8C3ABDB6D514A76ECD37C37AA88B5860630B3406B494F7725975596F84777
+D9CF48686EC9C5DBCC1D78513F591C7C10AB9D153B3D41426B7BF668B0D04503
+56BCB686258462C1DC61095724B9F3312316262FD7C1AEC6E54DE7E5A7BD8EFF
+035299B8FD8A4A7B0F51404F4A760F4D8B4C0FB7A32FA4B2383AB6E9C78FDEDB
+FE6A5788D38A6701B123630C2A6D820A684166FBBC83DB17069494FBD411B333
+CB37E2491C5BD035A33867A6D3A3D420CC31ACF43AA07182CAAE67E40EC63663
+B678F71D4C6E0EC3A0AAF904CD3AA66E0DE5E3CDE049E94249B39A1C06E3CE9A
+F974B2484BB2CDA14282B9511E505B3C89F9C802218AE40D1A7541335C5736DD
+CD565D4B9F4CC78F3A393737EDB4FBD0DA299E21CCFEBA5478EEF013F0552A8B
+0BB11FF46CCDB784E8BDCF730A16363E66572049E42C695886EAB42A9AD9094C
+B635DF4B5B9BD9B9AE8455DFA3EEFC77653190F9A8B1E93B7281C2A21EA7DDA9
+33484745BDF7E3DD63C7AC66C286C9A5A698A5E4D7A91710B7FF943FB23609B6
+4B442F83CB795788FAB5E9CF3F75D5487DA26170E4561C7941C910B088C3B86D
+F844B0F340CF82786A3FCF347048463EBD2006281A816627065DDA6CD4D3AC5E
+2024BC96C7D896381BBB567951E7A1F29D4E95351298B000D29E5F3D0448CB5A
+CFDAE1BADE9403B90371C3A07D208948AFA022A69C519434B6813086ADF518D5
+88E0B92072A44BA1B3EBB630A13B7AB90992E85B6D67361C8D96F3E0D826FF37
+17B67E4B1EB7BADFD98D7F4FD17BECE740ADF13C141EBF0A91CB105DABB32FE0
+55086D56A0D358841D15FD349E6B95512E4EDF4C430216FF85C2ABE995E4B40A
+A6044CC8820AD885C07E052B3F91C2E9A1D163BFFD210F7BE95B923E2500DB50
+2075106DB541C267BD450B25B670CE80BCD068D4DBFF2D82634175B61FBD3BC3
+406131F44C7D6F18D375D1F2270829DDF29DC14DBB58A30AC193245D18DE91F8
+AB88AB548D8138605BB5A50073295534E314366E26665AE70482B890E4101D6B
+60E4F3B37ABCA1346DAAE8FDB8DD9C832EFF3E73BA470E2BACE7B8515CB43388
+C27AF99FF9322175CF8D4947E6B3846AFF5163E972156847F58A66660EC8A3A6
+5FB47C9F637B4CBB4C73B6A080B0CF6FD1E9665E92032540570FFCC747C67C50
+822811AADC404BC7ECD1673E8AA6C3A2F1D82F39430B58C29145E2F1B679C46E
+94EDC711883F1E4EA84117A54757E8895A40401A26E1437B39A2F65CAADD6E02
+D71FA8AF7453668DC613F326A3344F74AD7AC67569AF399385500ABDA5EDD3BA
+343CC5EDD4B558467626850E752B9959FEF1454E53E7A3DCBC2255AD8F6AB4FE
+894455118A61C58840CB68A925ACCAD75CEACE863D806916228F0614191A1CD5
+DC9BAE256018615AA3725834519449B0A88B4F396654E74099C007930ADB1327
+DD119BF799FE3B0B223E1EDA04FE2DA7A1C879143E1C33B6C6344F4BA033AD6F
+8E88C33DEF1977796B454BAB2494C930F492A518E8198C708A75FFEF8C49C324
+A718AB59B889DED521229E741FFE53F98EBE88B0405AD523254FD3FA4BBE96DA
+DA1C27C1C979A0DD4E61C3B1F4C4DE01E42F1C4435EECFC02D97994BC8AF5270
+E7CB1458D76ED0229C5FFB4A23B8716018F9050970895D51722CDE8F2EA3D947
+DFF374D84915D5C5D16463A6FFCD079D1ED416C4347BF831FF0C4ADFB61295DC
+4D5785BB0852BF472CFC97EC174491CAF961AB90629F055E75DAA6D9898E8653
+5BCF379816CAE46FEA62E7BE8E9B953466E51828172C4DBD0E1BBAD1CE28B5B1
+02B3E36403BE80B49A47446A6677FCED438F01D60EB10F478C89528FA337D0D8
+88D3FC123C076507ACDAF783A9A6E24ED73BF24B6E0F11C13E532DE5F70EB02A
+60651FC2E263002D3986B7B20CC2AA08330B9FC2E26765CD52266969A86EE30E
+71E0B41B6C1C6DA423D3A7E1553D2FAF26EF40DC183099322D362E4965695C52
+9FC3E5BD7ABD743CDCB717DB10372A722A39CE53FABB454EADE2179C4CBFC016
+A8E893C28EF549CA1692C8D8ADFC471DCCDE266FB4E97A1F3035801F3F034D44
+AE6ADA0192657E8078A1D27420093FEBA111333314658021B90DA4E7A8D4B829
+F1795501020D5FF0AD25584C1D47BE08ED6CE96278050BA67680A3B973613647
+A93FAEC756FC253B3693FA2D6491B276EF45751EFB306961788E7C15297A5822
+AFC5A2DABD0DBBFF0BE135267EA6B9D1B4E4760ED14895FFE1F8C3F564830001
+EFA901B8442BD2D98561BAB9A0FD939E0F856E4D2EB04A9A4496704109B8A84C
+EA06AB0999427B3B1BE776004AE906D0F22159C051D88CF573A0255D99B56781
+CF326CD11919AA40B096769CD6D0ADF3ACEC7957621084ACF21AF1F265416628
+86B67FCBDE9370D4F5C6F5CC67EBB0A2727E074090DBCA459AFA1A4778AED4C9
+AE5400775223E684BFCB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+TeXDict begin 40258431 52099146 1000 600 600 (readline.dvi)
+@start /Fa 197[21 58[{}1 74.7198 /CMMI9 rf /Fb 133[34
+41 41 55 41 43 30 30 30 41 43 38 43 64 21 41 1[21 43
+38 23 34 43 34 43 38 39[38 38 38 38 38 38 38 38 38 38
+2[26 21 30[43 43 12[{}39 74.7198 /CMR9 rf /Fc 134[39
+39 2[39 39 39 39 2[39 39 39 39 2[39 39 1[39 39 39 2[39
+19[39 27[39 39 2[39 45[{}20 74.7198 /CMSLTT10 rf /Fd
+167[62 3[60 46 2[57 1[62 76 52 1[43 1[62 65 54 1[63 60
+67[{}13 83.022 /CMR10 rf /Fe 129[39 39 39 39 39 39 39
+39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+39 39 39 39 39 39 39 1[39 39 39 1[39 39 39 39 39 39 39
+39 39 39 39 39 39 39 1[39 39 39 39 39 39 39 39 39 39
+39 39 39 39 39 39 39 3[39 1[39 39 39 39 39 39 39 39 39
+39 39 39 39 39 39 39 1[39 39 39 33[{}86 74.7198 /CMTT9
+rf /Ff 133[44 53 53 72 53 55 39 39 39 53 55 50 55 83
+28 53 1[28 55 50 30 44 55 44 55 50 20[62 77 1[36 2[65
+68 22[28 1[28 1[50 28[55 55 12[{}35 99.6264 /CMSL10 rf
+/Fg 214[35 35 40[{}2 90.9091 /CMSS10 rf /Fh 133[52 52
+52 52 52 52 52 52 52 52 52 52 52 52 52 52 1[52 52 52
+52 52 52 52 52 52 1[52 18[52 52 1[52 2[52 52 9[52 16[52
+42[{}33 99.6264 /CMTT10 rf /Fi 134[65 65 89 65 68 48
+48 50 1[68 61 68 102 34 65 1[34 68 61 37 56 68 55 68
+60 7[93 1[127 93 94 85 68 92 3[96 116 74 96 1[46 96 1[77
+81 1[89 87 93 7[61 61 61 61 61 61 61 61 61 61 1[34 46[{}52
+109.091 /CMBX12 rf /Fj 133[40 48 48 66 48 51 35 36 36
+48 51 45 51 76 25 48 1[25 51 45 28 40 51 40 51 45 9[93
+1[68 66 51 67 1[62 71 68 83 57 71 1[33 68 1[59 62 69
+66 64 68 15[45 45 2[30 2[45 28[51 51 53 11[{}51 90.9091
+/CMSL10 rf /Fk 134[44 1[60 42 49 30 37 38 1[46 46 51
+74 23 42 1[28 1[42 1[42 46 42 1[46 84[51 12[{}20 90.9091
+/CMTI10 rf /Fl 134[48 48 48 48 48 48 48 48 48 48 48 48
+48 48 48 48 48 1[48 48 48 48 48 48 48 1[48 2[48 14[48
+48 1[48 1[48 2[48 48 48 17[48 48 2[48 5[48 39[{}37 90.9091
+/CMSLTT10 rf /Fm 135[56 2[56 1[42 2[51 58 56 4[27 1[58
+49 51 1[54 1[56 97[{}12 90.9091 /CMCSC10 rf /Fn 197[25
+58[{}1 90.9091 /CMMI10 rf /Fo 197[33 58[{}1 119.552 /CMMI12
+rf /Fp 135[85 117 1[90 63 64 66 1[90 81 90 134 45 2[45
+90 81 49 74 90 72 90 78 10[122 124 112 1[120 1[110 1[126
+1[97 2[60 1[127 101 106 124 117 1[122 14[81 81 49[{}36
+143.462 /CMBX12 rf /Fq 242[91 13[{}1 90.9091 /CMSY10
+rf /Fr 134[71 71 97 71 75 52 53 55 1[75 67 75 112 37
+2[37 75 67 41 61 75 60 75 65 7[102 1[139 102 103 94 75
+100 101 92 101 105 128 81 105 1[50 105 106 85 88 103
+97 96 102 6[37 67 67 67 67 67 67 67 67 67 67 1[37 1[37
+44[{}58 119.552 /CMBX12 rf /Fs 129[48 48 48 48 48 48
+48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+48 48 48 48 48 48 48 48 48 48 1[48 48 48 48 48 48 48
+48 48 48 48 48 48 48 48 48 1[48 48 1[48 48 48 48 48 48
+48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 33[{}91
+90.9091 /CMTT10 rf /Ft 131[91 45 40 48 48 66 48 51 35
+36 36 48 51 45 51 76 25 48 28 25 51 45 28 40 51 40 51
+45 25 2[25 45 25 56 68 68 93 68 68 66 51 67 71 62 71
+68 83 57 71 47 33 68 71 59 62 69 66 64 68 71 4[25 25
+45 45 45 45 45 45 45 45 45 45 45 25 30 25 2[35 35 25
+2[45 1[45 19[76 51 51 53 11[{}84 90.9091 /CMR10 rf /Fu
+134[102 6[79 3[108 1[54 2[54 3[88 108 1[108 94 11[149
+2[144 3[151 1[116 4[152 71[{}14 172.154 /CMBX12 rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%BeginPaperSize: Letter
+/setpagedevice where
+{ pop << /PageSize [612 792] >> setpagedevice }
+{ /letter where { pop letter } if }
+ifelse
+%%EndPaperSize
+ end
+%%EndSetup
+%%Page: 1 1
+TeXDict begin 1 0 bop 150 1318 a Fu(GNU)65 b(Readline)g(Library)p
+150 1418 3600 34 v 1873 1515 a Ft(Edition)30 b(8.2,)i(for)e
+Fs(Readline)e(Library)h Ft(V)-8 b(ersion)31 b(8.2.)3118
+1623 y(Septem)m(b)s(er)f(2022)150 4927 y Fr(Chet)45 b(Ramey)-11
+b(,)46 b(Case)g(W)-11 b(estern)46 b(Reserv)l(e)g(Univ)l(ersit)l(y)150
+5068 y(Brian)f(F)-11 b(o)l(x,)45 b(F)-11 b(ree)45 b(Soft)l(w)l(are)h(F)
+-11 b(oundation)p 150 5141 3600 17 v eop end
+%%Page: 2 2
+TeXDict begin 2 1 bop 150 4413 a Ft(This)21 b(man)m(ual)g(describ)s(es)
+g(the)g(GNU)h(Readline)g(Library)f(\(v)m(ersion)h(8.2,)i(19)e(Septem)m
+(b)s(er)f(2022\),)26 b(a)21 b(library)150 4523 y(whic)m(h)39
+b(aids)g(in)g(the)g(consistency)h(of)g(user)e(in)m(terface)j(across)f
+(discrete)g(programs)e(whic)m(h)h(pro)m(vide)h(a)150
+4633 y(command)30 b(line)h(in)m(terface.)150 4767 y(Cop)m(yrigh)m(t)602
+4764 y(c)577 4767 y Fq(\015)f Ft(1988{2022)35 b(F)-8
+b(ree)31 b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390
+4902 y(P)m(ermission)21 b(is)f(gran)m(ted)h(to)g(cop)m(y)-8
+b(,)24 b(distribute)c(and/or)h(mo)s(dify)e(this)i(do)s(cumen)m(t)f
+(under)f(the)390 5011 y(terms)25 b(of)h(the)f(GNU)h(F)-8
+b(ree)27 b(Do)s(cumen)m(tation)g(License,)g(V)-8 b(ersion)26
+b(1.3)g(or)f(an)m(y)h(later)g(v)m(ersion)390 5121 y(published)43
+b(b)m(y)h(the)h(F)-8 b(ree)46 b(Soft)m(w)m(are)g(F)-8
+b(oundation;)53 b(with)44 b(no)g(In)m(v)-5 b(arian)m(t)46
+b(Sections,)j(no)390 5230 y(F)-8 b(ron)m(t-Co)m(v)m(er)31
+b(T)-8 b(exts,)30 b(and)f(no)f(Bac)m(k-Co)m(v)m(er)k(T)-8
+b(exts.)41 b(A)29 b(cop)m(y)h(of)f(the)g(license)h(is)f(included)390
+5340 y(in)h(the)h(section)g(en)m(titled)h(\\GNU)f(F)-8
+b(ree)32 b(Do)s(cumen)m(tation)g(License".)p eop end
+%%Page: -1 3
+TeXDict begin -1 2 bop 3725 -116 a Ft(i)150 299 y Fp(T)-13
+b(able)53 b(of)h(Con)l(ten)l(ts)150 649 y Fr(1)135 b(Command)45
+b(Line)g(Editing)26 b Fo(:)20 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h
+(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)39
+b Fr(1)275 786 y Ft(1.1)92 b(In)m(tro)s(duction)30 b(to)h(Line)f
+(Editing)17 b Fn(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
+f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h
+(:)f(:)h(:)f(:)g(:)31 b Ft(1)275 896 y(1.2)92 b(Readline)31
+b(In)m(teraction)19 b Fn(:)e(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
+f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h
+(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)32
+b Ft(1)399 1005 y(1.2.1)93 b(Readline)31 b(Bare)g(Essen)m(tials)18
+b Fn(:)e(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
+(:)31 b Ft(1)399 1115 y(1.2.2)93 b(Readline)31 b(Mo)m(v)m(emen)m(t)i
+(Commands)18 b Fn(:)d(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)32
+b Ft(2)399 1225 y(1.2.3)93 b(Readline)31 b(Killing)g(Commands)10
+b Fn(:)k(:)h(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)
+f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23
+b Ft(2)399 1334 y(1.2.4)93 b(Readline)31 b(Argumen)m(ts)22
+b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)36 b Ft(3)399 1444 y(1.2.5)93 b(Searc)m(hing)31
+b(for)f(Commands)f(in)h(the)h(History)20 b Fn(:)c(:)f(:)g(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)33
+b Ft(3)275 1553 y(1.3)92 b(Readline)31 b(Init)f(File)13
+b Fn(:)k(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)27
+b Ft(4)399 1663 y(1.3.1)93 b(Readline)31 b(Init)f(File)i(Syn)m(tax)26
+b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)
+39 b Ft(4)399 1773 y(1.3.2)93 b(Conditional)31 b(Init)f(Constructs)16
+b Fn(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)29
+b Ft(13)399 1882 y(1.3.3)93 b(Sample)30 b(Init)g(File)22
+b Fn(:)17 b(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)35 b Ft(14)275 1992 y(1.4)92
+b(Bindable)30 b(Readline)h(Commands)22 b Fn(:)15 b(:)g(:)g(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)35 b Ft(17)399 2101
+y(1.4.1)93 b(Commands)29 b(F)-8 b(or)31 b(Mo)m(ving)18
+b Fn(:)f(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h
+(:)31 b Ft(17)399 2211 y(1.4.2)93 b(Commands)29 b(F)-8
+b(or)31 b(Manipulating)g(The)f(History)f Fn(:)15 b(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)41 b Ft(18)399
+2320 y(1.4.3)93 b(Commands)29 b(F)-8 b(or)31 b(Changing)f(T)-8
+b(ext)12 b Fn(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)25
+b Ft(19)399 2430 y(1.4.4)93 b(Killing)31 b(And)e(Y)-8
+b(anking)13 b Fn(:)k(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)26 b Ft(21)399 2540 y(1.4.5)93
+b(Sp)s(ecifying)30 b(Numeric)g(Argumen)m(ts)e Fn(:)15
+b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)41 b Ft(22)399 2649
+y(1.4.6)93 b(Letting)31 b(Readline)g(T)m(yp)s(e)f(F)-8
+b(or)31 b(Y)-8 b(ou)22 b Fn(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)35
+b Ft(22)399 2759 y(1.4.7)93 b(Keyb)s(oard)29 b(Macros)11
+b Fn(:)17 b(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)h(:)24 b Ft(23)399 2868 y(1.4.8)93
+b(Some)30 b(Miscellaneous)j(Commands)16 b Fn(:)e(:)h(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)29 b Ft(23)275 2978 y(1.5)92 b(Readline)31
+b(vi)f(Mo)s(de)10 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23
+b Ft(25)150 3229 y Fr(2)135 b(Programming)46 b(with)f(GNU)g(Readline)37
+b Fo(:)19 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)48
+b Fr(26)275 3366 y Ft(2.1)92 b(Basic)31 b(Beha)m(vior)23
+b Fn(:)17 b(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)36
+b Ft(26)275 3475 y(2.2)92 b(Custom)29 b(F)-8 b(unctions)19
+b Fn(:)d(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)32 b Ft(27)399
+3585 y(2.2.1)93 b(Readline)31 b(T)m(yp)s(edefs)17 b Fn(:)e(:)g(:)g(:)h
+(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
+f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h
+(:)30 b Ft(28)399 3694 y(2.2.2)93 b(W)-8 b(riting)31
+b(a)g(New)g(F)-8 b(unction)24 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)37 b Ft(28)275 3804 y(2.3)92
+b(Readline)31 b(V)-8 b(ariables)11 b Fn(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)
+f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)h(:)f(:)24 b Ft(29)275 3914 y(2.4)92 b(Readline)31
+b(Con)m(v)m(enience)g(F)-8 b(unctions)22 b Fn(:)16 b(:)g(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)35 b Ft(34)399 4023 y(2.4.1)93
+b(Naming)31 b(a)g(F)-8 b(unction)21 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)34
+b Ft(34)399 4133 y(2.4.2)93 b(Selecting)32 b(a)e(Keymap)9
+b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)
+f(:)h(:)f(:)g(:)h(:)22 b Ft(35)399 4242 y(2.4.3)93 b(Binding)30
+b(Keys)15 b Fn(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)28
+b Ft(36)399 4352 y(2.4.4)93 b(Asso)s(ciating)32 b(F)-8
+b(unction)31 b(Names)g(and)e(Bindings)d Fn(:)16 b(:)f(:)g(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)39 b Ft(38)399
+4462 y(2.4.5)93 b(Allo)m(wing)32 b(Undoing)26 b Fn(:)16
+b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
+f(:)g(:)h(:)f(:)40 b Ft(39)399 4571 y(2.4.6)93 b(Redispla)m(y)10
+b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)23
+b Ft(40)399 4681 y(2.4.7)93 b(Mo)s(difying)30 b(T)-8
+b(ext)16 b Fn(:)g(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Ft(41)399
+4790 y(2.4.8)93 b(Character)31 b(Input)22 b Fn(:)13 b(:)j(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)
+f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)g(:)35 b Ft(42)399 4900 y(2.4.9)93 b(T)-8 b(erminal)30
+b(Managemen)m(t)17 b Fn(:)h(:)d(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)30 b Ft(43)399 5010 y(2.4.10)93
+b(Utilit)m(y)33 b(F)-8 b(unctions)24 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)36
+b Ft(43)399 5119 y(2.4.11)93 b(Miscellaneous)33 b(F)-8
+b(unctions)23 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)
+f(:)h(:)f(:)36 b Ft(45)399 5229 y(2.4.12)93 b(Alternate)32
+b(In)m(terface)27 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Ft(46)399 5338
+y(2.4.13)93 b(A)31 b(Readline)g(Example)12 b Fn(:)j(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)25
+b Ft(46)p eop end
+%%Page: -2 4
+TeXDict begin -2 3 bop 3699 -116 a Ft(ii)399 83 y(2.4.14)93
+b(Alternate)32 b(In)m(terface)g(Example)18 b Fn(:)e(:)f(:)h(:)f(:)g(:)h
+(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
+f(:)g(:)h(:)f(:)h(:)31 b Ft(48)275 193 y(2.5)92 b(Readline)31
+b(Signal)f(Handling)18 b Fn(:)e(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
+f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)31 b Ft(50)275 302
+y(2.6)92 b(Custom)29 b(Completers)e Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
+(:)40 b Ft(53)399 412 y(2.6.1)93 b(Ho)m(w)31 b(Completing)g(W)-8
+b(orks)11 b Fn(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)24 b Ft(53)399 521 y(2.6.2)93 b(Completion)31
+b(F)-8 b(unctions)28 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
+f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)40 b Ft(54)399 631 y(2.6.3)93
+b(Completion)31 b(V)-8 b(ariables)18 b Fn(:)e(:)g(:)f(:)g(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)
+f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)31 b
+Ft(55)399 741 y(2.6.4)93 b(A)30 b(Short)g(Completion)h(Example)15
+b Fn(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)28 b
+Ft(60)150 991 y Fr(App)t(endix)44 b(A)119 b(GNU)39 b(F)-11
+b(ree)38 b(Do)t(cumen)l(tation)i(License)25 b Fo(:)20
+b(:)32 b Fr(70)150 1269 y(Concept)45 b(Index)36 b Fo(:)19
+b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)
+h(:)49 b Fr(78)150 1548 y(F)-11 b(unction)44 b(and)h(V)-11
+b(ariable)45 b(Index)20 b Fo(:)g(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)
+f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)33 b Fr(79)p
+eop end
+%%Page: 1 5
+TeXDict begin 1 4 bop 3705 -116 a Ft(1)150 299 y Fp(1)80
+b(Command)54 b(Line)f(Editing)150 527 y Ft(This)30 b(c)m(hapter)h
+(describ)s(es)e(the)i(basic)g(features)f(of)h(the)f Fm(gnu)g
+Ft(command)h(line)f(editing)h(in)m(terface.)150 766 y
+Fr(1.1)68 b(In)l(tro)t(duction)45 b(to)g(Line)h(Editing)150
+925 y Ft(The)30 b(follo)m(wing)i(paragraphs)d(describ)s(e)h(the)h
+(notation)g(used)f(to)h(represen)m(t)f(k)m(eystrok)m(es.)275
+1058 y(The)35 b(text)i Fl(C-k)f Ft(is)g(read)g(as)h(`Con)m(trol-K')g
+(and)f(describ)s(es)f(the)h(c)m(haracter)i(pro)s(duced)d(when)g(the)h
+Fs(k)150 1168 y Ft(k)m(ey)31 b(is)g(pressed)e(while)h(the)h(Con)m(trol)
+g(k)m(ey)g(is)g(depressed.)275 1301 y(The)g(text)i Fl(M-k)e
+Ft(is)h(read)f(as)i(`Meta-K')g(and)f(describ)s(es)f(the)h(c)m(haracter)
+h(pro)s(duced)e(when)f(the)i(Meta)150 1411 y(k)m(ey)i(\(if)f(y)m(ou)h
+(ha)m(v)m(e)g(one\))g(is)f(depressed,)g(and)f(the)h Fs(k)g
+Ft(k)m(ey)h(is)f(pressed.)48 b(The)32 b(Meta)j(k)m(ey)e(is)h(lab)s
+(eled)f Fs(ALT)150 1521 y Ft(on)c(man)m(y)h(k)m(eyb)s(oards.)40
+b(On)29 b(k)m(eyb)s(oards)g(with)h(t)m(w)m(o)h(k)m(eys)f(lab)s(eled)g
+Fs(ALT)e Ft(\(usually)i(to)g(either)g(side)g(of)g(the)150
+1630 y(space)h(bar\),)f(the)g Fs(ALT)f Ft(on)h(the)g(left)h(side)f(is)g
+(generally)h(set)f(to)h(w)m(ork)f(as)g(a)h(Meta)g(k)m(ey)-8
+b(.)42 b(The)29 b Fs(ALT)g Ft(k)m(ey)i(on)150 1740 y(the)c(righ)m(t)h
+(ma)m(y)g(also)g(b)s(e)f(con\014gured)f(to)i(w)m(ork)f(as)h(a)f(Meta)i
+(k)m(ey)f(or)f(ma)m(y)h(b)s(e)e(con\014gured)h(as)g(some)h(other)150
+1849 y(mo)s(di\014er,)i(suc)m(h)g(as)g(a)h(Comp)s(ose)f(k)m(ey)h(for)f
+(t)m(yping)h(accen)m(ted)h(c)m(haracters.)275 1983 y(If)23
+b(y)m(ou)i(do)f(not)h(ha)m(v)m(e)h(a)f(Meta)g(or)g Fs(ALT)e
+Ft(k)m(ey)-8 b(,)27 b(or)e(another)f(k)m(ey)i(w)m(orking)e(as)h(a)g
+(Meta)h(k)m(ey)-8 b(,)27 b(the)d(iden)m(tical)150 2092
+y(k)m(eystrok)m(e)30 b(can)f(b)s(e)f(generated)h(b)m(y)g(t)m(yping)g
+Fs(ESC)e Fk(\014rst)p Ft(,)j(and)e(then)g(t)m(yping)h
+Fs(k)p Ft(.)40 b(Either)28 b(pro)s(cess)g(is)g(kno)m(wn)150
+2202 y(as)j Fj(metafying)39 b Ft(the)30 b Fs(k)g Ft(k)m(ey)-8
+b(.)275 2335 y(The)39 b(text)j Fl(M-C-k)d Ft(is)h(read)g(as)h
+(`Meta-Con)m(trol-k')j(and)39 b(describ)s(es)h(the)g(c)m(haracter)i
+(pro)s(duced)d(b)m(y)150 2445 y Fj(metafying)g Fl(C-k)p
+Ft(.)275 2578 y(In)c(addition,)j(sev)m(eral)f(k)m(eys)g(ha)m(v)m(e)g
+(their)f(o)m(wn)g(names.)58 b(Sp)s(eci\014cally)-8 b(,)38
+b Fs(DEL)p Ft(,)f Fs(ESC)p Ft(,)g Fs(LFD)p Ft(,)g Fs(SPC)p
+Ft(,)g Fs(RET)p Ft(,)150 2688 y(and)d Fs(TAB)f Ft(all)j(stand)e(for)g
+(themselv)m(es)i(when)d(seen)i(in)f(this)g(text,)j(or)d(in)h(an)f(init)
+h(\014le)f(\(see)i(Section)f(1.3)150 2797 y([Readline)c(Init)e(File],)j
+(page)e(4\).)41 b(If)29 b(y)m(our)h(k)m(eyb)s(oard)f(lac)m(ks)i(a)f
+Fs(LFD)f Ft(k)m(ey)-8 b(,)31 b(t)m(yping)g Fs(C-j)d Ft(will)i(pro)s
+(duce)f(the)150 2907 y(desired)h(c)m(haracter.)42 b(The)30
+b Fs(RET)g Ft(k)m(ey)h(ma)m(y)g(b)s(e)e(lab)s(eled)i
+Fs(Return)e Ft(or)h Fs(Enter)f Ft(on)h(some)h(k)m(eyb)s(oards.)150
+3145 y Fr(1.2)68 b(Readline)47 b(In)l(teraction)150 3305
+y Ft(Often)32 b(during)g(an)g(in)m(teractiv)m(e)j(session)e(y)m(ou)g(t)
+m(yp)s(e)g(in)f(a)h(long)g(line)g(of)f(text,)j(only)d(to)i(notice)g
+(that)f(the)150 3414 y(\014rst)f(w)m(ord)g(on)g(the)g(line)h(is)g
+(missp)s(elled.)46 b(The)32 b(Readline)h(library)f(giv)m(es)h(y)m(ou)g
+(a)g(set)g(of)f(commands)g(for)150 3524 y(manipulating)e(the)g(text)h
+(as)f(y)m(ou)g(t)m(yp)s(e)g(it)g(in,)g(allo)m(wing)h(y)m(ou)f(to)h
+(just)e(\014x)g(y)m(our)h(t)m(yp)s(o,)g(and)g(not)g(forcing)150
+3634 y(y)m(ou)e(to)h(ret)m(yp)s(e)g(the)f(ma)5 b(jorit)m(y)29
+b(of)f(the)h(line.)40 b(Using)28 b(these)h(editing)g(commands,)f(y)m
+(ou)h(mo)m(v)m(e)g(the)g(cursor)150 3743 y(to)35 b(the)f(place)i(that)e
+(needs)g(correction,)j(and)d(delete)h(or)f(insert)h(the)f(text)h(of)g
+(the)f(corrections.)54 b(Then,)150 3853 y(when)24 b(y)m(ou)h(are)g
+(satis\014ed)g(with)g(the)g(line,)i(y)m(ou)e(simply)f(press)g
+Fs(RET)p Ft(.)39 b(Y)-8 b(ou)25 b(do)g(not)g(ha)m(v)m(e)h(to)g(b)s(e)e
+(at)h(the)h(end)150 3962 y(of)33 b(the)h(line)g(to)g(press)e
+Fs(RET)p Ft(;)i(the)g(en)m(tire)g(line)f(is)h(accepted)g(regardless)g
+(of)f(the)h(lo)s(cation)h(of)e(the)h(cursor)150 4072
+y(within)c(the)g(line.)150 4269 y Fi(1.2.1)63 b(Readline)40
+b(Bare)h(Essen)m(tials)150 4416 y Ft(In)31 b(order)h(to)h(en)m(ter)g(c)
+m(haracters)g(in)m(to)g(the)g(line,)g(simply)e(t)m(yp)s(e)i(them.)46
+b(The)31 b(t)m(yp)s(ed)h(c)m(haracter)i(app)s(ears)150
+4525 y(where)e(the)h(cursor)e(w)m(as,)j(and)e(then)g(the)h(cursor)e(mo)
+m(v)m(es)j(one)f(space)g(to)g(the)g(righ)m(t.)47 b(If)32
+b(y)m(ou)h(mist)m(yp)s(e)g(a)150 4635 y(c)m(haracter,)f(y)m(ou)f(can)g
+(use)f(y)m(our)g(erase)h(c)m(haracter)h(to)f(bac)m(k)g(up)f(and)f
+(delete)j(the)f(mist)m(yp)s(ed)e(c)m(haracter.)275 4768
+y(Sometimes)i(y)m(ou)g(ma)m(y)h(mist)m(yp)s(e)e(a)i(c)m(haracter,)g
+(and)e(not)i(notice)g(the)f(error)f(un)m(til)h(y)m(ou)g(ha)m(v)m(e)h(t)
+m(yp)s(ed)150 4878 y(sev)m(eral)e(other)f(c)m(haracters.)42
+b(In)28 b(that)i(case,)g(y)m(ou)f(can)g(t)m(yp)s(e)h
+Fl(C-b)d Ft(to)j(mo)m(v)m(e)g(the)f(cursor)g(to)g(the)g(left,)i(and)150
+4987 y(then)f(correct)i(y)m(our)e(mistak)m(e.)42 b(Afterw)m(ards,)31
+b(y)m(ou)f(can)h(mo)m(v)m(e)h(the)e(cursor)g(to)h(the)g(righ)m(t)g
+(with)f Fl(C-f)p Ft(.)275 5121 y(When)i(y)m(ou)h(add)f(text)h(in)f(the)
+h(middle)f(of)h(a)g(line,)h(y)m(ou)e(will)h(notice)h(that)f(c)m
+(haracters)h(to)g(the)e(righ)m(t)150 5230 y(of)d(the)g(cursor)f(are)h
+(`pushed)e(o)m(v)m(er')j(to)g(mak)m(e)f(ro)s(om)g(for)f(the)h(text)h
+(that)f(y)m(ou)g(ha)m(v)m(e)h(inserted.)40 b(Lik)m(ewise,)150
+5340 y(when)d(y)m(ou)g(delete)i(text)g(b)s(ehind)c(the)j(cursor,)h(c)m
+(haracters)g(to)f(the)g(righ)m(t)g(of)g(the)g(cursor)e(are)i(`pulled)p
+eop end
+%%Page: 2 6
+TeXDict begin 2 5 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(2)150 299 y(bac)m(k')24
+b(to)f(\014ll)g(in)f(the)h(blank)f(space)i(created)f(b)m(y)g(the)g
+(remo)m(v)-5 b(al)24 b(of)f(the)g(text.)39 b(A)23 b(list)g(of)g(the)g
+(bare)f(essen)m(tials)150 408 y(for)30 b(editing)h(the)g(text)g(of)g
+(an)f(input)f(line)i(follo)m(ws.)150 571 y Fl(C-b)336
+b Ft(Mo)m(v)m(e)32 b(bac)m(k)g(one)e(c)m(haracter.)150
+732 y Fl(C-f)336 b Ft(Mo)m(v)m(e)32 b(forw)m(ard)e(one)h(c)m(haracter.)
+150 893 y Fs(DEL)e Ft(or)i Fs(Backspace)630 1003 y Ft(Delete)i(the)d(c)
+m(haracter)i(to)f(the)g(left)g(of)f(the)h(cursor.)150
+1164 y Fl(C-d)336 b Ft(Delete)33 b(the)d(c)m(haracter)i(underneath)d
+(the)i(cursor.)150 1325 y(Prin)m(ting)g(c)m(haracters)630
+1435 y(Insert)f(the)g(c)m(haracter)i(in)m(to)g(the)e(line)h(at)g(the)g
+(cursor.)150 1596 y Fl(C-_)e Ft(or)i Fl(C-x)e(C-u)630
+1706 y Ft(Undo)k(the)h(last)g(editing)g(command.)50 b(Y)-8
+b(ou)34 b(can)f(undo)g(all)h(the)f(w)m(a)m(y)i(bac)m(k)f(to)g(an)g
+(empt)m(y)630 1815 y(line.)150 1977 y(\(Dep)s(ending)c(on)g(y)m(our)g
+(con\014guration,)h(the)f Fs(Backspace)d Ft(k)m(ey)k(migh)m(t)g(b)s(e)e
+(set)i(to)g(delete)g(the)f(c)m(haracter)150 2087 y(to)h(the)f(left)h
+(of)f(the)g(cursor)f(and)h(the)g Fs(DEL)f Ft(k)m(ey)i(set)g(to)f
+(delete)i(the)e(c)m(haracter)h(underneath)e(the)h(cursor,)150
+2196 y(lik)m(e)i Fl(C-d)p Ft(,)d(rather)i(than)f(the)g(c)m(haracter)i
+(to)f(the)g(left)g(of)g(the)f(cursor.\))150 2398 y Fi(1.2.2)63
+b(Readline)40 b(Mo)m(v)m(emen)m(t)h(Commands)150 2545
+y Ft(The)27 b(ab)s(o)m(v)m(e)i(table)g(describ)s(es)e(the)g(most)i
+(basic)f(k)m(eystrok)m(es)h(that)f(y)m(ou)g(need)g(in)f(order)g(to)i
+(do)e(editing)i(of)150 2654 y(the)k(input)f(line.)49
+b(F)-8 b(or)34 b(y)m(our)f(con)m(v)m(enience,)j(man)m(y)d(other)g
+(commands)f(ha)m(v)m(e)j(b)s(een)d(added)g(in)h(addition)150
+2764 y(to)j Fl(C-b)p Ft(,)f Fl(C-f)p Ft(,)g Fl(C-d)p
+Ft(,)h(and)e Fs(DEL)p Ft(.)54 b(Here)35 b(are)g(some)h(commands)e(for)h
+(mo)m(ving)h(more)f(rapidly)f(ab)s(out)h(the)150 2873
+y(line.)150 3035 y Fl(C-a)336 b Ft(Mo)m(v)m(e)32 b(to)g(the)e(start)h
+(of)g(the)f(line.)150 3197 y Fl(C-e)336 b Ft(Mo)m(v)m(e)32
+b(to)g(the)e(end)g(of)g(the)h(line.)150 3358 y Fl(M-f)336
+b Ft(Mo)m(v)m(e)32 b(forw)m(ard)e(a)h(w)m(ord,)f(where)g(a)h(w)m(ord)f
+(is)g(comp)s(osed)g(of)h(letters)h(and)d(digits.)150
+3519 y Fl(M-b)336 b Ft(Mo)m(v)m(e)32 b(bac)m(kw)m(ard)f(a)g(w)m(ord.)
+150 3680 y Fl(C-l)336 b Ft(Clear)31 b(the)f(screen,)h(reprin)m(ting)f
+(the)h(curren)m(t)f(line)h(at)g(the)f(top.)275 3843 y(Notice)c(ho)m(w)f
+Fl(C-f)e Ft(mo)m(v)m(es)j(forw)m(ard)e(a)h(c)m(haracter,)j(while)d
+Fl(M-f)e Ft(mo)m(v)m(es)j(forw)m(ard)e(a)h(w)m(ord.)39
+b(It)24 b(is)h(a)g(lo)s(ose)150 3952 y(con)m(v)m(en)m(tion)32
+b(that)f(con)m(trol)g(k)m(eystrok)m(es)h(op)s(erate)e(on)g(c)m
+(haracters)h(while)f(meta)h(k)m(eystrok)m(es)h(op)s(erate)e(on)150
+4062 y(w)m(ords.)150 4263 y Fi(1.2.3)63 b(Readline)40
+b(Killing)i(Commands)150 4410 y Fj(Killing)35 b Ft(text)28
+b(means)e(to)h(delete)h(the)f(text)g(from)g(the)f(line,)i(but)e(to)h
+(sa)m(v)m(e)h(it)g(a)m(w)m(a)m(y)g(for)e(later)i(use,)f(usually)150
+4519 y(b)m(y)g Fj(y)m(anking)35 b Ft(\(re-inserting\))28
+b(it)g(bac)m(k)f(in)m(to)h(the)f(line.)40 b(\(`Cut')27
+b(and)g(`paste')h(are)f(more)g(recen)m(t)h(jargon)f(for)150
+4629 y(`kill')32 b(and)d(`y)m(ank'.\))275 4765 y(If)g(the)i
+(description)f(for)g(a)h(command)f(sa)m(ys)g(that)h(it)g(`kills')g
+(text,)h(then)e(y)m(ou)g(can)h(b)s(e)e(sure)h(that)h(y)m(ou)150
+4875 y(can)g(get)g(the)g(text)g(bac)m(k)g(in)f(a)h(di\013eren)m(t)g
+(\(or)g(the)f(same\))h(place)h(later.)275 5011 y(When)23
+b(y)m(ou)g(use)g(a)h(kill)g(command,)g(the)g(text)g(is)f(sa)m(v)m(ed)i
+(in)e(a)g Fj(kill-ring)p Ft(.)39 b(An)m(y)24 b(n)m(um)m(b)s(er)e(of)h
+(consecutiv)m(e)150 5121 y(kills)31 b(sa)m(v)m(e)i(all)f(of)f(the)g
+(killed)h(text)g(together,)g(so)g(that)f(when)f(y)m(ou)h(y)m(ank)h(it)f
+(bac)m(k,)h(y)m(ou)g(get)g(it)f(all.)43 b(The)150 5230
+y(kill)33 b(ring)f(is)g(not)h(line)g(sp)s(eci\014c;)g(the)g(text)g
+(that)g(y)m(ou)g(killed)f(on)h(a)f(previously)g(t)m(yp)s(ed)h(line)f
+(is)h(a)m(v)-5 b(ailable)150 5340 y(to)31 b(b)s(e)f(y)m(ank)m(ed)h(bac)
+m(k)g(later,)h(when)d(y)m(ou)i(are)g(t)m(yping)f(another)h(line.)p
+eop end
+%%Page: 3 7
+TeXDict begin 3 6 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(3)275 299 y(Here)30
+b(is)h(the)f(list)h(of)g(commands)f(for)g(killing)h(text.)150
+456 y Fl(C-k)336 b Ft(Kill)31 b(the)f(text)i(from)e(the)g(curren)m(t)g
+(cursor)g(p)s(osition)h(to)g(the)f(end)g(of)g(the)h(line.)150
+614 y Fl(M-d)336 b Ft(Kill)27 b(from)f(the)g(cursor)g(to)h(the)f(end)g
+(of)h(the)f(curren)m(t)g(w)m(ord,)h(or,)h(if)e(b)s(et)m(w)m(een)h(w)m
+(ords,)g(to)g(the)630 723 y(end)j(of)g(the)h(next)f(w)m(ord.)41
+b(W)-8 b(ord)30 b(b)s(oundaries)f(are)i(the)g(same)f(as)h(those)g(used)
+f(b)m(y)g Fl(M-f)p Ft(.)150 881 y Fl(M-DEL)240 b Ft(Kill)34
+b(from)f(the)g(cursor)g(to)h(the)g(start)g(of)g(the)f(curren)m(t)g(w)m
+(ord,)h(or,)h(if)e(b)s(et)m(w)m(een)h(w)m(ords,)g(to)630
+991 y(the)28 b(start)g(of)g(the)g(previous)f(w)m(ord.)39
+b(W)-8 b(ord)28 b(b)s(oundaries)e(are)i(the)g(same)g(as)g(those)g(used)
+f(b)m(y)630 1100 y Fl(M-b)p Ft(.)150 1258 y Fl(C-w)336
+b Ft(Kill)35 b(from)g(the)g(cursor)f(to)i(the)f(previous)g(whitespace.)
+55 b(This)34 b(is)h(di\013eren)m(t)h(than)e Fl(M-DEL)630
+1367 y Ft(b)s(ecause)c(the)h(w)m(ord)f(b)s(oundaries)f(di\013er.)275
+1525 y(Here)42 b(is)f(ho)m(w)h(to)g Fj(y)m(ank)47 b Ft(the)42
+b(text)g(bac)m(k)h(in)m(to)f(the)g(line.)74 b(Y)-8 b(anking)43
+b(means)e(to)h(cop)m(y)h(the)e(most-)150 1634 y(recen)m(tly-killed)33
+b(text)e(from)f(the)g(kill)i(bu\013er.)150 1792 y Fl(C-y)336
+b Ft(Y)-8 b(ank)31 b(the)f(most)h(recen)m(tly)h(killed)f(text)g(bac)m
+(k)g(in)m(to)h(the)e(bu\013er)g(at)h(the)f(cursor.)150
+1949 y Fl(M-y)336 b Ft(Rotate)36 b(the)f(kill-ring,)i(and)d(y)m(ank)h
+(the)f(new)g(top.)54 b(Y)-8 b(ou)35 b(can)g(only)f(do)h(this)f(if)h
+(the)g(prior)630 2059 y(command)30 b(is)h Fl(C-y)e Ft(or)h
+Fl(M-y)p Ft(.)150 2256 y Fi(1.2.4)63 b(Readline)40 b(Argumen)m(ts)150
+2403 y Ft(Y)-8 b(ou)40 b(can)f(pass)g(n)m(umeric)f(argumen)m(ts)i(to)f
+(Readline)h(commands.)67 b(Sometimes)39 b(the)g(argumen)m(t)h(acts)150
+2513 y(as)g(a)h(rep)s(eat)f(coun)m(t,)j(other)e(times)f(it)h(is)f(the)g
+Fk(sign)47 b Ft(of)41 b(the)f(argumen)m(t)g(that)h(is)f(signi\014can)m
+(t.)71 b(If)40 b(y)m(ou)150 2622 y(pass)33 b(a)h(negativ)m(e)i(argumen)
+m(t)e(to)g(a)g(command)f(whic)m(h)g(normally)h(acts)g(in)f(a)h(forw)m
+(ard)f(direction,)i(that)150 2732 y(command)g(will)h(act)g(in)f(a)h
+(bac)m(kw)m(ard)f(direction.)57 b(F)-8 b(or)36 b(example,)h(to)f(kill)g
+(text)g(bac)m(k)g(to)g(the)g(start)g(of)150 2842 y(the)31
+b(line,)g(y)m(ou)f(migh)m(t)h(t)m(yp)s(e)g(`)p Fs(M--)f(C-k)p
+Ft('.)275 2975 y(The)d(general)i(w)m(a)m(y)h(to)e(pass)g(n)m(umeric)g
+(argumen)m(ts)h(to)g(a)f(command)g(is)g(to)h(t)m(yp)s(e)f(meta)i
+(digits)e(b)s(efore)150 3085 y(the)j(command.)42 b(If)30
+b(the)h(\014rst)f(`digit')i(t)m(yp)s(ed)f(is)g(a)g(min)m(us)f(sign)h
+(\(`)p Fs(-)p Ft('\),)h(then)f(the)g(sign)f(of)h(the)g(argumen)m(t)150
+3194 y(will)39 b(b)s(e)e(negativ)m(e.)66 b(Once)38 b(y)m(ou)h(ha)m(v)m
+(e)g(t)m(yp)s(ed)f(one)h(meta)g(digit)g(to)f(get)i(the)e(argumen)m(t)h
+(started,)i(y)m(ou)150 3304 y(can)29 b(t)m(yp)s(e)g(the)g(remainder)f
+(of)h(the)g(digits,)h(and)f(then)f(the)h(command.)40
+b(F)-8 b(or)30 b(example,)g(to)f(giv)m(e)i(the)e Fl(C-d)150
+3414 y Ft(command)37 b(an)g(argumen)m(t)h(of)g(10,)i(y)m(ou)e(could)f
+(t)m(yp)s(e)h(`)p Fs(M-1)29 b(0)h(C-d)p Ft(',)39 b(whic)m(h)e(will)h
+(delete)h(the)e(next)h(ten)150 3523 y(c)m(haracters)32
+b(on)e(the)h(input)e(line.)150 3720 y Fi(1.2.5)63 b(Searc)m(hing)40
+b(for)i(Commands)g(in)f(the)g(History)150 3867 y Ft(Readline)22
+b(pro)m(vides)f(commands)g(for)g(searc)m(hing)h(through)f(the)g
+(command)h(history)f(for)g(lines)g(con)m(taining)150
+3977 y(a)31 b(sp)s(eci\014ed)e(string.)41 b(There)30
+b(are)h(t)m(w)m(o)g(searc)m(h)g(mo)s(des:)41 b Fj(incremen)m(tal)35
+b Ft(and)30 b Fj(non-incremen)m(tal)p Ft(.)275 4111 y(Incremen)m(tal)c
+(searc)m(hes)h(b)s(egin)e(b)s(efore)g(the)h(user)f(has)h(\014nished)e
+(t)m(yping)i(the)g(searc)m(h)g(string.)39 b(As)26 b(eac)m(h)150
+4220 y(c)m(haracter)37 b(of)e(the)h(searc)m(h)g(string)f(is)h(t)m(yp)s
+(ed,)g(Readline)g(displa)m(ys)g(the)f(next)h(en)m(try)g(from)e(the)i
+(history)150 4330 y(matc)m(hing)25 b(the)f(string)g(t)m(yp)s(ed)g(so)g
+(far.)39 b(An)23 b(incremen)m(tal)j(searc)m(h)e(requires)g(only)g(as)g
+(man)m(y)g(c)m(haracters)i(as)150 4439 y(needed)i(to)i(\014nd)d(the)i
+(desired)f(history)h(en)m(try)-8 b(.)41 b(T)-8 b(o)29
+b(searc)m(h)h(bac)m(kw)m(ard)f(in)f(the)h(history)g(for)f(a)i
+(particular)150 4549 y(string,)g(t)m(yp)s(e)f Fl(C-r)p
+Ft(.)40 b(T)m(yping)29 b Fl(C-s)g Ft(searc)m(hes)h(forw)m(ard)f
+(through)g(the)g(history)-8 b(.)41 b(The)29 b(c)m(haracters)i(presen)m
+(t)150 4658 y(in)38 b(the)g(v)-5 b(alue)38 b(of)g(the)g
+Fs(isearch-terminators)33 b Ft(v)-5 b(ariable)39 b(are)f(used)f(to)i
+(terminate)g(an)f(incremen)m(tal)150 4768 y(searc)m(h.)71
+b(If)40 b(that)h(v)-5 b(ariable)41 b(has)f(not)h(b)s(een)e(assigned)i
+(a)f(v)-5 b(alue,)44 b(the)c Fs(ESC)g Ft(and)f Fl(C-J)h
+Ft(c)m(haracters)i(will)150 4878 y(terminate)h(an)g(incremen)m(tal)g
+(searc)m(h.)78 b Fl(C-g)41 b Ft(will)i(ab)s(ort)f(an)g(incremen)m(tal)i
+(searc)m(h)f(and)f(restore)h(the)150 4987 y(original)30
+b(line.)41 b(When)28 b(the)h(searc)m(h)h(is)f(terminated,)h(the)f
+(history)g(en)m(try)g(con)m(taining)h(the)f(searc)m(h)h(string)150
+5097 y(b)s(ecomes)h(the)f(curren)m(t)g(line.)275 5230
+y(T)-8 b(o)31 b(\014nd)e(other)j(matc)m(hing)g(en)m(tries)g(in)e(the)h
+(history)g(list,)h(t)m(yp)s(e)g Fl(C-r)e Ft(or)h Fl(C-s)f
+Ft(as)h(appropriate.)43 b(This)150 5340 y(will)26 b(searc)m(h)h(bac)m
+(kw)m(ard)g(or)f(forw)m(ard)g(in)f(the)i(history)f(for)g(the)g(next)g
+(en)m(try)h(matc)m(hing)g(the)f(searc)m(h)h(string)p
+eop end
+%%Page: 4 8
+TeXDict begin 4 7 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(4)150 299 y(t)m(yp)s(ed)37
+b(so)h(far.)63 b(An)m(y)38 b(other)f(k)m(ey)i(sequence)f(b)s(ound)e(to)
+i(a)g(Readline)h(command)e(will)h(terminate)h(the)150
+408 y(searc)m(h)26 b(and)f(execute)i(that)f(command.)39
+b(F)-8 b(or)26 b(instance,)h(a)f Fs(RET)f Ft(will)g(terminate)i(the)f
+(searc)m(h)g(and)e(accept)150 518 y(the)30 b(line,)g(thereb)m(y)f
+(executing)i(the)e(command)g(from)g(the)h(history)f(list.)41
+b(A)29 b(mo)m(v)m(emen)m(t)j(command)d(will)150 628 y(terminate)i(the)g
+(searc)m(h,)g(mak)m(e)h(the)e(last)h(line)g(found)e(the)i(curren)m(t)f
+(line,)h(and)f(b)s(egin)g(editing.)275 777 y(Readline)35
+b(remem)m(b)s(ers)f(the)h(last)h(incremen)m(tal)g(searc)m(h)f(string.)
+54 b(If)34 b(t)m(w)m(o)j Fl(C-r)p Ft(s)c(are)i(t)m(yp)s(ed)g(without)
+150 886 y(an)m(y)i(in)m(terv)m(ening)g(c)m(haracters)h(de\014ning)e(a)h
+(new)f(searc)m(h)h(string,)h(an)m(y)f(remem)m(b)s(ered)e(searc)m(h)i
+(string)g(is)150 996 y(used.)275 1145 y(Non-incremen)m(tal)48
+b(searc)m(hes)g(read)e(the)h(en)m(tire)h(searc)m(h)f(string)g(b)s
+(efore)f(starting)h(to)h(searc)m(h)f(for)150 1255 y(matc)m(hing)d
+(history)e(lines.)78 b(The)42 b(searc)m(h)h(string)g(ma)m(y)g(b)s(e)f
+(t)m(yp)s(ed)g(b)m(y)g(the)h(user)f(or)h(b)s(e)f(part)g(of)h(the)150
+1364 y(con)m(ten)m(ts)32 b(of)f(the)f(curren)m(t)g(line.)150
+1627 y Fr(1.3)68 b(Readline)47 b(Init)e(File)150 1786
+y Ft(Although)f(the)g(Readline)g(library)f(comes)i(with)e(a)h(set)h(of)
+f(Emacs-lik)m(e)h(k)m(eybindings)f(installed)g(b)m(y)150
+1896 y(default,)26 b(it)g(is)e(p)s(ossible)h(to)g(use)f(a)i(di\013eren)
+m(t)f(set)g(of)g(k)m(eybindings.)38 b(An)m(y)25 b(user)f(can)h
+(customize)h(programs)150 2005 y(that)39 b(use)g(Readline)g(b)m(y)f
+(putting)h(commands)f(in)g(an)h Fj(inputrc)k Ft(\014le,)e(con)m(v)m(en)
+m(tionally)h(in)c(their)h(home)150 2115 y(directory)-8
+b(.)39 b(The)23 b(name)h(of)f(this)h(\014le)f(is)g(tak)m(en)i(from)e
+(the)g(v)-5 b(alue)24 b(of)g(the)f(en)m(vironmen)m(t)h(v)-5
+b(ariable)25 b Fs(INPUTRC)p Ft(.)150 2224 y(If)30 b(that)g(v)-5
+b(ariable)31 b(is)f(unset,)g(the)h(default)f(is)g Fs(~/.inputrc)p
+Ft(.)38 b(If)30 b(that)g(\014le)h(do)s(es)e(not)i(exist)g(or)f(cannot)h
+(b)s(e)150 2334 y(read,)g(the)f(ultimate)i(default)e(is)h
+Fs(/etc/inputrc)p Ft(.)275 2483 y(When)e(a)h(program)f(whic)m(h)h(uses)
+f(the)h(Readline)g(library)f(starts)h(up,)f(the)h(init)g(\014le)f(is)h
+(read,)g(and)f(the)150 2593 y(k)m(ey)i(bindings)e(are)i(set.)275
+2742 y(In)26 b(addition,)i(the)f Fs(C-x)i(C-r)d Ft(command)h(re-reads)g
+(this)f(init)h(\014le,)h(th)m(us)f(incorp)s(orating)g(an)m(y)g(c)m
+(hanges)150 2851 y(that)k(y)m(ou)g(migh)m(t)g(ha)m(v)m(e)g(made)g(to)g
+(it.)150 3065 y Fi(1.3.1)63 b(Readline)40 b(Init)h(File)g(Syn)m(tax)150
+3212 y Ft(There)f(are)i(only)f(a)g(few)g(basic)g(constructs)h(allo)m(w)
+m(ed)h(in)d(the)h(Readline)h(init)f(\014le.)73 b(Blank)41
+b(lines)h(are)150 3322 y(ignored.)72 b(Lines)41 b(b)s(eginning)f(with)h
+(a)g(`)p Fs(#)p Ft(')g(are)h(commen)m(ts.)73 b(Lines)41
+b(b)s(eginning)f(with)g(a)i(`)p Fs($)p Ft(')f(indicate)150
+3431 y(conditional)i(constructs)e(\(see)i(Section)f(1.3.2)h
+([Conditional)f(Init)f(Constructs],)j(page)f(13\).)74
+b(Other)150 3541 y(lines)31 b(denote)g(v)-5 b(ariable)31
+b(settings)g(and)f(k)m(ey)h(bindings.)150 3722 y(V)-8
+b(ariable)32 b(Settings)630 3832 y(Y)-8 b(ou)41 b(can)g(mo)s(dify)e
+(the)i(run-time)f(b)s(eha)m(vior)g(of)h(Readline)g(b)m(y)f(altering)h
+(the)g(v)-5 b(alues)41 b(of)630 3941 y(v)-5 b(ariables)34
+b(in)f(Readline)i(using)e(the)g Fs(set)g Ft(command)g(within)g(the)h
+(init)g(\014le.)50 b(The)33 b(syn)m(tax)630 4051 y(is)d(simple:)870
+4193 y Fs(set)47 b Fl(variable)e(value)630 4335 y Ft(Here,)29
+b(for)e(example,)h(is)g(ho)m(w)f(to)h(c)m(hange)g(from)f(the)g(default)
+h(Emacs-lik)m(e)h(k)m(ey)f(binding)e(to)630 4444 y(use)k
+Fs(vi)g Ft(line)h(editing)g(commands:)870 4586 y Fs(set)47
+b(editing-mode)d(vi)630 4728 y Ft(V)-8 b(ariable)36 b(names)f(and)g(v)
+-5 b(alues,)36 b(where)f(appropriate,)h(are)g(recognized)g(without)f
+(regard)630 4837 y(to)c(case.)42 b(Unrecognized)31 b(v)-5
+b(ariable)31 b(names)g(are)f(ignored.)630 4979 y(Bo)s(olean)c(v)-5
+b(ariables)26 b(\(those)g(that)g(can)f(b)s(e)f(set)i(to)g(on)f(or)g
+(o\013)7 b(\))25 b(are)h(set)f(to)h(on)f(if)g(the)g(v)-5
+b(alue)26 b(is)630 5089 y(n)m(ull)e(or)g(empt)m(y)-8
+b(,)27 b Fj(on)d Ft(\(case-insensitiv)m(e\),)29 b(or)24
+b(1.)39 b(An)m(y)25 b(other)f(v)-5 b(alue)25 b(results)f(in)g(the)g(v)
+-5 b(ariable)630 5198 y(b)s(eing)30 b(set)h(to)g(o\013.)630
+5340 y(A)f(great)i(deal)f(of)g(run-time)f(b)s(eha)m(vior)g(is)g(c)m
+(hangeable)j(with)d(the)g(follo)m(wing)i(v)-5 b(ariables.)p
+eop end
+%%Page: 5 9
+TeXDict begin 5 8 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(5)630 299 y Fs
+(active-region-start-colo)o(r)1110 408 y Ft(A)27 b(string)f(v)-5
+b(ariable)27 b(that)g(con)m(trols)h(the)f(text)g(color)h(and)e(bac)m
+(kground)g(when)1110 518 y(displa)m(ying)50 b(the)f(text)h(in)f(the)h
+(activ)m(e)h(region)f(\(see)g(the)g(description)f(of)1110
+628 y Fs(enable-active-region)25 b Ft(b)s(elo)m(w\).)43
+b(This)30 b(string)h(m)m(ust)f(not)h(tak)m(e)i(up)d(an)m(y)1110
+737 y(ph)m(ysical)25 b(c)m(haracter)h(p)s(ositions)f(on)g(the)f(displa)
+m(y)-8 b(,)27 b(so)e(it)g(should)f(consist)h(only)1110
+847 y(of)37 b(terminal)g(escap)s(e)g(sequences.)61 b(It)36
+b(is)h(output)g(to)g(the)g(terminal)g(b)s(efore)1110
+956 y(displa)m(ying)h(the)f(text)i(in)e(the)h(activ)m(e)h(region.)63
+b(This)37 b(v)-5 b(ariable)38 b(is)f(reset)h(to)1110
+1066 y(the)29 b(default)g(v)-5 b(alue)29 b(whenev)m(er)f(the)h
+(terminal)g(t)m(yp)s(e)g(c)m(hanges.)41 b(The)28 b(default)1110
+1176 y(v)-5 b(alue)30 b(is)f(the)g(string)g(that)h(puts)e(the)i
+(terminal)f(in)g(standout)g(mo)s(de,)g(as)h(ob-)1110
+1285 y(tained)40 b(from)f(the)h(terminal's)g(terminfo)g(description.)68
+b(A)40 b(sample)f(v)-5 b(alue)1110 1395 y(migh)m(t)31
+b(b)s(e)f(`)p Fs(\\e[01;33m)p Ft('.)630 1570 y Fs
+(active-region-end-color)1110 1680 y Ft(A)48 b(string)g(v)-5
+b(ariable)48 b(that)h Fs(")p Ft(undo)s(es)p Fs(")d Ft(the)i(e\013ects)h
+(of)f Fs(active-region-)1110 1789 y(start-color)36 b
+Ft(and)i(restores)h Fs(")p Ft(normal)p Fs(")f Ft(terminal)h(displa)m(y)
+g(app)s(earance)1110 1899 y(after)26 b(displa)m(ying)h(text)f(in)g(the)
+g(activ)m(e)i(region.)40 b(This)25 b(string)h(m)m(ust)f(not)h(tak)m(e)
+1110 2008 y(up)e(an)m(y)h(ph)m(ysical)h(c)m(haracter)h(p)s(ositions)d
+(on)h(the)h(displa)m(y)-8 b(,)27 b(so)e(it)g(should)f(con-)1110
+2118 y(sist)29 b(only)h(of)f(terminal)h(escap)s(e)f(sequences.)41
+b(It)29 b(is)g(output)g(to)h(the)f(terminal)1110 2228
+y(after)36 b(displa)m(ying)g(the)g(text)h(in)e(the)h(activ)m(e)i
+(region.)58 b(This)34 b(v)-5 b(ariable)37 b(is)f(re-)1110
+2337 y(set)e(to)g(the)g(default)g(v)-5 b(alue)34 b(whenev)m(er)f(the)h
+(terminal)g(t)m(yp)s(e)f(c)m(hanges.)51 b(The)1110 2447
+y(default)38 b(v)-5 b(alue)39 b(is)f(the)h(string)f(that)h(restores)f
+(the)h(terminal)f(from)g(stand-)1110 2556 y(out)30 b(mo)s(de,)f(as)g
+(obtained)h(from)f(the)g(terminal's)h(terminfo)f(description.)41
+b(A)1110 2666 y(sample)31 b(v)-5 b(alue)30 b(migh)m(t)h(b)s(e)f(`)p
+Fs(\\e[0m)p Ft('.)630 2841 y Fs(bell-style)1110 2951
+y Ft(Con)m(trols)44 b(what)g(happ)s(ens)e(when)h(Readline)i(w)m(an)m
+(ts)f(to)h(ring)e(the)h(termi-)1110 3061 y(nal)37 b(b)s(ell.)61
+b(If)37 b(set)h(to)g(`)p Fs(none)p Ft(',)g(Readline)g(nev)m(er)g(rings)
+e(the)i(b)s(ell.)61 b(If)36 b(set)i(to)1110 3170 y(`)p
+Fs(visible)p Ft(',)32 b(Readline)i(uses)f(a)g(visible)g(b)s(ell)g(if)g
+(one)g(is)g(a)m(v)-5 b(ailable.)51 b(If)33 b(set)g(to)1110
+3280 y(`)p Fs(audible)p Ft(')j(\(the)i(default\),)i(Readline)e
+(attempts)g(to)h(ring)e(the)g(terminal's)1110 3389 y(b)s(ell.)630
+3565 y Fs(bind-tty-special-chars)1110 3674 y Ft(If)e(set)g(to)h(`)p
+Fs(on)p Ft(')f(\(the)g(default\),)i(Readline)f(attempts)g(to)g(bind)d
+(the)i(con)m(trol)1110 3784 y(c)m(haracters)30 b(treated)g(sp)s
+(ecially)g(b)m(y)f(the)g(k)m(ernel's)h(terminal)f(driv)m(er)g(to)h
+(their)1110 3893 y(Readline)h(equiv)-5 b(alen)m(ts.)630
+4069 y Fs(blink-matching-paren)1110 4178 y Ft(If)36 b(set)g(to)h(`)p
+Fs(on)p Ft(',)h(Readline)f(attempts)g(to)g(brie\015y)e(mo)m(v)m(e)j
+(the)f(cursor)e(to)i(an)1110 4288 y(op)s(ening)k(paren)m(thesis)h(when)
+f(a)h(closing)h(paren)m(thesis)e(is)h(inserted.)74 b(The)1110
+4398 y(default)31 b(is)f(`)p Fs(off)p Ft('.)630 4573
+y Fs(colored-completion-prefi)o(x)1110 4682 y Ft(If)f(set)h(to)g(`)p
+Fs(on)p Ft(',)g(when)e(listing)i(completions,)h(Readline)f(displa)m(ys)
+g(the)f(com-)1110 4792 y(mon)c(pre\014x)f(of)i(the)f(set)h(of)g(p)s
+(ossible)f(completions)h(using)f(a)h(di\013eren)m(t)g(color.)1110
+4902 y(The)f(color)h(de\014nitions)f(are)h(tak)m(en)g(from)f(the)g(v)-5
+b(alue)26 b(of)g(the)f Fs(LS_COLORS)e Ft(en-)1110 5011
+y(vironmen)m(t)34 b(v)-5 b(ariable.)50 b(If)33 b(there)h(is)g(a)f
+(color)i(de\014nition)e(in)g Fs(LS_COLORS)e Ft(for)1110
+5121 y(the)22 b(custom)g(su\016x)f(`)p Fs(readline-colored-complet)o
+(ion)o(-pre)o(fix)p Ft(',)c(Read-)1110 5230 y(line)24
+b(uses)e(this)i(color)g(for)f(the)h(common)f(pre\014x)f(instead)i(of)f
+(its)h(default.)38 b(The)1110 5340 y(default)31 b(is)f(`)p
+Fs(off)p Ft('.)p eop end
+%%Page: 6 10
+TeXDict begin 6 9 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(6)630 299 y Fs(colored-stats)1110
+408 y Ft(If)26 b(set)h(to)g(`)p Fs(on)p Ft(',)h(Readline)f(displa)m(ys)
+g(p)s(ossible)f(completions)h(using)f(di\013eren)m(t)1110
+518 y(colors)40 b(to)g(indicate)g(their)f(\014le)h(t)m(yp)s(e.)67
+b(The)38 b(color)j(de\014nitions)d(are)i(tak)m(en)1110
+628 y(from)24 b(the)h(v)-5 b(alue)25 b(of)g(the)g Fs(LS_COLORS)d
+Ft(en)m(vironmen)m(t)j(v)-5 b(ariable.)40 b(The)24 b(default)1110
+737 y(is)30 b(`)p Fs(off)p Ft('.)630 925 y Fs(comment-begin)1110
+1035 y Ft(The)62 b(string)g(to)h(insert)f(at)h(the)g(b)s(eginning)e(of)
+h(the)h(line)f(when)g(the)1110 1144 y Fs(insert-comment)26
+b Ft(command)31 b(is)f(executed.)42 b(The)30 b(default)g(v)-5
+b(alue)31 b(is)f Fs("#")p Ft(.)630 1332 y Fs(completion-display-width)
+1110 1442 y Ft(The)41 b(n)m(um)m(b)s(er)f(of)i(screen)g(columns)f(used)
+g(to)h(displa)m(y)g(p)s(ossible)f(matc)m(hes)1110 1551
+y(when)28 b(p)s(erforming)g(completion.)41 b(The)29 b(v)-5
+b(alue)29 b(is)g(ignored)g(if)g(it)h(is)f(less)g(than)1110
+1661 y(0)e(or)f(greater)h(than)f(the)g(terminal)h(screen)f(width.)39
+b(A)26 b(v)-5 b(alue)27 b(of)f(0)h(will)f(cause)1110
+1771 y(matc)m(hes)32 b(to)f(b)s(e)e(displa)m(y)m(ed)i(one)g(p)s(er)e
+(line.)41 b(The)30 b(default)h(v)-5 b(alue)31 b(is)f(-1.)630
+1958 y Fs(completion-ignore-case)1110 2068 y Ft(If)d(set)h(to)g(`)p
+Fs(on)p Ft(',)g(Readline)g(p)s(erforms)e(\014lename)h(matc)m(hing)i
+(and)e(completion)1110 2178 y(in)j(a)h(case-insensitiv)m(e)i(fashion.)
+40 b(The)30 b(default)h(v)-5 b(alue)30 b(is)h(`)p Fs(off)p
+Ft('.)630 2365 y Fs(completion-map-case)1110 2475 y Ft(If)22
+b(set)g(to)h(`)p Fs(on)p Ft(',)h(and)e Fj(completion-ignore-case)31
+b Ft(is)22 b(enabled,)i(Readline)f(treats)1110 2585 y(h)m(yphens)29
+b(\(`)p Fs(-)p Ft('\))j(and)e(underscores)g(\(`)p Fs(_)p
+Ft('\))i(as)f(equiv)-5 b(alen)m(t)32 b(when)e(p)s(erforming)1110
+2694 y(case-insensitiv)m(e)47 b(\014lename)e(matc)m(hing)g(and)f
+(completion.)85 b(The)44 b(default)1110 2804 y(v)-5 b(alue)31
+b(is)f(`)p Fs(off)p Ft('.)630 2992 y Fs(completion-prefix-displa)o
+(y-le)o(ngth)1110 3101 y Ft(The)h(length)g(in)g(c)m(haracters)i(of)f
+(the)f(common)h(pre\014x)e(of)h(a)h(list)g(of)f(p)s(ossible)1110
+3211 y(completions)g(that)f(is)g(displa)m(y)m(ed)g(without)g(mo)s
+(di\014cation.)41 b(When)29 b(set)h(to)h(a)1110 3320
+y(v)-5 b(alue)26 b(greater)h(than)e(zero,)j(common)e(pre\014xes)e
+(longer)j(than)e(this)g(v)-5 b(alue)27 b(are)1110 3430
+y(replaced)k(with)f(an)g(ellipsis)h(when)e(displa)m(ying)i(p)s(ossible)
+f(completions.)630 3618 y Fs(completion-query-items)1110
+3727 y Ft(The)c(n)m(um)m(b)s(er)f(of)h(p)s(ossible)g(completions)h
+(that)g(determines)f(when)f(the)i(user)1110 3837 y(is)43
+b(ask)m(ed)g(whether)f(the)g(list)h(of)g(p)s(ossibilities)g(should)f(b)
+s(e)g(displa)m(y)m(ed.)77 b(If)1110 3947 y(the)29 b(n)m(um)m(b)s(er)f
+(of)h(p)s(ossible)g(completions)h(is)f(greater)h(than)f(or)g(equal)g
+(to)h(this)1110 4056 y(v)-5 b(alue,)45 b(Readline)e(will)f(ask)g
+(whether)f(or)h(not)g(the)g(user)f(wishes)g(to)i(view)1110
+4166 y(them;)33 b(otherwise,)f(they)g(are)g(simply)g(listed.)45
+b(This)31 b(v)-5 b(ariable)33 b(m)m(ust)e(b)s(e)g(set)1110
+4275 y(to)43 b(an)e(in)m(teger)j(v)-5 b(alue)42 b(greater)h(than)f(or)g
+(equal)g(to)h(zero.)76 b(A)42 b(zero)g(v)-5 b(alue)1110
+4385 y(means)40 b(Readline)h(should)f(nev)m(er)g(ask;)46
+b(negativ)m(e)d(v)-5 b(alues)41 b(are)f(treated)i(as)1110
+4495 y(zero.)g(The)29 b(default)i(limit)g(is)g Fs(100)p
+Ft(.)630 4682 y Fs(convert-meta)1110 4792 y Ft(If)22
+b(set)g(to)h(`)p Fs(on)p Ft(',)h(Readline)f(will)f(con)m(v)m(ert)i(c)m
+(haracters)f(with)f(the)g(eigh)m(th)h(bit)f(set)1110
+4902 y(to)33 b(an)e Fm(asci)r(i)h Ft(k)m(ey)h(sequence)f(b)m(y)g
+(stripping)f(the)h(eigh)m(th)h(bit)f(and)f(pre\014xing)1110
+5011 y(an)24 b Fs(ESC)g Ft(c)m(haracter,)j(con)m(v)m(erting)f(them)f
+(to)g(a)g(meta-pre\014xed)f(k)m(ey)h(sequence.)1110 5121
+y(The)i(default)h(v)-5 b(alue)28 b(is)f(`)p Fs(on)p Ft(',)i(but)d(will)
+i(b)s(e)f(set)h(to)g(`)p Fs(off)p Ft(')g(if)f(the)h(lo)s(cale)h(is)f
+(one)1110 5230 y(that)21 b(con)m(tains)h(eigh)m(t-bit)h(c)m(haracters.)
+39 b(This)20 b(v)-5 b(ariable)21 b(is)g(dep)s(enden)m(t)f(on)h(the)1110
+5340 y Fs(LC_CTYPE)26 b Ft(lo)s(cale)31 b(category)-8
+b(,)31 b(and)d(ma)m(y)h(c)m(hange)h(if)e(the)h(lo)s(cale)h(is)f(c)m
+(hanged.)p eop end
+%%Page: 7 11
+TeXDict begin 7 10 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(7)630 299 y Fs(disable-completion)
+1110 408 y Ft(If)36 b(set)h(to)h(`)p Fs(On)p Ft(',)g(Readline)f(will)g
+(inhibit)f(w)m(ord)h(completion.)60 b(Completion)1110
+518 y(c)m(haracters)28 b(will)e(b)s(e)f(inserted)h(in)m(to)h(the)g
+(line)f(as)g(if)g(they)h(had)e(b)s(een)g(mapp)s(ed)1110
+628 y(to)31 b Fs(self-insert)p Ft(.)38 b(The)30 b(default)g(is)h(`)p
+Fs(off)p Ft('.)630 774 y Fs(echo-control-characters)1110
+883 y Ft(When)f(set)h(to)g(`)p Fs(on)p Ft(',)f(on)g(op)s(erating)h
+(systems)f(that)h(indicate)g(they)g(supp)s(ort)1110 993
+y(it,)e(Readline)g(ec)m(ho)s(es)g(a)f(c)m(haracter)i(corresp)s(onding)d
+(to)i(a)f(signal)h(generated)1110 1103 y(from)h(the)g(k)m(eyb)s(oard.)
+41 b(The)30 b(default)g(is)h(`)p Fs(on)p Ft('.)630 1249
+y Fs(editing-mode)1110 1358 y Ft(The)d Fs(editing-mode)e
+Ft(v)-5 b(ariable)29 b(con)m(trols)h(whic)m(h)e(default)h(set)h(of)e(k)
+m(ey)i(bind-)1110 1468 y(ings)25 b(is)g(used.)38 b(By)26
+b(default,)g(Readline)g(starts)f(up)f(in)h(Emacs)g(editing)h(mo)s(de,)
+1110 1577 y(where)j(the)g(k)m(eystrok)m(es)i(are)e(most)h(similar)f(to)
+h(Emacs.)40 b(This)29 b(v)-5 b(ariable)30 b(can)1110
+1687 y(b)s(e)g(set)h(to)g(either)g(`)p Fs(emacs)p Ft(')e(or)h(`)p
+Fs(vi)p Ft('.)630 1833 y Fs(emacs-mode-string)1110 1943
+y Ft(If)j(the)h Fj(sho)m(w-mo)s(de-in-prompt)h Ft(v)-5
+b(ariable)35 b(is)e(enabled,)i(this)f(string)f(is)h(dis-)1110
+2052 y(pla)m(y)m(ed)24 b(immediately)g(b)s(efore)f(the)g(last)h(line)f
+(of)h(the)f(primary)f(prompt)g(when)1110 2162 y(emacs)g(editing)h(mo)s
+(de)e(is)h(activ)m(e.)40 b(The)21 b(v)-5 b(alue)22 b(is)g(expanded)f
+(lik)m(e)h(a)h(k)m(ey)f(bind-)1110 2271 y(ing,)27 b(so)f(the)f
+(standard)g(set)h(of)f(meta-)i(and)e(con)m(trol)i(pre\014xes)d(and)h
+(bac)m(kslash)1110 2381 y(escap)s(e)f(sequences)h(is)e(a)m(v)-5
+b(ailable.)41 b(Use)25 b(the)f(`)p Fs(\\1)p Ft(')f(and)h(`)p
+Fs(\\2)p Ft(')g(escap)s(es)g(to)g(b)s(egin)1110 2491
+y(and)37 b(end)g(sequences)h(of)f(non-prin)m(ting)h(c)m(haracters,)j
+(whic)m(h)c(can)h(b)s(e)f(used)1110 2600 y(to)h(em)m(b)s(ed)f(a)g
+(terminal)h(con)m(trol)h(sequence)f(in)m(to)g(the)f(mo)s(de)g(string.)
+61 b(The)1110 2710 y(default)31 b(is)f(`)p Fs(@)p Ft('.)630
+2856 y Fs(enable-active-region)1110 2966 y Ft(The)46
+b Fj(p)s(oin)m(t)j Ft(is)e(the)g(curren)m(t)f(cursor)g(p)s(osition,)52
+b(and)46 b Fj(mark)52 b Ft(refers)46 b(to)i(a)1110 3075
+y(sa)m(v)m(ed)37 b(cursor)f(p)s(osition)g(\(see)i(Section)f(1.4.1)h
+([Commands)d(F)-8 b(or)37 b(Mo)m(ving],)1110 3185 y(page)25
+b(17\).)40 b(The)24 b(text)h(b)s(et)m(w)m(een)g(the)g(p)s(oin)m(t)f
+(and)g(mark)g(is)g(referred)g(to)h(as)g(the)1110 3294
+y Fj(region)p Ft(.)62 b(When)37 b(this)g(v)-5 b(ariable)38
+b(is)f(set)h(to)g(`)p Fs(On)p Ft(',)h(Readline)f(allo)m(ws)g(certain)
+1110 3404 y(commands)f(to)h(designate)h(the)e(region)h(as)g
+Fj(activ)m(e)p Ft(.)64 b(When)37 b(the)h(region)g(is)1110
+3513 y(activ)m(e,)43 b(Readline)38 b(highligh)m(ts)h(the)g(text)g(in)e
+(the)i(region)g(using)e(the)h(v)-5 b(alue)1110 3623 y(of)35
+b(the)g Fs(active-region-start-color)p Ft(,)30 b(whic)m(h)35
+b(defaults)g(to)h(the)f(string)1110 3733 y(that)23 b(enables)f(the)g
+(terminal's)h(standout)e(mo)s(de.)38 b(The)21 b(activ)m(e)k(region)d
+(sho)m(ws)1110 3842 y(the)32 b(text)h(inserted)f(b)m(y)g(brac)m(k)m
+(eted-paste)i(and)e(an)m(y)g(matc)m(hing)h(text)g(found)1110
+3952 y(b)m(y)f(incremen)m(tal)i(and)e(non-incremen)m(tal)i(history)e
+(searc)m(hes.)48 b(The)32 b(default)1110 4061 y(is)e(`)p
+Fs(On)p Ft('.)630 4208 y Fs(enable-bracketed-paste)1110
+4317 y Ft(When)36 b(set)h(to)g(`)p Fs(On)p Ft(',)h(Readline)f
+(con\014gures)f(the)h(terminal)f(to)i(insert)e(eac)m(h)1110
+4427 y(paste)27 b(in)m(to)g(the)f(editing)h(bu\013er)e(as)h(a)h(single)
+g(string)f(of)g(c)m(haracters,)j(instead)1110 4536 y(of)d(treating)i
+(eac)m(h)g(c)m(haracter)f(as)g(if)f(it)h(had)f(b)s(een)f(read)i(from)e
+(the)i(k)m(eyb)s(oard.)1110 4646 y(This)36 b(is)h(called)h(putting)f
+(the)h(terminal)f(in)m(to)h Fj(brac)m(k)m(eted)h(paste)e(mo)s(de)5
+b Ft(;)40 b(it)1110 4756 y(prev)m(en)m(ts)30 b(Readline)h(from)e
+(executing)i(an)m(y)f(editing)h(commands)e(b)s(ound)f(to)1110
+4865 y(k)m(ey)j(sequences)g(app)s(earing)f(in)g(the)g(pasted)h(text.)42
+b(The)29 b(default)i(is)f(`)p Fs(On)p Ft('.)630 5011
+y Fs(enable-keypad)1110 5121 y Ft(When)23 b(set)h(to)g(`)p
+Fs(on)p Ft(',)h(Readline)f(will)g(try)f(to)h(enable)g(the)f
+(application)i(k)m(eypad)1110 5230 y(when)h(it)h(is)f(called.)41
+b(Some)27 b(systems)f(need)h(this)f(to)h(enable)g(the)g(arro)m(w)g(k)m
+(eys.)1110 5340 y(The)j(default)g(is)h(`)p Fs(off)p Ft('.)p
+eop end
+%%Page: 8 12
+TeXDict begin 8 11 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(8)630 299 y Fs(enable-meta-key)
+1110 408 y Ft(When)40 b(set)g(to)g(`)p Fs(on)p Ft(',)j(Readline)d(will)
+g(try)g(to)g(enable)g(an)m(y)g(meta)h(mo)s(di\014er)1110
+518 y(k)m(ey)i(the)e(terminal)i(claims)f(to)h(supp)s(ort)d(when)h(it)h
+(is)g(called.)76 b(On)41 b(man)m(y)1110 628 y(terminals,)c(the)e(meta)h
+(k)m(ey)g(is)f(used)g(to)h(send)e(eigh)m(t-bit)j(c)m(haracters.)56
+b(The)1110 737 y(default)31 b(is)f(`)p Fs(on)p Ft('.)630
+894 y Fs(expand-tilde)1110 1003 y Ft(If)d(set)h(to)h(`)p
+Fs(on)p Ft(',)f(tilde)g(expansion)g(is)f(p)s(erformed)f(when)h
+(Readline)h(attempts)1110 1113 y(w)m(ord)i(completion.)42
+b(The)30 b(default)g(is)h(`)p Fs(off)p Ft('.)630 1270
+y Fs(history-preserve-point)1110 1379 y Ft(If)41 b(set)h(to)h(`)p
+Fs(on)p Ft(',)i(the)c(history)h(co)s(de)g(attempts)h(to)f(place)h(the)f
+(p)s(oin)m(t)f(\(the)1110 1489 y(curren)m(t)35 b(cursor)g(p)s
+(osition\))g(at)h(the)g(same)f(lo)s(cation)i(on)e(eac)m(h)h(history)g
+(line)1110 1598 y(retriev)m(ed)h(with)f Fs(previous-history)c
+Ft(or)37 b Fs(next-history)p Ft(.)55 b(The)36 b(default)1110
+1708 y(is)30 b(`)p Fs(off)p Ft('.)630 1864 y Fs(history-size)1110
+1974 y Ft(Set)39 b(the)g(maxim)m(um)g(n)m(um)m(b)s(er)f(of)h(history)g
+(en)m(tries)h(sa)m(v)m(ed)g(in)f(the)g(history)1110 2084
+y(list.)51 b(If)34 b(set)g(to)h(zero,)g(an)m(y)f(existing)h(history)f
+(en)m(tries)g(are)g(deleted)h(and)e(no)1110 2193 y(new)e(en)m(tries)i
+(are)f(sa)m(v)m(ed.)46 b(If)31 b(set)h(to)h(a)f(v)-5
+b(alue)32 b(less)g(than)f(zero,)i(the)f(n)m(um)m(b)s(er)1110
+2303 y(of)f(history)f(en)m(tries)h(is)g(not)g(limited.)42
+b(By)30 b(default,)h(the)g(n)m(um)m(b)s(er)e(of)i(history)1110
+2412 y(en)m(tries)j(is)f(not)g(limited.)49 b(If)32 b(an)h(attempt)h(is)
+f(made)g(to)h(set)f Fj(history-size)39 b Ft(to)1110 2522
+y(a)34 b(non-n)m(umeric)f(v)-5 b(alue,)34 b(the)g(maxim)m(um)f(n)m(um)m
+(b)s(er)f(of)h(history)h(en)m(tries)g(will)1110 2632
+y(b)s(e)c(set)h(to)g(500.)630 2788 y Fs(horizontal-scroll-mode)1110
+2898 y Ft(This)k(v)-5 b(ariable)37 b(can)f(b)s(e)f(set)h(to)h(either)f
+(`)p Fs(on)p Ft(')g(or)g(`)p Fs(off)p Ft('.)57 b(Setting)36
+b(it)g(to)h(`)p Fs(on)p Ft(')1110 3007 y(means)26 b(that)h(the)f(text)h
+(of)g(the)f(lines)g(b)s(eing)g(edited)h(will)f(scroll)h(horizon)m
+(tally)1110 3117 y(on)32 b(a)g(single)g(screen)g(line)g(when)e(they)i
+(are)g(longer)h(than)e(the)h(width)f(of)h(the)1110 3226
+y(screen,)c(instead)g(of)f(wrapping)f(on)m(to)i(a)g(new)e(screen)i
+(line.)40 b(This)26 b(v)-5 b(ariable)28 b(is)1110 3336
+y(automatically)k(set)e(to)g(`)p Fs(on)p Ft(')f(for)g(terminals)g(of)h
+(heigh)m(t)g(1.)41 b(By)29 b(default,)h(this)1110 3446
+y(v)-5 b(ariable)31 b(is)g(set)f(to)i(`)p Fs(off)p Ft('.)630
+3602 y Fs(input-meta)1110 3712 y Ft(If)f(set)g(to)h(`)p
+Fs(on)p Ft(',)g(Readline)g(will)f(enable)h(eigh)m(t-bit)h(input)d(\(it)
+i(will)f(not)h(clear)1110 3821 y(the)40 b(eigh)m(th)g(bit)g(in)f(the)h
+(c)m(haracters)h(it)f(reads\),)j(regardless)c(of)h(what)g(the)1110
+3931 y(terminal)k(claims)h(it)f(can)g(supp)s(ort.)79
+b(The)44 b(default)g(v)-5 b(alue)44 b(is)g(`)p Fs(off)p
+Ft(',)j(but)1110 4041 y(Readline)24 b(will)h(set)f(it)g(to)h(`)p
+Fs(on)p Ft(')e(if)h(the)g(lo)s(cale)i(con)m(tains)f(eigh)m(t-bit)g(c)m
+(haracters.)1110 4150 y(The)k(name)g Fs(meta-flag)e Ft(is)i(a)h(synon)m
+(ym)f(for)g(this)g(v)-5 b(ariable.)42 b(This)28 b(v)-5
+b(ariable)1110 4260 y(is)35 b(dep)s(enden)m(t)f(on)h(the)g
+Fs(LC_CTYPE)e Ft(lo)s(cale)k(category)-8 b(,)39 b(and)34
+b(ma)m(y)i(c)m(hange)g(if)1110 4369 y(the)31 b(lo)s(cale)h(is)e(c)m
+(hanged.)630 4526 y Fs(isearch-terminators)1110 4635
+y Ft(The)51 b(string)h(of)g(c)m(haracters)h(that)f(should)e(terminate)j
+(an)f(incremen)m(tal)1110 4745 y(searc)m(h)25 b(without)g(subsequen)m
+(tly)g(executing)h(the)f(c)m(haracter)h(as)f(a)g(command)1110
+4855 y(\(see)45 b(Section)h(1.2.5)g([Searc)m(hing],)j(page)d(3\).)84
+b(If)44 b(this)g(v)-5 b(ariable)45 b(has)g(not)1110 4964
+y(b)s(een)35 b(giv)m(en)h(a)g(v)-5 b(alue,)37 b(the)f(c)m(haracters)h
+Fs(ESC)d Ft(and)h Fl(C-J)g Ft(will)h(terminate)g(an)1110
+5074 y(incremen)m(tal)c(searc)m(h.)630 5230 y Fs(keymap)192
+b Ft(Sets)64 b(Readline's)i(idea)f(of)f(the)h(curren)m(t)f(k)m(eymap)h
+(for)f(k)m(ey)h(binding)1110 5340 y(commands.)71 b(Built-in)41
+b Fs(keymap)e Ft(names)h(are)h Fs(emacs)p Ft(,)h Fs(emacs-standard)p
+Ft(,)p eop end
+%%Page: 9 13
+TeXDict begin 9 12 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(9)1110 299 y Fs(emacs-meta)p
+Ft(,)99 b Fs(emacs-ctlx)p Ft(,)f Fs(vi)p Ft(,)j Fs(vi-move)p
+Ft(,)f Fs(vi-command)p Ft(,)f(and)1110 408 y Fs(vi-insert)p
+Ft(.)81 b Fs(vi)44 b Ft(is)h(equiv)-5 b(alen)m(t)46 b(to)g
+Fs(vi-command)c Ft(\()p Fs(vi-move)h Ft(is)i(also)h(a)1110
+518 y(synon)m(ym\);)41 b Fs(emacs)c Ft(is)h(equiv)-5
+b(alen)m(t)39 b(to)f Fs(emacs-standard)p Ft(.)59 b(Applications)1110
+628 y(ma)m(y)32 b(add)e(additional)i(names.)43 b(The)30
+b(default)h(v)-5 b(alue)32 b(is)f Fs(emacs)p Ft(.)41
+b(The)30 b(v)-5 b(alue)1110 737 y(of)31 b(the)f Fs(editing-mode)d
+Ft(v)-5 b(ariable)31 b(also)h(a\013ects)f(the)g(default)g(k)m(eymap.)
+630 909 y Fs(keyseq-timeout)1110 1019 y Ft(Sp)s(eci\014es)25
+b(the)g(duration)g(Readline)h(will)g(w)m(ait)g(for)g(a)f(c)m(haracter)i
+(when)e(read-)1110 1129 y(ing)30 b(an)g(am)m(biguous)g(k)m(ey)h
+(sequence)f(\(one)g(that)h(can)f(form)g(a)g(complete)h(k)m(ey)1110
+1238 y(sequence)j(using)e(the)i(input)e(read)h(so)g(far,)h(or)g(can)f
+(tak)m(e)i(additional)f(input)1110 1348 y(to)g(complete)g(a)f(longer)h
+(k)m(ey)f(sequence\).)49 b(If)33 b(no)f(input)g(is)h(receiv)m(ed)h
+(within)1110 1457 y(the)43 b(timeout,)48 b(Readline)43
+b(will)g(use)g(the)g(shorter)g(but)f(complete)j(k)m(ey)e(se-)1110
+1567 y(quence.)c(Readline)26 b(uses)f(this)h(v)-5 b(alue)26
+b(to)g(determine)g(whether)f(or)g(not)h(input)1110 1677
+y(is)31 b(a)m(v)-5 b(ailable)33 b(on)d(the)h(curren)m(t)f(input)g
+(source)h(\()p Fs(rl_instream)d Ft(b)m(y)i(default\).)1110
+1786 y(The)25 b(v)-5 b(alue)26 b(is)f(sp)s(eci\014ed)f(in)h
+(milliseconds,)j(so)d(a)h(v)-5 b(alue)26 b(of)f(1000)i(means)e(that)
+1110 1896 y(Readline)e(will)g(w)m(ait)g(one)g(second)f(for)g
+(additional)i(input.)37 b(If)22 b(this)g(v)-5 b(ariable)23
+b(is)1110 2005 y(set)28 b(to)h(a)f(v)-5 b(alue)29 b(less)f(than)g(or)f
+(equal)i(to)f(zero,)i(or)e(to)g(a)h(non-n)m(umeric)e(v)-5
+b(alue,)1110 2115 y(Readline)30 b(will)f(w)m(ait)i(un)m(til)e(another)h
+(k)m(ey)g(is)f(pressed)g(to)h(decide)f(whic)m(h)g(k)m(ey)1110
+2225 y(sequence)i(to)g(complete.)42 b(The)30 b(default)g(v)-5
+b(alue)31 b(is)g Fs(500)p Ft(.)630 2397 y Fs(mark-directories)1110
+2506 y Ft(If)38 b(set)g(to)h(`)p Fs(on)p Ft(',)i(completed)e(directory)
+f(names)g(ha)m(v)m(e)i(a)e(slash)g(app)s(ended.)1110
+2616 y(The)30 b(default)g(is)h(`)p Fs(on)p Ft('.)630
+2788 y Fs(mark-modified-lines)1110 2898 y Ft(This)k(v)-5
+b(ariable,)38 b(when)d(set)h(to)h(`)p Fs(on)p Ft(',)g(causes)g
+(Readline)f(to)h(displa)m(y)f(an)f(as-)1110 3007 y(terisk)f(\(`)p
+Fs(*)p Ft('\))h(at)f(the)g(start)g(of)g(history)g(lines)g(whic)m(h)f
+(ha)m(v)m(e)i(b)s(een)e(mo)s(di\014ed.)1110 3117 y(This)d(v)-5
+b(ariable)31 b(is)f(`)p Fs(off)p Ft(')g(b)m(y)g(default.)630
+3289 y Fs(mark-symlinked-directori)o(es)1110 3399 y Ft(If)59
+b(set)h(to)g(`)p Fs(on)p Ft(',)67 b(completed)60 b(names)f(whic)m(h)g
+(are)h(sym)m(b)s(olic)g(links)f(to)1110 3508 y(directories)71
+b(ha)m(v)m(e)f(a)g(slash)f(app)s(ended)f(\(sub)5 b(ject)70
+b(to)g(the)g(v)-5 b(alue)70 b(of)1110 3618 y Fs(mark-directories)p
+Ft(\).)37 b(The)30 b(default)g(is)g(`)p Fs(off)p Ft('.)630
+3790 y Fs(match-hidden-files)1110 3900 y Ft(This)21 b(v)-5
+b(ariable,)25 b(when)d(set)g(to)h(`)p Fs(on)p Ft(',)h(causes)f
+(Readline)g(to)g(matc)m(h)g(\014les)f(whose)1110 4009
+y(names)44 b(b)s(egin)g(with)g(a)g(`)p Fs(.)p Ft(')g(\(hidden)f
+(\014les\))i(when)e(p)s(erforming)g(\014lename)1110 4119
+y(completion.)75 b(If)41 b(set)g(to)h(`)p Fs(off)p Ft(',)i(the)e
+(leading)g(`)p Fs(.)p Ft(')f(m)m(ust)g(b)s(e)g(supplied)f(b)m(y)1110
+4228 y(the)34 b(user)g(in)g(the)g(\014lename)g(to)h(b)s(e)f(completed.)
+53 b(This)33 b(v)-5 b(ariable)35 b(is)f(`)p Fs(on)p Ft(')g(b)m(y)1110
+4338 y(default.)630 4510 y Fs(menu-complete-display-pr)o(efix)1110
+4620 y Ft(If)f(set)h(to)g(`)p Fs(on)p Ft(',)h(men)m(u)e(completion)i
+(displa)m(ys)e(the)h(common)g(pre\014x)e(of)i(the)1110
+4729 y(list)k(of)g(p)s(ossible)f(completions)i(\(whic)m(h)e(ma)m(y)h(b)
+s(e)f(empt)m(y\))i(b)s(efore)e(cycling)1110 4839 y(through)30
+b(the)g(list.)42 b(The)29 b(default)i(is)f(`)p Fs(off)p
+Ft('.)630 5011 y Fs(output-meta)1110 5121 y Ft(If)35
+b(set)h(to)g(`)p Fs(on)p Ft(',)h(Readline)f(will)g(displa)m(y)f(c)m
+(haracters)i(with)e(the)h(eigh)m(th)g(bit)1110 5230 y(set)h(directly)g
+(rather)f(than)g(as)h(a)g(meta-pre\014xed)f(escap)s(e)h(sequence.)59
+b(The)1110 5340 y(default)26 b(is)f(`)p Fs(off)p Ft(',)i(but)e
+(Readline)h(will)g(set)g(it)g(to)h(`)p Fs(on)p Ft(')e(if)h(the)f(lo)s
+(cale)j(con)m(tains)p eop end
+%%Page: 10 14
+TeXDict begin 10 13 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(10)1110 299 y(eigh)m(t-bit)38
+b(c)m(haracters.)61 b(This)36 b(v)-5 b(ariable)37 b(is)g(dep)s(enden)m
+(t)e(on)h(the)h Fs(LC_CTYPE)1110 408 y Ft(lo)s(cale)32
+b(category)-8 b(,)33 b(and)d(ma)m(y)h(c)m(hange)g(if)g(the)f(lo)s(cale)
+i(is)f(c)m(hanged.)630 581 y Fs(page-completions)1110
+690 y Ft(If)i(set)i(to)f(`)p Fs(on)p Ft(',)h(Readline)g(uses)e(an)h(in)
+m(ternal)h Fs(more)p Ft(-lik)m(e)f(pager)g(to)h(displa)m(y)1110
+800 y(a)e(screenful)f(of)g(p)s(ossible)g(completions)i(at)f(a)g(time.)
+47 b(This)31 b(v)-5 b(ariable)34 b(is)e(`)p Fs(on)p Ft(')1110
+909 y(b)m(y)e(default.)630 1082 y Fs(print-completions-horizo)o(ntal)o
+(ly)1110 1191 y Ft(If)23 b(set)i(to)g(`)p Fs(on)p Ft(',)g(Readline)g
+(will)f(displa)m(y)g(completions)h(with)f(matc)m(hes)h(sorted)1110
+1301 y(horizon)m(tally)45 b(in)e(alphab)s(etical)i(order,)i(rather)c
+(than)g(do)m(wn)g(the)h(screen.)1110 1410 y(The)30 b(default)g(is)h(`)p
+Fs(off)p Ft('.)630 1583 y Fs(revert-all-at-newline)1110
+1692 y Ft(If)e(set)h(to)g(`)p Fs(on)p Ft(',)g(Readline)g(will)g(undo)f
+(all)h(c)m(hanges)h(to)f(history)g(lines)f(b)s(efore)1110
+1802 y(returning)f(when)f Fs(accept-line)f Ft(is)j(executed.)41
+b(By)29 b(default,)g(history)g(lines)1110 1911 y(ma)m(y)42
+b(b)s(e)g(mo)s(di\014ed)e(and)h(retain)i(individual)e(undo)g(lists)h
+(across)g(calls)h(to)1110 2021 y Fs(readline\(\))p Ft(.)38
+b(The)30 b(default)g(is)h(`)p Fs(off)p Ft('.)630 2193
+y Fs(show-all-if-ambiguous)1110 2303 y Ft(This)e(alters)i(the)f
+(default)g(b)s(eha)m(vior)g(of)g(the)h(completion)g(functions.)40
+b(If)29 b(set)1110 2412 y(to)f(`)p Fs(on)p Ft(',)g(w)m(ords)f(whic)m(h)
+g(ha)m(v)m(e)i(more)f(than)f(one)h(p)s(ossible)f(completion)h(cause)
+1110 2522 y(the)39 b(matc)m(hes)h(to)g(b)s(e)e(listed)h(immediately)i
+(instead)e(of)g(ringing)g(the)g(b)s(ell.)1110 2632 y(The)30
+b(default)g(v)-5 b(alue)31 b(is)g(`)p Fs(off)p Ft('.)630
+2804 y Fs(show-all-if-unmodified)1110 2913 y Ft(This)38
+b(alters)h(the)g(default)g(b)s(eha)m(vior)g(of)f(the)h(completion)h
+(functions)e(in)h(a)1110 3023 y(fashion)25 b(similar)h(to)g
+Fj(sho)m(w-all-if-am)m(biguous)p Ft(.)41 b(If)25 b(set)h(to)h(`)p
+Fs(on)p Ft(',)f(w)m(ords)f(whic)m(h)1110 3133 y(ha)m(v)m(e)32
+b(more)f(than)f(one)i(p)s(ossible)e(completion)i(without)f(an)m(y)g(p)s
+(ossible)f(par-)1110 3242 y(tial)43 b(completion)h(\(the)f(p)s(ossible)
+f(completions)h(don't)f(share)g(a)h(common)1110 3352
+y(pre\014x\))30 b(cause)g(the)h(matc)m(hes)g(to)g(b)s(e)f(listed)g
+(immediately)i(instead)e(of)h(ring-)1110 3461 y(ing)g(the)f(b)s(ell.)41
+b(The)30 b(default)g(v)-5 b(alue)31 b(is)f(`)p Fs(off)p
+Ft('.)630 3634 y Fs(show-mode-in-prompt)1110 3743 y Ft(If)24
+b(set)h(to)g(`)p Fs(on)p Ft(',)g(add)f(a)h(string)f(to)h(the)f(b)s
+(eginning)g(of)g(the)h(prompt)e(indicating)1110 3853
+y(the)33 b(editing)h(mo)s(de:)46 b(emacs,)35 b(vi)e(command,)h(or)f(vi)
+h(insertion.)49 b(The)32 b(mo)s(de)1110 3962 y(strings)45
+b(are)h(user-settable)g(\(e.g.,)51 b Fj(emacs-mo)s(de-string)8
+b Ft(\).)87 b(The)45 b(default)1110 4072 y(v)-5 b(alue)31
+b(is)f(`)p Fs(off)p Ft('.)630 4244 y Fs(skip-completed-text)1110
+4354 y Ft(If)i(set)i(to)f(`)p Fs(on)p Ft(',)h(this)f(alters)g(the)g
+(default)g(completion)h(b)s(eha)m(vior)f(when)f(in-)1110
+4463 y(serting)d(a)h(single)g(matc)m(h)f(in)m(to)h(the)g(line.)40
+b(It's)30 b(only)f(activ)m(e)i(when)d(p)s(erform-)1110
+4573 y(ing)k(completion)i(in)e(the)g(middle)g(of)g(a)h(w)m(ord.)46
+b(If)32 b(enabled,)g(Readline)h(do)s(es)1110 4682 y(not)41
+b(insert)f(c)m(haracters)i(from)e(the)h(completion)h(that)f(matc)m(h)g
+(c)m(haracters)1110 4792 y(after)c(p)s(oin)m(t)g(in)g(the)g(w)m(ord)f
+(b)s(eing)g(completed,)k(so)d(p)s(ortions)f(of)h(the)g(w)m(ord)1110
+4902 y(follo)m(wing)c(the)f(cursor)f(are)h(not)g(duplicated.)45
+b(F)-8 b(or)32 b(instance,)h(if)f(this)f(is)h(en-)1110
+5011 y(abled,)43 b(attempting)f(completion)g(when)d(the)i(cursor)f(is)g
+(after)h(the)g(`)p Fs(e)p Ft(')f(in)1110 5121 y(`)p Fs(Makefile)p
+Ft(')c(will)i(result)f(in)g(`)p Fs(Makefile)p Ft(')f(rather)h(than)h(`)
+p Fs(Makefilefile)p Ft(',)1110 5230 y(assuming)d(there)g(is)h(a)f
+(single)h(p)s(ossible)f(completion.)56 b(The)35 b(default)g(v)-5
+b(alue)1110 5340 y(is)30 b(`)p Fs(off)p Ft('.)p eop end
+%%Page: 11 15
+TeXDict begin 11 14 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(11)630 299 y Fs
+(vi-cmd-mode-string)1110 408 y Ft(If)33 b(the)h Fj(sho)m(w-mo)s
+(de-in-prompt)h Ft(v)-5 b(ariable)35 b(is)e(enabled,)i(this)f(string)f
+(is)h(dis-)1110 518 y(pla)m(y)m(ed)24 b(immediately)g(b)s(efore)f(the)g
+(last)h(line)f(of)h(the)f(primary)f(prompt)g(when)1110
+628 y(vi)32 b(editing)h(mo)s(de)f(is)g(activ)m(e)j(and)c(in)h(command)g
+(mo)s(de.)46 b(The)31 b(v)-5 b(alue)33 b(is)f(ex-)1110
+737 y(panded)26 b(lik)m(e)i(a)f(k)m(ey)h(binding,)e(so)i(the)f
+(standard)f(set)h(of)g(meta-)h(and)e(con)m(trol)1110
+847 y(pre\014xes)34 b(and)g(bac)m(kslash)i(escap)s(e)g(sequences)f(is)g
+(a)m(v)-5 b(ailable.)57 b(Use)35 b(the)g(`)p Fs(\\1)p
+Ft(')1110 956 y(and)23 b(`)p Fs(\\2)p Ft(')h(escap)s(es)h(to)f(b)s
+(egin)g(and)f(end)g(sequences)i(of)f(non-prin)m(ting)f(c)m(harac-)1110
+1066 y(ters,)31 b(whic)m(h)g(can)g(b)s(e)f(used)g(to)h(em)m(b)s(ed)f(a)
+h(terminal)h(con)m(trol)g(sequence)f(in)m(to)1110 1176
+y(the)g(mo)s(de)f(string.)40 b(The)30 b(default)h(is)f(`)p
+Fs(\(cmd\))p Ft('.)630 1340 y Fs(vi-ins-mode-string)1110
+1450 y Ft(If)j(the)h Fj(sho)m(w-mo)s(de-in-prompt)h Ft(v)-5
+b(ariable)35 b(is)e(enabled,)i(this)f(string)f(is)h(dis-)1110
+1559 y(pla)m(y)m(ed)24 b(immediately)g(b)s(efore)f(the)g(last)h(line)f
+(of)h(the)f(primary)f(prompt)g(when)1110 1669 y(vi)35
+b(editing)h(mo)s(de)e(is)i(activ)m(e)h(and)d(in)h(insertion)g(mo)s(de.)
+54 b(The)35 b(v)-5 b(alue)35 b(is)g(ex-)1110 1778 y(panded)26
+b(lik)m(e)i(a)f(k)m(ey)h(binding,)e(so)i(the)f(standard)f(set)h(of)g
+(meta-)h(and)e(con)m(trol)1110 1888 y(pre\014xes)34 b(and)g(bac)m
+(kslash)i(escap)s(e)g(sequences)f(is)g(a)m(v)-5 b(ailable.)57
+b(Use)35 b(the)g(`)p Fs(\\1)p Ft(')1110 1998 y(and)23
+b(`)p Fs(\\2)p Ft(')h(escap)s(es)h(to)f(b)s(egin)g(and)f(end)g
+(sequences)i(of)f(non-prin)m(ting)f(c)m(harac-)1110 2107
+y(ters,)31 b(whic)m(h)g(can)g(b)s(e)f(used)g(to)h(em)m(b)s(ed)f(a)h
+(terminal)h(con)m(trol)g(sequence)f(in)m(to)1110 2217
+y(the)g(mo)s(de)f(string.)40 b(The)30 b(default)h(is)f(`)p
+Fs(\(ins\))p Ft('.)630 2381 y Fs(visible-stats)1110 2491
+y Ft(If)h(set)i(to)f(`)p Fs(on)p Ft(',)h(a)f(c)m(haracter)i(denoting)e
+(a)g(\014le's)g(t)m(yp)s(e)g(is)g(app)s(ended)e(to)j(the)1110
+2600 y(\014lename)e(when)e(listing)i(p)s(ossible)f(completions.)42
+b(The)30 b(default)g(is)h(`)p Fs(off)p Ft('.)150 2765
+y(Key)f(Bindings)630 2874 y(The)41 b(syn)m(tax)i(for)f(con)m(trolling)h
+(k)m(ey)g(bindings)e(in)h(the)g(init)g(\014le)g(is)g(simple.)75
+b(First)43 b(y)m(ou)630 2984 y(need)27 b(to)i(\014nd)d(the)i(name)f(of)
+h(the)g(command)f(that)i(y)m(ou)f(w)m(an)m(t)g(to)g(c)m(hange.)41
+b(The)27 b(follo)m(wing)630 3093 y(sections)37 b(con)m(tain)g(tables)g
+(of)f(the)g(command)f(name,)j(the)e(default)g(k)m(eybinding,)h(if)f(an)
+m(y)-8 b(,)630 3203 y(and)30 b(a)h(short)f(description)g(of)h(what)f
+(the)g(command)h(do)s(es.)630 3340 y(Once)36 b(y)m(ou)g(kno)m(w)g(the)g
+(name)g(of)g(the)g(command,)h(simply)f(place)h(on)e(a)i(line)f(in)g
+(the)g(init)630 3450 y(\014le)e(the)g(name)f(of)h(the)g(k)m(ey)g(y)m
+(ou)g(wish)f(to)h(bind)f(the)h(command)f(to,)i(a)f(colon,)i(and)d(then)
+630 3559 y(the)f(name)h(of)f(the)g(command.)46 b(There)32
+b(can)g(b)s(e)g(no)g(space)g(b)s(et)m(w)m(een)h(the)f(k)m(ey)h(name)g
+(and)630 3669 y(the)41 b(colon)h({)f(that)g(will)g(b)s(e)g(in)m
+(terpreted)g(as)g(part)f(of)h(the)g(k)m(ey)h(name.)72
+b(The)40 b(name)h(of)630 3778 y(the)35 b(k)m(ey)g(can)g(b)s(e)f
+(expressed)f(in)i(di\013eren)m(t)g(w)m(a)m(ys,)h(dep)s(ending)d(on)h
+(what)h(y)m(ou)g(\014nd)e(most)630 3888 y(comfortable.)630
+4025 y(In)g(addition)h(to)g(command)g(names,)g(Readline)g(allo)m(ws)h
+(k)m(eys)g(to)f(b)s(e)f(b)s(ound)f(to)i(a)g(string)630
+4134 y(that)d(is)f(inserted)h(when)e(the)i(k)m(ey)g(is)f(pressed)g(\(a)
+h Fj(macro)5 b Ft(\).)630 4299 y Fj(k)m(eyname)g Ft(:)42
+b Fj(function-name)35 b Ft(or)c Fj(macro)1110 4408 y(k)m(eyname)k
+Ft(is)29 b(the)f(name)h(of)g(a)g(k)m(ey)h(sp)s(elled)e(out)h(in)g
+(English.)39 b(F)-8 b(or)30 b(example:)1350 4545 y Fs(Control-u:)45
+b(universal-argument)1350 4655 y(Meta-Rubout:)f(backward-kill-word)1350
+4765 y(Control-o:)h(">)i(output")1110 4902 y Ft(In)94
+b(the)g(example)h(ab)s(o)m(v)m(e,)112 b Fl(C-u)94 b Ft(is)g(b)s(ound)f
+(to)i(the)f(function)1110 5011 y Fs(universal-argument)p
+Ft(,)124 b Fl(M-DEL)107 b Ft(is)i(b)s(ound)e(to)j(the)f(function)1110
+5121 y Fs(backward-kill-word)p Ft(,)75 b(and)69 b Fl(C-o)g
+Ft(is)h(b)s(ound)e(to)j(run)d(the)i(macro)1110 5230 y(expressed)45
+b(on)h(the)g(righ)m(t)g(hand)e(side)i(\(that)h(is,)i(to)e(insert)e(the)
+h(text)h(`)p Fs(>)1110 5340 y(output)p Ft(')29 b(in)m(to)i(the)g
+(line\).)p eop end
+%%Page: 12 16
+TeXDict begin 12 15 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(12)1110 299 y(A)62
+b(n)m(um)m(b)s(er)e(of)i(sym)m(b)s(olic)h(c)m(haracter)g(names)f(are)g
+(recognized)h(while)1110 408 y(pro)s(cessing)40 b(this)f(k)m(ey)i
+(binding)e(syn)m(tax:)60 b Fj(DEL)p Ft(,)42 b Fj(ESC)p
+Ft(,)g Fj(ESCAPE)p Ft(,)f Fj(LFD)p Ft(,)1110 518 y Fj(NEWLINE)p
+Ft(,)31 b Fj(RET)p Ft(,)f Fj(RETURN)p Ft(,)g Fj(R)m(UBOUT)p
+Ft(,)h Fj(SP)-8 b(A)m(CE)p Ft(,)31 b Fj(SPC)p Ft(,)e(and)h
+Fj(T)-8 b(AB)p Ft(.)630 677 y Fs(")p Fj(k)m(eyseq)r Fs(")p
+Ft(:)41 b Fj(function-name)36 b Ft(or)30 b Fj(macro)1110
+787 y(k)m(eyseq)k Ft(di\013ers)d(from)f Fj(k)m(eyname)37
+b Ft(ab)s(o)m(v)m(e)32 b(in)f(that)h(strings)f(denoting)g(an)g(en-)1110
+896 y(tire)j(k)m(ey)h(sequence)f(can)g(b)s(e)f(sp)s(eci\014ed,)h(b)m(y)
+f(placing)i(the)f(k)m(ey)g(sequence)g(in)1110 1006 y(double)29
+b(quotes.)41 b(Some)29 b Fm(gnu)h Ft(Emacs)f(st)m(yle)i(k)m(ey)f(escap)
+s(es)g(can)g(b)s(e)f(used,)g(as)1110 1115 y(in)k(the)h(follo)m(wing)i
+(example,)f(but)e(the)h(sp)s(ecial)h(c)m(haracter)g(names)f(are)g(not)
+1110 1225 y(recognized.)1350 1359 y Fs("\\C-u":)46 b
+(universal-argument)1350 1469 y("\\C-x\\C-r":)f(re-read-init-file)1350
+1578 y("\\e[11~":)g("Function)h(Key)g(1")1110 1713 y
+Ft(In)64 b(the)g(ab)s(o)m(v)m(e)i(example,)74 b Fl(C-u)64
+b Ft(is)g(again)i(b)s(ound)c(to)k(the)e(function)1110
+1822 y Fs(universal-argument)39 b Ft(\(just)k(as)h(it)g(w)m(as)g(in)g
+(the)f(\014rst)g(example\),)49 b(`)p Fl(C-x)1110 1932
+y(C-r)p Ft(')30 b(is)g(b)s(ound)e(to)j(the)g(function)f
+Fs(re-read-init-file)p Ft(,)c(and)j(`)p Fs(ESC)h([)g(1)g(1)1110
+2041 y(~)p Ft(')g(is)h(b)s(ound)d(to)j(insert)f(the)h(text)g(`)p
+Fs(Function)e(Key)g(1)p Ft('.)630 2200 y(The)g(follo)m(wing)i
+Fm(gnu)f Ft(Emacs)g(st)m(yle)h(escap)s(e)f(sequences)g(are)g(a)m(v)-5
+b(ailable)32 b(when)d(sp)s(ecifying)630 2310 y(k)m(ey)i(sequences:)630
+2469 y Fl(\\C-)336 b Ft(con)m(trol)32 b(pre\014x)630
+2628 y Fl(\\M-)336 b Ft(meta)31 b(pre\014x)630 2787 y
+Fl(\\e)384 b Ft(an)30 b(escap)s(e)h(c)m(haracter)630
+2945 y Fl(\\\\)384 b Ft(bac)m(kslash)630 3104 y Fl(\\)p
+Fs(")g(")p Ft(,)30 b(a)h(double)f(quotation)i(mark)630
+3263 y Fl(\\')384 b Fs(')p Ft(,)30 b(a)h(single)g(quote)g(or)f(ap)s
+(ostrophe)630 3422 y(In)d(addition)h(to)g(the)g Fm(gnu)f
+Ft(Emacs)h(st)m(yle)h(escap)s(e)f(sequences,)h(a)f(second)f(set)h(of)g
+(bac)m(kslash)630 3532 y(escap)s(es)j(is)f(a)m(v)-5 b(ailable:)630
+3691 y Fs(\\a)384 b Ft(alert)31 b(\(b)s(ell\))630 3850
+y Fs(\\b)384 b Ft(bac)m(kspace)630 4008 y Fs(\\d)g Ft(delete)630
+4167 y Fs(\\f)g Ft(form)30 b(feed)630 4326 y Fs(\\n)384
+b Ft(newline)630 4485 y Fs(\\r)g Ft(carriage)32 b(return)630
+4644 y Fs(\\t)384 b Ft(horizon)m(tal)32 b(tab)630 4803
+y Fs(\\v)384 b Ft(v)m(ertical)32 b(tab)630 4962 y Fs(\\)p
+Fl(nnn)288 b Ft(the)35 b(eigh)m(t-bit)h(c)m(haracter)g(whose)e(v)-5
+b(alue)35 b(is)g(the)f(o)s(ctal)i(v)-5 b(alue)35 b Fj(nnn)e
+Ft(\(one)i(to)1110 5071 y(three)c(digits\))630 5230 y
+Fs(\\x)p Fl(HH)288 b Ft(the)38 b(eigh)m(t-bit)i(c)m(haracter)g(whose)e
+(v)-5 b(alue)39 b(is)f(the)h(hexadecimal)g(v)-5 b(alue)39
+b Fj(HH)1110 5340 y Ft(\(one)31 b(or)f(t)m(w)m(o)i(hex)e(digits\))p
+eop end
+%%Page: 13 17
+TeXDict begin 13 16 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(13)630 299 y(When)37
+b(en)m(tering)h(the)g(text)g(of)g(a)g(macro,)i(single)e(or)f(double)g
+(quotes)h(m)m(ust)f(b)s(e)g(used)f(to)630 408 y(indicate)23
+b(a)e(macro)h(de\014nition.)38 b(Unquoted)21 b(text)i(is)e(assumed)g
+(to)h(b)s(e)f(a)h(function)f(name.)38 b(In)630 518 y(the)22
+b(macro)f(b)s(o)s(dy)-8 b(,)23 b(the)e(bac)m(kslash)h(escap)s(es)g
+(describ)s(ed)e(ab)s(o)m(v)m(e)j(are)e(expanded.)37 b(Bac)m(kslash)630
+628 y(will)j(quote)h(an)m(y)f(other)g(c)m(haracter)i(in)d(the)i(macro)f
+(text,)k(including)39 b(`)p Fs(")p Ft(')h(and)g(`)p Fs(')p
+Ft('.)69 b(F)-8 b(or)630 737 y(example,)28 b(the)e(follo)m(wing)h
+(binding)d(will)i(mak)m(e)h(`)p Fl(C-x)j Fs(\\)p Ft(')c(insert)f(a)h
+(single)h(`)p Fs(\\)p Ft(')f(in)m(to)g(the)g(line:)870
+873 y Fs("\\C-x\\\\":)45 b("\\\\")150 1073 y Fi(1.3.2)63
+b(Conditional)41 b(Init)g(Constructs)150 1220 y Ft(Readline)c(implemen)
+m(ts)g(a)h(facilit)m(y)g(similar)f(in)g(spirit)f(to)i(the)f
+(conditional)h(compilation)g(features)f(of)150 1330 y(the)31
+b(C)f(prepro)s(cessor)g(whic)m(h)g(allo)m(ws)i(k)m(ey)g(bindings)d(and)
+h(v)-5 b(ariable)32 b(settings)f(to)h(b)s(e)e(p)s(erformed)f(as)i(the)
+150 1440 y(result)f(of)h(tests.)41 b(There)30 b(are)h(four)f(parser)f
+(directiv)m(es)j(used.)150 1601 y Fs($if)336 b Ft(The)31
+b Fs($if)f Ft(construct)i(allo)m(ws)h(bindings)d(to)i(b)s(e)e(made)i
+(based)f(on)g(the)g(editing)h(mo)s(de,)g(the)630 1711
+y(terminal)37 b(b)s(eing)f(used,)h(or)f(the)h(application)g(using)f
+(Readline.)59 b(The)36 b(text)h(of)f(the)h(test,)630
+1821 y(after)30 b(an)m(y)g(comparison)g(op)s(erator,)g(extends)f(to)h
+(the)g(end)f(of)h(the)f(line;)i(unless)e(otherwise)630
+1930 y(noted,)i(no)f(c)m(haracters)i(are)f(required)e(to)i(isolate)i
+(it.)630 2091 y Fs(mode)288 b Ft(The)30 b Fs(mode=)e
+Ft(form)i(of)g(the)h Fs($if)e Ft(directiv)m(e)j(is)e(used)f(to)i(test)g
+(whether)e(Read-)1110 2201 y(line)44 b(is)f(in)g Fs(emacs)f
+Ft(or)h Fs(vi)g Ft(mo)s(de.)79 b(This)42 b(ma)m(y)i(b)s(e)e(used)h(in)g
+(conjunction)1110 2311 y(with)c(the)h(`)p Fs(set)29 b(keymap)p
+Ft(')38 b(command,)k(for)d(instance,)j(to)e(set)g(bindings)e(in)1110
+2420 y(the)32 b Fs(emacs-standard)c Ft(and)j Fs(emacs-ctlx)d
+Ft(k)m(eymaps)k(only)g(if)g(Readline)g(is)1110 2530 y(starting)f(out)g
+(in)f Fs(emacs)f Ft(mo)s(de.)630 2691 y Fs(term)288 b
+Ft(The)26 b Fs(term=)g Ft(form)g(ma)m(y)i(b)s(e)e(used)g(to)i(include)f
+(terminal-sp)s(eci\014c)g(k)m(ey)h(bind-)1110 2800 y(ings,)38
+b(p)s(erhaps)c(to)j(bind)e(the)h(k)m(ey)h(sequences)f(output)g(b)m(y)g
+(the)g(terminal's)1110 2910 y(function)24 b(k)m(eys.)39
+b(The)23 b(w)m(ord)h(on)f(the)i(righ)m(t)f(side)g(of)g(the)g(`)p
+Fs(=)p Ft(')g(is)g(tested)h(against)1110 3020 y(b)s(oth)k(the)h(full)g
+(name)g(of)g(the)g(terminal)h(and)e(the)i(p)s(ortion)e(of)h(the)g
+(terminal)1110 3129 y(name)k(b)s(efore)f(the)g(\014rst)g(`)p
+Fs(-)p Ft('.)50 b(This)33 b(allo)m(ws)i Fs(sun)e Ft(to)h(matc)m(h)g(b)s
+(oth)f Fs(sun)g Ft(and)1110 3239 y Fs(sun-cmd)p Ft(,)c(for)h(instance.)
+630 3400 y Fs(version)144 b Ft(The)44 b Fs(version)f
+Ft(test)i(ma)m(y)h(b)s(e)e(used)f(to)j(p)s(erform)d(comparisons)i
+(against)1110 3509 y(sp)s(eci\014c)c(Readline)i(v)m(ersions.)74
+b(The)42 b Fs(version)d Ft(expands)i(to)h(the)g(curren)m(t)1110
+3619 y(Readline)25 b(v)m(ersion.)39 b(The)23 b(set)h(of)g(comparison)h
+(op)s(erators)f(includes)f(`)p Fs(=)p Ft(')h(\(and)1110
+3729 y(`)p Fs(==)p Ft('\),)33 b(`)p Fs(!=)p Ft(',)f(`)p
+Fs(<=)p Ft(',)h(`)p Fs(>=)p Ft(',)f(`)p Fs(<)p Ft(',)h(and)e(`)p
+Fs(>)p Ft('.)46 b(The)31 b(v)m(ersion)i(n)m(um)m(b)s(er)d(supplied)h
+(on)1110 3838 y(the)j(righ)m(t)h(side)f(of)g(the)g(op)s(erator)g
+(consists)h(of)f(a)g(ma)5 b(jor)35 b(v)m(ersion)f(n)m(um)m(b)s(er,)1110
+3948 y(an)45 b(optional)i(decimal)f(p)s(oin)m(t,)k(and)44
+b(an)i(optional)g(minor)f(v)m(ersion)h(\(e.g.,)1110 4057
+y(`)p Fs(7.1)p Ft('\).)40 b(If)27 b(the)h(minor)f(v)m(ersion)h(is)g
+(omitted,)h(it)f(is)g(assumed)f(to)h(b)s(e)f(`)p Fs(0)p
+Ft('.)40 b(The)1110 4167 y(op)s(erator)34 b(ma)m(y)g(b)s(e)f(separated)
+g(from)g(the)h(string)f Fs(version)f Ft(and)h(from)g(the)1110
+4276 y(v)m(ersion)39 b(n)m(um)m(b)s(er)f(argumen)m(t)h(b)m(y)f
+(whitespace.)67 b(The)38 b(follo)m(wing)i(example)1110
+4386 y(sets)31 b(a)g(v)-5 b(ariable)31 b(if)f(the)h(Readline)g(v)m
+(ersion)f(b)s(eing)g(used)g(is)g(7.0)i(or)e(new)m(er:)1350
+4521 y Fs($if)47 b(version)f(>=)h(7.0)1350 4631 y(set)g
+(show-mode-in-prompt)42 b(on)1350 4741 y($endif)630 4902
+y(application)1110 5011 y Ft(The)21 b Fj(application)j
+Ft(construct)e(is)g(used)f(to)i(include)f(application-sp)s(eci\014c)h
+(set-)1110 5121 y(tings.)39 b(Eac)m(h)26 b(program)e(using)g(the)h
+(Readline)g(library)g(sets)g(the)g Fj(application)1110
+5230 y(name)p Ft(,)g(and)e(y)m(ou)g(can)h(test)g(for)f(a)g(particular)h
+(v)-5 b(alue.)39 b(This)22 b(could)h(b)s(e)g(used)f(to)1110
+5340 y(bind)32 b(k)m(ey)h(sequences)g(to)h(functions)e(useful)g(for)h
+(a)g(sp)s(eci\014c)f(program.)48 b(F)-8 b(or)p eop end
+%%Page: 14 18
+TeXDict begin 14 17 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(14)1110 299 y(instance,)35
+b(the)e(follo)m(wing)h(command)f(adds)f(a)i(k)m(ey)f(sequence)h(that)f
+(quotes)1110 408 y(the)e(curren)m(t)f(or)g(previous)g(w)m(ord)g(in)g
+(Bash:)1350 543 y Fs($if)47 b(Bash)1350 653 y(#)g(Quote)g(the)g
+(current)f(or)h(previous)e(word)1350 762 y("\\C-xq":)h
+("\\eb\\"\\ef\\"")1350 872 y($endif)630 1031 y(variable)96
+b Ft(The)33 b Fj(v)-5 b(ariable)39 b Ft(construct)33
+b(pro)m(vides)g(simple)g(equalit)m(y)i(tests)e(for)g(Readline)1110
+1141 y(v)-5 b(ariables)32 b(and)f(v)-5 b(alues.)45 b(The)32
+b(p)s(ermitted)f(comparison)h(op)s(erators)f(are)i(`)p
+Fs(=)p Ft(',)1110 1250 y(`)p Fs(==)p Ft(',)49 b(and)44
+b(`)p Fs(!=)p Ft('.)85 b(The)44 b(v)-5 b(ariable)46 b(name)f(m)m(ust)g
+(b)s(e)g(separated)g(from)g(the)1110 1360 y(comparison)25
+b(op)s(erator)g(b)m(y)g(whitespace;)j(the)d(op)s(erator)g(ma)m(y)g(b)s
+(e)f(separated)1110 1469 y(from)33 b(the)h(v)-5 b(alue)35
+b(on)f(the)g(righ)m(t)g(hand)f(side)h(b)m(y)f(whitespace.)52
+b(Both)35 b(string)1110 1579 y(and)i(b)s(o)s(olean)g(v)-5
+b(ariables)38 b(ma)m(y)h(b)s(e)d(tested.)63 b(Bo)s(olean)39
+b(v)-5 b(ariables)38 b(m)m(ust)g(b)s(e)1110 1689 y(tested)46
+b(against)g(the)f(v)-5 b(alues)46 b Fj(on)f Ft(and)f
+Fj(o\013)p Ft(.)85 b(The)45 b(follo)m(wing)h(example)g(is)1110
+1798 y(equiv)-5 b(alen)m(t)32 b(to)f(the)f Fs(mode=emacs)e
+Ft(test)j(describ)s(ed)f(ab)s(o)m(v)m(e:)1350 1933 y
+Fs($if)47 b(editing-mode)d(==)k(emacs)1350 2042 y(set)f
+(show-mode-in-prompt)42 b(on)1350 2152 y($endif)150 2311
+y($endif)192 b Ft(This)29 b(command,)i(as)f(seen)h(in)f(the)g(previous)
+g(example,)h(terminates)g(an)g Fs($if)e Ft(command.)150
+2471 y Fs($else)240 b Ft(Commands)29 b(in)h(this)h(branc)m(h)e(of)i
+(the)f Fs($if)g Ft(directiv)m(e)i(are)f(executed)g(if)f(the)h(test)g
+(fails.)150 2630 y Fs($include)96 b Ft(This)43 b(directiv)m(e)i(tak)m
+(es)g(a)e(single)i(\014lename)e(as)h(an)f(argumen)m(t)h(and)f(reads)g
+(commands)630 2740 y(and)38 b(bindings)f(from)h(that)i(\014le.)65
+b(F)-8 b(or)39 b(example,)j(the)d(follo)m(wing)h(directiv)m(e)g(reads)e
+(from)630 2849 y Fs(/etc/inputrc)p Ft(:)870 2984 y Fs($include)46
+b(/etc/inputrc)150 3183 y Fi(1.3.3)63 b(Sample)41 b(Init)g(File)150
+3330 y Ft(Here)27 b(is)f(an)h(example)g(of)f(an)h Fj(inputrc)k
+Ft(\014le.)39 b(This)26 b(illustrates)h(k)m(ey)h(binding,)e(v)-5
+b(ariable)27 b(assignmen)m(t,)i(and)150 3440 y(conditional)j(syn)m
+(tax.)p eop end
+%%Page: 15 19
+TeXDict begin 15 18 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(15)390 408 y Fs(#)47
+b(This)g(file)g(controls)e(the)i(behaviour)e(of)j(line)e(input)h
+(editing)e(for)390 518 y(#)i(programs)f(that)h(use)g(the)f(GNU)h
+(Readline)f(library.)93 b(Existing)390 628 y(#)47 b(programs)f(include)
+g(FTP,)g(Bash,)h(and)g(GDB.)390 737 y(#)390 847 y(#)g(You)g(can)g
+(re-read)f(the)h(inputrc)f(file)g(with)h(C-x)g(C-r.)390
+956 y(#)g(Lines)g(beginning)e(with)i('#')g(are)g(comments.)390
+1066 y(#)390 1176 y(#)g(First,)g(include)e(any)i(system-wide)e
+(bindings)h(and)g(variable)390 1285 y(#)h(assignments)e(from)i
+(/etc/Inputrc)390 1395 y($include)f(/etc/Inputrc)390
+1614 y(#)390 1724 y(#)h(Set)g(various)f(bindings)g(for)h(emacs)f(mode.)
+390 1943 y(set)h(editing-mode)d(emacs)390 2162 y($if)j(mode=emacs)390
+2381 y(Meta-Control-h:)91 b(backward-kill-word)43 b(Text)k(after)f(the)
+h(function)f(name)g(is)h(ignored)p 3970 2401 42 76 v
+390 2600 a(#)390 2710 y(#)g(Arrow)g(keys)f(in)i(keypad)e(mode)390
+2819 y(#)390 2929 y(#"\\M-OD":)379 b(backward-char)390
+3039 y(#"\\M-OC":)g(forward-char)390 3148 y(#"\\M-OA":)g
+(previous-history)390 3258 y(#"\\M-OB":)g(next-history)390
+3367 y(#)390 3477 y(#)47 b(Arrow)g(keys)f(in)i(ANSI)e(mode)390
+3587 y(#)390 3696 y("\\M-[D":)380 b(backward-char)390
+3806 y("\\M-[C":)g(forward-char)390 3915 y("\\M-[A":)g
+(previous-history)390 4025 y("\\M-[B":)g(next-history)390
+4134 y(#)390 4244 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(keypad)f(mode)
+390 4354 y(#)390 4463 y(#"\\M-\\C-OD":)331 b(backward-char)390
+4573 y(#"\\M-\\C-OC":)g(forward-char)390 4682 y(#"\\M-\\C-OA":)g
+(previous-history)390 4792 y(#"\\M-\\C-OB":)g(next-history)390
+4902 y(#)390 5011 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(ANSI)g(mode)
+390 5121 y(#)390 5230 y(#"\\M-\\C-[D":)331 b(backward-char)390
+5340 y(#"\\M-\\C-[C":)g(forward-char)p eop end
+%%Page: 16 20
+TeXDict begin 16 19 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(16)390 299 y Fs(#"\\M-\\C-[A":)331
+b(previous-history)390 408 y(#"\\M-\\C-[B":)g(next-history)390
+628 y(C-q:)47 b(quoted-insert)390 847 y($endif)390 1066
+y(#)g(An)h(old-style)d(binding.)93 b(This)47 b(happens)f(to)h(be)g(the)
+g(default.)390 1176 y(TAB:)g(complete)390 1395 y(#)g(Macros)g(that)f
+(are)h(convenient)e(for)i(shell)f(interaction)390 1504
+y($if)h(Bash)390 1614 y(#)g(edit)g(the)g(path)390 1724
+y("\\C-xp":)f("PATH=${PATH}\\e\\C-e\\C-a)o(\\ef)o(\\C-f)o(")390
+1833 y(#)h(prepare)f(to)h(type)g(a)h(quoted)e(word)g(--)390
+1943 y(#)h(insert)g(open)f(and)h(close)f(double)h(quotes)390
+2052 y(#)g(and)g(move)g(to)g(just)g(after)f(the)h(open)g(quote)390
+2162 y("\\C-x\\"":)e("\\"\\"\\C-b")390 2271 y(#)i(insert)g(a)g
+(backslash)e(\(testing)h(backslash)f(escapes)390 2381
+y(#)i(in)h(sequences)d(and)i(macros\))390 2491 y("\\C-x\\\\":)e("\\\\")
+390 2600 y(#)i(Quote)g(the)g(current)f(or)h(previous)e(word)390
+2710 y("\\C-xq":)h("\\eb\\"\\ef\\"")390 2819 y(#)h(Add)g(a)h(binding)e
+(to)h(refresh)f(the)h(line,)f(which)g(is)h(unbound)390
+2929 y("\\C-xr":)f(redraw-current-line)390 3039 y(#)h(Edit)g(variable)f
+(on)h(current)f(line.)390 3148 y("\\M-\\C-v":)f
+("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-)o(a\\C-)o(y=")390 3258
+y($endif)390 3477 y(#)i(use)g(a)h(visible)e(bell)g(if)h(one)g(is)h
+(available)390 3587 y(set)f(bell-style)e(visible)390
+3806 y(#)i(don't)g(strip)f(characters)f(to)i(7)h(bits)e(when)h(reading)
+390 3915 y(set)g(input-meta)e(on)390 4134 y(#)i(allow)g(iso-latin1)e
+(characters)g(to)i(be)g(inserted)f(rather)390 4244 y(#)h(than)g
+(converted)e(to)j(prefix-meta)c(sequences)390 4354 y(set)j
+(convert-meta)d(off)390 4573 y(#)j(display)f(characters)f(with)i(the)g
+(eighth)f(bit)h(set)g(directly)390 4682 y(#)g(rather)g(than)f(as)h
+(meta-prefixed)e(characters)390 4792 y(set)i(output-meta)e(on)390
+5011 y(#)i(if)h(there)e(are)h(150)g(or)g(more)g(possible)e(completions)
+g(for)i(a)g(word,)390 5121 y(#)g(ask)g(whether)f(or)h(not)g(the)g(user)
+g(wants)f(to)h(see)g(all)g(of)g(them)390 5230 y(set)g
+(completion-query-items)42 b(150)p eop end
+%%Page: 17 21
+TeXDict begin 17 20 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(17)390 299 y Fs(#)47
+b(For)g(FTP)390 408 y($if)g(Ftp)390 518 y("\\C-xg":)f("get)g(\\M-?")390
+628 y("\\C-xt":)g("put)g(\\M-?")390 737 y("\\M-.":)g(yank-last-arg)390
+847 y($endif)150 1089 y Fr(1.4)68 b(Bindable)45 b(Readline)i(Commands)
+150 1248 y Ft(This)25 b(section)i(describ)s(es)d(Readline)j(commands)e
+(that)h(ma)m(y)g(b)s(e)f(b)s(ound)f(to)i(k)m(ey)h(sequences.)39
+b(Command)150 1358 y(names)30 b(without)h(an)f(accompan)m(ying)i(k)m
+(ey)f(sequence)g(are)g(un)m(b)s(ound)c(b)m(y)k(default.)275
+1493 y(In)25 b(the)h(follo)m(wing)i(descriptions,)f Fj(p)s(oin)m(t)h
+Ft(refers)e(to)h(the)f(curren)m(t)g(cursor)g(p)s(osition,)h(and)f
+Fj(mark)31 b Ft(refers)150 1603 y(to)40 b(a)f(cursor)f(p)s(osition)h
+(sa)m(v)m(ed)h(b)m(y)f(the)g Fs(set-mark)d Ft(command.)66
+b(The)38 b(text)i(b)s(et)m(w)m(een)g(the)f(p)s(oin)m(t)g(and)150
+1713 y(mark)30 b(is)h(referred)e(to)i(as)g(the)f Fj(region)p
+Ft(.)150 1913 y Fi(1.4.1)63 b(Commands)42 b(F)-10 b(or)41
+b(Mo)m(ving)150 2085 y Fs(beginning-of-line)26 b(\(C-a\))630
+2195 y Ft(Mo)m(v)m(e)32 b(to)g(the)e(start)h(of)g(the)f(curren)m(t)g
+(line.)150 2355 y Fs(end-of-line)d(\(C-e\))630 2464 y
+Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(line.)150
+2625 y Fs(forward-char)c(\(C-f\))630 2734 y Ft(Mo)m(v)m(e)32
+b(forw)m(ard)e(a)h(c)m(haracter.)150 2895 y Fs(backward-char)c(\(C-b\))
+630 3004 y Ft(Mo)m(v)m(e)32 b(bac)m(k)g(a)e(c)m(haracter.)150
+3165 y Fs(forward-word)d(\(M-f\))630 3274 y Ft(Mo)m(v)m(e)32
+b(forw)m(ard)e(to)h(the)f(end)g(of)g(the)h(next)f(w)m(ord.)41
+b(W)-8 b(ords)30 b(are)h(comp)s(osed)f(of)g(letters)i(and)630
+3384 y(digits.)150 3544 y Fs(backward-word)27 b(\(M-b\))630
+3654 y Ft(Mo)m(v)m(e)36 b(bac)m(k)e(to)g(the)g(start)g(of)g(the)g
+(curren)m(t)f(or)g(previous)g(w)m(ord.)50 b(W)-8 b(ords)34
+b(are)g(comp)s(osed)630 3763 y(of)d(letters)g(and)f(digits.)150
+3923 y Fs(previous-screen-line)25 b(\(\))630 4033 y Ft(A)m(ttempt)41
+b(to)g(mo)m(v)m(e)h(p)s(oin)m(t)e(to)h(the)f(same)h(ph)m(ysical)g
+(screen)f(column)g(on)g(the)g(previous)630 4143 y(ph)m(ysical)26
+b(screen)f(line.)39 b(This)24 b(will)i(not)f(ha)m(v)m(e)h(the)f
+(desired)g(e\013ect)h(if)f(the)h(curren)m(t)e(Readline)630
+4252 y(line)k(do)s(es)f(not)g(tak)m(e)i(up)d(more)i(than)f(one)g(ph)m
+(ysical)h(line)g(or)f(if)g(p)s(oin)m(t)h(is)f(not)h(greater)g(than)630
+4362 y(the)j(length)f(of)h(the)f(prompt)g(plus)f(the)i(screen)f(width.)
+150 4522 y Fs(next-screen-line)c(\(\))630 4632 y Ft(A)m(ttempt)g(to)f
+(mo)m(v)m(e)i(p)s(oin)m(t)d(to)i(the)e(same)i(ph)m(ysical)f(screen)g
+(column)f(on)h(the)f(next)h(ph)m(ysical)630 4741 y(screen)e(line.)39
+b(This)23 b(will)g(not)h(ha)m(v)m(e)h(the)e(desired)g(e\013ect)i(if)e
+(the)g(curren)m(t)h(Readline)g(line)f(do)s(es)630 4851
+y(not)k(tak)m(e)i(up)e(more)g(than)g(one)g(ph)m(ysical)h(line)g(or)f
+(if)g(the)h(length)f(of)h(the)f(curren)m(t)g(Readline)630
+4960 y(line)k(is)f(not)h(greater)g(than)f(the)h(length)g(of)f(the)h
+(prompt)e(plus)h(the)g(screen)h(width.)150 5121 y Fs(clear-display)c
+(\(M-C-l\))630 5230 y Ft(Clear)33 b(the)g(screen)g(and,)h(if)e(p)s
+(ossible,)i(the)f(terminal's)g(scrollbac)m(k)i(bu\013er,)e(then)f
+(redra)m(w)630 5340 y(the)f(curren)m(t)f(line,)h(lea)m(ving)h(the)e
+(curren)m(t)h(line)f(at)h(the)g(top)g(of)f(the)h(screen.)p
+eop end
+%%Page: 18 22
+TeXDict begin 18 21 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(18)150 299 y Fs(clear-screen)27
+b(\(C-l\))630 408 y Ft(Clear)35 b(the)f(screen,)i(then)e(redra)m(w)g
+(the)h(curren)m(t)f(line,)i(lea)m(ving)g(the)f(curren)m(t)f(line)h(at)g
+(the)630 518 y(top)c(of)f(the)h(screen.)150 665 y Fs
+(redraw-current-line)25 b(\(\))630 775 y Ft(Refresh)30
+b(the)g(curren)m(t)h(line.)41 b(By)30 b(default,)h(this)f(is)h(un)m(b)s
+(ound.)150 962 y Fi(1.4.2)63 b(Commands)42 b(F)-10 b(or)41
+b(Manipulating)h(The)f(History)150 1128 y Fs(accept-line)27
+b(\(Newline)h(or)i(Return\))630 1237 y Ft(Accept)36 b(the)g(line)f
+(regardless)h(of)f(where)g(the)g(cursor)g(is.)55 b(If)34
+b(this)h(line)h(is)f(non-empt)m(y)-8 b(,)37 b(it)630
+1347 y(ma)m(y)32 b(b)s(e)g(added)f(to)h(the)g(history)g(list)h(for)e
+(future)g(recall)j(with)d Fs(add_history\(\))p Ft(.)42
+b(If)31 b(this)630 1457 y(line)g(is)f(a)h(mo)s(di\014ed)e(history)h
+(line,)h(the)g(history)f(line)h(is)f(restored)h(to)g(its)g(original)g
+(state.)150 1604 y Fs(previous-history)26 b(\(C-p\))630
+1713 y Ft(Mo)m(v)m(e)32 b(`bac)m(k')g(through)e(the)g(history)h(list,)g
+(fetc)m(hing)g(the)g(previous)f(command.)150 1861 y Fs(next-history)d
+(\(C-n\))630 1970 y Ft(Mo)m(v)m(e)32 b(`forw)m(ard')f(through)e(the)i
+(history)f(list,)i(fetc)m(hing)f(the)g(next)f(command.)150
+2117 y Fs(beginning-of-history)25 b(\(M-<\))630 2227
+y Ft(Mo)m(v)m(e)32 b(to)g(the)e(\014rst)g(line)g(in)h(the)f(history)-8
+b(.)150 2374 y Fs(end-of-history)26 b(\(M->\))630 2484
+y Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(input)e(history)-8
+b(,)31 b(i.e.,)h(the)f(line)f(curren)m(tly)h(b)s(eing)f(en)m(tered.)150
+2631 y Fs(reverse-search-history)24 b(\(C-r\))630 2741
+y Ft(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g(the)f(curren)m(t)g
+(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g(his-)630
+2850 y(tory)26 b(as)h(necessary)-8 b(.)40 b(This)25 b(is)i(an)f
+(incremen)m(tal)h(searc)m(h.)40 b(This)25 b(command)h(sets)h(the)f
+(region)630 2960 y(to)31 b(the)g(matc)m(hed)g(text)g(and)f(activ)-5
+b(ates)33 b(the)d(mark.)150 3107 y Fs(forward-search-history)24
+b(\(C-s\))630 3217 y Ft(Searc)m(h)44 b(forw)m(ard)f(starting)h(at)h
+(the)e(curren)m(t)h(line)g(and)f(mo)m(ving)h(`do)m(wn')g(through)f(the)
+630 3326 y(history)38 b(as)g(necessary)-8 b(.)65 b(This)38
+b(is)g(an)g(incremen)m(tal)h(searc)m(h.)65 b(This)37
+b(command)h(sets)h(the)630 3436 y(region)31 b(to)g(the)g(matc)m(hed)g
+(text)g(and)f(activ)-5 b(ates)33 b(the)d(mark.)150 3583
+y Fs(non-incremental-reverse-)o(sear)o(ch-h)o(ist)o(ory)24
+b(\(M-p\))630 3693 y Ft(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g
+(the)f(curren)m(t)g(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g
+(his-)630 3802 y(tory)36 b(as)g(necessary)h(using)e(a)i(non-incremen)m
+(tal)g(searc)m(h)f(for)g(a)g(string)g(supplied)f(b)m(y)h(the)630
+3912 y(user.)k(The)30 b(searc)m(h)h(string)f(ma)m(y)h(matc)m(h)g(an)m
+(ywhere)g(in)f(a)h(history)f(line.)150 4059 y Fs
+(non-incremental-forward-)o(sear)o(ch-h)o(ist)o(ory)24
+b(\(M-n\))630 4169 y Ft(Searc)m(h)44 b(forw)m(ard)f(starting)h(at)h
+(the)e(curren)m(t)h(line)g(and)f(mo)m(ving)h(`do)m(wn')g(through)f(the)
+630 4278 y(history)27 b(as)f(necessary)i(using)e(a)h(non-incremen)m
+(tal)g(searc)m(h)h(for)e(a)h(string)g(supplied)e(b)m(y)i(the)630
+4388 y(user.)40 b(The)30 b(searc)m(h)h(string)f(ma)m(y)h(matc)m(h)g(an)
+m(ywhere)g(in)f(a)h(history)f(line.)150 4535 y Fs
+(history-search-forward)24 b(\(\))630 4645 y Ft(Searc)m(h)42
+b(forw)m(ard)f(through)f(the)i(history)f(for)g(the)h(string)f(of)h(c)m
+(haracters)h(b)s(et)m(w)m(een)f(the)630 4754 y(start)36
+b(of)h(the)f(curren)m(t)f(line)i(and)e(the)h(p)s(oin)m(t.)58
+b(The)35 b(searc)m(h)i(string)e(m)m(ust)h(matc)m(h)h(at)g(the)630
+4864 y(b)s(eginning)32 b(of)g(a)h(history)g(line.)47
+b(This)32 b(is)h(a)f(non-incremen)m(tal)i(searc)m(h.)48
+b(By)33 b(default,)g(this)630 4974 y(command)d(is)h(un)m(b)s(ound.)150
+5121 y Fs(history-search-backward)24 b(\(\))630 5230
+y Ft(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h(history)g(for)g
+(the)f(string)h(of)g(c)m(haracters)h(b)s(et)m(w)m(een)g(the)630
+5340 y(start)g(of)h(the)f(curren)m(t)f(line)i(and)e(the)h(p)s(oin)m(t.)
+58 b(The)35 b(searc)m(h)i(string)e(m)m(ust)h(matc)m(h)h(at)g(the)p
+eop end
+%%Page: 19 23
+TeXDict begin 19 22 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(19)630 299 y(b)s(eginning)32
+b(of)g(a)h(history)g(line.)47 b(This)32 b(is)h(a)f(non-incremen)m(tal)i
+(searc)m(h.)48 b(By)33 b(default,)g(this)630 408 y(command)d(is)h(un)m
+(b)s(ound.)150 566 y Fs(history-substring-search)o(-for)o(ward)24
+b(\(\))630 676 y Ft(Searc)m(h)42 b(forw)m(ard)f(through)f(the)i
+(history)f(for)g(the)h(string)f(of)h(c)m(haracters)h(b)s(et)m(w)m(een)f
+(the)630 785 y(start)29 b(of)g(the)g(curren)m(t)g(line)g(and)f(the)h(p)
+s(oin)m(t.)40 b(The)29 b(searc)m(h)g(string)g(ma)m(y)g(matc)m(h)h(an)m
+(ywhere)630 895 y(in)i(a)h(history)g(line.)47 b(This)32
+b(is)g(a)h(non-incremen)m(tal)h(searc)m(h.)47 b(By)33
+b(default,)h(this)e(command)630 1005 y(is)e(un)m(b)s(ound.)150
+1162 y Fs(history-substring-search)o(-bac)o(kwar)o(d)24
+b(\(\))630 1272 y Ft(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h
+(history)g(for)g(the)f(string)h(of)g(c)m(haracters)h(b)s(et)m(w)m(een)g
+(the)630 1381 y(start)29 b(of)g(the)g(curren)m(t)g(line)g(and)f(the)h
+(p)s(oin)m(t.)40 b(The)29 b(searc)m(h)g(string)g(ma)m(y)g(matc)m(h)h
+(an)m(ywhere)630 1491 y(in)i(a)h(history)g(line.)47 b(This)32
+b(is)g(a)h(non-incremen)m(tal)h(searc)m(h.)47 b(By)33
+b(default,)h(this)e(command)630 1601 y(is)e(un)m(b)s(ound.)150
+1758 y Fs(yank-nth-arg)d(\(M-C-y\))630 1868 y Ft(Insert)37
+b(the)g(\014rst)f(argumen)m(t)i(to)f(the)h(previous)e(command)h
+(\(usually)g(the)g(second)g(w)m(ord)630 1978 y(on)32
+b(the)g(previous)f(line\))i(at)f(p)s(oin)m(t.)46 b(With)32
+b(an)g(argumen)m(t)g Fj(n)p Ft(,)g(insert)g(the)g Fj(n)p
+Ft(th)f(w)m(ord)g(from)630 2087 y(the)k(previous)f(command)h(\(the)g(w)
+m(ords)g(in)f(the)h(previous)g(command)f(b)s(egin)h(with)f(w)m(ord)630
+2197 y(0\).)69 b(A)40 b(negativ)m(e)h(argumen)m(t)f(inserts)g(the)f
+Fj(n)p Ft(th)g(w)m(ord)g(from)g(the)h(end)f(of)h(the)f(previous)630
+2306 y(command.)48 b(Once)33 b(the)g(argumen)m(t)h Fj(n)e
+Ft(is)h(computed,)h(the)f(argumen)m(t)g(is)g(extracted)i(as)e(if)630
+2416 y(the)e(`)p Fs(!)p Fl(n)p Ft(')f(history)g(expansion)g(had)g(b)s
+(een)g(sp)s(eci\014ed.)150 2574 y Fs(yank-last-arg)d(\(M-.)i(or)h
+(M-_\))630 2683 y Ft(Insert)k(last)i(argumen)m(t)g(to)g(the)f(previous)
+f(command)h(\(the)h(last)f(w)m(ord)g(of)g(the)g(previous)630
+2793 y(history)e(en)m(try\).)51 b(With)34 b(a)g(n)m(umeric)g(argumen)m
+(t,)h(b)s(eha)m(v)m(e)f(exactly)h(lik)m(e)g Fs(yank-nth-arg)p
+Ft(.)630 2902 y(Successiv)m(e)26 b(calls)g(to)f Fs(yank-last-arg)c
+Ft(mo)m(v)m(e)27 b(bac)m(k)e(through)f(the)h(history)g(list,)i
+(inserting)630 3012 y(the)c(last)g(w)m(ord)f(\(or)h(the)g(w)m(ord)f(sp)
+s(eci\014ed)g(b)m(y)g(the)h(argumen)m(t)g(to)g(the)g(\014rst)f(call\))i
+(of)f(eac)m(h)h(line)630 3122 y(in)36 b(turn.)58 b(An)m(y)36
+b(n)m(umeric)h(argumen)m(t)f(supplied)g(to)h(these)g(successiv)m(e)g
+(calls)h(determines)630 3231 y(the)d(direction)g(to)h(mo)m(v)m(e)g
+(through)e(the)h(history)-8 b(.)54 b(A)35 b(negativ)m(e)i(argumen)m(t)e
+(switc)m(hes)h(the)630 3341 y(direction)23 b(through)g(the)g(history)f
+(\(bac)m(k)i(or)f(forw)m(ard\).)38 b(The)22 b(history)h(expansion)g
+(facilities)630 3450 y(are)28 b(used)f(to)h(extract)h(the)f(last)g
+(argumen)m(t,)h(as)e(if)h(the)g(`)p Fs(!$)p Ft(')f(history)g(expansion)
+h(had)f(b)s(een)630 3560 y(sp)s(eci\014ed.)150 3718 y
+Fs(operate-and-get-next)e(\(C-o\))630 3827 y Ft(Accept)30
+b(the)g(curren)m(t)e(line)i(for)f(return)f(to)h(the)h(calling)g
+(application)h(as)e(if)g(a)h(newline)f(had)630 3937 y(b)s(een)22
+b(en)m(tered,)k(and)d(fetc)m(h)h(the)f(next)g(line)h(relativ)m(e)h(to)f
+(the)f(curren)m(t)g(line)h(from)f(the)g(history)630 4046
+y(for)31 b(editing.)43 b(A)31 b(n)m(umeric)f(argumen)m(t,)i(if)f
+(supplied,)f(sp)s(eci\014es)h(the)g(history)f(en)m(try)i(to)f(use)630
+4156 y(instead)g(of)f(the)h(curren)m(t)f(line.)150 4314
+y Fs(fetch-history)d(\(\))630 4423 y Ft(With)e(a)f(n)m(umeric)g
+(argumen)m(t,)i(fetc)m(h)f(that)g(en)m(try)f(from)g(the)g(history)g
+(list)h(and)e(mak)m(e)i(it)g(the)630 4533 y(curren)m(t)30
+b(line.)41 b(Without)30 b(an)g(argumen)m(t,)h(mo)m(v)m(e)g(bac)m(k)g
+(to)f(the)g(\014rst)f(en)m(try)h(in)g(the)g(history)630
+4643 y(list.)150 4840 y Fi(1.4.3)63 b(Commands)42 b(F)-10
+b(or)41 b(Changing)g(T)-10 b(ext)150 5011 y Fl(end-of-file)27
+b Fs(\(usually)h(C-d\))630 5121 y Ft(The)e(c)m(haracter)h(indicating)h
+(end-of-\014le)e(as)h(set,)g(for)f(example,)i(b)m(y)e
+Fs(stty)p Ft(.)39 b(If)25 b(this)h(c)m(harac-)630 5230
+y(ter)c(is)g(read)g(when)e(there)i(are)h(no)e(c)m(haracters)j(on)d(the)
+h(line,)i(and)d(p)s(oin)m(t)h(is)g(at)h(the)f(b)s(eginning)630
+5340 y(of)31 b(the)f(line,)h(Readline)g(in)m(terprets)g(it)g(as)f(the)h
+(end)f(of)g(input)f(and)h(returns)f Fm(eof)p Ft(.)p eop
+end
+%%Page: 20 24
+TeXDict begin 20 23 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(20)150 299 y Fs(delete-char)27
+b(\(C-d\))630 408 y Ft(Delete)35 b(the)f(c)m(haracter)h(at)f(p)s(oin)m
+(t.)49 b(If)33 b(this)g(function)g(is)g(b)s(ound)e(to)j(the)g(same)f(c)
+m(haracter)630 518 y(as)e(the)f(tt)m(y)i Fm(eof)d Ft(c)m(haracter,)j
+(as)f Fl(C-d)e Ft(commonly)i(is,)g(see)g(ab)s(o)m(v)m(e)h(for)e(the)g
+(e\013ects.)150 669 y Fs(backward-delete-char)25 b(\(Rubout\))630
+779 y Ft(Delete)32 b(the)f(c)m(haracter)g(b)s(ehind)e(the)h(cursor.)40
+b(A)30 b(n)m(umeric)g(argumen)m(t)h(means)f(to)h(kill)g(the)630
+889 y(c)m(haracters)h(instead)e(of)h(deleting)g(them.)150
+1040 y Fs(forward-backward-delete-)o(char)24 b(\(\))630
+1149 y Ft(Delete)40 b(the)f(c)m(haracter)h(under)c(the)j(cursor,)h
+(unless)d(the)i(cursor)e(is)h(at)h(the)g(end)e(of)i(the)630
+1259 y(line,)33 b(in)e(whic)m(h)g(case)i(the)f(c)m(haracter)h(b)s
+(ehind)d(the)i(cursor)f(is)g(deleted.)46 b(By)32 b(default,)g(this)630
+1369 y(is)e(not)h(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150
+1520 y Fs(quoted-insert)27 b(\(C-q)i(or)h(C-v\))630 1630
+y Ft(Add)j(the)i(next)f(c)m(haracter)i(t)m(yp)s(ed)e(to)h(the)f(line)h
+(v)m(erbatim.)53 b(This)33 b(is)i(ho)m(w)f(to)h(insert)f(k)m(ey)630
+1739 y(sequences)d(lik)m(e)g Fl(C-q)p Ft(,)f(for)g(example.)150
+1891 y Fs(tab-insert)e(\(M-TAB\))630 2000 y Ft(Insert)i(a)h(tab)f(c)m
+(haracter.)150 2151 y Fs(self-insert)d(\(a,)j(b,)g(A,)f(1,)h(!,)g(...)o
+(\))630 2261 y Ft(Insert)g(y)m(ourself.)150 2412 y Fs
+(bracketed-paste-begin)25 b(\(\))630 2522 y Ft(This)f(function)h(is)f
+(in)m(tended)h(to)h(b)s(e)e(b)s(ound)f(to)i(the)g Fs(")p
+Ft(brac)m(k)m(eted)h(paste)p Fs(")f Ft(escap)s(e)h(sequence)630
+2632 y(sen)m(t)38 b(b)m(y)f(some)h(terminals,)i(and)d(suc)m(h)g(a)h
+(binding)e(is)i(assigned)f(b)m(y)h(default.)62 b(It)38
+b(allo)m(ws)630 2741 y(Readline)33 b(to)g(insert)g(the)f(pasted)h(text)
+g(as)g(a)g(single)g(unit)f(without)h(treating)h(eac)m(h)f(c)m(har-)630
+2851 y(acter)40 b(as)f(if)g(it)g(had)f(b)s(een)g(read)h(from)f(the)h(k)
+m(eyb)s(oard.)66 b(The)39 b(c)m(haracters)h(are)f(inserted)630
+2960 y(as)44 b(if)g(eac)m(h)i(one)e(w)m(as)g(b)s(ound)e(to)j
+Fs(self-insert)c Ft(instead)j(of)h(executing)g(an)m(y)f(editing)630
+3070 y(commands.)630 3200 y(Brac)m(k)m(eted)38 b(paste)f(sets)f(the)h
+(region)f(\(the)h(c)m(haracters)g(b)s(et)m(w)m(een)g(p)s(oin)m(t)f(and)
+g(the)g(mark\))630 3310 y(to)j(the)g(inserted)f(text.)65
+b(It)39 b(uses)f(the)g(concept)h(of)g(an)f Fk(active)i(mark)10
+b Ft(:)57 b(when)38 b(the)g(mark)630 3420 y(is)d(activ)m(e,)k(Readline)
+c(redispla)m(y)h(uses)e(the)h(terminal's)h(standout)f(mo)s(de)f(to)i
+(denote)g(the)630 3529 y(region.)150 3680 y Fs(transpose-chars)26
+b(\(C-t\))630 3790 y Ft(Drag)33 b(the)f(c)m(haracter)h(b)s(efore)f(the)
+g(cursor)f(forw)m(ard)h(o)m(v)m(er)h(the)f(c)m(haracter)i(at)e(the)g
+(cursor,)630 3900 y(mo)m(ving)k(the)g(cursor)f(forw)m(ard)g(as)g(w)m
+(ell.)57 b(If)35 b(the)h(insertion)g(p)s(oin)m(t)f(is)g(at)i(the)e(end)
+g(of)h(the)630 4009 y(line,)24 b(then)e(this)g(transp)s(oses)f(the)h
+(last)h(t)m(w)m(o)g(c)m(haracters)g(of)f(the)h(line.)38
+b(Negativ)m(e)25 b(argumen)m(ts)630 4119 y(ha)m(v)m(e)32
+b(no)e(e\013ect.)150 4270 y Fs(transpose-words)c(\(M-t\))630
+4380 y Ft(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)g(past)g
+(the)h(w)m(ord)f(after)g(p)s(oin)m(t,)i(mo)m(ving)f(p)s(oin)m(t)f(past)
+g(that)630 4489 y(w)m(ord)c(as)h(w)m(ell.)41 b(If)27
+b(the)i(insertion)f(p)s(oin)m(t)h(is)f(at)h(the)g(end)e(of)i(the)f
+(line,)i(this)e(transp)s(oses)g(the)630 4599 y(last)j(t)m(w)m(o)h(w)m
+(ords)e(on)g(the)h(line.)150 4750 y Fs(upcase-word)c(\(M-u\))630
+4860 y Ft(Upp)s(ercase)32 b(the)g(curren)m(t)g(\(or)g(follo)m(wing\))i
+(w)m(ord.)45 b(With)32 b(a)g(negativ)m(e)j(argumen)m(t,)e(upp)s(er-)630
+4969 y(case)e(the)g(previous)f(w)m(ord,)g(but)g(do)g(not)h(mo)m(v)m(e)h
+(the)e(cursor.)150 5121 y Fs(downcase-word)d(\(M-l\))630
+5230 y Ft(Lo)m(w)m(ercase)c(the)f(curren)m(t)f(\(or)h(follo)m(wing\))i
+(w)m(ord.)37 b(With)22 b(a)g(negativ)m(e)i(argumen)m(t,)g(lo)m(w)m
+(ercase)630 5340 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f(mo)m
+(v)m(e)i(the)f(cursor.)p eop end
+%%Page: 21 25
+TeXDict begin 21 24 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(21)150 299 y Fs(capitalize-word)26
+b(\(M-c\))630 408 y Ft(Capitalize)d(the)f(curren)m(t)f(\(or)g(follo)m
+(wing\))i(w)m(ord.)38 b(With)21 b(a)h(negativ)m(e)h(argumen)m(t,)h
+(capitalize)630 518 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f
+(mo)m(v)m(e)i(the)f(cursor.)150 678 y Fs(overwrite-mode)26
+b(\(\))630 788 y Ft(T)-8 b(oggle)35 b(o)m(v)m(erwrite)g(mo)s(de.)48
+b(With)33 b(an)g(explicit)h(p)s(ositiv)m(e)g(n)m(umeric)f(argumen)m(t,)
+h(switc)m(hes)630 897 y(to)22 b(o)m(v)m(erwrite)i(mo)s(de.)37
+b(With)22 b(an)g(explicit)h(non-p)s(ositiv)m(e)f(n)m(umeric)g(argumen)m
+(t,)i(switc)m(hes)e(to)630 1007 y(insert)30 b(mo)s(de.)41
+b(This)30 b(command)h(a\013ects)h(only)e Fs(emacs)f Ft(mo)s(de;)i
+Fs(vi)f Ft(mo)s(de)g(do)s(es)g(o)m(v)m(erwrite)630 1116
+y(di\013eren)m(tly)-8 b(.)42 b(Eac)m(h)31 b(call)h(to)f
+Fs(readline\(\))c Ft(starts)k(in)f(insert)g(mo)s(de.)630
+1251 y(In)52 b(o)m(v)m(erwrite)h(mo)s(de,)58 b(c)m(haracters)c(b)s
+(ound)c(to)j Fs(self-insert)c Ft(replace)k(the)g(text)g(at)630
+1361 y(p)s(oin)m(t)59 b(rather)f(than)h(pushing)e(the)i(text)g(to)h
+(the)f(righ)m(t.)126 b(Characters)59 b(b)s(ound)d(to)630
+1470 y Fs(backward-delete-char)25 b Ft(replace)31 b(the)g(c)m(haracter)
+h(b)s(efore)e(p)s(oin)m(t)g(with)g(a)h(space.)630 1605
+y(By)g(default,)f(this)h(command)f(is)g(un)m(b)s(ound.)150
+1805 y Fi(1.4.4)63 b(Killing)42 b(And)e(Y)-10 b(anking)150
+1977 y Fs(kill-line)28 b(\(C-k\))630 2087 y Ft(Kill)k(the)f(text)i
+(from)d(p)s(oin)m(t)i(to)g(the)f(end)g(of)g(the)h(line.)44
+b(With)31 b(a)h(negativ)m(e)i(n)m(umeric)d(argu-)630
+2197 y(men)m(t,)g(kill)g(bac)m(kw)m(ard)g(from)f(the)g(cursor)g(to)h
+(the)g(b)s(eginning)e(of)i(the)g(curren)m(t)f(line.)150
+2357 y Fs(backward-kill-line)25 b(\(C-x)30 b(Rubout\))630
+2466 y Ft(Kill)40 b(bac)m(kw)m(ard)h(from)e(the)h(cursor)g(to)g(the)g
+(b)s(eginning)g(of)g(the)g(curren)m(t)f(line.)70 b(With)41
+b(a)630 2576 y(negativ)m(e)47 b(n)m(umeric)e(argumen)m(t,)50
+b(kill)c(forw)m(ard)e(from)h(the)g(cursor)g(to)h(the)f(end)f(of)i(the)
+630 2685 y(curren)m(t)30 b(line.)150 2845 y Fs(unix-line-discard)c
+(\(C-u\))630 2955 y Ft(Kill)31 b(bac)m(kw)m(ard)g(from)e(the)i(cursor)f
+(to)h(the)f(b)s(eginning)g(of)h(the)f(curren)m(t)g(line.)150
+3115 y Fs(kill-whole-line)c(\(\))630 3225 y Ft(Kill)37
+b(all)g(c)m(haracters)h(on)f(the)f(curren)m(t)h(line,)h(no)f(matter)g
+(where)f(p)s(oin)m(t)h(is.)59 b(By)36 b(default,)630
+3334 y(this)30 b(is)h(un)m(b)s(ound.)150 3494 y Fs(kill-word)d(\(M-d\))
+630 3604 y Ft(Kill)i(from)f(p)s(oin)m(t)g(to)h(the)g(end)e(of)i(the)f
+(curren)m(t)h(w)m(ord,)f(or)g(if)h(b)s(et)m(w)m(een)g(w)m(ords,)f(to)h
+(the)g(end)630 3713 y(of)h(the)f(next)h(w)m(ord.)40 b(W)-8
+b(ord)31 b(b)s(oundaries)e(are)h(the)h(same)g(as)f Fs(forward-word)p
+Ft(.)150 3874 y Fs(backward-kill-word)25 b(\(M-DEL\))630
+3983 y Ft(Kill)k(the)g(w)m(ord)g(b)s(ehind)e(p)s(oin)m(t.)40
+b(W)-8 b(ord)29 b(b)s(oundaries)f(are)h(the)g(same)g(as)g
+Fs(backward-word)p Ft(.)150 4143 y Fs(shell-transpose-words)c
+(\(M-C-t\))630 4253 y Ft(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin)
+m(t)g(past)g(the)h(w)m(ord)f(after)g(p)s(oin)m(t,)i(mo)m(ving)f(p)s
+(oin)m(t)f(past)g(that)630 4362 y(w)m(ord)c(as)h(w)m(ell.)41
+b(If)27 b(the)i(insertion)f(p)s(oin)m(t)h(is)f(at)h(the)g(end)e(of)i
+(the)f(line,)i(this)e(transp)s(oses)g(the)630 4472 y(last)j(t)m(w)m(o)h
+(w)m(ords)d(on)i(the)f(line.)41 b(W)-8 b(ord)31 b(b)s(oundaries)e(are)h
+(the)h(same)f(as)h Fs(shell-forward-)630 4582 y(word)e
+Ft(and)h Fs(shell-backward-word)p Ft(.)150 4742 y Fs(unix-word-rubout)c
+(\(C-w\))630 4851 y Ft(Kill)32 b(the)g(w)m(ord)f(b)s(ehind)f(p)s(oin)m
+(t,)i(using)f(white)h(space)g(as)g(a)g(w)m(ord)f(b)s(oundary)-8
+b(.)43 b(The)31 b(killed)630 4961 y(text)g(is)g(sa)m(v)m(ed)g(on)g(the)
+f(kill-ring.)150 5121 y Fs(unix-filename-rubout)25 b(\(\))630
+5230 y Ft(Kill)37 b(the)f(w)m(ord)g(b)s(ehind)f(p)s(oin)m(t,)j(using)e
+(white)g(space)h(and)f(the)g(slash)g(c)m(haracter)i(as)f(the)630
+5340 y(w)m(ord)30 b(b)s(oundaries.)39 b(The)30 b(killed)h(text)g(is)g
+(sa)m(v)m(ed)g(on)g(the)f(kill-ring.)p eop end
+%%Page: 22 26
+TeXDict begin 22 25 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(22)150 299 y Fs
+(delete-horizontal-space)24 b(\(\))630 408 y Ft(Delete)33
+b(all)e(spaces)g(and)e(tabs)i(around)e(p)s(oin)m(t.)41
+b(By)31 b(default,)f(this)h(is)f(un)m(b)s(ound.)150 564
+y Fs(kill-region)d(\(\))630 673 y Ft(Kill)k(the)f(text)i(in)e(the)g
+(curren)m(t)h(region.)41 b(By)31 b(default,)f(this)h(command)f(is)g(un)
+m(b)s(ound.)150 829 y Fs(copy-region-as-kill)25 b(\(\))630
+938 y Ft(Cop)m(y)34 b(the)g(text)h(in)f(the)g(region)g(to)h(the)f(kill)
+h(bu\013er,)f(so)g(it)h(can)f(b)s(e)f(y)m(ank)m(ed)i(righ)m(t)f(a)m(w)m
+(a)m(y)-8 b(.)630 1048 y(By)31 b(default,)f(this)h(command)f(is)g(un)m
+(b)s(ound.)150 1203 y Fs(copy-backward-word)25 b(\(\))630
+1313 y Ft(Cop)m(y)38 b(the)h(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)g(to)i
+(the)e(kill)h(bu\013er.)64 b(The)38 b(w)m(ord)g(b)s(oundaries)f(are)i
+(the)630 1422 y(same)31 b(as)f Fs(backward-word)p Ft(.)38
+b(By)30 b(default,)h(this)f(command)g(is)h(un)m(b)s(ound.)150
+1578 y Fs(copy-forward-word)26 b(\(\))630 1687 y Ft(Cop)m(y)31
+b(the)g(w)m(ord)g(follo)m(wing)h(p)s(oin)m(t)f(to)h(the)f(kill)h
+(bu\013er.)42 b(The)30 b(w)m(ord)h(b)s(oundaries)e(are)j(the)630
+1797 y(same)f(as)f Fs(forward-word)p Ft(.)38 b(By)30
+b(default,)h(this)g(command)f(is)g(un)m(b)s(ound.)150
+1952 y Fs(yank)f(\(C-y\))630 2062 y Ft(Y)-8 b(ank)31
+b(the)f(top)h(of)g(the)f(kill)h(ring)f(in)m(to)i(the)e(bu\013er)g(at)h
+(p)s(oin)m(t.)150 2217 y Fs(yank-pop)d(\(M-y\))630 2327
+y Ft(Rotate)36 b(the)f(kill-ring,)i(and)d(y)m(ank)h(the)f(new)g(top.)54
+b(Y)-8 b(ou)35 b(can)g(only)f(do)h(this)f(if)h(the)g(prior)630
+2436 y(command)30 b(is)h Fs(yank)e Ft(or)h Fs(yank-pop)p
+Ft(.)150 2631 y Fi(1.4.5)63 b(Sp)s(ecifying)42 b(Numeric)f(Argumen)m
+(ts)150 2801 y Fs(digit-argument)26 b(\()p Fl(M-0)p Fs(,)j
+Fl(M-1)p Fs(,)h(...)f Fl(M--)p Fs(\))630 2911 y Ft(Add)d(this)h(digit)g
+(to)h(the)f(argumen)m(t)g(already)h(accum)m(ulating,)h(or)e(start)h(a)f
+(new)f(argumen)m(t.)630 3020 y Fl(M--)j Ft(starts)i(a)g(negativ)m(e)i
+(argumen)m(t.)150 3176 y Fs(universal-argument)25 b(\(\))630
+3285 y Ft(This)g(is)g(another)h(w)m(a)m(y)g(to)h(sp)s(ecify)e(an)g
+(argumen)m(t.)40 b(If)25 b(this)g(command)h(is)f(follo)m(w)m(ed)i(b)m
+(y)f(one)630 3395 y(or)k(more)f(digits,)i(optionally)g(with)e(a)h
+(leading)h(min)m(us)e(sign,)h(those)g(digits)g(de\014ne)f(the)h(ar-)630
+3505 y(gumen)m(t.)41 b(If)28 b(the)i(command)f(is)g(follo)m(w)m(ed)h(b)
+m(y)f(digits,)i(executing)f Fs(universal-argument)630
+3614 y Ft(again)j(ends)e(the)h(n)m(umeric)f(argumen)m(t,)i(but)e(is)h
+(otherwise)g(ignored.)45 b(As)32 b(a)g(sp)s(ecial)h(case,)630
+3724 y(if)g(this)g(command)f(is)h(immediately)h(follo)m(w)m(ed)h(b)m(y)
+d(a)h(c)m(haracter)i(that)e(is)g(neither)g(a)g(digit)630
+3833 y(nor)41 b(min)m(us)f(sign,)k(the)e(argumen)m(t)f(coun)m(t)h(for)f
+(the)h(next)f(command)g(is)g(m)m(ultiplied)h(b)m(y)630
+3943 y(four.)54 b(The)35 b(argumen)m(t)g(coun)m(t)h(is)f(initially)h
+(one,)h(so)e(executing)i(this)e(function)f(the)i(\014rst)630
+4053 y(time)29 b(mak)m(es)h(the)e(argumen)m(t)i(coun)m(t)f(four,)f(a)h
+(second)g(time)g(mak)m(es)h(the)e(argumen)m(t)h(coun)m(t)630
+4162 y(sixteen,)i(and)f(so)h(on.)40 b(By)31 b(default,)g(this)f(is)g
+(not)h(b)s(ound)d(to)k(a)e(k)m(ey)-8 b(.)150 4357 y Fi(1.4.6)63
+b(Letting)40 b(Readline)h(T)m(yp)s(e)g(F)-10 b(or)42
+b(Y)-10 b(ou)150 4527 y Fs(complete)28 b(\(TAB\))630
+4637 y Ft(A)m(ttempt)c(to)f(p)s(erform)e(completion)j(on)f(the)g(text)g
+(b)s(efore)f(p)s(oin)m(t.)39 b(The)22 b(actual)i(completion)630
+4746 y(p)s(erformed)29 b(is)h(application-sp)s(eci\014c.)42
+b(The)30 b(default)h(is)f(\014lename)h(completion.)150
+4902 y Fs(possible-completions)25 b(\(M-?\))630 5011
+y Ft(List)35 b(the)g(p)s(ossible)f(completions)i(of)e(the)h(text)h(b)s
+(efore)e(p)s(oin)m(t.)54 b(When)34 b(displa)m(ying)h(com-)630
+5121 y(pletions,)f(Readline)f(sets)f(the)h(n)m(um)m(b)s(er)e(of)i
+(columns)f(used)f(for)i(displa)m(y)f(to)h(the)g(v)-5
+b(alue)33 b(of)630 5230 y Fs(completion-display-width)o
+Ft(,)g(the)j(v)-5 b(alue)37 b(of)g(the)f(en)m(vironmen)m(t)h(v)-5
+b(ariable)38 b Fs(COLUMNS)p Ft(,)630 5340 y(or)30 b(the)h(screen)f
+(width,)g(in)g(that)h(order.)p eop end
+%%Page: 23 27
+TeXDict begin 23 26 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(23)150 299 y Fs
+(insert-completions)25 b(\(M-*\))630 408 y Ft(Insert)30
+b(all)h(completions)h(of)f(the)g(text)g(b)s(efore)f(p)s(oin)m(t)h(that)
+g(w)m(ould)f(ha)m(v)m(e)i(b)s(een)e(generated)630 518
+y(b)m(y)g Fs(possible-completions)p Ft(.)150 673 y Fs(menu-complete)d
+(\(\))630 783 y Ft(Similar)d(to)g Fs(complete)p Ft(,)f(but)h(replaces)g
+(the)g(w)m(ord)g(to)g(b)s(e)f(completed)i(with)e(a)i(single)f(matc)m(h)
+630 893 y(from)37 b(the)h(list)h(of)f(p)s(ossible)f(completions.)64
+b(Rep)s(eated)39 b(execution)g(of)f Fs(menu-complete)630
+1002 y Ft(steps)i(through)g(the)g(list)h(of)f(p)s(ossible)g
+(completions,)k(inserting)c(eac)m(h)i(matc)m(h)f(in)f(turn.)630
+1112 y(A)m(t)e(the)f(end)f(of)h(the)g(list)g(of)g(completions,)i(the)e
+(b)s(ell)g(is)g(rung)f(\(sub)5 b(ject)36 b(to)i(the)f(setting)630
+1221 y(of)f Fs(bell-style)p Ft(\))e(and)h(the)h(original)i(text)f(is)f
+(restored.)57 b(An)36 b(argumen)m(t)h(of)f Fj(n)f Ft(mo)m(v)m(es)i
+Fj(n)630 1331 y Ft(p)s(ositions)e(forw)m(ard)f(in)g(the)h(list)h(of)e
+(matc)m(hes;)39 b(a)c(negativ)m(e)i(argumen)m(t)e(ma)m(y)g(b)s(e)f
+(used)g(to)630 1441 y(mo)m(v)m(e)40 b(bac)m(kw)m(ard)e(through)g(the)g
+(list.)65 b(This)38 b(command)g(is)g(in)m(tended)g(to)h(b)s(e)f(b)s
+(ound)e(to)630 1550 y Fs(TAB)p Ft(,)30 b(but)f(is)i(un)m(b)s(ound)d(b)m
+(y)i(default.)150 1705 y Fs(menu-complete-backward)24
+b(\(\))630 1815 y Ft(Iden)m(tical)36 b(to)g Fs(menu-complete)p
+Ft(,)d(but)h(mo)m(v)m(es)j(bac)m(kw)m(ard)e(through)f(the)i(list)f(of)g
+(p)s(ossible)630 1925 y(completions,)d(as)e(if)h Fs(menu-complete)26
+b Ft(had)k(b)s(een)g(giv)m(en)h(a)g(negativ)m(e)i(argumen)m(t.)150
+2080 y Fs(delete-char-or-list)25 b(\(\))630 2190 y Ft(Deletes)41
+b(the)e(c)m(haracter)h(under)e(the)h(cursor)f(if)h(not)g(at)g(the)h(b)s
+(eginning)e(or)h(end)f(of)h(the)630 2299 y(line)50 b(\(lik)m(e)h
+Fs(delete-char)p Ft(\).)96 b(If)49 b(at)h(the)g(end)f(of)h(the)f(line,)
+55 b(b)s(eha)m(v)m(es)c(iden)m(tically)g(to)630 2409
+y Fs(possible-completions)p Ft(.)35 b(This)30 b(command)g(is)g(un)m(b)s
+(ound)e(b)m(y)i(default.)150 2604 y Fi(1.4.7)63 b(Keyb)s(oard)41
+b(Macros)150 2774 y Fs(start-kbd-macro)26 b(\(C-x)j(\(\))630
+2883 y Ft(Begin)i(sa)m(ving)h(the)e(c)m(haracters)i(t)m(yp)s(ed)e(in)m
+(to)h(the)g(curren)m(t)f(k)m(eyb)s(oard)g(macro.)150
+3039 y Fs(end-kbd-macro)d(\(C-x)i(\)\))630 3148 y Ft(Stop)e(sa)m(ving)h
+(the)g(c)m(haracters)g(t)m(yp)s(ed)f(in)m(to)i(the)e(curren)m(t)g(k)m
+(eyb)s(oard)g(macro)h(and)f(sa)m(v)m(e)i(the)630 3258
+y(de\014nition.)150 3413 y Fs(call-last-kbd-macro)c(\(C-x)k(e\))630
+3523 y Ft(Re-execute)37 b(the)e(last)h(k)m(eyb)s(oard)f(macro)h
+(de\014ned,)f(b)m(y)h(making)f(the)g(c)m(haracters)i(in)e(the)630
+3632 y(macro)c(app)s(ear)f(as)g(if)h(t)m(yp)s(ed)f(at)h(the)f(k)m(eyb)s
+(oard.)150 3788 y Fs(print-last-kbd-macro)25 b(\(\))630
+3897 y Ft(Prin)m(t)30 b(the)g(last)h(k)m(eyb)s(oard)f(macro)h
+(de\014ned)e(in)h(a)g(format)h(suitable)g(for)f(the)g
+Fj(inputrc)35 b Ft(\014le.)150 4092 y Fi(1.4.8)63 b(Some)41
+b(Miscellaneous)i(Commands)150 4262 y Fs(re-read-init-file)26
+b(\(C-x)j(C-r\))630 4372 y Ft(Read)22 b(in)g(the)g(con)m(ten)m(ts)h(of)
+f(the)g Fj(inputrc)27 b Ft(\014le,)d(and)d(incorp)s(orate)h(an)m(y)h
+(bindings)d(or)i(v)-5 b(ariable)630 4481 y(assignmen)m(ts)31
+b(found)e(there.)150 4637 y Fs(abort)g(\(C-g\))630 4746
+y Ft(Ab)s(ort)d(the)h(curren)m(t)f(editing)h(command)f(and)g(ring)h
+(the)f(terminal's)h(b)s(ell)g(\(sub)5 b(ject)26 b(to)i(the)630
+4856 y(setting)j(of)g Fs(bell-style)p Ft(\).)150 5011
+y Fs(do-lowercase-version)25 b(\(M-A,)k(M-B,)g(M-)p Fl(x)p
+Fs(,)g(...)o(\))630 5121 y Ft(If)35 b(the)g(meta\014ed)g(c)m(haracter)i
+Fj(x)k Ft(is)35 b(upp)s(er)e(case,)k(run)d(the)h(command)g(that)g(is)g
+(b)s(ound)e(to)630 5230 y(the)g(corresp)s(onding)f(meta\014ed)h(lo)m(w)
+m(er)i(case)f(c)m(haracter.)50 b(The)32 b(b)s(eha)m(vior)h(is)g
+(unde\014ned)e(if)630 5340 y Fj(x)37 b Ft(is)30 b(already)h(lo)m(w)m
+(er)h(case.)p eop end
+%%Page: 24 28
+TeXDict begin 24 27 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(24)150 299 y Fs(prefix-meta)27
+b(\(ESC\))630 408 y Ft(Metafy)39 b(the)e(next)h(c)m(haracter)h(t)m(yp)s
+(ed.)62 b(This)37 b(is)g(for)h(k)m(eyb)s(oards)f(without)g(a)h(meta)g
+(k)m(ey)-8 b(.)630 518 y(T)m(yping)30 b(`)p Fs(ESC)g(f)p
+Ft(')g(is)h(equiv)-5 b(alen)m(t)31 b(to)g(t)m(yping)g
+Fl(M-f)p Ft(.)150 704 y Fs(undo)e(\(C-_)g(or)h(C-x)g(C-u\))630
+814 y Ft(Incremen)m(tal)h(undo,)f(separately)h(remem)m(b)s(ered)f(for)g
+(eac)m(h)i(line.)150 1000 y Fs(revert-line)27 b(\(M-r\))630
+1110 y Ft(Undo)33 b(all)h(c)m(hanges)g(made)f(to)h(this)f(line.)49
+b(This)32 b(is)h(lik)m(e)i(executing)f(the)f Fs(undo)f
+Ft(command)630 1219 y(enough)e(times)h(to)g(get)h(bac)m(k)f(to)g(the)f
+(b)s(eginning.)150 1406 y Fs(tilde-expand)d(\(M-~\))630
+1515 y Ft(P)m(erform)j(tilde)h(expansion)g(on)f(the)g(curren)m(t)h(w)m
+(ord.)150 1702 y Fs(set-mark)d(\(C-@\))630 1811 y Ft(Set)33
+b(the)g(mark)f(to)i(the)f(p)s(oin)m(t.)48 b(If)32 b(a)h(n)m(umeric)g
+(argumen)m(t)g(is)g(supplied,)f(the)h(mark)g(is)f(set)630
+1921 y(to)f(that)g(p)s(osition.)150 2107 y Fs(exchange-point-and-mark)
+24 b(\(C-x)29 b(C-x\))630 2217 y Ft(Sw)m(ap)i(the)g(p)s(oin)m(t)g(with)
+g(the)g(mark.)43 b(The)31 b(curren)m(t)g(cursor)f(p)s(osition)i(is)f
+(set)h(to)f(the)h(sa)m(v)m(ed)630 2326 y(p)s(osition,)f(and)e(the)i
+(old)g(cursor)e(p)s(osition)i(is)f(sa)m(v)m(ed)i(as)e(the)h(mark.)150
+2513 y Fs(character-search)26 b(\(C-]\))630 2622 y Ft(A)f(c)m(haracter)
+h(is)f(read)g(and)f(p)s(oin)m(t)h(is)g(mo)m(v)m(ed)h(to)g(the)f(next)g
+(o)s(ccurrence)g(of)g(that)g(c)m(haracter.)630 2732 y(A)30
+b(negativ)m(e)j(argumen)m(t)e(searc)m(hes)g(for)f(previous)g(o)s
+(ccurrences.)150 2918 y Fs(character-search-backwar)o(d)24
+b(\(M-C-]\))630 3028 y Ft(A)45 b(c)m(haracter)h(is)f(read)g(and)f(p)s
+(oin)m(t)h(is)g(mo)m(v)m(ed)h(to)f(the)g(previous)f(o)s(ccurrence)h(of)
+g(that)630 3137 y(c)m(haracter.)d(A)31 b(negativ)m(e)h(argumen)m(t)f
+(searc)m(hes)g(for)g(subsequen)m(t)e(o)s(ccurrences.)150
+3324 y Fs(skip-csi-sequence)d(\(\))630 3433 y Ft(Read)i(enough)f(c)m
+(haracters)h(to)g(consume)f(a)h(m)m(ulti-k)m(ey)h(sequence)f(suc)m(h)f
+(as)g(those)h(de\014ned)630 3543 y(for)37 b(k)m(eys)h(lik)m(e)g(Home)g
+(and)f(End.)60 b(Suc)m(h)37 b(sequences)g(b)s(egin)g(with)g(a)h(Con)m
+(trol)g(Sequence)630 3652 y(Indicator)f(\(CSI\),)f(usually)h(ESC-[.)59
+b(If)36 b(this)g(sequence)h(is)g(b)s(ound)d(to)k Fs("\\)p
+Ft(e[)p Fs(")p Ft(,)g(k)m(eys)f(pro-)630 3762 y(ducing)29
+b(suc)m(h)g(sequences)g(will)h(ha)m(v)m(e)h(no)e(e\013ect)i(unless)d
+(explicitly)j(b)s(ound)d(to)i(a)f(Readline)630 3871 y(command,)j
+(instead)g(of)g(inserting)g(stra)m(y)h(c)m(haracters)g(in)m(to)g(the)f
+(editing)h(bu\013er.)44 b(This)31 b(is)630 3981 y(un)m(b)s(ound)d(b)m
+(y)i(default,)h(but)f(usually)g(b)s(ound)e(to)j(ESC-[.)150
+4167 y Fs(insert-comment)26 b(\(M-#\))630 4277 y Ft(Without)36
+b(a)g(n)m(umeric)g(argumen)m(t,)h(the)f(v)-5 b(alue)36
+b(of)g(the)g Fs(comment-begin)c Ft(v)-5 b(ariable)36
+b(is)g(in-)630 4387 y(serted)c(at)g(the)g(b)s(eginning)f(of)h(the)f
+(curren)m(t)h(line.)45 b(If)31 b(a)h(n)m(umeric)f(argumen)m(t)h(is)g
+(supplied,)630 4496 y(this)k(command)h(acts)g(as)g(a)g(toggle:)55
+b(if)37 b(the)f(c)m(haracters)i(at)g(the)e(b)s(eginning)g(of)h(the)g
+(line)630 4606 y(do)30 b(not)h(matc)m(h)h(the)f(v)-5
+b(alue)31 b(of)f Fs(comment-begin)p Ft(,)e(the)i(v)-5
+b(alue)31 b(is)g(inserted,)g(otherwise)g(the)630 4715
+y(c)m(haracters)42 b(in)d Fs(comment-begin)e Ft(are)j(deleted)h(from)f
+(the)g(b)s(eginning)g(of)g(the)g(line.)71 b(In)630 4825
+y(either)31 b(case,)h(the)e(line)h(is)f(accepted)i(as)f(if)f(a)h
+(newline)f(had)g(b)s(een)f(t)m(yp)s(ed.)150 5011 y Fs(dump-functions)d
+(\(\))630 5121 y Ft(Prin)m(t)g(all)i(of)e(the)h(functions)f(and)g
+(their)g(k)m(ey)h(bindings)e(to)j(the)e(Readline)h(output)f(stream.)630
+5230 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)g(supplied,)f(the)h
+(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)m(y)g(that)630
+5340 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h Fj(inputrc)k
+Ft(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c(b)m(y)k
+(default.)p eop end
+%%Page: 25 29
+TeXDict begin 25 28 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(25)150 299 y Fs(dump-variables)26
+b(\(\))630 408 y Ft(Prin)m(t)21 b(all)h(of)g(the)f(settable)i(v)-5
+b(ariables)22 b(and)f(their)g(v)-5 b(alues)22 b(to)g(the)f(Readline)h
+(output)f(stream.)630 518 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)g
+(supplied,)f(the)h(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)m
+(y)g(that)630 628 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h
+Fj(inputrc)k Ft(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c
+(b)m(y)k(default.)150 787 y Fs(dump-macros)c(\(\))630
+897 y Ft(Prin)m(t)34 b(all)g(of)g(the)g(Readline)g(k)m(ey)h(sequences)f
+(b)s(ound)e(to)i(macros)g(and)f(the)h(strings)g(they)630
+1006 y(output.)53 b(If)35 b(a)g(n)m(umeric)f(argumen)m(t)i(is)e
+(supplied,)h(the)g(output)g(is)f(formatted)i(in)e(suc)m(h)h(a)630
+1116 y(w)m(a)m(y)c(that)g(it)f(can)g(b)s(e)g(made)g(part)f(of)i(an)e
+Fj(inputrc)35 b Ft(\014le.)41 b(This)29 b(command)h(is)g(un)m(b)s(ound)
+d(b)m(y)630 1225 y(default.)150 1385 y Fs(emacs-editing-mode)e(\(C-e\))
+630 1494 y Ft(When)30 b(in)g Fs(vi)g Ft(command)g(mo)s(de,)g(this)h
+(causes)f(a)h(switc)m(h)g(to)g Fs(emacs)e Ft(editing)i(mo)s(de.)150
+1654 y Fs(vi-editing-mode)26 b(\(M-C-j\))630 1763 y Ft(When)k(in)g
+Fs(emacs)f Ft(editing)i(mo)s(de,)f(this)h(causes)f(a)h(switc)m(h)g(to)g
+Fs(vi)f Ft(editing)h(mo)s(de.)150 2004 y Fr(1.5)68 b(Readline)47
+b(vi)e(Mo)t(de)150 2164 y Ft(While)32 b(the)g(Readline)g(library)f(do)s
+(es)g(not)h(ha)m(v)m(e)h(a)f(full)f(set)h(of)g Fs(vi)f
+Ft(editing)h(functions,)f(it)h(do)s(es)g(con)m(tain)150
+2273 y(enough)i(to)h(allo)m(w)g(simple)f(editing)h(of)f(the)g(line.)52
+b(The)34 b(Readline)g Fs(vi)g Ft(mo)s(de)f(b)s(eha)m(v)m(es)i(as)f(sp)s
+(eci\014ed)f(in)150 2383 y(the)e Fm(posix)e Ft(standard.)275
+2517 y(In)f(order)g(to)i(switc)m(h)g(in)m(teractiv)m(ely)i(b)s(et)m(w)m
+(een)d Fs(emacs)f Ft(and)g Fs(vi)h Ft(editing)g(mo)s(des,)g(use)g(the)g
+(command)150 2627 y Fl(M-C-j)36 b Ft(\(b)s(ound)h(to)h
+(emacs-editing-mo)s(de)i(when)d(in)g Fs(vi)h Ft(mo)s(de)f(and)g(to)i
+(vi-editing-mo)s(de)g(in)e Fs(emacs)150 2736 y Ft(mo)s(de\).)k(The)30
+b(Readline)h(default)f(is)g Fs(emacs)f Ft(mo)s(de.)275
+2871 y(When)g(y)m(ou)i(en)m(ter)f(a)h(line)f(in)g Fs(vi)f
+Ft(mo)s(de,)h(y)m(ou)h(are)f(already)h(placed)f(in)g(`insertion')g(mo)s
+(de,)g(as)h(if)f(y)m(ou)150 2980 y(had)f(t)m(yp)s(ed)g(an)g(`)p
+Fs(i)p Ft('.)41 b(Pressing)29 b Fs(ESC)f Ft(switc)m(hes)i(y)m(ou)g(in)m
+(to)h(`command')e(mo)s(de,)h(where)e(y)m(ou)i(can)g(edit)g(the)150
+3090 y(text)35 b(of)f(the)g(line)g(with)f(the)h(standard)f
+Fs(vi)g Ft(mo)m(v)m(emen)m(t)j(k)m(eys,)g(mo)m(v)m(e)f(to)f(previous)g
+(history)f(lines)h(with)150 3200 y(`)p Fs(k)p Ft(')d(and)e(subsequen)m
+(t)h(lines)h(with)f(`)p Fs(j)p Ft(',)g(and)g(so)h(forth.)p
+eop end
+%%Page: 26 30
+TeXDict begin 26 29 bop 3659 -116 a Ft(26)150 299 y Fp(2)80
+b(Programming)54 b(with)f(GNU)h(Readline)150 543 y Ft(This)24
+b(c)m(hapter)i(describ)s(es)e(the)h(in)m(terface)h(b)s(et)m(w)m(een)g
+(the)f Fm(gnu)f Ft(Readline)i(Library)e(and)g(other)h(programs.)150
+652 y(If)k(y)m(ou)g(are)g(a)h(programmer,)f(and)f(y)m(ou)i(wish)e(to)i
+(include)f(the)g(features)g(found)f(in)h Fm(gnu)g Ft(Readline)g(suc)m
+(h)150 762 y(as)c(completion,)j(line)d(editing,)i(and)d(in)m(teractiv)m
+(e)k(history)d(manipulation)g(in)f(y)m(our)h(o)m(wn)g(programs,)h(this)
+150 871 y(section)32 b(is)e(for)g(y)m(ou.)150 1117 y
+Fr(2.1)68 b(Basic)45 b(Beha)l(vior)150 1276 y Ft(Man)m(y)39
+b(programs)e(pro)m(vide)h(a)h(command)f(line)g(in)m(terface,)k(suc)m(h)
+37 b(as)i Fs(mail)p Ft(,)g Fs(ftp)p Ft(,)g(and)e Fs(sh)p
+Ft(.)63 b(F)-8 b(or)39 b(suc)m(h)150 1386 y(programs,)29
+b(the)f(default)h(b)s(eha)m(viour)f(of)h(Readline)g(is)g(su\016cien)m
+(t.)40 b(This)28 b(section)i(describ)s(es)d(ho)m(w)i(to)g(use)150
+1496 y(Readline)35 b(in)f(the)h(simplest)f(w)m(a)m(y)h(p)s(ossible,)h
+(p)s(erhaps)c(to)j(replace)h(calls)f(in)f(y)m(our)h(co)s(de)f(to)h
+Fs(gets\(\))e Ft(or)150 1605 y Fs(fgets\(\))p Ft(.)275
+1743 y(The)f(function)g Fs(readline\(\))e Ft(prin)m(ts)i(a)g(prompt)g
+Fj(prompt)i Ft(and)e(then)g(reads)g(and)g(returns)f(a)i(single)150
+1852 y(line)g(of)g(text)h(from)e(the)h(user.)47 b(If)32
+b Fj(prompt)i Ft(is)e Fs(NULL)g Ft(or)h(the)f(empt)m(y)i(string,)f(no)g
+(prompt)e(is)i(displa)m(y)m(ed.)150 1962 y(The)k(line)g
+Fs(readline)e Ft(returns)h(is)h(allo)s(cated)i(with)e
+Fs(malloc\(\))p Ft(;)h(the)f(caller)i(should)d Fs(free\(\))f
+Ft(the)j(line)150 2072 y(when)29 b(it)i(has)f(\014nished)f(with)h(it.)
+42 b(The)29 b(declaration)j(for)f Fs(readline)d Ft(in)i(ANSI)g(C)g(is)
+390 2209 y Fs(char)47 b(*readline)e(\(const)h(char)h(*)p
+Fl(prompt)p Fs(\);)150 2347 y Ft(So,)31 b(one)f(migh)m(t)h(sa)m(y)390
+2485 y Fs(char)47 b(*line)f(=)h(readline)f(\("Enter)g(a)h(line:)g("\);)
+150 2623 y Ft(in)23 b(order)f(to)h(read)g(a)g(line)h(of)f(text)h(from)e
+(the)h(user.)38 b(The)22 b(line)h(returned)f(has)g(the)h(\014nal)g
+(newline)g(remo)m(v)m(ed,)150 2732 y(so)31 b(only)f(the)h(text)g
+(remains.)275 2870 y(If)40 b Fs(readline)e Ft(encoun)m(ters)j(an)f
+Fs(EOF)f Ft(while)i(reading)f(the)h(line,)j(and)39 b(the)i(line)g(is)f
+(empt)m(y)h(at)g(that)150 2979 y(p)s(oin)m(t,)30 b(then)f
+Fs(\(char)g(*\)NULL)e Ft(is)j(returned.)39 b(Otherwise,)30
+b(the)f(line)h(is)f(ended)g(just)g(as)g(if)h(a)f(newline)h(had)150
+3089 y(b)s(een)g(t)m(yp)s(ed.)275 3227 y(Readline)22
+b(p)s(erforms)e(some)j(expansion)e(on)h(the)g Fj(prompt)h
+Ft(b)s(efore)f(it)g(is)g(displa)m(y)m(ed)h(on)f(the)g(screen.)38
+b(See)150 3336 y(the)27 b(description)g(of)h Fs(rl_expand_prompt)22
+b Ft(\(see)28 b(Section)g(2.4.6)h([Redispla)m(y],)g(page)f(40\))g(for)f
+(additional)150 3446 y(details,)41 b(esp)s(ecially)f(if)e
+Fj(prompt)i Ft(will)e(con)m(tain)i(c)m(haracters)f(that)g(do)f(not)h
+(consume)f(ph)m(ysical)h(screen)150 3556 y(space)31 b(when)e(displa)m
+(y)m(ed.)275 3693 y(If)d(y)m(ou)h(w)m(an)m(t)h(the)f(user)g(to)g(b)s(e)
+g(able)g(to)h(get)g(at)g(the)f(line)g(later,)i(\(with)e
+Fs(C-p)f Ft(for)h(example\),)i(y)m(ou)e(m)m(ust)150 3803
+y(call)32 b Fs(add_history\(\))26 b Ft(to)32 b(sa)m(v)m(e)f(the)g(line)
+g(a)m(w)m(a)m(y)h(in)e(a)h Fj(history)38 b Ft(list)31
+b(of)g(suc)m(h)f(lines.)390 3941 y Fs(add_history)45
+b(\(line\);)150 4078 y Ft(F)-8 b(or)31 b(full)f(details)i(on)e(the)g
+(GNU)h(History)g(Library)-8 b(,)31 b(see)g(the)f(asso)s(ciated)i(man)m
+(ual.)275 4216 y(It)f(is)g(preferable)g(to)i(a)m(v)m(oid)f(sa)m(ving)h
+(empt)m(y)e(lines)h(on)f(the)h(history)f(list,)h(since)g(users)e
+(rarely)i(ha)m(v)m(e)h(a)150 4326 y(burning)28 b(need)h(to)i(reuse)e(a)
+h(blank)g(line.)40 b(Here)31 b(is)e(a)h(function)g(whic)m(h)f(usefully)
+g(replaces)i(the)f(standard)150 4435 y Fs(gets\(\))f
+Ft(library)h(function,)g(and)g(has)g(the)g(adv)-5 b(an)m(tage)33
+b(of)d(no)g(static)i(bu\013er)e(to)h(o)m(v)m(er\015o)m(w:)390
+4573 y Fs(/*)47 b(A)h(static)e(variable)f(for)i(holding)f(the)h(line.)f
+(*/)390 4682 y(static)g(char)h(*line_read)e(=)i(\(char)g(*\)NULL;)390
+4902 y(/*)g(Read)g(a)g(string,)f(and)h(return)f(a)i(pointer)d(to)j(it.)
+533 5011 y(Returns)e(NULL)h(on)g(EOF.)f(*/)390 5121 y(char)h(*)390
+5230 y(rl_gets)f(\(\))390 5340 y({)p eop end
+%%Page: 27 31
+TeXDict begin 27 30 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(27)485
+299 y Fs(/*)48 b(If)f(the)g(buffer)f(has)h(already)f(been)g(allocated,)
+629 408 y(return)g(the)h(memory)f(to)h(the)g(free)f(pool.)h(*/)485
+518 y(if)h(\(line_read\))581 628 y({)676 737 y(free)f(\(line_read\);)
+676 847 y(line_read)f(=)h(\(char)f(*\)NULL;)581 956 y(})485
+1176 y(/*)i(Get)f(a)g(line)g(from)f(the)h(user.)g(*/)485
+1285 y(line_read)f(=)h(readline)f(\(""\);)485 1504 y(/*)i(If)f(the)g
+(line)f(has)h(any)g(text)g(in)g(it,)629 1614 y(save)f(it)h(on)h(the)f
+(history.)e(*/)485 1724 y(if)j(\(line_read)d(&&)i(*line_read\))581
+1833 y(add_history)e(\(line_read\);)485 2052 y(return)i(\(line_read\);)
+390 2162 y(})275 2303 y Ft(This)27 b(function)h(giv)m(es)h(the)f(user)g
+(the)g(default)g(b)s(eha)m(viour)g(of)g Fs(TAB)g Ft(completion:)40
+b(completion)30 b(on)e(\014le)150 2412 y(names.)41 b(If)31
+b(y)m(ou)g(do)f(not)h(w)m(an)m(t)g(Readline)h(to)f(complete)h(on)f
+(\014lenames,)g(y)m(ou)g(can)f(c)m(hange)i(the)f(binding)150
+2522 y(of)g(the)f Fs(TAB)g Ft(k)m(ey)h(with)f Fs(rl_bind_key\(\))p
+Ft(.)390 2662 y Fs(int)47 b(rl_bind_key)e(\(int)h Fl(key)p
+Fs(,)h(rl_command_func_t)c(*)p Fl(function)p Fs(\);)275
+2803 y(rl_bind_key\(\))29 b Ft(tak)m(es)35 b(t)m(w)m(o)g(argumen)m(ts:)
+47 b Fj(k)m(ey)c Ft(is)33 b(the)h(c)m(haracter)h(that)f(y)m(ou)g(w)m
+(an)m(t)g(to)g(bind,)g(and)150 2912 y Fj(function)39
+b Ft(is)f(the)h(address)f(of)h(the)g(function)g(to)g(call)i(when)c
+Fj(k)m(ey)48 b Ft(is)39 b(pressed.)65 b(Binding)38 b
+Fs(TAB)g Ft(to)i Fs(rl_)150 3022 y(insert\(\))c Ft(mak)m(es)k
+Fs(TAB)e Ft(insert)g(itself.)67 b Fs(rl_bind_key\(\))35
+b Ft(returns)j(non-zero)h(if)g Fj(k)m(ey)47 b Ft(is)39
+b(not)g(a)g(v)-5 b(alid)150 3132 y(ASCI)s(I)29 b(c)m(haracter)j(co)s
+(de)e(\(b)s(et)m(w)m(een)i(0)f(and)e(255\).)275 3272
+y(Th)m(us,)g(to)i(disable)g(the)f(default)h Fs(TAB)e
+Ft(b)s(eha)m(vior,)i(the)g(follo)m(wing)g(su\016ces:)390
+3413 y Fs(rl_bind_key)45 b(\('\\t',)h(rl_insert\);)275
+3554 y Ft(This)25 b(co)s(de)i(should)e(b)s(e)h(executed)h(once)g(at)g
+(the)g(start)g(of)f(y)m(our)h(program;)g(y)m(ou)g(migh)m(t)g(write)g(a)
+g(func-)150 3663 y(tion)33 b(called)h Fs(initialize_readline\(\))27
+b Ft(whic)m(h)33 b(p)s(erforms)e(this)h(and)h(other)g(desired)f
+(initializations,)150 3773 y(suc)m(h)e(as)h(installing)g(custom)g
+(completers)g(\(see)g(Section)h(2.6)f([Custom)f(Completers],)h(page)g
+(53\).)150 4023 y Fr(2.2)68 b(Custom)45 b(F)-11 b(unctions)150
+4182 y Ft(Readline)28 b(pro)m(vides)f(man)m(y)g(functions)g(for)g
+(manipulating)h(the)f(text)h(of)g(the)f(line,)i(but)d(it)i(isn't)f(p)s
+(ossible)150 4292 y(to)37 b(an)m(ticipate)i(the)e(needs)f(of)h(all)g
+(programs.)59 b(This)36 b(section)h(describ)s(es)f(the)h(v)-5
+b(arious)36 b(functions)h(and)150 4401 y(v)-5 b(ariables)27
+b(de\014ned)e(within)g(the)h(Readline)h(library)f(whic)m(h)g(allo)m(w)h
+(a)g(user)e(program)h(to)h(add)e(customized)150 4511
+y(functionalit)m(y)32 b(to)f(Readline.)275 4651 y(Before)37
+b(declaring)g(an)m(y)g(functions)f(that)h(customize)h(Readline's)f(b)s
+(eha)m(vior,)h(or)f(using)f(an)m(y)h(func-)150 4761 y(tionalit)m(y)48
+b(Readline)e(pro)m(vides)f(in)g(other)h(co)s(de,)k(an)45
+b(application)i(writer)e(should)g(include)g(the)h(\014le)150
+4871 y Fs(<readline/readline.h>)28 b Ft(in)33 b(an)m(y)h(\014le)f(that)
+h(uses)f(Readline's)h(features.)51 b(Since)33 b(some)h(of)g(the)f
+(de\014-)150 4980 y(nitions)e(in)g Fs(readline.h)d Ft(use)j(the)h
+Fs(stdio)d Ft(library)-8 b(,)32 b(the)f(\014le)h Fs(<stdio.h>)c
+Ft(should)i(b)s(e)h(included)f(b)s(efore)150 5090 y Fs(readline.h)p
+Ft(.)275 5230 y Fs(readline.h)d Ft(de\014nes)j(a)h(C)f(prepro)s(cessor)
+g(v)-5 b(ariable)31 b(that)g(should)f(b)s(e)g(treated)h(as)g(an)g(in)m
+(teger,)h Fs(RL_)150 5340 y(READLINE_VERSION)p Ft(,)20
+b(whic)m(h)h(ma)m(y)i(b)s(e)f(used)f(to)i(conditionally)h(compile)f
+(application)g(co)s(de)f(dep)s(ending)p eop end
+%%Page: 28 32
+TeXDict begin 28 31 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(28)150
+299 y(on)35 b(the)g(installed)h(Readline)f(v)m(ersion.)56
+b(The)34 b(v)-5 b(alue)35 b(is)h(a)f(hexadecimal)h(enco)s(ding)f(of)g
+(the)h(ma)5 b(jor)35 b(and)150 408 y(minor)f(v)m(ersion)g(n)m(um)m(b)s
+(ers)f(of)h(the)h(library)-8 b(,)35 b(of)f(the)h(form)e(0x)p
+Fj(MMmm)p Ft(.)53 b Fj(MM)45 b Ft(is)34 b(the)g(t)m(w)m(o-digit)j(ma)5
+b(jor)150 518 y(v)m(ersion)29 b(n)m(um)m(b)s(er;)g Fj(mm)f
+Ft(is)h(the)g(t)m(w)m(o-digit)j(minor)c(v)m(ersion)i(n)m(um)m(b)s(er.)
+38 b(F)-8 b(or)30 b(Readline)g(4.2,)g(for)f(example,)150
+628 y(the)i(v)-5 b(alue)30 b(of)h Fs(RL_READLINE_VERSION)25
+b Ft(w)m(ould)30 b(b)s(e)g Fs(0x0402)p Ft(.)150 837 y
+Fi(2.2.1)63 b(Readline)40 b(T)m(yp)s(edefs)150 984 y
+Ft(F)-8 b(or)31 b(readabilit)m(y)-8 b(,)33 b(w)m(e)d(declare)i(a)f(n)m
+(um)m(b)s(er)e(of)h(new)g(ob)5 b(ject)31 b(t)m(yp)s(es,)g(all)g(p)s
+(oin)m(ters)f(to)i(functions.)275 1128 y(The)j(reason)h(for)f
+(declaring)h(these)h(new)e(t)m(yp)s(es)g(is)h(to)h(mak)m(e)f(it)g
+(easier)h(to)f(write)g(co)s(de)g(describing)150 1238
+y(p)s(oin)m(ters)30 b(to)h(C)f(functions)g(with)g(appropriately)h
+(protot)m(yp)s(ed)f(argumen)m(ts)h(and)f(return)f(v)-5
+b(alues.)275 1382 y(F)d(or)37 b(instance,)j(sa)m(y)d(w)m(e)g(w)m(an)m
+(t)h(to)g(declare)f(a)h(v)-5 b(ariable)37 b Fj(func)42
+b Ft(as)37 b(a)g(p)s(oin)m(ter)g(to)g(a)h(function)e(whic)m(h)150
+1492 y(tak)m(es)27 b(t)m(w)m(o)g Fs(int)e Ft(argumen)m(ts)h(and)f
+(returns)f(an)i Fs(int)f Ft(\(this)h(is)f(the)h(t)m(yp)s(e)g(of)g(all)h
+(of)e(the)h(Readline)h(bindable)150 1601 y(functions\).)41
+b(Instead)30 b(of)g(the)h(classic)h(C)e(declaration)275
+1746 y Fs(int)f(\(*func\)\(\);)150 1890 y Ft(or)h(the)h(ANSI-C)f(st)m
+(yle)i(declaration)275 2035 y Fs(int)d(\(*func\)\(int,)e(int\);)150
+2179 y Ft(w)m(e)k(ma)m(y)g(write)275 2324 y Fs(rl_command_func_t)25
+b(*func;)275 2468 y Ft(The)k(full)h(list)i(of)e(function)g(p)s(oin)m
+(ter)g(t)m(yp)s(es)h(a)m(v)-5 b(ailable)33 b(is)150 2643
+y Fs(typedef)28 b(int)i(rl_command_func_t)c(\(int,)i(int\);)150
+2752 y(typedef)g(char)i(*rl_compentry_func_t)24 b(\(const)29
+b(char)g(*,)h(int\);)150 2862 y(typedef)e(char)i
+(**rl_completion_func_t)24 b(\(const)29 b(char)g(*,)h(int,)f(int\);)150
+2971 y(typedef)f(char)i(*rl_quote_func_t)c(\(char)i(*,)i(int,)f(char)h
+(*\);)150 3081 y(typedef)e(char)i(*rl_dequote_func_t)25
+b(\(char)k(*,)h(int\);)150 3191 y(typedef)e(int)i(rl_compignore_func_t)
+25 b(\(char)k(**\);)150 3300 y(typedef)f(void)i(rl_compdisp_func_t)25
+b(\(char)k(**,)g(int,)h(int\);)150 3410 y(typedef)e(int)i
+(rl_hook_func_t)c(\(void\);)150 3519 y(typedef)i(int)i(rl_getc_func_t)c
+(\(FILE)j(*\);)150 3629 y(typedef)f(int)i(rl_linebuf_func_t)c(\(char)i
+(*,)i(int\);)150 3738 y(typedef)e(int)i(rl_intfunc_t)d(\(int\);)150
+3848 y(#define)h(rl_ivoidfunc_t)f(rl_hook_func_t)150
+3958 y(typedef)h(int)i(rl_icpfunc_t)d(\(char)i(*\);)150
+4067 y(typedef)f(int)i(rl_icppfunc_t)d(\(char)i(**\);)150
+4177 y(typedef)f(void)i(rl_voidfunc_t)c(\(void\);)150
+4286 y(typedef)i(void)i(rl_vintfunc_t)c(\(int\);)150
+4396 y(typedef)i(void)i(rl_vcpfunc_t)d(\(char)i(*\);)150
+4506 y(typedef)f(void)i(rl_vcppfunc_t)c(\(char)j(**\);)150
+4685 y Fi(2.2.2)63 b(W)-10 b(riting)41 b(a)f(New)h(F)-10
+b(unction)150 4832 y Ft(In)30 b(order)h(to)h(write)f(new)g(functions)f
+(for)h(Readline,)h(y)m(ou)g(need)e(to)i(kno)m(w)f(the)g(calling)i(con)m
+(v)m(en)m(tions)g(for)150 4941 y(k)m(eyb)s(oard-in)m(v)m(ok)m(ed)f
+(functions,)d(and)h(the)g(names)g(of)g(the)g(v)-5 b(ariables)31
+b(that)f(describ)s(e)g(the)g(curren)m(t)g(state)150 5051
+y(of)h(the)f(line)h(read)f(so)h(far.)275 5196 y(The)e(calling)j
+(sequence)f(for)f(a)h(command)f Fs(foo)g Ft(lo)s(oks)g(lik)m(e)390
+5340 y Fs(int)47 b(foo)g(\(int)f(count,)h(int)f(key\))p
+eop end
+%%Page: 29 33
+TeXDict begin 29 32 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(29)150
+299 y(where)35 b Fj(coun)m(t)k Ft(is)d(the)g(n)m(umeric)g(argumen)m(t)g
+(\(or)g(1)g(if)g(defaulted\))h(and)e Fj(k)m(ey)44 b Ft(is)36
+b(the)g(k)m(ey)h(that)f(in)m(v)m(ok)m(ed)150 408 y(this)30
+b(function.)275 541 y(It)23 b(is)g(completely)h(up)e(to)i(the)f
+(function)g(as)g(to)h(what)f(should)f(b)s(e)h(done)f(with)h(the)g(n)m
+(umeric)g(argumen)m(t.)150 650 y(Some)40 b(functions)g(use)f(it)i(as)f
+(a)g(rep)s(eat)h(coun)m(t,)i(some)d(as)h(a)f(\015ag,)j(and)c(others)h
+(to)h(c)m(ho)s(ose)g(alternate)150 760 y(b)s(eha)m(vior)i(\(refreshing)
+g(the)h(curren)m(t)f(line)h(as)f(opp)s(osed)g(to)h(refreshing)e(the)i
+(screen,)j(for)c(example\).)150 870 y(Some)33 b(c)m(ho)s(ose)h(to)g
+(ignore)g(it.)50 b(In)32 b(general,)j(if)f(a)f(function)g(uses)g(the)g
+(n)m(umeric)g(argumen)m(t)h(as)f(a)h(rep)s(eat)150 979
+y(coun)m(t,)29 b(it)g(should)e(b)s(e)g(able)h(to)h(do)f(something)g
+(useful)f(with)h(b)s(oth)f(negativ)m(e)j(and)d(p)s(ositiv)m(e)i
+(argumen)m(ts.)150 1089 y(A)m(t)i(the)g(v)m(ery)g(least,)h(it)e(should)
+g(b)s(e)g(a)m(w)m(are)h(that)g(it)g(can)g(b)s(e)f(passed)g(a)g(negativ)
+m(e)j(argumen)m(t.)275 1221 y(A)38 b(command)f(function)h(should)f
+(return)g(0)h(if)g(its)h(action)g(completes)g(successfully)-8
+b(,)41 b(and)c(a)h(v)-5 b(alue)150 1331 y(greater)34
+b(than)f(zero)g(if)g(some)h(error)e(o)s(ccurs.)48 b(This)32
+b(is)h(the)g(con)m(v)m(en)m(tion)i(ob)s(ey)m(ed)f(b)m(y)e(all)i(of)f
+(the)g(builtin)150 1440 y(Readline)e(bindable)f(command)g(functions.)
+150 1677 y Fr(2.3)68 b(Readline)47 b(V)-11 b(ariables)150
+1836 y Ft(These)30 b(v)-5 b(ariables)31 b(are)g(a)m(v)-5
+b(ailable)33 b(to)e(function)f(writers.)3371 2014 y([V)-8
+b(ariable])-3598 b Fh(char)54 b(*)e(rl_line_buffer)390
+2123 y Ft(This)30 b(is)i(the)f(line)g(gathered)h(so)f(far.)43
+b(Y)-8 b(ou)32 b(are)f(w)m(elcome)i(to)f(mo)s(dify)f(the)g(con)m(ten)m
+(ts)i(of)e(the)g(line,)390 2233 y(but)k(see)h(Section)g(2.4.5)h([Allo)m
+(wing)h(Undoing],)f(page)f(39.)57 b(The)35 b(function)g
+Fs(rl_extend_line_)390 2342 y(buffer)29 b Ft(is)h(a)m(v)-5
+b(ailable)33 b(to)e(increase)g(the)g(memory)f(allo)s(cated)i(to)f
+Fs(rl_line_buffer)p Ft(.)3371 2520 y([V)-8 b(ariable])-3598
+b Fh(int)53 b(rl_point)390 2630 y Ft(The)30 b(o\013set)h(of)g(the)f
+(curren)m(t)h(cursor)e(p)s(osition)i(in)f Fs(rl_line_buffer)c
+Ft(\(the)31 b Fk(p)-5 b(oint)9 b Ft(\).)3371 2808 y([V)-8
+b(ariable])-3598 b Fh(int)53 b(rl_end)390 2917 y Ft(The)27
+b(n)m(um)m(b)s(er)g(of)h(c)m(haracters)h(presen)m(t)f(in)g
+Fs(rl_line_buffer)p Ft(.)36 b(When)27 b Fs(rl_point)f
+Ft(is)i(at)h(the)f(end)390 3027 y(of)j(the)f(line,)h
+Fs(rl_point)d Ft(and)i Fs(rl_end)f Ft(are)h(equal.)3371
+3204 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_mark)390
+3314 y Ft(The)36 b Fj(mark)42 b Ft(\(sa)m(v)m(ed)d(p)s(osition\))e(in)g
+(the)g(curren)m(t)f(line.)61 b(If)36 b(set,)k(the)d(mark)f(and)h(p)s
+(oin)m(t)f(de\014ne)h(a)390 3424 y Fk(r)-5 b(e)g(gion)p
+Ft(.)3371 3601 y([V)d(ariable])-3598 b Fh(int)53 b(rl_done)390
+3711 y Ft(Setting)22 b(this)g(to)g(a)g(non-zero)g(v)-5
+b(alue)23 b(causes)f(Readline)g(to)g(return)f(the)h(curren)m(t)f(line)h
+(immediately)-8 b(.)390 3820 y(Readline)26 b(will)f(set)h(this)f(v)-5
+b(ariable)26 b(when)e(it)i(has)f(read)g(a)g(k)m(ey)h(sequence)g(b)s
+(ound)d(to)j Fs(accept-line)390 3930 y Ft(and)k(is)g(ab)s(out)g(to)h
+(return)f(the)g(line)h(to)g(the)g(caller.)3371 4108 y([V)-8
+b(ariable])-3598 b Fh(int)53 b(rl_eof_found)390 4217
+y Ft(Readline)28 b(will)g(set)g(this)f(v)-5 b(ariable)28
+b(when)e(it)i(has)f(read)g(an)h(EOF)f(c)m(haracter)i(\(e.g.,)h(the)d
+(stt)m(y)h(`)p Fs(EOF)p Ft(')390 4327 y(c)m(haracter\))42
+b(on)e(an)f(empt)m(y)i(line)f(or)g(encoun)m(tered)g(a)g(read)g(error)f
+(and)h(is)g(ab)s(out)f(to)i(return)e(a)390 4437 y(NULL)30
+b(line)h(to)g(the)g(caller.)3371 4614 y([V)-8 b(ariable])-3598
+b Fh(int)53 b(rl_num_chars_to_read)390 4724 y Ft(Setting)34
+b(this)e(to)i(a)f(p)s(ositiv)m(e)h(v)-5 b(alue)34 b(b)s(efore)e
+(calling)i Fs(readline\(\))d Ft(causes)i(Readline)g(to)h(return)390
+4833 y(after)i(accepting)h(that)g(man)m(y)e(c)m(haracters,)k(rather)d
+(than)f(reading)h(up)e(to)j(a)f(c)m(haracter)h(b)s(ound)390
+4943 y(to)31 b Fs(accept-line)p Ft(.)3371 5121 y([V)-8
+b(ariable])-3598 b Fh(int)53 b(rl_pending_input)390 5230
+y Ft(Setting)26 b(this)f(to)h(a)f(v)-5 b(alue)26 b(mak)m(es)g(it)g(the)
+f(next)g(k)m(eystrok)m(e)i(read.)39 b(This)24 b(is)i(a)f(w)m(a)m(y)h
+(to)g(stu\013)f(a)g(single)390 5340 y(c)m(haracter)32
+b(in)m(to)f(the)g(input)e(stream.)p eop end
+%%Page: 30 34
+TeXDict begin 30 33 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(30)3371
+299 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_dispatching)390
+408 y Ft(Set)24 b(to)h(a)g(non-zero)g(v)-5 b(alue)24
+b(if)h(a)f(function)g(is)g(b)s(eing)g(called)i(from)d(a)i(k)m(ey)g
+(binding;)g(zero)g(otherwise.)390 518 y(Application)37
+b(functions)e(can)h(test)h(this)e(to)i(disco)m(v)m(er)g(whether)e(they)
+h(w)m(ere)g(called)h(directly)f(or)390 628 y(b)m(y)30
+b(Readline's)h(dispatc)m(hing)g(mec)m(hanism.)3371 835
+y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_erase_empty_line)390
+944 y Ft(Setting)47 b(this)e(to)i(a)f(non-zero)h(v)-5
+b(alue)46 b(causes)h(Readline)f(to)h(completely)g(erase)g(the)f(curren)
+m(t)390 1054 y(line,)f(including)c(an)m(y)g(prompt,)j(an)m(y)d(time)h
+(a)g(newline)f(is)h(t)m(yp)s(ed)f(as)g(the)h(only)f(c)m(haracter)i(on)
+390 1163 y(an)36 b(otherwise-empt)m(y)i(line.)58 b(The)36
+b(cursor)g(is)g(mo)m(v)m(ed)h(to)g(the)g(b)s(eginning)e(of)i(the)f
+(newly-blank)390 1273 y(line.)3371 1480 y([V)-8 b(ariable])-3598
+b Fh(char)54 b(*)e(rl_prompt)390 1590 y Ft(The)26 b(prompt)f(Readline)i
+(uses.)38 b(This)26 b(is)g(set)h(from)e(the)i(argumen)m(t)f(to)h
+Fs(readline\(\))p Ft(,)d(and)i(should)390 1699 y(not)h(b)s(e)f
+(assigned)h(to)h(directly)-8 b(.)41 b(The)26 b Fs(rl_set_prompt\(\))d
+Ft(function)j(\(see)i(Section)g(2.4.6)h([Redis-)390 1809
+y(pla)m(y],)i(page)h(40\))f(ma)m(y)g(b)s(e)f(used)f(to)j(mo)s(dify)d
+(the)i(prompt)e(string)h(after)h(calling)h Fs(readline\(\))p
+Ft(.)3371 2016 y([V)-8 b(ariable])-3598 b Fh(char)54
+b(*)e(rl_display_prompt)390 2125 y Ft(The)31 b(string)h(displa)m(y)m
+(ed)g(as)g(the)g(prompt.)44 b(This)31 b(is)h(usually)f(iden)m(tical)j
+(to)e Fj(rl)p 3031 2125 28 4 v 40 w(prompt)p Ft(,)f(but)g(ma)m(y)390
+2235 y(b)s(e)j(c)m(hanged)g(temp)s(orarily)h(b)m(y)f(functions)g(that)g
+(use)g(the)h(prompt)e(string)h(as)h(a)f(message)i(area,)390
+2345 y(suc)m(h)30 b(as)h(incremen)m(tal)g(searc)m(h.)3371
+2552 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_already_prompted)390
+2661 y Ft(If)36 b(an)g(application)i(wishes)d(to)i(displa)m(y)g(the)f
+(prompt)g(itself,)i(rather)f(than)f(ha)m(v)m(e)h(Readline)g(do)390
+2771 y(it)c(the)g(\014rst)f(time)i Fs(readline\(\))c
+Ft(is)i(called,)j(it)e(should)f(set)h(this)g(v)-5 b(ariable)34
+b(to)f(a)g(non-zero)g(v)-5 b(alue)390 2880 y(after)38
+b(displa)m(ying)h(the)f(prompt.)63 b(The)37 b(prompt)g(m)m(ust)h(also)h
+(b)s(e)e(passed)g(as)i(the)f(argumen)m(t)g(to)390 2990
+y Fs(readline\(\))30 b Ft(so)j(the)h(redispla)m(y)f(functions)f(can)i
+(up)s(date)e(the)h(displa)m(y)g(prop)s(erly)-8 b(.)48
+b(The)32 b(calling)390 3099 y(application)g(is)e(resp)s(onsible)g(for)g
+(managing)h(the)f(v)-5 b(alue;)31 b(Readline)g(nev)m(er)g(sets)g(it.)
+3371 3306 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g
+(rl_library_version)390 3416 y Ft(The)30 b(v)m(ersion)h(n)m(um)m(b)s
+(er)e(of)h(this)h(revision)f(of)h(the)f(library)-8 b(.)3371
+3623 y([V)g(ariable])-3598 b Fh(int)53 b(rl_readline_version)390
+3733 y Ft(An)34 b(in)m(teger)h(enco)s(ding)f(the)g(curren)m(t)g(v)m
+(ersion)h(of)f(the)g(library)-8 b(.)52 b(The)34 b(enco)s(ding)g(is)g
+(of)g(the)g(form)390 3842 y(0x)p Fj(MMmm)p Ft(,)39 b(where)d
+Fj(MM)47 b Ft(is)36 b(the)h(t)m(w)m(o-digit)i(ma)5 b(jor)36
+b(v)m(ersion)h(n)m(um)m(b)s(er,)g(and)f Fj(mm)g Ft(is)h(the)f(t)m(w)m
+(o-)390 3952 y(digit)i(minor)f(v)m(ersion)h(n)m(um)m(b)s(er.)60
+b(F)-8 b(or)38 b(example,)i(for)d(Readline-4.2,)k Fs
+(rl_readline_version)390 4061 y Ft(w)m(ould)30 b(ha)m(v)m(e)i(the)e(v)
+-5 b(alue)31 b(0x0402.)3371 4268 y([V)-8 b(ariable])-3598
+b Fh(int)53 b(rl_gnu_readline_p)390 4378 y Ft(Alw)m(a)m(ys)32
+b(set)f(to)g(1,)g(denoting)f(that)h(this)g(is)f Fm(gnu)g
+Ft(Readline)h(rather)f(than)h(some)f(em)m(ulation.)3371
+4585 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g
+(rl_terminal_name)390 4695 y Ft(The)28 b(terminal)g(t)m(yp)s(e,)h(used)
+e(for)h(initialization.)43 b(If)28 b(not)g(set)h(b)m(y)e(the)i
+(application,)h(Readline)f(sets)390 4804 y(this)h(to)h(the)g(v)-5
+b(alue)31 b(of)f(the)h Fs(TERM)e Ft(en)m(vironmen)m(t)i(v)-5
+b(ariable)31 b(the)g(\014rst)e(time)j(it)e(is)h(called.)3371
+5011 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g
+(rl_readline_name)390 5121 y Ft(This)30 b(v)-5 b(ariable)32
+b(is)g(set)f(to)h(a)g(unique)e(name)h(b)m(y)g(eac)m(h)i(application)f
+(using)f(Readline.)44 b(The)30 b(v)-5 b(alue)390 5230
+y(allo)m(ws)29 b(conditional)h(parsing)d(of)h(the)h(inputrc)e(\014le)h
+(\(see)h(Section)g(1.3.2)g([Conditional)g(Init)f(Con-)390
+5340 y(structs],)j(page)g(13\).)p eop end
+%%Page: 31 35
+TeXDict begin 31 34 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(31)3371
+299 y([V)-8 b(ariable])-3598 b Fh(FILE)54 b(*)e(rl_instream)390
+408 y Ft(The)40 b(stdio)i(stream)f(from)g(whic)m(h)f(Readline)i(reads)f
+(input.)71 b(If)41 b Fs(NULL)p Ft(,)i(Readline)e(defaults)g(to)390
+518 y Fj(stdin)p Ft(.)3371 704 y([V)-8 b(ariable])-3598
+b Fh(FILE)54 b(*)e(rl_outstream)390 814 y Ft(The)34 b(stdio)h(stream)f
+(to)i(whic)m(h)e(Readline)h(p)s(erforms)e(output.)52
+b(If)34 b Fs(NULL)p Ft(,)h(Readline)g(defaults)f(to)390
+924 y Fj(stdout)p Ft(.)3371 1110 y([V)-8 b(ariable])-3598
+b Fh(int)53 b(rl_prefer_env_winsize)390 1219 y Ft(If)28
+b(non-zero,)h(Readline)g(giv)m(es)h(v)-5 b(alues)29 b(found)e(in)h(the)
+g Fs(LINES)f Ft(and)h Fs(COLUMNS)e Ft(en)m(vironmen)m(t)j(v)-5
+b(ari-)390 1329 y(ables)41 b(greater)h(precedence)g(than)e(v)-5
+b(alues)41 b(fetc)m(hed)h(from)e(the)h(k)m(ernel)h(when)e(computing)h
+(the)390 1439 y(screen)30 b(dimensions.)3371 1625 y([V)-8
+b(ariable])-3598 b Fh(rl_command_func_t)57 b(*)c(rl_last_func)390
+1734 y Ft(The)34 b(address)g(of)h(the)g(last)h(command)e(function)g
+(Readline)i(executed.)55 b(Ma)m(y)35 b(b)s(e)g(used)f(to)h(test)390
+1844 y(whether)30 b(or)g(not)h(a)f(function)h(is)f(b)s(eing)g(executed)
+h(t)m(wice)h(in)e(succession,)h(for)f(example.)3371 2030
+y([V)-8 b(ariable])-3598 b Fh(rl_hook_func_t)57 b(*)52
+b(rl_startup_hook)390 2140 y Ft(If)34 b(non-zero,)i(this)e(is)h(the)f
+(address)f(of)i(a)g(function)f(to)h(call)g(just)f(b)s(efore)g
+Fs(readline)e Ft(prin)m(ts)i(the)390 2250 y(\014rst)c(prompt.)3371
+2436 y([V)-8 b(ariable])-3598 b Fh(rl_hook_func_t)57
+b(*)52 b(rl_pre_input_hook)390 2545 y Ft(If)35 b(non-zero,)j(this)d(is)
+g(the)h(address)f(of)g(a)h(function)f(to)i(call)f(after)g(the)g
+(\014rst)f(prompt)f(has)i(b)s(een)390 2655 y(prin)m(ted)30
+b(and)g(just)f(b)s(efore)h Fs(readline)f Ft(starts)h(reading)h(input)e
+(c)m(haracters.)3371 2841 y([V)-8 b(ariable])-3598 b
+Fh(rl_hook_func_t)57 b(*)52 b(rl_event_hook)390 2951
+y Ft(If)40 b(non-zero,)k(this)d(is)f(the)h(address)f(of)h(a)g(function)
+f(to)h(call)h(p)s(erio)s(dically)f(when)f(Readline)h(is)390
+3061 y(w)m(aiting)30 b(for)f(terminal)h(input.)39 b(By)30
+b(default,)g(this)f(will)g(b)s(e)g(called)h(at)g(most)f(ten)h(times)f
+(a)h(second)390 3170 y(if)g(there)h(is)f(no)h(k)m(eyb)s(oard)f(input.)
+3371 3356 y([V)-8 b(ariable])-3598 b Fh(rl_getc_func_t)57
+b(*)52 b(rl_getc_function)390 3466 y Ft(If)30 b(non-zero,)h(Readline)g
+(will)g(call)h(indirectly)e(through)g(this)h(p)s(oin)m(ter)f(to)h(get)h
+(a)e(c)m(haracter)i(from)390 3576 y(the)21 b(input)g(stream.)38
+b(By)21 b(default,)j(it)e(is)f(set)h(to)g Fs(rl_getc)p
+Ft(,)f(the)h(default)f(Readline)h(c)m(haracter)h(input)390
+3685 y(function)f(\(see)i(Section)g(2.4.8)g([Character)g(Input],)f
+(page)h(42\).)39 b(In)22 b(general,)k(an)c(application)i(that)390
+3795 y(sets)31 b Fj(rl)p 635 3795 28 4 v 40 w(getc)p
+835 3795 V 41 w(function)f Ft(should)g(consider)g(setting)h
+Fj(rl)p 2234 3795 V 40 w(input)p 2487 3795 V 39 w(a)m(v)-5
+b(ailable)p 2867 3795 V 43 w(ho)s(ok)36 b Ft(as)30 b(w)m(ell.)3371
+3981 y([V)-8 b(ariable])-3598 b Fh(rl_hook_func_t)57
+b(*)52 b(rl_signal_event_hook)390 4091 y Ft(If)27 b(non-zero,)h(this)f
+(is)g(the)g(address)f(of)i(a)f(function)g(to)g(call)i(if)e(a)g(read)g
+(system)g(call)h(is)g(in)m(terrupted)390 4200 y(when)h(Readline)i(is)g
+(reading)f(terminal)h(input.)3371 4387 y([V)-8 b(ariable])-3598
+b Fh(rl_hook_func_t)57 b(*)52 b(rl_timeout_event_hook)390
+4496 y Ft(If)25 b(non-zero,)i(this)e(is)g(the)h(address)e(of)h(a)h
+(function)f(to)h(call)g(if)g(Readline)f(times)h(out)g(while)f(reading)
+390 4606 y(input.)3371 4792 y([V)-8 b(ariable])-3598
+b Fh(rl_hook_func_t)57 b(*)52 b(rl_input_available_ho)q(ok)390
+4902 y Ft(If)28 b(non-zero,)j(Readline)e(will)g(use)g(this)g
+(function's)g(return)f(v)-5 b(alue)29 b(when)f(it)i(needs)e(to)i
+(determine)390 5011 y(whether)42 b(or)g(not)h(there)f(is)h(a)m(v)-5
+b(ailable)45 b(input)c(on)i(the)f(curren)m(t)g(input)g(source.)77
+b(The)42 b(default)390 5121 y(ho)s(ok)25 b(c)m(hec)m(ks)i
+Fs(rl_instream)p Ft(;)d(if)i(an)f(application)i(is)e(using)g(a)h
+(di\013eren)m(t)g(input)e(source,)j(it)f(should)390 5230
+y(set)34 b(the)f(ho)s(ok)h(appropriately)-8 b(.)50 b(Readline)34
+b(queries)f(for)h(a)m(v)-5 b(ailable)35 b(input)e(when)f(implemen)m
+(ting)390 5340 y(in)m(tra-k)m(ey-sequence)f(timeouts)e(during)e(input)g
+(and)h(incremen)m(tal)h(searc)m(hes.)41 b(This)27 b(ma)m(y)i(use)f(an)p
+eop end
+%%Page: 32 36
+TeXDict begin 32 35 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(32)390
+299 y(application-sp)s(eci\014c)22 b(timeout)g(b)s(efore)f(returning)f
+(a)h(v)-5 b(alue;)25 b(Readline)c(uses)f(the)i(v)-5 b(alue)21
+b(passed)f(to)390 408 y Fs(rl_set_keyboard_input_ti)o(meou)o(t\(\))e
+Ft(or)24 b(the)g(v)-5 b(alue)25 b(of)g(the)f(user-settable)i
+Fj(k)m(eyseq-timeout)390 518 y Ft(v)-5 b(ariable.)48
+b(This)31 b(is)i(designed)f(for)g(use)g(b)m(y)g(applications)i(using)e
+(Readline's)h(callbac)m(k)h(in)m(terface)390 628 y(\(see)d(Section)f
+(2.4.12)i([Alternate)f(In)m(terface],)h(page)e(46\),)i(whic)m(h)d(ma)m
+(y)h(not)g(use)g(the)g(traditional)390 737 y Fs(read\(2\))39
+b Ft(and)g(\014le)i(descriptor)f(in)m(terface,)45 b(or)c(other)f
+(applications)i(using)e(a)h(di\013eren)m(t)g(input)390
+847 y(mec)m(hanism.)k(If)31 b(an)g(application)i(uses)e(an)h(input)e
+(mec)m(hanism)i(or)g(ho)s(ok)f(that)h(can)g(p)s(oten)m(tially)390
+956 y(exceed)38 b(the)e(v)-5 b(alue)37 b(of)g Fj(k)m(eyseq-timeout)p
+Ft(,)k(it)c(should)e(increase)j(the)e(timeout)i(or)f(set)g(this)f(ho)s
+(ok)390 1066 y(appropriately)d(ev)m(en)g(when)e(not)h(using)g(the)h
+(callbac)m(k)h(in)m(terface.)48 b(In)31 b(general,)j(an)f(application)
+390 1176 y(that)e(sets)g Fj(rl)p 832 1176 28 4 v 40 w(getc)p
+1032 1176 V 41 w(function)f Ft(should)g(consider)g(setting)h
+Fj(rl)p 2431 1176 V 40 w(input)p 2684 1176 V 39 w(a)m(v)-5
+b(ailable)p 3064 1176 V 43 w(ho)s(ok)36 b Ft(as)30 b(w)m(ell.)3371
+1362 y([V)-8 b(ariable])-3598 b Fh(rl_voidfunc_t)56 b(*)d
+(rl_redisplay_function)390 1471 y Ft(If)36 b(non-zero,)i(Readline)e
+(will)h(call)g(indirectly)f(through)g(this)g(p)s(oin)m(ter)g(to)g(up)s
+(date)g(the)g(displa)m(y)390 1581 y(with)27 b(the)g(curren)m(t)g(con)m
+(ten)m(ts)h(of)f(the)h(editing)f(bu\013er.)39 b(By)27
+b(default,)h(it)g(is)f(set)g(to)h Fs(rl_redisplay)p Ft(,)390
+1691 y(the)j(default)f(Readline)h(redispla)m(y)g(function)f(\(see)h
+(Section)g(2.4.6)h([Redispla)m(y],)g(page)f(40\).)3371
+1877 y([V)-8 b(ariable])-3598 b Fh(rl_vintfunc_t)56 b(*)d
+(rl_prep_term_function)390 1987 y Ft(If)24 b(non-zero,)i(Readline)e
+(will)h(call)g(indirectly)g(through)e(this)h(p)s(oin)m(ter)g(to)h
+(initialize)h(the)e(terminal.)390 2096 y(The)37 b(function)f(tak)m(es)j
+(a)e(single)h(argumen)m(t,)i(an)d Fs(int)f Ft(\015ag)h(that)h(sa)m(ys)g
+(whether)e(or)h(not)g(to)h(use)390 2206 y(eigh)m(t-bit)e(c)m
+(haracters.)53 b(By)35 b(default,)g(this)f(is)g(set)h(to)g
+Fs(rl_prep_terminal)29 b Ft(\(see)35 b(Section)g(2.4.9)390
+2315 y([T)-8 b(erminal)31 b(Managemen)m(t],)i(page)e(43\).)3371
+2502 y([V)-8 b(ariable])-3598 b Fh(rl_voidfunc_t)56 b(*)d
+(rl_deprep_term_functio)q(n)390 2611 y Ft(If)36 b(non-zero,)j(Readline)
+e(will)g(call)h(indirectly)f(through)f(this)g(p)s(oin)m(ter)h(to)g
+(reset)g(the)g(terminal.)390 2721 y(This)d(function)h(should)f(undo)g
+(the)h(e\013ects)h(of)f Fs(rl_prep_term_function)p Ft(.)49
+b(By)35 b(default,)i(this)390 2830 y(is)30 b(set)h(to)g
+Fs(rl_deprep_terminal)26 b Ft(\(see)31 b(Section)g(2.4.9)i([T)-8
+b(erminal)30 b(Managemen)m(t],)j(page)e(43\).)3371 3017
+y([V)-8 b(ariable])-3598 b Fh(Keymap)54 b(rl_executing_keymap)390
+3126 y Ft(This)35 b(v)-5 b(ariable)37 b(is)f(set)g(to)h(the)f(k)m
+(eymap)h(\(see)g(Section)f(2.4.2)i([Keymaps],)g(page)e(35\))i(in)d
+(whic)m(h)390 3236 y(the)c(curren)m(tly)f(executing)i(Readline)f
+(function)f(w)m(as)g(found.)3371 3422 y([V)-8 b(ariable])-3598
+b Fh(Keymap)54 b(rl_binding_keymap)390 3532 y Ft(This)35
+b(v)-5 b(ariable)37 b(is)f(set)g(to)h(the)f(k)m(eymap)h(\(see)g
+(Section)f(2.4.2)i([Keymaps],)g(page)e(35\))i(in)d(whic)m(h)390
+3641 y(the)c(last)g(k)m(ey)g(binding)e(o)s(ccurred.)3371
+3828 y([V)-8 b(ariable])-3598 b Fh(char)54 b(*)e(rl_executing_macro)390
+3937 y Ft(This)30 b(v)-5 b(ariable)31 b(is)f(set)h(to)g(the)g(text)g
+(of)g(an)m(y)f(curren)m(tly-executing)i(macro.)3371 4124
+y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_executing_key)390
+4233 y Ft(The)30 b(k)m(ey)h(that)g(caused)f(the)h(dispatc)m(h)g(to)g
+(the)f(curren)m(tly-executing)i(Readline)f(function.)3371
+4419 y([V)-8 b(ariable])-3598 b Fh(char)54 b(*)e(rl_executing_keyseq)
+390 4529 y Ft(The)35 b(full)g(k)m(ey)h(sequence)g(that)g(caused)g(the)g
+(dispatc)m(h)f(to)i(the)e(curren)m(tly-executing)i(Readline)390
+4639 y(function.)3371 4825 y([V)-8 b(ariable])-3598 b
+Fh(int)53 b(rl_key_sequence_lengt)q(h)390 4934 y Ft(The)30
+b(n)m(um)m(b)s(er)f(of)h(c)m(haracters)i(in)e Fj(rl)p
+1617 4934 V 40 w(executing)p 2032 4934 V 41 w(k)m(eyseq)p
+Ft(.)3371 5121 y([V)-8 b(ariable])-3598 b Fh(int)53 b
+(rl_readline_state)390 5230 y Ft(A)35 b(v)-5 b(ariable)35
+b(with)f(bit)g(v)-5 b(alues)35 b(that)g(encapsulate)h(the)e(curren)m(t)
+h(Readline)g(state.)54 b(A)34 b(bit)h(is)f(set)390 5340
+y(with)k(the)g Fs(RL_SETSTATE)c Ft(macro,)41 b(and)c(unset)h(with)f
+(the)h Fs(RL_UNSETSTATE)d Ft(macro.)63 b(Use)39 b(the)p
+eop end
+%%Page: 33 37
+TeXDict begin 33 36 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(33)390
+299 y Fs(RL_ISSTATE)34 b Ft(macro)k(to)g(test)g(whether)f(a)h
+(particular)f(state)i(bit)e(is)g(set.)62 b(Curren)m(t)36
+b(state)j(bits)390 408 y(include:)390 561 y Fs(RL_STATE_NONE)870
+670 y Ft(Readline)31 b(has)f(not)h(y)m(et)g(b)s(een)f(called,)i(nor)e
+(has)g(it)h(b)s(egun)e(to)i(initialize.)390 822 y Fs
+(RL_STATE_INITIALIZING)870 932 y Ft(Readline)g(is)f(initializing)j(its)
+e(in)m(ternal)g(data)g(structures.)390 1084 y Fs(RL_STATE_INITIALIZED)
+870 1194 y Ft(Readline)g(has)f(completed)h(its)g(initialization.)390
+1346 y Fs(RL_STATE_TERMPREPPED)870 1456 y Ft(Readline)e(has)g(mo)s
+(di\014ed)e(the)i(terminal)g(mo)s(des)f(to)i(do)e(its)i(o)m(wn)e(input)
+g(and)g(redis-)870 1565 y(pla)m(y)-8 b(.)390 1717 y Fs
+(RL_STATE_READCMD)870 1827 y Ft(Readline)31 b(is)f(reading)h(a)g
+(command)f(from)g(the)g(k)m(eyb)s(oard.)390 1979 y Fs
+(RL_STATE_METANEXT)870 2089 y Ft(Readline)h(is)f(reading)h(more)f
+(input)g(after)h(reading)f(the)h(meta-pre\014x)f(c)m(haracter.)390
+2241 y Fs(RL_STATE_DISPATCHING)870 2351 y Ft(Readline)h(is)f(dispatc)m
+(hing)h(to)g(a)g(command.)390 2503 y Fs(RL_STATE_MOREINPUT)870
+2612 y Ft(Readline)g(is)f(reading)h(more)f(input)g(while)g(executing)i
+(an)e(editing)h(command.)390 2765 y Fs(RL_STATE_ISEARCH)870
+2874 y Ft(Readline)g(is)f(p)s(erforming)g(an)g(incremen)m(tal)i
+(history)e(searc)m(h.)390 3026 y Fs(RL_STATE_NSEARCH)870
+3136 y Ft(Readline)h(is)f(p)s(erforming)g(a)g(non-incremen)m(tal)i
+(history)e(searc)m(h.)390 3288 y Fs(RL_STATE_SEARCH)870
+3398 y Ft(Readline)21 b(is)f(searc)m(hing)i(bac)m(kw)m(ard)e(or)h(forw)
+m(ard)e(through)h(the)h(history)f(for)g(a)h(string.)390
+3550 y Fs(RL_STATE_NUMERICARG)870 3660 y Ft(Readline)31
+b(is)f(reading)h(a)g(n)m(umeric)f(argumen)m(t.)390 3812
+y Fs(RL_STATE_MACROINPUT)870 3921 y Ft(Readline)25 b(is)f(curren)m(tly)
+g(getting)i(its)f(input)e(from)h(a)g(previously-de\014ned)f(k)m(eyb)s
+(oard)870 4031 y(macro.)390 4183 y Fs(RL_STATE_MACRODEF)870
+4293 y Ft(Readline)31 b(is)f(curren)m(tly)h(reading)f(c)m(haracters)i
+(de\014ning)e(a)g(k)m(eyb)s(oard)h(macro.)390 4445 y
+Fs(RL_STATE_OVERWRITE)870 4555 y Ft(Readline)g(is)f(in)g(o)m(v)m
+(erwrite)i(mo)s(de.)390 4707 y Fs(RL_STATE_COMPLETING)870
+4816 y Ft(Readline)f(is)f(p)s(erforming)g(w)m(ord)g(completion.)390
+4969 y Fs(RL_STATE_SIGHANDLER)870 5078 y Ft(Readline)h(is)f(curren)m
+(tly)h(executing)g(the)g(readline)g(signal)g(handler.)390
+5230 y Fs(RL_STATE_UNDOING)870 5340 y Ft(Readline)g(is)f(p)s(erforming)
+g(an)g(undo.)p eop end
+%%Page: 34 38
+TeXDict begin 34 37 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(34)390
+299 y Fs(RL_STATE_INPUTPENDING)870 408 y Ft(Readline)31
+b(has)f(input)g(p)s(ending)f(due)g(to)i(a)g(call)h(to)f
+Fs(rl_execute_next\(\))p Ft(.)390 557 y Fs(RL_STATE_TTYCSAVED)870
+666 y Ft(Readline)g(has)f(sa)m(v)m(ed)i(the)e(v)-5 b(alues)31
+b(of)f(the)h(terminal's)g(sp)s(ecial)g(c)m(haracters.)390
+814 y Fs(RL_STATE_CALLBACK)870 924 y Ft(Readline)44 b(is)f(curren)m
+(tly)g(using)f(the)h(alternate)i(\(callbac)m(k\))h(in)m(terface)e
+(\(see)g(Sec-)870 1033 y(tion)31 b(2.4.12)h([Alternate)h(In)m
+(terface],)f(page)f(46\).)390 1182 y Fs(RL_STATE_VIMOTION)870
+1291 y Ft(Readline)g(is)f(reading)h(the)f(argumen)m(t)h(to)g(a)g(vi-mo)
+s(de)g Fs(")p Ft(motion)p Fs(")f Ft(command.)390 1439
+y Fs(RL_STATE_MULTIKEY)870 1549 y Ft(Readline)h(is)f(reading)h(a)g(m)m
+(ultiple-k)m(eystrok)m(e)i(command.)390 1697 y Fs(RL_STATE_VICMDONCE)
+870 1807 y Ft(Readline)40 b(has)f(en)m(tered)g(vi)g(command)g(\(mo)m(v)
+m(emen)m(t\))j(mo)s(de)d(at)h(least)g(one)f(time)870
+1916 y(during)29 b(the)i(curren)m(t)f(call)i(to)f Fs(readline\(\))p
+Ft(.)390 2064 y Fs(RL_STATE_DONE)870 2174 y Ft(Readline)d(has)g(read)f
+(a)i(k)m(ey)f(sequence)g(b)s(ound)e(to)i Fs(accept-line)d
+Ft(and)i(is)h(ab)s(out)f(to)870 2284 y(return)i(the)i(line)g(to)g(the)f
+(caller.)390 2432 y Fs(RL_STATE_TIMEOUT)870 2541 y Ft(Readline)44
+b(has)f(timed)g(out)h(\(it)g(did)f(not)g(receiv)m(e)i(a)f(line)f(or)h
+(sp)s(eci\014ed)e(n)m(um)m(b)s(er)870 2651 y(of)36 b(c)m(haracters)i(b)
+s(efore)d(the)i(timeout)g(duration)e(sp)s(eci\014ed)h(b)m(y)g
+Fs(rl_set_timeout)870 2760 y Ft(elapsed\))31 b(and)f(is)g(returning)g
+(that)h(status)f(to)h(the)g(caller.)390 2909 y Fs(RL_STATE_EOF)870
+3018 y Ft(Readline)39 b(has)f(read)h(an)f(EOF)h(c)m(haracter)h(\(e.g.,)
+i(the)d(stt)m(y)g(`)p Fs(EOF)p Ft(')f(c)m(haracter\))j(or)870
+3128 y(encoun)m(tered)k(a)h(read)e(error)h(and)f(is)h(ab)s(out)g(to)g
+(return)f(a)h(NULL)g(line)g(to)h(the)870 3237 y(caller.)3371
+3405 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_explicit_arg)390
+3514 y Ft(Set)39 b(to)g(a)h(non-zero)f(v)-5 b(alue)39
+b(if)g(an)g(explicit)h(n)m(umeric)e(argumen)m(t)i(w)m(as)f(sp)s
+(eci\014ed)f(b)m(y)g(the)h(user.)390 3624 y(Only)30 b(v)-5
+b(alid)30 b(in)h(a)f(bindable)g(command)g(function.)3371
+3791 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_numeric_arg)390
+3901 y Ft(Set)45 b(to)h(the)g(v)-5 b(alue)46 b(of)f(an)m(y)h(n)m
+(umeric)f(argumen)m(t)h(explicitly)h(sp)s(eci\014ed)d(b)m(y)h(the)h
+(user)e(b)s(efore)390 4010 y(executing)27 b(the)f(curren)m(t)g
+(Readline)h(function.)38 b(Only)26 b(v)-5 b(alid)26 b(in)g(a)g
+(bindable)f(command)h(function.)3371 4178 y([V)-8 b(ariable])-3598
+b Fh(int)53 b(rl_editing_mode)390 4287 y Ft(Set)25 b(to)h(a)g(v)-5
+b(alue)25 b(denoting)h(Readline's)f(curren)m(t)g(editing)h(mo)s(de.)39
+b(A)25 b(v)-5 b(alue)25 b(of)h Fj(1)32 b Ft(means)25
+b(Readline)390 4397 y(is)30 b(curren)m(tly)h(in)f(emacs)h(mo)s(de;)f
+Fj(0)38 b Ft(means)31 b(that)f(vi)h(mo)s(de)f(is)g(activ)m(e.)150
+4626 y Fr(2.4)68 b(Readline)47 b(Con)l(v)l(enience)f(F)-11
+b(unctions)150 4845 y Fi(2.4.1)63 b(Naming)41 b(a)g(F)-10
+b(unction)150 4992 y Ft(The)24 b(user)h(can)g(dynamically)g(c)m(hange)h
+(the)f(bindings)f(of)h(k)m(eys)h(while)e(using)h(Readline.)39
+b(This)24 b(is)h(done)g(b)m(y)150 5102 y(represen)m(ting)30
+b(the)h(function)f(with)g(a)g(descriptiv)m(e)h(name.)41
+b(The)30 b(user)f(is)i(able)f(to)h(t)m(yp)s(e)g(the)f(descriptiv)m(e)
+150 5211 y(name)g(when)g(referring)g(to)h(the)f(function.)41
+b(Th)m(us,)29 b(in)h(an)h(init)f(\014le,)h(one)g(migh)m(t)g(\014nd)390
+5340 y Fs(Meta-Rubout:)92 b(backward-kill-word)p eop
+end
+%%Page: 35 39
+TeXDict begin 35 38 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(35)275
+299 y(This)84 b(binds)h(the)g(k)m(eystrok)m(e)j Fs(Meta-Rubout)82
+b Ft(to)87 b(the)e(function)h Fk(descriptively)94 b Ft(named)150
+408 y Fs(backward-kill-word)p Ft(.)63 b(Y)-8 b(ou,)43
+b(as)d(the)g(programmer,)i(should)c(bind)g(the)i(functions)f(y)m(ou)h
+(write)g(to)150 518 y(descriptiv)m(e)31 b(names)g(as)f(w)m(ell.)42
+b(Readline)31 b(pro)m(vides)f(a)h(function)f(for)g(doing)h(that:)3350
+706 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_add_defun)c
+Fg(\()p Ff(const)34 b(c)m(har)g(*name,)f(rl)p 1964 706
+30 5 v 43 w(command)p 2427 706 V 45 w(func)p 2656 706
+V 45 w(t)g(*function,)565 815 y(in)m(t)g(k)m(ey)p Fg(\))390
+925 y Ft(Add)h Fj(name)41 b Ft(to)36 b(the)f(list)h(of)g(named)e
+(functions.)55 b(Mak)m(e)37 b Fj(function)e Ft(b)s(e)g(the)g(function)g
+(that)h(gets)390 1034 y(called.)42 b(If)30 b Fj(k)m(ey)39
+b Ft(is)30 b(not)h(-1,)g(then)f(bind)f(it)i(to)g Fj(function)f
+Ft(using)g Fs(rl_bind_key\(\))p Ft(.)275 1222 y(Using)g(this)g
+(function)g(alone)h(is)f(su\016cien)m(t)g(for)g(most)h(applications.)42
+b(It)30 b(is)g(the)g(recommended)g(w)m(a)m(y)150 1332
+y(to)e(add)e(a)h(few)g(functions)g(to)g(the)g(default)h(functions)e
+(that)i(Readline)f(has)g(built)g(in.)39 b(If)26 b(y)m(ou)i(need)e(to)i
+(do)150 1441 y(something)34 b(other)g(than)f(adding)h(a)g(function)f
+(to)h(Readline,)i(y)m(ou)e(ma)m(y)g(need)f(to)i(use)e(the)h(underlying)
+150 1551 y(functions)c(describ)s(ed)f(b)s(elo)m(w.)150
+1752 y Fi(2.4.2)63 b(Selecting)41 b(a)f(Keymap)150 1899
+y Ft(Key)f(bindings)e(tak)m(e)j(place)g(on)f(a)g Fj(k)m(eymap)p
+Ft(.)66 b(The)38 b(k)m(eymap)h(is)g(the)g(asso)s(ciation)h(b)s(et)m(w)m
+(een)f(the)g(k)m(eys)150 2008 y(that)29 b(the)g(user)e(t)m(yp)s(es)i
+(and)f(the)g(functions)g(that)h(get)h(run.)39 b(Y)-8
+b(ou)29 b(can)f(mak)m(e)i(y)m(our)e(o)m(wn)h(k)m(eymaps,)g(cop)m(y)150
+2118 y(existing)i(k)m(eymaps,)g(and)f(tell)i(Readline)f(whic)m(h)f(k)m
+(eymap)h(to)g(use.)3350 2305 y([F)-8 b(unction])-3599
+b Fh(Keymap)54 b(rl_make_bare_keymap)d Fg(\()p Ff(v)m(oid)p
+Fg(\))390 2415 y Ft(Returns)23 b(a)i(new,)g(empt)m(y)f(k)m(eymap.)40
+b(The)23 b(space)i(for)f(the)g(k)m(eymap)h(is)f(allo)s(cated)i(with)e
+Fs(malloc\(\))p Ft(;)390 2524 y(the)31 b(caller)g(should)f(free)g(it)h
+(b)m(y)f(calling)i Fs(rl_free_keymap\(\))26 b Ft(when)j(done.)3350
+2712 y([F)-8 b(unction])-3599 b Fh(Keymap)54 b(rl_copy_keymap)c
+Fg(\()p Ff(Keymap)34 b(map)p Fg(\))390 2822 y Ft(Return)c(a)g(new)g(k)m
+(eymap)h(whic)m(h)f(is)h(a)f(cop)m(y)h(of)g Fj(map)p
+Ft(.)3350 3009 y([F)-8 b(unction])-3599 b Fh(Keymap)54
+b(rl_make_keymap)c Fg(\()p Ff(v)m(oid)p Fg(\))390 3119
+y Ft(Return)31 b(a)g(new)g(k)m(eymap)h(with)f(the)h(prin)m(ting)f(c)m
+(haracters)i(b)s(ound)c(to)j(rl)p 2909 3119 28 4 v 40
+w(insert,)g(the)g(lo)m(w)m(ercase)390 3228 y(Meta)24
+b(c)m(haracters)g(b)s(ound)d(to)i(run)e(their)i(equiv)-5
+b(alen)m(ts,)25 b(and)d(the)h(Meta)h(digits)f(b)s(ound)e(to)i(pro)s
+(duce)390 3338 y(n)m(umeric)30 b(argumen)m(ts.)3350 3525
+y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_discard_keymap)c
+Fg(\()p Ff(Keymap)34 b(k)m(eymap)p Fg(\))390 3635 y Ft(F)-8
+b(ree)30 b(the)g(storage)h(asso)s(ciated)g(with)e(the)g(data)h(in)f
+Fj(k)m(eymap)p Ft(.)41 b(The)29 b(caller)h(should)f(free)g
+Fj(k)m(eymap)p Ft(.)3350 3823 y([F)-8 b(unction])-3599
+b Fh(void)54 b(rl_free_keymap)49 b Fg(\()p Ff(Keymap)34
+b(k)m(eymap)p Fg(\))390 3932 y Ft(F)-8 b(ree)32 b(all)g(storage)g(asso)
+s(ciated)g(with)f Fj(k)m(eymap)p Ft(.)42 b(This)30 b(calls)i
+Fs(rl_discard_keymap)26 b Ft(to)32 b(free)f(sub-)390
+4042 y(ordindate)f(k)m(eymaps)h(and)f(macros.)3350 4229
+y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_empty_keymap)d
+Fg(\()p Ff(Keymap)34 b(k)m(eymap)p Fg(\))390 4339 y Ft(Return)c
+(non-zero)h(if)g(there)g(are)g(no)f(k)m(eys)i(b)s(ound)c(to)k
+(functions)e(in)g Fj(k)m(eymap)s Ft(;)i(zero)f(if)g(there)g(are)390
+4449 y(an)m(y)g(k)m(eys)g(b)s(ound.)275 4636 y(Readline)45
+b(has)g(sev)m(eral)i(in)m(ternal)f(k)m(eymaps.)86 b(These)45
+b(functions)g(allo)m(w)h(y)m(ou)g(to)g(c)m(hange)g(whic)m(h)150
+4746 y(k)m(eymap)31 b(is)f(activ)m(e.)3350 4933 y([F)-8
+b(unction])-3599 b Fh(Keymap)54 b(rl_get_keymap)c Fg(\()p
+Ff(v)m(oid)p Fg(\))390 5043 y Ft(Returns)29 b(the)i(curren)m(tly)f
+(activ)m(e)j(k)m(eymap.)3350 5230 y([F)-8 b(unction])-3599
+b Fh(void)54 b(rl_set_keymap)49 b Fg(\()p Ff(Keymap)34
+b(k)m(eymap)p Fg(\))390 5340 y Ft(Mak)m(es)e Fj(k)m(eymap)h
+Ft(the)e(curren)m(tly)f(activ)m(e)j(k)m(eymap.)p eop
+end
+%%Page: 36 40
+TeXDict begin 36 39 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(36)3350
+299 y([F)-8 b(unction])-3599 b Fh(Keymap)54 b(rl_get_keymap_by_name)e
+Fg(\()p Ff(const)34 b(c)m(har)g(*name)p Fg(\))390 408
+y Ft(Return)e(the)i(k)m(eymap)f(matc)m(hing)i Fj(name)p
+Ft(.)49 b Fj(name)38 b Ft(is)c(one)f(whic)m(h)g(w)m(ould)g(b)s(e)f
+(supplied)g(in)h(a)h Fs(set)390 518 y(keymap)29 b Ft(inputrc)g(line)i
+(\(see)g(Section)g(1.3)h([Readline)f(Init)f(File],)i(page)f(4\).)3350
+692 y([F)-8 b(unction])-3599 b Fh(char)54 b(*)e(rl_get_keymap_name)f
+Fg(\()p Ff(Keymap)34 b(k)m(eymap)p Fg(\))390 801 y Ft(Return)e(the)i
+(name)f(matc)m(hing)h Fj(k)m(eymap)p Ft(.)50 b Fj(name)38
+b Ft(is)c(one)f(whic)m(h)g(w)m(ould)g(b)s(e)f(supplied)g(in)h(a)h
+Fs(set)390 911 y(keymap)29 b Ft(inputrc)g(line)i(\(see)g(Section)g(1.3)
+h([Readline)f(Init)f(File],)i(page)f(4\).)3350 1085 y([F)-8
+b(unction])-3599 b Fh(int)53 b(rl_set_keymap_name)e Fg(\()p
+Ff(const)34 b(c)m(har)g(*name,)f(Keymap)h(k)m(eymap)p
+Fg(\))390 1194 y Ft(Set)g(the)f(name)h(of)g Fj(k)m(eymap)p
+Ft(.)50 b(This)33 b(name)h(will)f(then)h(b)s(e)e Fs(")p
+Ft(registered)p Fs(")i Ft(and)f(a)m(v)-5 b(ailable)36
+b(for)d(use)390 1304 y(in)i(a)g Fs(set)29 b(keymap)k
+Ft(inputrc)h(directiv)m(e)j(see)e(Section)h(1.3)g([Readline)g(Init)e
+(File],)k(page)e(4\).)54 b(The)390 1414 y Fj(name)27
+b Ft(ma)m(y)c(not)g(b)s(e)e(one)i(of)f(Readline's)h(builtin)f(k)m
+(eymap)g(names;)j(y)m(ou)e(ma)m(y)g(not)f(add)g(a)g(di\013eren)m(t)390
+1523 y(name)36 b(for)g(one)g(of)g(Readline's)h(builtin)e(k)m(eymaps.)58
+b(Y)-8 b(ou)37 b(ma)m(y)f(replace)h(the)f(name)g(asso)s(ciated)390
+1633 y(with)31 b(a)g(giv)m(en)h(k)m(eymap)g(b)m(y)f(calling)h(this)f
+(function)g(more)h(than)e(once)i(with)f(the)g(same)h
+Fj(k)m(eymap)390 1742 y Ft(argumen)m(t.)50 b(Y)-8 b(ou)34
+b(ma)m(y)h(asso)s(ciate)g(a)f(registered)g Fj(name)39
+b Ft(with)33 b(a)h(new)f(k)m(eymap)h(b)m(y)f(calling)i(this)390
+1852 y(function)c(more)h(than)f(once)i(with)e(the)h(same)g
+Fj(name)k Ft(argumen)m(t.)45 b(There)31 b(is)h(no)g(w)m(a)m(y)g(to)g
+(remo)m(v)m(e)390 1962 y(a)k(named)e(k)m(eymap)i(once)g(the)f(name)g
+(has)g(b)s(een)g(registered.)56 b(Readline)36 b(will)f(mak)m(e)h(a)g
+(cop)m(y)g(of)390 2071 y Fj(name)p Ft(.)41 b(The)30 b(return)f(v)-5
+b(alue)31 b(is)g(greater)g(than)g(zero)g(unless)f Fj(name)35
+b Ft(is)c(one)g(of)f(Readline's)h(builtin)390 2181 y(k)m(eymap)g(names)
+f(or)h Fj(k)m(eymap)i Ft(is)e(one)f(of)h(Readline's)g(builtin)f(k)m
+(eymaps.)150 2373 y Fi(2.4.3)63 b(Binding)42 b(Keys)150
+2520 y Ft(Key)34 b(sequences)g(are)h(asso)s(ciate)h(with)e(functions)f
+(through)h(the)g(k)m(eymap.)52 b(Readline)35 b(has)f(sev)m(eral)h(in-)
+150 2629 y(ternal)30 b(k)m(eymaps:)40 b Fs(emacs_standard_keymap)p
+Ft(,)24 b Fs(emacs_meta_keymap)p Ft(,)h Fs(emacs_ctlx_keymap)p
+Ft(,)g Fs(vi_)150 2739 y(movement_keymap)p Ft(,)41 b(and)h
+Fs(vi_insertion_keymap)p Ft(.)71 b Fs(emacs_standard_keymap)37
+b Ft(is)42 b(the)g(default,)150 2849 y(and)30 b(the)g(examples)h(in)f
+(this)h(man)m(ual)f(assume)g(that.)275 2980 y(Since)d
+Fs(readline\(\))e Ft(installs)j(a)g(set)g(of)g(default)g(k)m(ey)g
+(bindings)f(the)h(\014rst)e(time)j(it)f(is)f(called,)j(there)e(is)150
+3089 y(alw)m(a)m(ys)34 b(the)f(danger)f(that)i(a)f(custom)g(binding)e
+(installed)j(b)s(efore)e(the)h(\014rst)e(call)j(to)g
+Fs(readline\(\))c Ft(will)150 3199 y(b)s(e)25 b(o)m(v)m(erridden.)39
+b(An)26 b(alternate)h(mec)m(hanism)f(is)g(to)g(install)h(custom)f(k)m
+(ey)g(bindings)f(in)g(an)h(initialization)150 3308 y(function)37
+b(assigned)g(to)h(the)f Fs(rl_startup_hook)c Ft(v)-5
+b(ariable)38 b(\(see)g(Section)g(2.3)g([Readline)g(V)-8
+b(ariables],)150 3418 y(page)31 b(29\).)275 3549 y(These)f(functions)g
+(manage)h(k)m(ey)g(bindings.)3350 3723 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_bind_key)c Fg(\()p Ff(in)m(t)34 b(k)m(ey)-8
+b(,)32 b(rl)p 1441 3723 30 5 v 43 w(command)p 1904 3723
+V 45 w(func)p 2133 3723 V 45 w(t)h(*function)p Fg(\))390
+3832 y Ft(Binds)f Fj(k)m(ey)42 b Ft(to)34 b Fj(function)e
+Ft(in)h(the)g(curren)m(tly)g(activ)m(e)i(k)m(eymap.)49
+b(Returns)32 b(non-zero)i(in)f(the)g(case)390 3942 y(of)e(an)f(in)m(v)
+-5 b(alid)31 b Fj(k)m(ey)p Ft(.)3350 4116 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_bind_key_in_map)e Fg(\()p Ff(in)m(t)34
+b(k)m(ey)-8 b(,)32 b(rl)p 1807 4116 V 43 w(command)p
+2270 4116 V 45 w(func)p 2499 4116 V 45 w(t)h(*function,)565
+4225 y(Keymap)h(map)p Fg(\))390 4335 y Ft(Bind)c Fj(k)m(ey)39
+b Ft(to)31 b Fj(function)f Ft(in)g Fj(map)p Ft(.)40 b(Returns)30
+b(non-zero)h(in)f(the)h(case)g(of)f(an)h(in)m(v)-5 b(alid)31
+b Fj(k)m(ey)p Ft(.)3350 4509 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_bind_key_if_unboun)q(d)e Fg(\()p Ff(in)m(t)34
+b(k)m(ey)-8 b(,)32 b(rl)p 2016 4509 V 44 w(command)p
+2480 4509 V 44 w(func)p 2708 4509 V 45 w(t)565 4618 y(*function)p
+Fg(\))390 4728 y Ft(Binds)43 b Fj(k)m(ey)53 b Ft(to)45
+b Fj(function)e Ft(if)h(it)h(is)f(not)g(already)g(b)s(ound)e(in)i(the)g
+(curren)m(tly)g(activ)m(e)i(k)m(eymap.)390 4837 y(Returns)29
+b(non-zero)i(in)f(the)h(case)g(of)g(an)f(in)m(v)-5 b(alid)31
+b Fj(k)m(ey)39 b Ft(or)30 b(if)h Fj(k)m(ey)39 b Ft(is)30
+b(already)h(b)s(ound.)3350 5011 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_bind_key_if_unboun)q(d_in)q(_ma)q(p)e
+Fg(\()p Ff(in)m(t)34 b(k)m(ey)-8 b(,)32 b(rl)p 2382 5011
+V 44 w(command)p 2846 5011 V 44 w(func)p 3074 5011 V
+46 w(t)565 5121 y(*function,)i(Keymap)g(map)p Fg(\))390
+5230 y Ft(Binds)27 b Fj(k)m(ey)36 b Ft(to)28 b Fj(function)f
+Ft(if)g(it)h(is)f(not)h(already)g(b)s(ound)d(in)i Fj(map)p
+Ft(.)39 b(Returns)27 b(non-zero)g(in)g(the)h(case)390
+5340 y(of)j(an)f(in)m(v)-5 b(alid)31 b Fj(k)m(ey)39 b
+Ft(or)30 b(if)g Fj(k)m(ey)39 b Ft(is)31 b(already)g(b)s(ound.)p
+eop end
+%%Page: 37 41
+TeXDict begin 37 40 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(37)3350
+299 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_unbind_key)d
+Fg(\()p Ff(in)m(t)33 b(k)m(ey)p Fg(\))390 408 y Ft(Bind)j
+Fj(k)m(ey)45 b Ft(to)37 b(the)f(n)m(ull)g(function)g(in)g(the)h(curren)
+m(tly)f(activ)m(e)i(k)m(eymap.)59 b(Returns)35 b(non-zero)i(in)390
+518 y(case)31 b(of)g(error.)3350 693 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_unbind_key_in_map)f Fg(\()p Ff(in)m(t)33
+b(k)m(ey)-8 b(,)33 b(Keymap)g(map)p Fg(\))390 803 y Ft(Bind)d
+Fj(k)m(ey)39 b Ft(to)31 b(the)g(n)m(ull)f(function)g(in)g
+Fj(map)p Ft(.)40 b(Returns)30 b(non-zero)h(in)f(case)h(of)g(error.)3350
+978 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_unbind_function_in)q
+(_map)f Fg(\()p Ff(rl)p 1821 978 30 5 v 44 w(command)p
+2285 978 V 45 w(func)p 2514 978 V 45 w(t)33 b(*function,)565
+1088 y(Keymap)h(map)p Fg(\))390 1198 y Ft(Un)m(bind)29
+b(all)i(k)m(eys)g(that)g(execute)h Fj(function)e Ft(in)g
+Fj(map)p Ft(.)3350 1373 y([F)-8 b(unction])-3599 b Fh(int)53
+b(rl_unbind_command_in_)q(map)f Fg(\()p Ff(const)34 b(c)m(har)g
+(*command,)f(Keymap)565 1482 y(map)p Fg(\))390 1592 y
+Ft(Un)m(bind)c(all)i(k)m(eys)g(that)g(are)g(b)s(ound)e(to)i
+Fj(command)i Ft(in)d Fj(map)p Ft(.)3350 1767 y([F)-8
+b(unction])-3599 b Fh(int)53 b(rl_bind_keyseq)d Fg(\()p
+Ff(const)34 b(c)m(har)g(*k)m(eyseq,)e(rl)p 2119 1767
+V 44 w(command)p 2583 1767 V 44 w(func)p 2811 1767 V
+46 w(t)565 1877 y(*function)p Fg(\))390 1987 y Ft(Bind)43
+b(the)g(k)m(ey)h(sequence)f(represen)m(ted)g(b)m(y)g(the)g(string)g
+Fj(k)m(eyseq)j Ft(to)e(the)f(function)g Fj(function)p
+Ft(,)390 2096 y(b)s(eginning)27 b(in)h(the)h(curren)m(t)f(k)m(eymap.)40
+b(This)28 b(mak)m(es)h(new)e(k)m(eymaps)i(as)f(necessary)-8
+b(.)41 b(The)28 b(return)390 2206 y(v)-5 b(alue)31 b(is)f(non-zero)h
+(if)g Fj(k)m(eyseq)i Ft(is)d(in)m(v)-5 b(alid.)3350 2381
+y([F)d(unction])-3599 b Fh(int)53 b(rl_bind_keyseq_in_map)f
+Fg(\()p Ff(const)34 b(c)m(har)g(*k)m(eyseq,)565 2491
+y(rl)p 639 2491 V 44 w(command)p 1103 2491 V 44 w(func)p
+1331 2491 V 45 w(t)f(*function,)h(Keymap)g(map)p Fg(\))390
+2600 y Ft(Bind)25 b(the)g(k)m(ey)h(sequence)f(represen)m(ted)g(b)m(y)g
+(the)g(string)g Fj(k)m(eyseq)j Ft(to)e(the)f(function)g
+Fj(function)p Ft(.)39 b(This)390 2710 y(mak)m(es)30 b(new)f(k)m(eymaps)
+g(as)g(necessary)-8 b(.)42 b(Initial)30 b(bindings)d(are)j(p)s
+(erformed)e(in)g Fj(map)p Ft(.)40 b(The)29 b(return)390
+2819 y(v)-5 b(alue)31 b(is)f(non-zero)h(if)g Fj(k)m(eyseq)i
+Ft(is)d(in)m(v)-5 b(alid.)3350 2995 y([F)d(unction])-3599
+b Fh(int)53 b(rl_set_key)c Fg(\()p Ff(const)34 b(c)m(har)g(*k)m(eyseq,)
+e(rl)p 1910 2995 V 44 w(command)p 2374 2995 V 44 w(func)p
+2602 2995 V 45 w(t)h(*function,)565 3104 y(Keymap)h(map)p
+Fg(\))390 3214 y Ft(Equiv)-5 b(alen)m(t)31 b(to)g Fs
+(rl_bind_keyseq_in_map)p Ft(.)3350 3389 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_bind_keyseq_if_unb)q(ound)f Fg(\()p
+Ff(const)34 b(c)m(har)g(*k)m(eyseq,)565 3499 y(rl)p 639
+3499 V 44 w(command)p 1103 3499 V 44 w(func)p 1331 3499
+V 45 w(t)f(*function)p Fg(\))390 3608 y Ft(Binds)i Fj(k)m(eyseq)k
+Ft(to)d Fj(function)f Ft(if)g(it)h(is)g(not)g(already)g(b)s(ound)d(in)i
+(the)h(curren)m(tly)f(activ)m(e)j(k)m(eymap.)390 3718
+y(Returns)29 b(non-zero)i(in)f(the)h(case)g(of)g(an)f(in)m(v)-5
+b(alid)31 b Fj(k)m(eyseq)j Ft(or)c(if)g Fj(k)m(eyseq)k
+Ft(is)c(already)h(b)s(ound.)3350 3893 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_bind_keyseq_if_unb)q(ound)q(_in)q(_ma)q(p)e
+Fg(\()p Ff(const)34 b(c)m(har)g(*k)m(eyseq,)565 4003
+y(rl)p 639 4003 V 44 w(command)p 1103 4003 V 44 w(func)p
+1331 4003 V 45 w(t)f(*function,)h(Keymap)g(map)p Fg(\))390
+4113 y Ft(Binds)d Fj(k)m(eyseq)k Ft(to)e Fj(function)f
+Ft(if)g(it)g(is)g(not)g(already)h(b)s(ound)d(in)h Fj(map)p
+Ft(.)46 b(Returns)31 b(non-zero)h(in)g(the)390 4222 y(case)f(of)g(an)f
+(in)m(v)-5 b(alid)31 b Fj(k)m(eyseq)j Ft(or)c(if)g Fj(k)m(eyseq)k
+Ft(is)c(already)h(b)s(ound.)3350 4398 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_generic_bind)d Fg(\()p Ff(in)m(t)34
+b(t)m(yp)s(e,)f(const)g(c)m(har)h(*k)m(eyseq,)f(c)m(har)h(*data,)565
+4507 y(Keymap)g(map)p Fg(\))390 4617 y Ft(Bind)27 b(the)g(k)m(ey)h
+(sequence)f(represen)m(ted)g(b)m(y)g(the)g(string)g Fj(k)m(eyseq)j
+Ft(to)e(the)f(arbitrary)g(p)s(oin)m(ter)g Fj(data)p Ft(.)390
+4726 y Fj(t)m(yp)s(e)34 b Ft(sa)m(ys)29 b(what)f(kind)g(of)g(data)h(is)
+g(p)s(oin)m(ted)f(to)h(b)m(y)g Fj(data)p Ft(;)h(this)e(can)h(b)s(e)f(a)
+g(function)g(\()p Fs(ISFUNC)p Ft(\),)h(a)390 4836 y(macro)h(\()p
+Fs(ISMACR)p Ft(\),)f(or)g(a)h(k)m(eymap)g(\()p Fs(ISKMAP)p
+Ft(\).)40 b(This)28 b(mak)m(es)j(new)e(k)m(eymaps)g(as)h(necessary)-8
+b(.)41 b(The)390 4945 y(initial)32 b(k)m(eymap)e(in)h(whic)m(h)f(to)h
+(do)f(bindings)f(is)i Fj(map)p Ft(.)3350 5121 y([F)-8
+b(unction])-3599 b Fh(int)53 b(rl_parse_and_bind)e Fg(\()p
+Ff(c)m(har)34 b(*line)p Fg(\))390 5230 y Ft(P)m(arse)c
+Fj(line)35 b Ft(as)29 b(if)h(it)g(had)e(b)s(een)h(read)g(from)g(the)h
+Fs(inputrc)d Ft(\014le)j(and)e(p)s(erform)g(an)m(y)i(k)m(ey)g(bindings)
+390 5340 y(and)g(v)-5 b(ariable)31 b(assignmen)m(ts)g(found)e(\(see)i
+(Section)h(1.3)f([Readline)g(Init)f(File],)j(page)e(4\).)p
+eop end
+%%Page: 38 42
+TeXDict begin 38 41 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(38)3350
+299 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_read_init_file)e
+Fg(\()p Ff(const)34 b(c)m(har)g(*\014lename)p Fg(\))390
+408 y Ft(Read)e(k)m(eybindings)f(and)g(v)-5 b(ariable)32
+b(assignmen)m(ts)g(from)f Fj(\014lename)37 b Ft(\(see)32
+b(Section)g(1.3)h([Readline)390 518 y(Init)d(File],)i(page)f(4\).)150
+726 y Fi(2.4.4)63 b(Asso)s(ciating)41 b(F)-10 b(unction)42
+b(Names)f(and)g(Bindings)150 873 y Ft(These)30 b(functions)g(allo)m(w)h
+(y)m(ou)g(to)f(\014nd)f(out)h(what)g(k)m(eys)h(in)m(v)m(ok)m(e)h(named)
+e(functions)g(and)f(the)h(functions)150 983 y(in)m(v)m(ok)m(ed)f(b)m(y)
+e(a)h(particular)g(k)m(ey)g(sequence.)40 b(Y)-8 b(ou)28
+b(ma)m(y)g(also)h(asso)s(ciate)g(a)f(new)f(function)g(name)h(with)f(an)
+150 1092 y(arbitrary)j(function.)3350 1295 y([F)-8 b(unction])-3599
+b Fh(rl_command_func_t)57 b(*)c(rl_named_function)e Fg(\()p
+Ff(const)34 b(c)m(har)g(*name)p Fg(\))390 1404 y Ft(Return)c(the)g
+(function)g(with)g(name)h Fj(name)p Ft(.)3350 1606 y([F)-8
+b(unction])-3599 b Fh(rl_command_func_t)57 b(*)c(rl_function_of_keyseq)
+f Fg(\()p Ff(const)34 b(c)m(har)565 1716 y(*k)m(eyseq,)f(Keymap)g(map,)
+g(in)m(t)h(*t)m(yp)s(e)p Fg(\))390 1826 y Ft(Return)e(the)g(function)h
+(in)m(v)m(ok)m(ed)h(b)m(y)e Fj(k)m(eyseq)k Ft(in)c(k)m(eymap)h
+Fj(map)p Ft(.)47 b(If)32 b Fj(map)j Ft(is)d Fs(NULL)p
+Ft(,)g(the)h(curren)m(t)390 1935 y(k)m(eymap)k(is)g(used.)60
+b(If)37 b Fj(t)m(yp)s(e)42 b Ft(is)37 b(not)g Fs(NULL)p
+Ft(,)h(the)f(t)m(yp)s(e)g(of)g(the)g(ob)5 b(ject)38 b(is)f(returned)f
+(in)h(the)g Fs(int)390 2045 y Ft(v)-5 b(ariable)30 b(it)g(p)s(oin)m(ts)
+g(to)g(\(one)g(of)g Fs(ISFUNC)p Ft(,)e Fs(ISKMAP)p Ft(,)g(or)i
+Fs(ISMACR)p Ft(\).)39 b(It)30 b(tak)m(es)h(a)f Fs(")p
+Ft(translated)p Fs(")f Ft(k)m(ey)390 2154 y(sequence)i(and)f(should)f
+(not)i(b)s(e)e(used)h(if)g(the)h(k)m(ey)g(sequence)g(can)f(include)g
+(NUL.)3350 2356 y([F)-8 b(unction])-3599 b Fh(rl_command_func_t)57
+b(*)c(rl_function_of_keyseq_)q(len)f Fg(\()p Ff(const)34
+b(c)m(har)565 2466 y(*k)m(eyseq,)f(size)p 1121 2466 30
+5 v 44 w(t)g(len,)g(Keymap)h(map,)f(in)m(t)g(*t)m(yp)s(e)p
+Fg(\))390 2576 y Ft(Return)20 b(the)h(function)g(in)m(v)m(ok)m(ed)i(b)m
+(y)e Fj(k)m(eyseq)j Ft(of)d(length)g Fj(len)h Ft(in)e(k)m(eymap)i
+Fj(map)p Ft(.)37 b(Equiv)-5 b(alen)m(t)22 b(to)g Fs(rl_)390
+2685 y(function_of_keyseq)g Ft(with)28 b(the)f(addition)h(of)f(the)h
+Fj(len)f Ft(parameter.)41 b(It)27 b(tak)m(es)i(a)f Fs(")p
+Ft(translated)p Fs(")390 2795 y Ft(k)m(ey)j(sequence)g(and)f(should)f
+(b)s(e)h(used)f(if)i(the)f(k)m(ey)h(sequence)g(can)g(include)f(NUL.)
+3350 2997 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_trim_arg_from_keys)
+q(eq)f Fg(\()p Ff(const)34 b(c)m(har)g(*k)m(eyseq,)e(size)p
+2678 2997 V 44 w(t)h(len,)565 3107 y(Keymap)h(map)p Fg(\))390
+3216 y Ft(If)e(there)h(is)f(a)h(n)m(umeric)g(argumen)m(t)g(at)g(the)g
+(b)s(eginning)e(of)i Fj(k)m(eyseq)p Ft(,)h(p)s(ossibly)e(including)g
+(digits,)390 3326 y(return)24 b(the)h(index)f(of)i(the)f(\014rst)f(c)m
+(haracter)i(in)f Fj(k)m(eyseq)j Ft(follo)m(wing)e(the)g(n)m(umeric)e
+(argumen)m(t.)40 b(This)390 3435 y(can)24 b(b)s(e)g(used)f(to)h(skip)g
+(o)m(v)m(er)h(the)f(n)m(umeric)g(argumen)m(t)g(\(whic)m(h)g(is)g(a)m(v)
+-5 b(ailable)27 b(as)d Fs(rl_numeric_arg)390 3545 y Ft(while)30
+b(tra)m(v)m(ersing)i(the)f(k)m(ey)g(sequence)g(that)g(in)m(v)m(ok)m(ed)
+g(the)g(curren)m(t)f(command.)3350 3747 y([F)-8 b(unction])-3599
+b Fh(char)54 b(**)e(rl_invoking_keyseqs)g Fg(\()p Ff(rl)p
+1717 3747 V 44 w(command)p 2181 3747 V 44 w(func)p 2409
+3747 V 45 w(t)33 b(*function)p Fg(\))390 3857 y Ft(Return)d(an)i(arra)m
+(y)f(of)h(strings)f(represen)m(ting)g(the)g(k)m(ey)h(sequences)g(used)e
+(to)i(in)m(v)m(ok)m(e)h Fj(function)e Ft(in)390 3966
+y(the)g(curren)m(t)f(k)m(eymap.)3350 4168 y([F)-8 b(unction])-3599
+b Fh(char)54 b(**)e(rl_invoking_keyseqs_i)q(n_m)q(ap)g
+Fg(\()p Ff(rl)p 2083 4168 V 44 w(command)p 2547 4168
+V 44 w(func)p 2775 4168 V 45 w(t)565 4278 y(*function,)34
+b(Keymap)g(map)p Fg(\))390 4388 y Ft(Return)c(an)i(arra)m(y)f(of)h
+(strings)f(represen)m(ting)g(the)g(k)m(ey)h(sequences)g(used)e(to)i(in)
+m(v)m(ok)m(e)h Fj(function)e Ft(in)390 4497 y(the)g(k)m(eymap)f
+Fj(map)p Ft(.)3350 4699 y([F)-8 b(unction])-3599 b Fh(void)54
+b(rl_function_dumper)c Fg(\()p Ff(in)m(t)34 b(readable)p
+Fg(\))390 4809 y Ft(Prin)m(t)i(the)g(Readline)g(function)g(names)f(and)
+g(the)h(k)m(ey)h(sequences)f(curren)m(tly)g(b)s(ound)d(to)k(them)390
+4919 y(to)32 b Fs(rl_outstream)p Ft(.)40 b(If)31 b Fj(readable)36
+b Ft(is)c(non-zero,)g(the)f(list)h(is)f(formatted)h(in)f(suc)m(h)g(a)g
+(w)m(a)m(y)i(that)e(it)390 5028 y(can)g(b)s(e)e(made)i(part)f(of)h(an)f
+Fs(inputrc)e Ft(\014le)j(and)e(re-read.)3350 5230 y([F)-8
+b(unction])-3599 b Fh(void)54 b(rl_list_funmap_names)d
+Fg(\()p Ff(v)m(oid)p Fg(\))390 5340 y Ft(Prin)m(t)30
+b(the)h(names)f(of)h(all)g(bindable)f(Readline)h(functions)f(to)h
+Fs(rl_outstream)p Ft(.)p eop end
+%%Page: 39 43
+TeXDict begin 39 42 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(39)3350
+299 y([F)-8 b(unction])-3599 b Fh(const)54 b(char)f(**)g
+(rl_funmap_names)d Fg(\()p Ff(v)m(oid)p Fg(\))390 408
+y Ft(Return)25 b(a)i(NULL)f(terminated)g(arra)m(y)h(of)f(kno)m(wn)f
+(function)h(names.)39 b(The)26 b(arra)m(y)g(is)g(sorted.)39
+b(The)390 518 y(arra)m(y)28 b(itself)h(is)f(allo)s(cated,)j(but)c(not)h
+(the)h(strings)e(inside.)40 b(Y)-8 b(ou)29 b(should)e(free)h(the)g
+(arra)m(y)-8 b(,)29 b(but)f(not)390 628 y(the)j(p)s(oin)m(ters,)f
+(using)g Fs(free)f Ft(or)i Fs(rl_free)d Ft(when)h(y)m(ou)i(are)g(done.)
+3350 813 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_add_funmap_entry)e
+Fg(\()p Ff(const)34 b(c)m(har)g(*name,)g(rl)p 2331 813
+30 5 v 43 w(command)p 2794 813 V 45 w(func)p 3023 813
+V 45 w(t)565 923 y(*function)p Fg(\))390 1033 y Ft(Add)e
+Fj(name)38 b Ft(to)33 b(the)g(list)h(of)f(bindable)f(Readline)h
+(command)g(names,)g(and)f(mak)m(e)i Fj(function)f Ft(the)390
+1142 y(function)d(to)h(b)s(e)f(called)h(when)f Fj(name)35
+b Ft(is)c(in)m(v)m(ok)m(ed.)150 1342 y Fi(2.4.5)63 b(Allo)m(wing)41
+b(Undoing)150 1489 y Ft(Supp)s(orting)34 b(the)i(undo)e(command)i(is)g
+(a)g(painless)g(thing,)h(and)e(mak)m(es)i(y)m(our)f(functions)f(m)m(uc)
+m(h)h(more)150 1599 y(useful.)k(It)30 b(is)h(certainly)g(easy)g(to)g
+(try)g(something)g(if)f(y)m(ou)h(kno)m(w)f(y)m(ou)h(can)f(undo)g(it.)
+275 1734 y(If)40 b(y)m(our)h(function)f(simply)g(inserts)h(text)h
+(once,)i(or)d(deletes)h(text)g(once,)i(and)c(uses)h Fs(rl_insert_)150
+1844 y(text\(\))26 b Ft(or)i Fs(rl_delete_text\(\))23
+b Ft(to)29 b(do)f(it,)h(then)f(undoing)f(is)g(already)i(done)f(for)f(y)
+m(ou)h(automatically)-8 b(.)275 1979 y(If)20 b(y)m(ou)g(do)h(m)m
+(ultiple)g(insertions)f(or)h(m)m(ultiple)g(deletions,)j(or)c(an)m(y)h
+(com)m(bination)h(of)e(these)h(op)s(erations,)150 2088
+y(y)m(ou)38 b(should)f(group)h(them)g(together)h(in)m(to)g(one)f(op)s
+(eration.)64 b(This)37 b(is)h(done)g(with)g Fs(rl_begin_undo_)150
+2198 y(group\(\))28 b Ft(and)i Fs(rl_end_undo_group\(\))p
+Ft(.)275 2333 y(The)f(t)m(yp)s(es)i(of)f(ev)m(en)m(ts)i(that)f(can)g(b)
+s(e)e(undone)h(are:)390 2446 y Fe(enum)40 b(undo_code)h({)f
+(UNDO_DELETE,)i(UNDO_INSERT,)g(UNDO_BEGIN,)g(UNDO_END)f(};)275
+2581 y Ft(Notice)32 b(that)f Fs(UNDO_DELETE)c Ft(means)j(to)h(insert)f
+(some)h(text,)h(and)d Fs(UNDO_INSERT)e Ft(means)k(to)g(delete)150
+2691 y(some)d(text.)41 b(That)27 b(is,)i(the)e(undo)g(co)s(de)h(tells)g
+(what)g(to)g(undo,)f(not)h(ho)m(w)g(to)g(undo)e(it.)41
+b Fs(UNDO_BEGIN)25 b Ft(and)150 2800 y Fs(UNDO_END)j
+Ft(are)j(tags)g(added)f(b)m(y)g Fs(rl_begin_undo_group\(\))25
+b Ft(and)30 b Fs(rl_end_undo_group\(\))p Ft(.)3350 2986
+y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_begin_undo_group)e
+Fg(\()p Ff(v)m(oid)p Fg(\))390 3096 y Ft(Begins)32 b(sa)m(ving)g(undo)d
+(information)j(in)e(a)i(group)e(construct.)43 b(The)30
+b(undo)g(information)h(usually)390 3205 y(comes)42 b(from)f(calls)i(to)
+f Fs(rl_insert_text\(\))37 b Ft(and)k Fs(rl_delete_text\(\))p
+Ft(,)f(but)h(could)h(b)s(e)f(the)390 3315 y(result)30
+b(of)h(calls)g(to)g Fs(rl_add_undo\(\))p Ft(.)3350 3501
+y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_end_undo_group)e
+Fg(\()p Ff(v)m(oid)p Fg(\))390 3610 y Ft(Closes)29 b(the)h(curren)m(t)e
+(undo)g(group)h(started)g(with)g Fs(rl_begin_undo_group)c(\(\))p
+Ft(.)39 b(There)29 b(should)390 3720 y(b)s(e)h(one)g(call)i(to)f
+Fs(rl_end_undo_group\(\))25 b Ft(for)30 b(eac)m(h)i(call)g(to)f
+Fs(rl_begin_undo_group\(\))p Ft(.)3350 3906 y([F)-8 b(unction])-3599
+b Fh(void)54 b(rl_add_undo)48 b Fg(\()p Ff(en)m(um)35
+b(undo)p 1558 3906 V 45 w(co)s(de)e(what,)g(in)m(t)g(start,)g(in)m(t)g
+(end,)h(c)m(har)565 4015 y(*text)p Fg(\))390 4125 y Ft(Remem)m(b)s(er)g
+(ho)m(w)g(to)h(undo)d(an)i(ev)m(en)m(t)i(\(according)f(to)g
+Fj(what)r Ft(\).)52 b(The)33 b(a\013ected)j(text)f(runs)d(from)390
+4235 y Fj(start)h Ft(to)e Fj(end)p Ft(,)f(and)g(encompasses)h
+Fj(text)p Ft(.)3350 4420 y([F)-8 b(unction])-3599 b Fh(void)54
+b(rl_free_undo_list)c Fg(\()p Ff(v)m(oid)p Fg(\))390
+4530 y Ft(F)-8 b(ree)31 b(the)g(existing)g(undo)f(list.)3350
+4716 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_do_undo)c
+Fg(\()p Ff(v)m(oid)p Fg(\))390 4825 y Ft(Undo)22 b(the)h(\014rst)g
+(thing)f(on)h(the)g(undo)f(list.)39 b(Returns)22 b Fs(0)g
+Ft(if)h(there)g(w)m(as)g(nothing)g(to)h(undo,)f(non-zero)390
+4935 y(if)30 b(something)h(w)m(as)g(undone.)275 5121
+y(Finally)-8 b(,)32 b(if)f(y)m(ou)h(neither)f(insert)g(nor)f(delete)j
+(text,)f(but)f(directly)g(mo)s(dify)g(the)g(existing)h(text)g(\(e.g.,)
+150 5230 y(c)m(hange)40 b(its)f(case\),)j(call)e Fs(rl_modifying\(\))35
+b Ft(once,)42 b(just)c(b)s(efore)g(y)m(ou)h(mo)s(dify)f(the)h(text.)67
+b(Y)-8 b(ou)39 b(m)m(ust)150 5340 y(supply)29 b(the)h(indices)h(of)f
+(the)h(text)g(range)g(that)g(y)m(ou)g(are)g(going)g(to)g(mo)s(dify)-8
+b(.)p eop end
+%%Page: 40 44
+TeXDict begin 40 43 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(40)3350
+299 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_modifying)c
+Fg(\()p Ff(in)m(t)34 b(start,)e(in)m(t)i(end)p Fg(\))390
+408 y Ft(T)-8 b(ell)41 b(Readline)g(to)g(sa)m(v)m(e)g(the)g(text)g(b)s
+(et)m(w)m(een)g Fj(start)i Ft(and)c Fj(end)k Ft(as)e(a)f(single)h(undo)
+e(unit.)70 b(It)40 b(is)390 518 y(assumed)30 b(that)h(y)m(ou)f(will)h
+(subsequen)m(tly)f(mo)s(dify)f(that)i(text.)150 712 y
+Fi(2.4.6)63 b(Redispla)m(y)3350 903 y Ft([F)-8 b(unction])-3599
+b Fh(void)54 b(rl_redisplay)49 b Fg(\()p Ff(v)m(oid)p
+Fg(\))390 1013 y Ft(Change)38 b(what's)f(displa)m(y)m(ed)i(on)e(the)h
+(screen)g(to)h(re\015ect)f(the)g(curren)m(t)g(con)m(ten)m(ts)h(of)f
+Fs(rl_line_)390 1123 y(buffer)p Ft(.)3350 1299 y([F)-8
+b(unction])-3599 b Fh(int)53 b(rl_forced_update_disp)q(lay)f
+Fg(\()p Ff(v)m(oid)p Fg(\))390 1409 y Ft(F)-8 b(orce)41
+b(the)f(line)g(to)h(b)s(e)e(up)s(dated)f(and)h(redispla)m(y)m(ed,)k
+(whether)c(or)g(not)h(Readline)h(thinks)e(the)390 1518
+y(screen)30 b(displa)m(y)h(is)f(correct.)3350 1695 y([F)-8
+b(unction])-3599 b Fh(int)53 b(rl_on_new_line)d Fg(\()p
+Ff(v)m(oid)p Fg(\))390 1804 y Ft(T)-8 b(ell)31 b(the)f(up)s(date)f
+(functions)g(that)i(w)m(e)f(ha)m(v)m(e)h(mo)m(v)m(ed)g(on)m(to)g(a)f
+(new)f(\(empt)m(y\))i(line,)g(usually)e(after)390 1914
+y(outputting)i(a)f(newline.)3350 2090 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_on_new_line_with_p)q(romp)q(t)f Fg(\()p
+Ff(v)m(oid)p Fg(\))390 2200 y Ft(T)-8 b(ell)25 b(the)f(up)s(date)f
+(functions)h(that)h(w)m(e)f(ha)m(v)m(e)h(mo)m(v)m(ed)g(on)m(to)h(a)e
+(new)g(line,)i(with)d Fj(rl)p 3106 2200 28 4 v 40 w(prompt)i
+Ft(already)390 2309 y(displa)m(y)m(ed.)41 b(This)28 b(could)g(b)s(e)g
+(used)g(b)m(y)g(applications)i(that)f(w)m(an)m(t)h(to)f(output)f(the)h
+(prompt)f(string)390 2419 y(themselv)m(es,)h(but)e(still)h(need)g
+(Readline)g(to)g(kno)m(w)f(the)h(prompt)e(string)h(length)h(for)f
+(redispla)m(y)-8 b(.)41 b(It)390 2528 y(should)29 b(b)s(e)h(used)g
+(after)h(setting)g Fj(rl)p 1590 2528 V 40 w(already)p
+1920 2528 V 41 w(prompted)p Ft(.)3350 2705 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_clear_visible_line)f Fg(\()p Ff(v)m(oid)p
+Fg(\))390 2814 y Ft(Clear)31 b(the)f(screen)h(lines)f(corresp)s(onding)
+g(to)h(the)f(curren)m(t)g(line's)h(con)m(ten)m(ts.)3350
+2991 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_reset_line_state)e
+Fg(\()p Ff(v)m(oid)p Fg(\))390 3100 y Ft(Reset)36 b(the)e(displa)m(y)h
+(state)h(to)g(a)f(clean)g(state)h(and)e(redispla)m(y)h(the)g(curren)m
+(t)g(line)g(starting)g(on)g(a)390 3210 y(new)30 b(line.)3350
+3386 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_crlf)48
+b Fg(\()p Ff(v)m(oid)p Fg(\))390 3496 y Ft(Mo)m(v)m(e)32
+b(the)f(cursor)f(to)h(the)f(start)h(of)g(the)f(next)h(screen)f(line.)
+3350 3672 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_show_char)c
+Fg(\()p Ff(in)m(t)34 b(c)p Fg(\))390 3782 y Ft(Displa)m(y)g(c)m
+(haracter)g Fj(c)k Ft(on)32 b Fs(rl_outstream)p Ft(.)44
+b(If)32 b(Readline)h(has)g(not)f(b)s(een)g(set)h(to)g(displa)m(y)g
+(meta)390 3891 y(c)m(haracters)27 b(directly)-8 b(,)29
+b(this)c(will)i(con)m(v)m(ert)g(meta)g(c)m(haracters)h(to)e(a)h
+(meta-pre\014xed)f(k)m(ey)g(sequence.)390 4001 y(This)k(is)g(in)m
+(tended)g(for)g(use)g(b)m(y)h(applications)g(whic)m(h)f(wish)g(to)h(do)
+f(their)h(o)m(wn)f(redispla)m(y)-8 b(.)3350 4177 y([F)g(unction])-3599
+b Fh(int)53 b(rl_message)c Fg(\()p Ff(const)34 b(c)m(har)g(*,)k(.)24
+b(.)g(.)12 b Fg(\))390 4287 y Ft(The)20 b(argumen)m(ts)h(are)g(a)g
+(format)g(string)g(as)f(w)m(ould)h(b)s(e)f(supplied)f(to)j
+Fs(printf)p Ft(,)f(p)s(ossibly)e(con)m(taining)390 4396
+y(con)m(v)m(ersion)45 b(sp)s(eci\014cations)g(suc)m(h)f(as)g(`)p
+Fs(\045d)p Ft(',)k(and)c(an)m(y)g(additional)h(argumen)m(ts)g
+(necessary)f(to)390 4506 y(satisfy)e(the)f(con)m(v)m(ersion)i(sp)s
+(eci\014cations.)74 b(The)41 b(resulting)h(string)f(is)g(displa)m(y)m
+(ed)h(in)f(the)h Fj(ec)m(ho)390 4616 y(area)p Ft(.)63
+b(The)37 b(ec)m(ho)i(area)f(is)g(also)g(used)f(to)h(displa)m(y)g(n)m
+(umeric)f(argumen)m(ts)h(and)f(searc)m(h)h(strings.)390
+4725 y(Y)-8 b(ou)34 b(should)e(call)j Fs(rl_save_prompt)29
+b Ft(to)34 b(sa)m(v)m(e)h(the)f(prompt)e(information)i(b)s(efore)f
+(calling)i(this)390 4835 y(function.)3350 5011 y([F)-8
+b(unction])-3599 b Fh(int)53 b(rl_clear_message)e Fg(\()p
+Ff(v)m(oid)p Fg(\))390 5121 y Ft(Clear)29 b(the)g(message)h(in)f(the)g
+(ec)m(ho)h(area.)41 b(If)29 b(the)g(prompt)f(w)m(as)h(sa)m(v)m(ed)h
+(with)f(a)g(call)i(to)e Fs(rl_save_)390 5230 y(prompt)38
+b Ft(b)s(efore)h(the)g(last)h(call)h(to)f Fs(rl_message)p
+Ft(,)f(call)i Fs(rl_restore_prompt)34 b Ft(b)s(efore)39
+b(calling)390 5340 y(this)30 b(function.)p eop end
+%%Page: 41 45
+TeXDict begin 41 44 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(41)3350
+299 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_save_prompt)49
+b Fg(\()p Ff(v)m(oid)p Fg(\))390 408 y Ft(Sa)m(v)m(e)44
+b(the)f(lo)s(cal)i(Readline)e(prompt)f(displa)m(y)i(state)g(in)f
+(preparation)g(for)g(displa)m(ying)g(a)g(new)390 518
+y(message)31 b(in)g(the)f(message)i(area)f(with)f Fs(rl_message\(\))p
+Ft(.)3350 722 y([F)-8 b(unction])-3599 b Fh(void)54 b
+(rl_restore_prompt)c Fg(\()p Ff(v)m(oid)p Fg(\))390 832
+y Ft(Restore)44 b(the)e(lo)s(cal)i(Readline)g(prompt)d(displa)m(y)i
+(state)h(sa)m(v)m(ed)g(b)m(y)f(the)f(most)h(recen)m(t)h(call)g(to)390
+941 y Fs(rl_save_prompt)p Ft(.)69 b(if)41 b Fs(rl_save_prompt)d
+Ft(w)m(as)j(called)i(to)f(sa)m(v)m(e)h(the)e(prompt)f(b)s(efore)h(a)h
+(call)390 1051 y(to)37 b Fs(rl_message)p Ft(,)f(this)h(function)f
+(should)g(b)s(e)g(called)i(b)s(efore)f(the)g(corresp)s(onding)e(call)j
+(to)g Fs(rl_)390 1161 y(clear_message)p Ft(.)3350 1365
+y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_expand_prompt)e
+Fg(\()p Ff(c)m(har)34 b(*prompt)p Fg(\))390 1474 y Ft(Expand)41
+b(an)m(y)j(sp)s(ecial)f(c)m(haracter)h(sequences)f(in)g
+Fj(prompt)g Ft(and)f(set)i(up)d(the)i(lo)s(cal)h(Readline)390
+1584 y(prompt)35 b(redispla)m(y)h(v)-5 b(ariables.)57
+b(This)35 b(function)h(is)g(called)h(b)m(y)e Fs(readline\(\))p
+Ft(.)55 b(It)35 b(ma)m(y)i(also)g(b)s(e)390 1694 y(called)22
+b(to)g(expand)f(the)g(primary)f(prompt)g(if)i(the)f Fs
+(rl_on_new_line_with_prom)o(pt\()o(\))15 b Ft(function)390
+1803 y(or)25 b Fs(rl_already_prompted)c Ft(v)-5 b(ariable)26
+b(is)f(used.)39 b(It)25 b(returns)f(the)i(n)m(um)m(b)s(er)e(of)i
+(visible)f(c)m(haracters)390 1913 y(on)34 b(the)g(last)g(line)g(of)g
+(the)g(\(p)s(ossibly)f(m)m(ulti-line\))j(prompt.)50 b(Applications)34
+b(ma)m(y)h(indicate)f(that)390 2022 y(the)28 b(prompt)f(con)m(tains)i
+(c)m(haracters)g(that)g(tak)m(e)g(up)e(no)h(ph)m(ysical)g(screen)g
+(space)g(when)f(displa)m(y)m(ed)390 2132 y(b)m(y)41 b(brac)m(k)m(eting)
+i(a)e(sequence)g(of)g(suc)m(h)g(c)m(haracters)h(with)f(the)g(sp)s
+(ecial)h(mark)m(ers)f Fs(RL_PROMPT_)390 2242 y(START_IGNORE)34
+b Ft(and)j Fs(RL_PROMPT_END_IGNORE)32 b Ft(\(declared)39
+b(in)e Fs(readline.h)e Ft(as)j(`)p Fs(\\001)p Ft(')f(and)390
+2351 y(`)p Fs(\\002)p Ft(',)31 b(resp)s(ectiv)m(ely\).)46
+b(This)31 b(ma)m(y)h(b)s(e)f(used)f(to)j(em)m(b)s(ed)e(terminal-sp)s
+(eci\014c)h(escap)s(e)g(sequences)390 2461 y(in)e(prompts.)3350
+2665 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_set_prompt)d
+Fg(\()p Ff(const)34 b(c)m(har)g(*prompt)p Fg(\))390 2775
+y Ft(Mak)m(e)28 b(Readline)g(use)f Fj(prompt)h Ft(for)e(subsequen)m(t)h
+(redispla)m(y)-8 b(.)40 b(This)26 b(calls)i Fs(rl_expand_prompt\(\))390
+2884 y Ft(to)j(expand)f(the)g(prompt)g(and)g(sets)g Fs(rl_prompt)e
+Ft(to)j(the)g(result.)150 3093 y Fi(2.4.7)63 b(Mo)s(difying)43
+b(T)-10 b(ext)3350 3300 y Ft([F)i(unction])-3599 b Fh(int)53
+b(rl_insert_text)d Fg(\()p Ff(const)34 b(c)m(har)g(*text)p
+Fg(\))390 3410 y Ft(Insert)d Fj(text)k Ft(in)m(to)d(the)g(line)g(at)g
+(the)g(curren)m(t)f(cursor)g(p)s(osition.)45 b(Returns)30
+b(the)i(n)m(um)m(b)s(er)f(of)g(c)m(har-)390 3519 y(acters)g(inserted.)
+3350 3723 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_delete_text)d
+Fg(\()p Ff(in)m(t)33 b(start,)g(in)m(t)g(end)p Fg(\))390
+3833 y Ft(Delete)40 b(the)e(text)h(b)s(et)m(w)m(een)f
+Fj(start)i Ft(and)d Fj(end)k Ft(in)c(the)h(curren)m(t)g(line.)63
+b(Returns)36 b(the)i(n)m(um)m(b)s(er)f(of)390 3943 y(c)m(haracters)32
+b(deleted.)3350 4147 y([F)-8 b(unction])-3599 b Fh(char)54
+b(*)e(rl_copy_text)d Fg(\()p Ff(in)m(t)34 b(start,)e(in)m(t)h(end)p
+Fg(\))390 4256 y Ft(Return)d(a)g(cop)m(y)h(of)g(the)g(text)g(b)s(et)m
+(w)m(een)g Fj(start)i Ft(and)d Fj(end)j Ft(in)d(the)h(curren)m(t)f
+(line.)3350 4461 y([F)-8 b(unction])-3599 b Fh(int)53
+b(rl_kill_text)c Fg(\()p Ff(in)m(t)34 b(start,)e(in)m(t)i(end)p
+Fg(\))390 4570 y Ft(Cop)m(y)g(the)g(text)i(b)s(et)m(w)m(een)e
+Fj(start)j Ft(and)d Fj(end)j Ft(in)d(the)g(curren)m(t)g(line)g(to)h
+(the)f(kill)h(ring,)g(app)s(ending)390 4680 y(or)f(prep)s(ending)e(to)j
+(the)f(last)h(kill)f(if)g(the)g(last)h(command)f(w)m(as)g(a)h(kill)f
+(command.)51 b(The)34 b(text)h(is)390 4789 y(deleted.)51
+b(If)33 b Fj(start)j Ft(is)e(less)g(than)f Fj(end)p Ft(,)h(the)g(text)g
+(is)g(app)s(ended,)f(otherwise)h(prep)s(ended.)48 b(If)33
+b(the)390 4899 y(last)e(command)f(w)m(as)h(not)g(a)f(kill,)i(a)f(new)e
+(kill)i(ring)g(slot)g(is)f(used.)3350 5103 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_push_macro_input)e Fg(\()p Ff(c)m(har)35
+b(*macro)p Fg(\))390 5213 y Ft(Cause)28 b Fj(macro)33
+b Ft(to)c(b)s(e)f(inserted)g(in)m(to)h(the)g(line,)g(as)f(if)h(it)f
+(had)g(b)s(een)g(in)m(v)m(ok)m(ed)h(b)m(y)f(a)h(k)m(ey)g(b)s(ound)d(to)
+390 5322 y(a)31 b(macro.)41 b(Not)31 b(esp)s(ecially)h(useful;)e(use)g
+Fs(rl_insert_text\(\))c Ft(instead.)p eop end
+%%Page: 42 46
+TeXDict begin 42 45 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(42)150
+299 y Fi(2.4.8)63 b(Character)39 b(Input)3350 505 y Ft([F)-8
+b(unction])-3599 b Fh(int)53 b(rl_read_key)c Fg(\()p
+Ff(v)m(oid)p Fg(\))390 615 y Ft(Return)29 b(the)g(next)h(c)m(haracter)h
+(a)m(v)-5 b(ailable)32 b(from)d(Readline's)h(curren)m(t)f(input)g
+(stream.)41 b(This)28 b(han-)390 724 y(dles)e(input)g(inserted)g(in)m
+(to)i(the)e(input)g(stream)h(via)g Fj(rl)p 2226 724 28
+4 v 40 w(p)s(ending)p 2583 724 V 38 w(input)h Ft(\(see)f(Section)h(2.3)
+f([Read-)390 834 y(line)40 b(V)-8 b(ariables],)43 b(page)d(29\))g(and)f
+Fs(rl_stuff_char\(\))p Ft(,)f(macros,)k(and)d(c)m(haracters)h(read)f
+(from)390 943 y(the)34 b(k)m(eyb)s(oard.)52 b(While)35
+b(w)m(aiting)g(for)f(input,)g(this)g(function)g(will)g(call)i(an)m(y)e
+(function)g(assigned)390 1053 y(to)d(the)g Fs(rl_event_hook)26
+b Ft(v)-5 b(ariable.)3350 1256 y([F)d(unction])-3599
+b Fh(int)53 b(rl_getc)48 b Fg(\()p Ff(FILE)33 b(*stream)p
+Fg(\))390 1365 y Ft(Return)20 b(the)i(next)f(c)m(haracter)i(a)m(v)-5
+b(ailable)24 b(from)c Fj(stream)p Ft(,)k(whic)m(h)d(is)g(assumed)g(to)h
+(b)s(e)e(the)i(k)m(eyb)s(oard.)3350 1568 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_stuff_char)d Fg(\()p Ff(in)m(t)33 b(c)p
+Fg(\))390 1678 y Ft(Insert)f Fj(c)39 b Ft(in)m(to)34
+b(the)f(Readline)g(input)f(stream.)49 b(It)33 b(will)g(b)s(e)f
+Fs(")p Ft(read)p Fs(")g Ft(b)s(efore)h(Readline)g(attempts)390
+1787 y(to)27 b(read)g(c)m(haracters)h(from)f(the)g(terminal)g(with)f
+Fs(rl_read_key\(\))p Ft(.)36 b(Up)27 b(to)g(512)h(c)m(haracters)g(ma)m
+(y)390 1897 y(b)s(e)i(pushed)f(bac)m(k.)42 b Fs(rl_stuff_char)27
+b Ft(returns)i(1)i(if)f(the)h(c)m(haracter)h(w)m(as)f(successfully)g
+(inserted;)390 2007 y(0)g(otherwise.)3350 2209 y([F)-8
+b(unction])-3599 b Fh(int)53 b(rl_execute_next)d Fg(\()p
+Ff(in)m(t)34 b(c)p Fg(\))390 2319 y Ft(Mak)m(e)j Fj(c)42
+b Ft(b)s(e)35 b(the)h(next)f(command)h(to)g(b)s(e)f(executed)i(when)d
+Fs(rl_read_key\(\))e Ft(is)k(called.)58 b(This)390 2429
+y(sets)31 b Fj(rl)p 635 2429 V 40 w(p)s(ending)p 992
+2429 V 38 w(input)p Ft(.)3350 2631 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_clear_pending_inpu)q(t)e Fg(\()p Ff(v)m(oid)p
+Fg(\))390 2741 y Ft(Unset)42 b Fj(rl)p 729 2741 V 40
+w(p)s(ending)p 1086 2741 V 38 w(input)p Ft(,)i(e\013ectiv)m(ely)h
+(negating)e(the)f(e\013ect)h(of)f(an)m(y)g(previous)f(call)i(to)g
+Fs(rl_)390 2851 y(execute_next\(\))p Ft(.)59 b(This)36
+b(w)m(orks)i(only)g(if)f(the)h(p)s(ending)e(input)h(has)g(not)h
+(already)g(b)s(een)f(read)390 2960 y(with)30 b Fs(rl_read_key\(\))p
+Ft(.)3350 3163 y([F)-8 b(unction])-3599 b Fh(int)53 b
+(rl_set_keyboard_input)q(_tim)q(eou)q(t)e Fg(\()p Ff(in)m(t)34
+b(u)p Fg(\))390 3273 y Ft(While)41 b(w)m(aiting)g(for)f(k)m(eyb)s(oard)
+g(input)f(in)h Fs(rl_read_key\(\))p Ft(,)f(Readline)i(will)f(w)m(ait)h
+(for)f Fj(u)g Ft(mi-)390 3382 y(croseconds)31 b(for)g(input)f(b)s
+(efore)g(calling)j(an)m(y)e(function)f(assigned)i(to)f
+Fs(rl_event_hook)p Ft(.)39 b Fj(u)30 b Ft(m)m(ust)390
+3492 y(b)s(e)h(greater)i(than)f(or)g(equal)g(to)h(zero)f(\(a)h
+(zero-length)g(timeout)g(is)f(equiv)-5 b(alen)m(t)33
+b(to)g(a)f(p)s(oll\).)45 b(The)390 3601 y(default)31
+b(w)m(aiting)g(p)s(erio)s(d)e(is)i(one-ten)m(th)g(of)g(a)g(second.)40
+b(Returns)30 b(the)g(old)h(timeout)g(v)-5 b(alue.)3350
+3804 y([F)d(unction])-3599 b Fh(int)53 b(rl_set_timeout)d
+Fg(\()p Ff(unsigned)35 b(in)m(t)e(secs,)h(unsigned)h(in)m(t)e(usecs)p
+Fg(\))390 3914 y Ft(Set)f(a)g(timeout)h(for)f(subsequen)m(t)f(calls)j
+(to)e Fs(readline\(\))p Ft(.)43 b(If)31 b(Readline)i(do)s(es)f(not)g
+(read)g(a)g(com-)390 4024 y(plete)37 b(line,)h(or)e(the)g(n)m(um)m(b)s
+(er)f(of)h(c)m(haracters)i(sp)s(eci\014ed)d(b)m(y)h Fs
+(rl_num_chars_to_read)p Ft(,)c(b)s(efore)390 4133 y(the)h(duration)g
+(sp)s(eci\014ed)g(b)m(y)g Fj(secs)38 b Ft(\(in)33 b(seconds\))h(and)e
+Fj(usecs)37 b Ft(\(microseconds\),)f(it)d(returns)g(and)390
+4243 y(sets)22 b Fs(RL_STATE_TIMEOUT)17 b Ft(in)k Fs(rl_readline_state)
+p Ft(.)33 b(P)m(assing)22 b(0)g(for)f Fs(secs)g Ft(and)g
+Fs(usecs)f Ft(cancels)390 4352 y(an)m(y)k(previously)f(set)h(timeout;)j
+(the)d(con)m(v)m(enience)h(macro)f Fs(rl_clear_timeout\(\))19
+b Ft(is)k(shorthand)390 4462 y(for)30 b(this.)41 b(Returns)29
+b(0)i(if)f(the)h(timeout)g(is)g(set)g(successfully)-8
+b(.)3350 4665 y([F)g(unction])-3599 b Fh(int)53 b(rl_timeout_remaining)
+f Fg(\()p Ff(unsigned)33 b(in)m(t)f(*secs,)h(unsigned)g(in)m(t)f
+(*usecs)p Fg(\))390 4774 y Ft(Return)38 b(the)h(n)m(um)m(b)s(er)e(of)i
+(seconds)f(and)g(microseconds)h(remaining)g(in)f(the)h(curren)m(t)f
+(timeout)390 4884 y(duration)26 b(in)g Fj(*secs)31 b
+Ft(and)26 b Fj(*usecs)p Ft(,)i(resp)s(ectiv)m(ely)-8
+b(.)41 b(Both)27 b Fj(*secs)k Ft(and)26 b Fj(*usecs)k
+Ft(m)m(ust)c(b)s(e)g(non-NULL)390 4994 y(to)j(return)f(an)m(y)h(v)-5
+b(alues.)40 b(The)29 b(return)e(v)-5 b(alue)29 b(is)g(-1)g(on)g(error)f
+(or)h(when)e(there)i(is)g(no)f(timeout)i(set,)390 5103
+y(0)35 b(when)e(the)i(timeout)h(has)e(expired)g(\(lea)m(ving)j
+Fj(*secs)i Ft(and)34 b Fj(*usecs)39 b Ft(unc)m(hanged\),)c(and)f(1)h
+(if)g(the)390 5213 y(timeout)27 b(has)e(not)h(expired.)38
+b(If)26 b(either)g(of)f Fj(secs)30 b Ft(and)25 b Fj(usecs)k
+Ft(is)d Fs(NULL)p Ft(,)g(the)f(return)g(v)-5 b(alue)26
+b(indicates)390 5322 y(whether)k(the)g(timeout)i(has)e(expired.)p
+eop end
+%%Page: 43 47
+TeXDict begin 43 46 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(43)150
+299 y Fi(2.4.9)63 b(T)-10 b(erminal)41 b(Managemen)m(t)3350
+496 y Ft([F)-8 b(unction])-3599 b Fh(void)54 b(rl_prep_terminal)c
+Fg(\()p Ff(in)m(t)33 b(meta)p 1704 496 30 5 v 44 w(\015ag)p
+Fg(\))390 606 y Ft(Mo)s(dify)42 b(the)h(terminal)g(settings)g(for)f
+(Readline's)i(use,)h(so)e Fs(readline\(\))c Ft(can)k(read)f(a)h(single)
+390 716 y(c)m(haracter)32 b(at)g(a)f(time)h(from)e(the)h(k)m(eyb)s
+(oard.)43 b(The)30 b Fj(meta)p 2376 716 28 4 v 41 w(\015ag)39
+b Ft(argumen)m(t)31 b(should)f(b)s(e)g(non-zero)390 825
+y(if)g(Readline)h(should)f(read)g(eigh)m(t-bit)i(input.)3350
+1011 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_deprep_terminal)c
+Fg(\()p Ff(v)m(oid)p Fg(\))390 1121 y Ft(Undo)31 b(the)h(e\013ects)h
+(of)f Fs(rl_prep_terminal\(\))p Ft(,)27 b(lea)m(ving)33
+b(the)f(terminal)g(in)f(the)h(state)h(in)e(whic)m(h)390
+1230 y(it)g(w)m(as)g(b)s(efore)f(the)g(most)h(recen)m(t)g(call)h(to)f
+Fs(rl_prep_terminal\(\))p Ft(.)3350 1416 y([F)-8 b(unction])-3599
+b Fh(void)54 b(rl_tty_set_default_bindi)q(ngs)e Fg(\()p
+Ff(Keymap)34 b(kmap)p Fg(\))390 1526 y Ft(Read)j(the)g(op)s(erating)h
+(system's)f(terminal)g(editing)h(c)m(haracters)g(\(as)g(w)m(ould)e(b)s
+(e)h(displa)m(y)m(ed)g(b)m(y)390 1635 y Fs(stty)p Ft(\))30
+b(to)h(their)f(Readline)h(equiv)-5 b(alen)m(ts.)42 b(The)30
+b(bindings)f(are)i(p)s(erformed)e(in)h Fj(kmap)p Ft(.)3350
+1821 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_tty_unset_default_bin)q
+(din)q(gs)e Fg(\()p Ff(Keymap)34 b(kmap)p Fg(\))390 1931
+y Ft(Reset)f(the)f(bindings)e(manipulated)i(b)m(y)g Fs
+(rl_tty_set_default_bind)o(ing)o(s)26 b Ft(so)32 b(that)g(the)g(ter-)
+390 2040 y(minal)40 b(editing)g(c)m(haracters)h(are)f(b)s(ound)e(to)i
+Fs(rl_insert)p Ft(.)66 b(The)39 b(bindings)f(are)i(p)s(erformed)e(in)
+390 2150 y Fj(kmap)p Ft(.)3350 2336 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_tty_set_echoing)e Fg(\()p Ff(in)m(t)34
+b(v)-6 b(alue)p Fg(\))390 2445 y Ft(Set)48 b(Readline's)g(idea)g(of)g
+(whether)f(or)g(not)h(it)g(is)f(ec)m(hoing)i(output)e(to)i(its)e
+(output)h(stream)390 2555 y(\()p Fj(rl)p 492 2555 V 40
+w(outstream)p Ft(\).)j(If)32 b Fj(v)-5 b(alue)39 b Ft(is)34
+b(0,)g(Readline)g(do)s(es)f(not)h(displa)m(y)f(output)g(to)h
+Fj(rl)p 3115 2555 V 40 w(outstream)p Ft(;)i(an)m(y)390
+2665 y(other)43 b(v)-5 b(alue)43 b(enables)h(output.)77
+b(The)43 b(initial)h(v)-5 b(alue)43 b(is)g(set)g(when)f(Readline)i
+(initializes)h(the)390 2774 y(terminal)31 b(settings.)42
+b(This)29 b(function)h(returns)f(the)i(previous)f(v)-5
+b(alue.)3350 2960 y([F)d(unction])-3599 b Fh(int)53 b
+(rl_reset_terminal)e Fg(\()p Ff(const)34 b(c)m(har)g(*terminal)p
+2232 2960 30 5 v 43 w(name)p Fg(\))390 3070 y Ft(Reinitialize)26
+b(Readline's)f(idea)f(of)g(the)g(terminal)h(settings)f(using)g
+Fj(terminal)p 2977 3070 28 4 v 40 w(name)29 b Ft(as)24
+b(the)g(termi-)390 3179 y(nal)32 b(t)m(yp)s(e)g(\(e.g.,)i
+Fs(vt100)p Ft(\).)44 b(If)31 b Fj(terminal)p 1753 3179
+V 41 w(name)37 b Ft(is)31 b Fs(NULL)p Ft(,)h(the)g(v)-5
+b(alue)32 b(of)g(the)g Fs(TERM)e Ft(en)m(vironmen)m(t)390
+3289 y(v)-5 b(ariable)31 b(is)g(used.)150 3489 y Fi(2.4.10)63
+b(Utilit)m(y)40 b(F)-10 b(unctions)3350 3686 y Ft([F)i(unction])-3599
+b Fh(int)53 b(rl_save_state)d Fg(\()p Ff(struct)34 b(readline)p
+1759 3686 30 5 v 44 w(state)f(*sp)p Fg(\))390 3796 y
+Ft(Sa)m(v)m(e)d(a)f(snapshot)e(of)i(Readline's)g(in)m(ternal)g(state)h
+(to)f Fj(sp)p Ft(.)40 b(The)28 b(con)m(ten)m(ts)i(of)e(the)h
+Fj(readline)p 3518 3796 28 4 v 40 w(state)390 3906 y
+Ft(structure)g(are)g(do)s(cumen)m(ted)g(in)g Fs(readline.h)p
+Ft(.)38 b(The)28 b(caller)j(is)e(resp)s(onsible)f(for)h(allo)s(cating)j
+(the)390 4015 y(structure.)3350 4201 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_restore_state)e Fg(\()p Ff(struct)34
+b(readline)p 1916 4201 30 5 v 44 w(state)f(*sp)p Fg(\))390
+4311 y Ft(Restore)23 b(Readline's)g(in)m(ternal)g(state)g(to)g(that)g
+(stored)f(in)g Fj(sp)p Ft(,)i(whic)m(h)d(m)m(ust)h(ha)m(v)m(e)i(b)s
+(een)d(sa)m(v)m(ed)i(b)m(y)g(a)390 4420 y(call)30 b(to)g
+Fs(rl_save_state)p Ft(.)37 b(The)28 b(con)m(ten)m(ts)j(of)e(the)g
+Fj(readline)p 2470 4420 28 4 v 41 w(state)35 b Ft(structure)29
+b(are)g(do)s(cumen)m(ted)390 4530 y(in)h Fs(readline.h)p
+Ft(.)38 b(The)30 b(caller)i(is)e(resp)s(onsible)f(for)i(freeing)f(the)h
+(structure.)3350 4716 y([F)-8 b(unction])-3599 b Fh(void)54
+b(rl_free)47 b Fg(\()p Ff(v)m(oid)33 b(*mem)p Fg(\))390
+4825 y Ft(Deallo)s(cate)25 b(the)c(memory)g(p)s(oin)m(ted)g(to)h(b)m(y)
+f Fj(mem)p Ft(.)38 b Fj(mem)21 b Ft(m)m(ust)g(ha)m(v)m(e)i(b)s(een)d
+(allo)s(cated)j(b)m(y)e Fs(malloc)p Ft(.)3350 5011 y([F)-8
+b(unction])-3599 b Fh(void)54 b(rl_replace_line)c Fg(\()p
+Ff(const)34 b(c)m(har)f(*text,)g(in)m(t)g(clear)p 2406
+5011 30 5 v 44 w(undo)p Fg(\))390 5121 y Ft(Replace)41
+b(the)e(con)m(ten)m(ts)i(of)f Fs(rl_line_buffer)35 b
+Ft(with)k Fj(text)p Ft(.)69 b(The)39 b(p)s(oin)m(t)h(and)e(mark)h(are)h
+(pre-)390 5230 y(serv)m(ed,)27 b(if)e(p)s(ossible.)39
+b(If)25 b Fj(clear)p 1422 5230 28 4 v 41 w(undo)k Ft(is)d(non-zero,)h
+(the)f(undo)e(list)i(asso)s(ciated)h(with)e(the)h(curren)m(t)390
+5340 y(line)31 b(is)f(cleared.)p eop end
+%%Page: 44 48
+TeXDict begin 44 47 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(44)3350
+299 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_extend_line_buffer)d
+Fg(\()p Ff(in)m(t)34 b(len)p Fg(\))390 408 y Ft(Ensure)29
+b(that)h Fs(rl_line_buffer)d Ft(has)j(enough)f(space)i(to)g(hold)f
+Fj(len)g Ft(c)m(haracters,)i(p)s(ossibly)d(real-)390
+518 y(lo)s(cating)j(it)f(if)f(necessary)-8 b(.)3350 756
+y([F)g(unction])-3599 b Fh(int)53 b(rl_initialize)d Fg(\()p
+Ff(v)m(oid)p Fg(\))390 865 y Ft(Initialize)39 b(or)e(re-initialize)i
+(Readline's)f(in)m(ternal)f(state.)62 b(It's)37 b(not)g(strictly)h
+(necessary)f(to)h(call)390 975 y(this;)31 b Fs(readline\(\))c
+Ft(calls)32 b(it)f(b)s(efore)f(reading)g(an)m(y)h(input.)3350
+1212 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_ding)48
+b Fg(\()p Ff(v)m(oid)p Fg(\))390 1322 y Ft(Ring)30 b(the)h(terminal)g
+(b)s(ell,)f(ob)s(eying)h(the)f(setting)i(of)e Fs(bell-style)p
+Ft(.)3350 1559 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_alphabetic)d
+Fg(\()p Ff(in)m(t)33 b(c)p Fg(\))390 1669 y Ft(Return)d(1)g(if)h
+Fj(c)36 b Ft(is)30 b(an)h(alphab)s(etic)g(c)m(haracter.)3350
+1906 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_display_match_list)d
+Fg(\()p Ff(c)m(har)35 b(**matc)m(hes,)e(in)m(t)g(len,)h(in)m(t)f(max)p
+Fg(\))390 2016 y Ft(A)i(con)m(v)m(enience)h(function)e(for)g(displa)m
+(ying)h(a)g(list)g(of)g(strings)f(in)g(columnar)g(format)h(on)f(Read-)
+390 2126 y(line's)g(output)f(stream.)51 b Fs(matches)31
+b Ft(is)j(the)f(list)i(of)e(strings,)i(in)e(argv)h(format,)h(suc)m(h)e
+(as)h(a)g(list)g(of)390 2235 y(completion)26 b(matc)m(hes.)39
+b Fs(len)24 b Ft(is)g(the)g(n)m(um)m(b)s(er)f(of)i(strings)f(in)g
+Fs(matches)p Ft(,)f(and)h Fs(max)f Ft(is)i(the)f(length)h(of)390
+2345 y(the)h(longest)i(string)e(in)g Fs(matches)p Ft(.)37
+b(This)25 b(function)h(uses)g(the)g(setting)i(of)e Fs
+(print-completions-)390 2454 y(horizontally)33 b Ft(to)k(select)h(ho)m
+(w)e(the)g(matc)m(hes)i(are)e(displa)m(y)m(ed)h(\(see)g(Section)g
+(1.3.1)h([Readline)390 2564 y(Init)30 b(File)h(Syn)m(tax],)g(page)g
+(4\).)42 b(When)29 b(displa)m(ying)i(completions,)h(this)e(function)g
+(sets)g(the)g(n)m(um-)390 2674 y(b)s(er)23 b(of)g(columns)g(used)g(for)
+h(displa)m(y)f(to)i(the)e(v)-5 b(alue)24 b(of)g Fs
+(completion-display-width)p Ft(,)19 b(the)k(v)-5 b(alue)390
+2783 y(of)31 b(the)f(en)m(vironmen)m(t)h(v)-5 b(ariable)31
+b Fs(COLUMNS)p Ft(,)e(or)h(the)h(screen)f(width,)g(in)g(that)h(order.)
+275 3021 y(The)g(follo)m(wing)j(are)e(implemen)m(ted)h(as)f(macros,)h
+(de\014ned)e(in)h Fs(chardefs.h)p Ft(.)43 b(Applications)33
+b(should)150 3130 y(refrain)d(from)g(using)g(them.)3350
+3368 y([F)-8 b(unction])-3599 b Fh(int)53 b(_rl_uppercase_p)d
+Fg(\()p Ff(in)m(t)34 b(c)p Fg(\))390 3477 y Ft(Return)c(1)g(if)h
+Fj(c)36 b Ft(is)30 b(an)h(upp)s(ercase)e(alphab)s(etic)i(c)m(haracter.)
+3350 3715 y([F)-8 b(unction])-3599 b Fh(int)53 b(_rl_lowercase_p)d
+Fg(\()p Ff(in)m(t)34 b(c)p Fg(\))390 3824 y Ft(Return)c(1)g(if)h
+Fj(c)36 b Ft(is)30 b(a)h(lo)m(w)m(ercase)i(alphab)s(etic)e(c)m
+(haracter.)3350 4062 y([F)-8 b(unction])-3599 b Fh(int)53
+b(_rl_digit_p)c Fg(\()p Ff(in)m(t)34 b(c)p Fg(\))390
+4171 y Ft(Return)c(1)g(if)h Fj(c)36 b Ft(is)30 b(a)h(n)m(umeric)f(c)m
+(haracter.)3350 4409 y([F)-8 b(unction])-3599 b Fh(int)53
+b(_rl_to_upper)c Fg(\()p Ff(in)m(t)34 b(c)p Fg(\))390
+4519 y Ft(If)23 b Fj(c)30 b Ft(is)24 b(a)g(lo)m(w)m(ercase)i(alphab)s
+(etic)e(c)m(haracter,)j(return)c(the)h(corresp)s(onding)e(upp)s(ercase)
+h(c)m(haracter.)3350 4756 y([F)-8 b(unction])-3599 b
+Fh(int)53 b(_rl_to_lower)c Fg(\()p Ff(in)m(t)34 b(c)p
+Fg(\))390 4866 y Ft(If)28 b Fj(c)35 b Ft(is)29 b(an)g(upp)s(ercase)f
+(alphab)s(etic)h(c)m(haracter,)i(return)d(the)h(corresp)s(onding)f(lo)m
+(w)m(ercase)j(c)m(harac-)390 4975 y(ter.)3350 5213 y([F)-8
+b(unction])-3599 b Fh(int)53 b(_rl_digit_value)d Fg(\()p
+Ff(in)m(t)34 b(c)p Fg(\))390 5322 y Ft(If)c Fj(c)36 b
+Ft(is)31 b(a)f(n)m(um)m(b)s(er,)g(return)f(the)h(v)-5
+b(alue)31 b(it)g(represen)m(ts.)p eop end
+%%Page: 45 49
+TeXDict begin 45 48 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(45)150
+299 y Fi(2.4.11)63 b(Miscellaneous)42 b(F)-10 b(unctions)3350
+489 y Ft([F)i(unction])-3599 b Fh(int)53 b(rl_macro_bind)d
+Fg(\()p Ff(const)34 b(c)m(har)g(*k)m(eyseq,)e(const)i(c)m(har)g
+(*macro,)565 598 y(Keymap)g(map)p Fg(\))390 708 y Ft(Bind)23
+b(the)g(k)m(ey)h(sequence)g Fj(k)m(eyseq)i Ft(to)e(in)m(v)m(ok)m(e)h
+(the)f(macro)f Fj(macro)p Ft(.)39 b(The)23 b(binding)f(is)i(p)s
+(erformed)d(in)390 817 y Fj(map)p Ft(.)39 b(When)28 b
+Fj(k)m(eyseq)i Ft(is)e(in)m(v)m(ok)m(ed,)i(the)d Fj(macro)33
+b Ft(will)28 b(b)s(e)f(inserted)g(in)m(to)i(the)e(line.)41
+b(This)26 b(function)390 927 y(is)k(deprecated;)i(use)e
+Fs(rl_generic_bind\(\))25 b Ft(instead.)3350 1101 y([F)-8
+b(unction])-3599 b Fh(void)54 b(rl_macro_dumper)c Fg(\()p
+Ff(in)m(t)33 b(readable)p Fg(\))390 1210 y Ft(Prin)m(t)27
+b(the)g(k)m(ey)h(sequences)g(b)s(ound)d(to)j(macros)f(and)g(their)g(v)
+-5 b(alues,)28 b(using)f(the)g(curren)m(t)g(k)m(eymap,)390
+1320 y(to)32 b Fs(rl_outstream)p Ft(.)40 b(If)31 b Fj(readable)36
+b Ft(is)c(non-zero,)g(the)f(list)h(is)f(formatted)h(in)f(suc)m(h)g(a)g
+(w)m(a)m(y)i(that)e(it)390 1429 y(can)g(b)s(e)e(made)i(part)f(of)h(an)f
+Fs(inputrc)e Ft(\014le)j(and)e(re-read.)3350 1603 y([F)-8
+b(unction])-3599 b Fh(int)53 b(rl_variable_bind)e Fg(\()p
+Ff(const)34 b(c)m(har)f(*v)-6 b(ariable,)33 b(const)h(c)m(har)f(*v)-6
+b(alue)p Fg(\))390 1713 y Ft(Mak)m(e)28 b(the)f(Readline)g(v)-5
+b(ariable)27 b Fj(v)-5 b(ariable)32 b Ft(ha)m(v)m(e)c
+Fj(v)-5 b(alue)p Ft(.)40 b(This)25 b(b)s(eha)m(v)m(es)i(as)g(if)f(the)h
+(Readline)g(com-)390 1822 y(mand)j(`)p Fs(set)g Fl(variable)e(value)p
+Ft(')h(had)h(b)s(een)h(executed)g(in)g(an)f Fs(inputrc)f
+Ft(\014le)i(\(see)h(Section)f(1.3.1)390 1932 y([Readline)g(Init)f(File)
+i(Syn)m(tax],)f(page)g(4\).)3350 2106 y([F)-8 b(unction])-3599
+b Fh(char)54 b(*)e(rl_variable_value)f Fg(\()p Ff(const)34
+b(c)m(har)g(*v)-6 b(ariable)p Fg(\))390 2215 y Ft(Return)28
+b(a)i(string)f(represen)m(ting)h(the)f(v)-5 b(alue)30
+b(of)f(the)h(Readline)g(v)-5 b(ariable)30 b Fj(v)-5 b(ariable)p
+Ft(.)41 b(F)-8 b(or)30 b(b)s(o)s(olean)390 2325 y(v)-5
+b(ariables,)31 b(this)g(string)f(is)g(either)h(`)p Fs(on)p
+Ft(')f(or)h(`)p Fs(off)p Ft('.)3350 2499 y([F)-8 b(unction])-3599
+b Fh(void)54 b(rl_variable_dumper)c Fg(\()p Ff(in)m(t)34
+b(readable)p Fg(\))390 2608 y Ft(Prin)m(t)44 b(the)h(Readline)g(v)-5
+b(ariable)45 b(names)f(and)g(their)g(curren)m(t)g(v)-5
+b(alues)45 b(to)g Fs(rl_outstream)p Ft(.)79 b(If)390
+2718 y Fj(readable)37 b Ft(is)32 b(non-zero,)h(the)e(list)i(is)e
+(formatted)h(in)g(suc)m(h)f(a)h(w)m(a)m(y)h(that)f(it)g(can)g(b)s(e)f
+(made)g(part)h(of)390 2827 y(an)e Fs(inputrc)f Ft(\014le)h(and)g
+(re-read.)3350 3001 y([F)-8 b(unction])-3599 b Fh(int)53
+b(rl_set_paren_blink_ti)q(meou)q(t)f Fg(\()p Ff(in)m(t)33
+b(u)p Fg(\))390 3111 y Ft(Set)25 b(the)h(time)f(in)m(terv)-5
+b(al)27 b(\(in)e(microseconds\))h(that)g(Readline)f(w)m(aits)h(when)e
+(sho)m(wing)i(a)f(balancing)390 3220 y(c)m(haracter)32
+b(when)d Fs(blink-matching-paren)c Ft(has)30 b(b)s(een)g(enabled.)3350
+3394 y([F)-8 b(unction])-3599 b Fh(char)54 b(*)e(rl_get_termcap)e
+Fg(\()p Ff(const)34 b(c)m(har)g(*cap)p Fg(\))390 3504
+y Ft(Retriev)m(e)29 b(the)e(string)g(v)-5 b(alue)27 b(of)g(the)h
+(termcap)f(capabilit)m(y)i Fj(cap)p Ft(.)40 b(Readline)27
+b(fetc)m(hes)h(the)g(termcap)390 3613 y(en)m(try)34 b(for)f(the)h
+(curren)m(t)f(terminal)h(name)g(and)f(uses)g(those)h(capabilities)h(to)
+f(mo)m(v)m(e)h(around)e(the)390 3723 y(screen)21 b(line)h(and)e(p)s
+(erform)g(other)h(terminal-sp)s(eci\014c)h(op)s(erations,)h(lik)m(e)f
+(erasing)g(a)f(line.)38 b(Readline)390 3832 y(do)s(es)d(not)g(use)g
+(all)g(of)h(a)f(terminal's)g(capabilities,)k(and)34 b(this)h(function)g
+(will)g(return)f(v)-5 b(alues)35 b(for)390 3942 y(only)30
+b(those)h(capabilities)i(Readline)e(uses.)3350 4116 y([F)-8
+b(unction])-3599 b Fh(void)54 b(rl_clear_history)c Fg(\()p
+Ff(v)m(oid)p Fg(\))390 4225 y Ft(Clear)27 b(the)h(history)f(list)h(b)m
+(y)f(deleting)h(all)g(of)f(the)h(en)m(tries,)h(in)d(the)i(same)f
+(manner)g(as)g(the)g(History)390 4335 y(library's)42
+b Fs(clear_history\(\))d Ft(function.)78 b(This)42 b(di\013ers)g(from)g
+Fs(clear_history)e Ft(b)s(ecause)i(it)390 4445 y(frees)30
+b(priv)-5 b(ate)31 b(data)g(Readline)g(sa)m(v)m(es)h(in)e(the)h
+(history)f(list.)3350 4618 y([F)-8 b(unction])-3599 b
+Fh(void)54 b(rl_activate_mark)c Fg(\()p Ff(v)m(oid)p
+Fg(\))390 4728 y Ft(Enable)30 b(an)f Fk(active)37 b Ft(mark.)j(When)30
+b(this)f(is)h(enabled,)g(the)g(text)h(b)s(et)m(w)m(een)f(p)s(oin)m(t)g
+(and)f(mark)g(\(the)390 4837 y Fj(region)p Ft(\))c(is)f(displa)m(y)m
+(ed)h(in)f(the)g(terminal's)h(standout)f(mo)s(de)f(\(a)i
+Fj(face)5 b Ft(\).)40 b(This)24 b(is)g(called)h(b)m(y)f(v)-5
+b(arious)390 4947 y(Readline)28 b(functions)f(that)h(set)g(the)f(mark)g
+(and)g(insert)g(text,)j(and)c(is)i(a)m(v)-5 b(ailable)30
+b(for)d(applications)390 5057 y(to)k(call.)3350 5230
+y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_deactivate_mark)c
+Fg(\()p Ff(v)m(oid)p Fg(\))390 5340 y Ft(T)-8 b(urn)29
+b(o\013)i(the)f(activ)m(e)j(mark.)p eop end
+%%Page: 46 50
+TeXDict begin 46 49 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(46)3350
+299 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_keep_mark_active)d
+Fg(\()p Ff(v)m(oid)p Fg(\))390 408 y Ft(Indicate)45 b(that)g(the)g
+(mark)f(should)g(remain)g(activ)m(e)j(when)c(the)i(curren)m(t)f
+(Readline)h(function)390 518 y(completes)28 b(and)e(after)h(redispla)m
+(y)g(o)s(ccurs.)40 b(In)26 b(most)h(cases,)h(the)f(mark)g(remains)f
+(activ)m(e)j(for)e(only)390 628 y(the)k(duration)f(of)g(a)h(single)g
+(bindable)f(Readline)h(function.)3350 799 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_mark_active_p)e Fg(\()p Ff(v)m(oid)p
+Fg(\))390 909 y Ft(Return)30 b(a)g(non-zero)h(v)-5 b(alue)31
+b(if)f(the)h(mark)f(is)h(curren)m(tly)f(activ)m(e;)j(zero)e(otherwise.)
+150 1100 y Fi(2.4.12)63 b(Alternate)40 b(In)m(terface)150
+1247 y Ft(An)21 b(alternate)j(in)m(terface)f(is)f(a)m(v)-5
+b(ailable)24 b(to)e(plain)g Fs(readline\(\))p Ft(.)35
+b(Some)21 b(applications)i(need)f(to)g(in)m(terlea)m(v)m(e)150
+1356 y(k)m(eyb)s(oard)35 b(I/O)h(with)f(\014le,)i(device,)h(or)e(windo)
+m(w)f(system)g(I/O,)h(t)m(ypically)i(b)m(y)d(using)g(a)h(main)g(lo)s
+(op)f(to)150 1466 y Fs(select\(\))40 b Ft(on)i(v)-5 b(arious)42
+b(\014le)g(descriptors.)76 b(T)-8 b(o)43 b(accommo)s(date)h(this)e
+(need,)j(Readline)e(can)f(also)i(b)s(e)150 1576 y(in)m(v)m(ok)m(ed)33
+b(as)e(a)h(`callbac)m(k')h(function)e(from)g(an)g(ev)m(en)m(t)h(lo)s
+(op.)44 b(There)30 b(are)i(functions)f(a)m(v)-5 b(ailable)33
+b(to)f(mak)m(e)150 1685 y(this)e(easy)-8 b(.)3350 1857
+y([F)g(unction])-3599 b Fh(void)54 b(rl_callback_handler_inst)q(all)e
+Fg(\()p Ff(const)34 b(c)m(har)g(*prompt,)565 1966 y(rl)p
+639 1966 30 5 v 44 w(v)m(cpfunc)p 1016 1966 V 45 w(t)f(*lhandler)p
+Fg(\))390 2076 y Ft(Set)23 b(up)e(the)i(terminal)g(for)f(Readline)h
+(I/O)g(and)f(displa)m(y)h(the)f(initial)i(expanded)e(v)-5
+b(alue)23 b(of)g Fj(prompt)p Ft(.)390 2186 y(Sa)m(v)m(e)34
+b(the)f(v)-5 b(alue)33 b(of)g Fj(lhandler)39 b Ft(to)34
+b(use)e(as)h(a)g(handler)f(function)h(to)g(call)h(when)e(a)h(complete)i
+(line)390 2295 y(of)h(input)f(has)g(b)s(een)g(en)m(tered.)57
+b(The)35 b(handler)g(function)g(receiv)m(es)j(the)e(text)g(of)g(the)g
+(line)g(as)g(an)390 2405 y(argumen)m(t.)k(As)29 b(with)f
+Fs(readline\(\))p Ft(,)e(the)j(handler)e(function)h(should)g
+Fs(free)f Ft(the)h(line)h(when)e(it)i(it)390 2514 y(\014nished)g(with)h
+(it.)3350 2686 y([F)-8 b(unction])-3599 b Fh(void)54
+b(rl_callback_read_char)d Fg(\()p Ff(v)m(oid)p Fg(\))390
+2796 y Ft(Whenev)m(er)34 b(an)g(application)h(determines)e(that)i(k)m
+(eyb)s(oard)e(input)g(is)h(a)m(v)-5 b(ailable,)37 b(it)d(should)f(call)
+390 2905 y Fs(rl_callback_read_char\(\))p Ft(,)17 b(whic)m(h)22
+b(will)g(read)f(the)h(next)g(c)m(haracter)h(from)f(the)f(curren)m(t)h
+(input)390 3015 y(source.)40 b(If)27 b(that)i(c)m(haracter)g(completes)
+h(the)e(line,)h Fs(rl_callback_read_char)22 b Ft(will)28
+b(in)m(v)m(ok)m(e)i(the)390 3124 y Fj(lhandler)47 b Ft(function)40
+b(installed)i(b)m(y)e Fs(rl_callback_handler_insta)o(ll)35
+b Ft(to)41 b(pro)s(cess)f(the)h(line.)390 3234 y(Before)j(calling)h
+(the)e Fj(lhandler)49 b Ft(function,)e(the)c(terminal)h(settings)g(are)
+g(reset)f(to)h(the)g(v)-5 b(alues)390 3344 y(they)44
+b(had)e(b)s(efore)h(calling)i Fs(rl_callback_handler_insta)o(ll)p
+Ft(.)73 b(If)43 b(the)h Fj(lhandler)49 b Ft(function)390
+3453 y(returns,)27 b(and)h(the)g(line)g(handler)f(remains)h(installed,)
+i(the)e(terminal)g(settings)h(are)f(mo)s(di\014ed)f(for)390
+3563 y(Readline's)k(use)f(again.)42 b Fs(EOF)29 b Ft(is)i(indicated)g
+(b)m(y)f(calling)i Fj(lhandler)k Ft(with)30 b(a)h Fs(NULL)e
+Ft(line.)3350 3735 y([F)-8 b(unction])-3599 b Fh(void)54
+b(rl_callback_sigcleanup)e Fg(\()p Ff(v)m(oid)p Fg(\))390
+3844 y Ft(Clean)26 b(up)e(an)m(y)i(in)m(ternal)g(state)h(the)e(callbac)
+m(k)j(in)m(terface)f(uses)e(to)h(main)m(tain)g(state)h(b)s(et)m(w)m
+(een)f(calls)390 3954 y(to)35 b(rl)p 572 3954 28 4 v
+40 w(callbac)m(k)p 928 3954 V 42 w(read)p 1142 3954 V
+40 w(c)m(har)f(\(e.g.,)j(the)e(state)g(of)f(an)m(y)h(activ)m(e)h
+(incremen)m(tal)f(searc)m(hes\).)54 b(This)33 b(is)390
+4063 y(in)m(tended)f(to)h(b)s(e)e(used)g(b)m(y)h(applications)h(that)g
+(wish)e(to)i(p)s(erform)d(their)j(o)m(wn)f(signal)g(handling;)390
+4173 y(Readline's)f(in)m(ternal)g(signal)g(handler)f(calls)h(this)g
+(when)e(appropriate.)3350 4345 y([F)-8 b(unction])-3599
+b Fh(void)54 b(rl_callback_handler_remo)q(ve)e Fg(\()p
+Ff(v)m(oid)p Fg(\))390 4454 y Ft(Restore)37 b(the)f(terminal)g(to)g
+(its)h(initial)g(state)g(and)e(remo)m(v)m(e)i(the)f(line)g(handler.)56
+b(Y)-8 b(ou)36 b(ma)m(y)h(call)390 4564 y(this)25 b(function)g(from)g
+(within)g(a)h(callbac)m(k)i(as)d(w)m(ell)i(as)f(indep)s(enden)m(tly)-8
+b(.)38 b(If)25 b(the)h Fj(lhandler)31 b Ft(installed)390
+4673 y(b)m(y)25 b Fs(rl_callback_handler_insta)o(ll)19
+b Ft(do)s(es)25 b(not)h(exit)g(the)g(program,)g(either)g(this)f
+(function)g(or)390 4783 y(the)32 b(function)f(referred)f(to)i(b)m(y)g
+(the)f(v)-5 b(alue)32 b(of)g Fs(rl_deprep_term_function)25
+b Ft(should)30 b(b)s(e)h(called)390 4893 y(b)s(efore)f(the)h(program)f
+(exits)h(to)g(reset)g(the)f(terminal)h(settings.)150
+5083 y Fi(2.4.13)63 b(A)41 b(Readline)f(Example)150 5230
+y Ft(Here)34 b(is)g(a)g(function)g(whic)m(h)g(c)m(hanges)g(lo)m(w)m
+(ercase)j(c)m(haracters)e(to)f(their)g(upp)s(ercase)f(equiv)-5
+b(alen)m(ts,)37 b(and)150 5340 y(upp)s(ercase)d(c)m(haracters)j(to)f
+(lo)m(w)m(ercase.)58 b(If)35 b(this)g(function)g(w)m(as)h(b)s(ound)d
+(to)j(`)p Fs(M-c)p Ft(',)h(then)e(t)m(yping)g(`)p Fs(M-c)p
+Ft(')p eop end
+%%Page: 47 51
+TeXDict begin 47 50 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(47)150
+299 y(w)m(ould)31 b(c)m(hange)i(the)f(case)g(of)g(the)g(c)m(haracter)h
+(under)d(p)s(oin)m(t.)44 b(T)m(yping)31 b(`)p Fs(M-1)f(0)g(M-c)p
+Ft(')h(w)m(ould)g(c)m(hange)i(the)150 408 y(case)e(of)g(the)g(follo)m
+(wing)g(10)h(c)m(haracters,)g(lea)m(ving)g(the)e(cursor)g(on)g(the)h
+(last)g(c)m(haracter)h(c)m(hanged.)390 628 y Fs(/*)47
+b(Invert)f(the)h(case)g(of)g(the)g(COUNT)f(following)g(characters.)e
+(*/)390 737 y(int)390 847 y(invert_case_line)f(\(count,)j(key\))629
+956 y(int)h(count,)f(key;)390 1066 y({)485 1176 y(register)g(int)h
+(start,)f(end,)h(i;)485 1395 y(start)g(=)g(rl_point;)485
+1614 y(if)h(\(rl_point)d(>=)i(rl_end\))581 1724 y(return)f(\(0\);)485
+1943 y(if)i(\(count)e(<)h(0\))581 2052 y({)676 2162 y(direction)f(=)h
+(-1;)676 2271 y(count)g(=)g(-count;)581 2381 y(})485
+2491 y(else)581 2600 y(direction)e(=)j(1;)485 2819 y(/*)g(Find)e(the)h
+(end)g(of)g(the)g(range)g(to)g(modify.)f(*/)485 2929
+y(end)h(=)h(start)e(+)i(\(count)e(*)h(direction\);)485
+3148 y(/*)h(Force)e(it)h(to)g(be)h(within)e(range.)g(*/)485
+3258 y(if)i(\(end)e(>)i(rl_end\))581 3367 y(end)f(=)g(rl_end;)485
+3477 y(else)g(if)g(\(end)g(<)g(0\))581 3587 y(end)g(=)g(0;)485
+3806 y(if)h(\(start)e(==)h(end\))581 3915 y(return)f(\(0\);)485
+4134 y(if)i(\(start)e(>)h(end\))581 4244 y({)676 4354
+y(int)g(temp)g(=)g(start;)676 4463 y(start)g(=)g(end;)676
+4573 y(end)g(=)h(temp;)581 4682 y(})485 4902 y(/*)g(Tell)e(readline)g
+(that)g(we)i(are)f(modifying)e(the)i(line,)629 5011 y(so)g(it)g(will)g
+(save)f(the)h(undo)g(information.)d(*/)485 5121 y(rl_modifying)h
+(\(start,)h(end\);)485 5340 y(for)h(\(i)h(=)f(start;)f(i)i(!=)f(end;)f
+(i++\))p eop end
+%%Page: 48 52
+TeXDict begin 48 51 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(48)581
+299 y Fs({)676 408 y(if)48 b(\(_rl_uppercase_p)43 b
+(\(rl_line_buffer[i]\)\))772 518 y(rl_line_buffer[i])g(=)k
+(_rl_to_lower)e(\(rl_line_buffer[i]\);)676 628 y(else)i(if)g
+(\(_rl_lowercase_p)d(\(rl_line_buffer[i]\)\))772 737
+y(rl_line_buffer[i])f(=)k(_rl_to_upper)e(\(rl_line_buffer[i]\);)581
+847 y(})485 956 y(/*)j(Move)e(point)h(to)g(on)g(top)g(of)g(the)g(last)g
+(character)e(changed.)g(*/)485 1066 y(rl_point)h(=)h(\(direction)e(==)j
+(1\))f(?)g(end)g(-)h(1)f(:)h(start;)485 1176 y(return)f(\(0\);)390
+1285 y(})150 1518 y Fi(2.4.14)63 b(Alternate)40 b(In)m(terface)g
+(Example)150 1665 y Ft(Here)f(is)g(a)g(complete)h(program)e(that)h
+(illustrates)h(Readline's)f(alternate)h(in)m(terface.)67
+b(It)38 b(reads)h(lines)150 1775 y(from)30 b(the)i(terminal)f(and)f
+(displa)m(ys)h(them,)h(pro)m(viding)f(the)g(standard)f(history)h(and)f
+(T)-8 b(AB)32 b(completion)150 1884 y(functions.)40 b(It)31
+b(understands)d(the)j(EOF)f(c)m(haracter)i(or)e Fs(")p
+Ft(exit)p Fs(")h Ft(to)g(exit)g(the)g(program.)390 2052
+y Fs(/*)47 b(Standard)f(include)g(files.)g(stdio.h)f(is)j(required.)d
+(*/)390 2162 y(#include)h(<stdlib.h>)390 2271 y(#include)g(<string.h>)
+390 2381 y(#include)g(<unistd.h>)390 2491 y(#include)g(<locale.h>)390
+2710 y(/*)h(Used)g(for)g(select\(2\))e(*/)390 2819 y(#include)h
+(<sys/types.h>)390 2929 y(#include)g(<sys/select.h>)390
+3148 y(#include)g(<signal.h>)390 3367 y(#include)g(<stdio.h>)390
+3587 y(/*)h(Standard)f(readline)f(include)h(files.)g(*/)390
+3696 y(#include)g(<readline/readline.h>)390 3806 y(#include)g
+(<readline/history.h>)390 4025 y(static)g(void)h(cb_linehandler)d
+(\(char)i(*\);)390 4134 y(static)g(void)h(sighandler)e(\(int\);)390
+4354 y(int)i(running;)390 4463 y(int)g(sigwinch_received;)390
+4573 y(const)f(char)h(*prompt)f(=)h("rltest$)f(";)390
+4792 y(/*)h(Handle)f(SIGWINCH)g(and)h(window)f(size)g(changes)g(when)h
+(readline)e(is)j(not)f(active)f(and)p 3922 4812 42 84
+v 533 4902 a(reading)g(a)h(character.)e(*/)390 5011 y(static)h(void)390
+5121 y(sighandler)f(\(int)i(sig\))390 5230 y({)485 5340
+y(sigwinch_received)d(=)j(1;)p eop end
+%%Page: 49 53
+TeXDict begin 49 52 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(49)390
+299 y Fs(})390 518 y(/*)47 b(Callback)f(function)f(called)h(for)h(each)
+g(line)g(when)f(accept-line)f(executed,)g(EOF)533 628
+y(seen,)i(or)g(EOF)g(character)e(read.)94 b(This)47 b(sets)f(a)i(flag)e
+(and)h(returns;)f(it)h(could)533 737 y(also)g(call)f(exit\(3\).)g(*/)
+390 847 y(static)g(void)390 956 y(cb_linehandler)e(\(char)i(*line\))390
+1066 y({)485 1176 y(/*)i(Can)f(use)f(^D)i(\(stty)e(eof\))h(or)g(`exit')
+f(to)h(exit.)f(*/)485 1285 y(if)i(\(line)e(==)h(NULL)g(||)g(strcmp)f
+(\(line,)g("exit"\))g(==)h(0\))581 1395 y({)676 1504
+y(if)h(\(line)e(==)h(0\))772 1614 y(printf)f(\("\\n"\);)676
+1724 y(printf)g(\("exit\\n"\);)676 1833 y(/*)i(This)e(function)g(needs)
+g(to)h(be)g(called)g(to)g(reset)f(the)h(terminal)f(settings,)p
+3874 1853 42 84 v 820 1943 a(and)g(calling)g(it)h(from)g(the)g(line)g
+(handler)e(keeps)i(one)g(extra)f(prompt)g(from)p 3874
+1963 42 76 v 820 2052 a(being)g(displayed.)f(*/)676 2162
+y(rl_callback_handler_remove)c(\(\);)676 2381 y(running)46
+b(=)i(0;)581 2491 y(})485 2600 y(else)581 2710 y({)676
+2819 y(if)g(\(*line\))772 2929 y(add_history)d(\(line\);)676
+3039 y(printf)h(\("input)g(line:)h(\045s\\n",)f(line\);)676
+3148 y(free)h(\(line\);)581 3258 y(})390 3367 y(})390
+3587 y(int)390 3696 y(main)g(\(int)f(c,)h(char)g(**v\))390
+3806 y({)485 3915 y(fd_set)g(fds;)485 4025 y(int)g(r;)485
+4244 y(/*)h(Set)f(the)f(default)g(locale)g(values)g(according)g(to)h
+(environment)e(variables.)g(*/)p 3874 4264 42 84 v 485
+4354 a(setlocale)h(\(LC_ALL,)f(""\);)485 4573 y(/*)j(Handle)e(window)g
+(size)g(changes)g(when)h(readline)e(is)j(not)f(active)f(and)h(reading)
+629 4682 y(characters.)d(*/)485 4792 y(signal)j(\(SIGWINCH,)e
+(sighandler\);)485 5011 y(/*)j(Install)d(the)i(line)g(handler.)f(*/)485
+5121 y(rl_callback_handler_instal)o(l)c(\(prompt,)j(cb_linehandler\);)
+485 5340 y(/*)j(Enter)e(a)h(simple)g(event)f(loop.)94
+b(This)47 b(waits)f(until)g(something)g(is)h(available)p
+eop end
+%%Page: 50 54
+TeXDict begin 50 53 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(50)629
+299 y Fs(to)47 b(read)f(on)i(readline's)d(input)h(stream)g(\(defaults)f
+(to)j(standard)d(input\))h(and)629 408 y(calls)g(the)h(builtin)f
+(character)f(read)i(callback)e(to)i(read)g(it.)95 b(It)47
+b(does)f(not)629 518 y(have)g(to)h(modify)g(the)f(user's)h(terminal)e
+(settings.)g(*/)485 628 y(running)h(=)i(1;)485 737 y(while)f
+(\(running\))581 847 y({)676 956 y(FD_ZERO)f(\(&fds\);)676
+1066 y(FD_SET)g(\(fileno)g(\(rl_instream\),)e(&fds\);)676
+1285 y(r)k(=)f(select)f(\(FD_SETSIZE,)f(&fds,)h(NULL,)h(NULL,)f
+(NULL\);)676 1395 y(if)i(\(r)f(<)g(0)h(&&)f(errno)f(!=)h(EINTR\))772
+1504 y({)867 1614 y(perror)f(\("rltest:)g(select"\);)867
+1724 y(rl_callback_handler_remov)o(e)c(\(\);)867 1833
+y(break;)772 1943 y(})676 2052 y(if)48 b(\(sigwinch_received\))390
+2162 y({)485 2271 y(rl_resize_terminal)43 b(\(\);)485
+2381 y(sigwinch_received)h(=)j(0;)390 2491 y(})676 2600
+y(if)h(\(r)f(<)g(0\))390 2710 y(continue;)676 2929 y(if)h(\(FD_ISSET)d
+(\(fileno)h(\(rl_instream\),)e(&fds\)\))772 3039 y
+(rl_callback_read_char)e(\(\);)581 3148 y(})485 3367
+y(printf)47 b(\("rltest:)e(Event)h(loop)h(has)g(exited\\n"\);)485
+3477 y(return)g(0;)390 3587 y(})150 3835 y Fr(2.5)68
+b(Readline)47 b(Signal)e(Handling)150 3995 y Ft(Signals)31
+b(are)f(async)m(hronous)g(ev)m(en)m(ts)i(sen)m(t)f(to)g(a)g(pro)s(cess)
+f(b)m(y)h(the)f(Unix)g(k)m(ernel,)i(sometimes)f(on)g(b)s(ehalf)150
+4104 y(of)24 b(another)f(pro)s(cess.)38 b(They)23 b(are)h(in)m(tended)f
+(to)h(indicate)h(exceptional)g(ev)m(en)m(ts,)i(lik)m(e)d(a)g(user)f
+(pressing)g(the)150 4214 y(terminal's)33 b(in)m(terrupt)f(k)m(ey)-8
+b(,)34 b(or)e(a)g(net)m(w)m(ork)h(connection)h(b)s(eing)e(brok)m(en.)46
+b(There)31 b(is)h(a)h(class)g(of)f(signals)150 4323 y(that)f(can)g(b)s
+(e)e(sen)m(t)i(to)g(the)g(pro)s(cess)f(curren)m(tly)g(reading)h(input)e
+(from)h(the)g(k)m(eyb)s(oard.)41 b(Since)30 b(Readline)150
+4433 y(c)m(hanges)41 b(the)e(terminal)i(attributes)f(when)f(it)h(is)f
+(called,)44 b(it)c(needs)f(to)i(p)s(erform)d(sp)s(ecial)i(pro)s
+(cessing)150 4543 y(when)33 b(suc)m(h)h(a)h(signal)g(is)f(receiv)m(ed)i
+(in)e(order)g(to)h(restore)f(the)h(terminal)g(to)g(a)f(sane)h(state,)i
+(or)d(pro)m(vide)150 4652 y(application)e(writers)e(with)g(functions)g
+(to)h(do)f(so)h(man)m(ually)-8 b(.)275 4792 y(Readline)40
+b(con)m(tains)i(an)e(in)m(ternal)h(signal)g(handler)f(that)h(is)f
+(installed)h(for)f(a)h(n)m(um)m(b)s(er)e(of)h(signals)150
+4902 y(\()p Fs(SIGINT)p Ft(,)e Fs(SIGQUIT)p Ft(,)f Fs(SIGTERM)p
+Ft(,)g Fs(SIGHUP)p Ft(,)g Fs(SIGALRM)p Ft(,)g Fs(SIGTSTP)p
+Ft(,)g Fs(SIGTTIN)p Ft(,)g(and)g Fs(SIGTTOU)p Ft(\).)59
+b(When)150 5011 y(one)27 b(of)g(these)g(signals)g(is)g(receiv)m(ed,)i
+(the)e(signal)g(handler)f(will)h(reset)h(the)e(terminal)i(attributes)f
+(to)g(those)150 5121 y(that)33 b(w)m(ere)g(in)f(e\013ect)h(b)s(efore)f
+Fs(readline\(\))e Ft(w)m(as)i(called,)j(reset)d(the)h(signal)g
+(handling)f(to)h(what)f(it)h(w)m(as)150 5230 y(b)s(efore)26
+b Fs(readline\(\))e Ft(w)m(as)j(called,)i(and)d(resend)g(the)h(signal)g
+(to)h(the)f(calling)h(application.)41 b(If)26 b(and)g(when)150
+5340 y(the)34 b(calling)i(application's)f(signal)g(handler)e(returns,)h
+(Readline)g(will)h(reinitialize)h(the)e(terminal)h(and)p
+eop end
+%%Page: 51 55
+TeXDict begin 51 54 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(51)150
+299 y(con)m(tin)m(ue)29 b(to)g(accept)h(input.)39 b(When)28
+b(a)h Fs(SIGINT)d Ft(is)j(receiv)m(ed,)h(the)e(Readline)h(signal)g
+(handler)f(p)s(erforms)150 408 y(some)39 b(additional)h(w)m(ork,)h
+(whic)m(h)d(will)h(cause)g(an)m(y)h(partially-en)m(tered)g(line)f(to)h
+(b)s(e)e(ab)s(orted)g(\(see)i(the)150 518 y(description)30
+b(of)h Fs(rl_free_line_state\(\))25 b Ft(b)s(elo)m(w\).)275
+656 y(There)e(is)i(an)f(additional)h(Readline)g(signal)g(handler,)g
+(for)f Fs(SIGWINCH)p Ft(,)g(whic)m(h)g(the)g(k)m(ernel)h(sends)e(to)j
+(a)150 765 y(pro)s(cess)i(whenev)m(er)h(the)g(terminal's)g(size)h(c)m
+(hanges)g(\(for)f(example,)h(if)f(a)g(user)f(resizes)i(an)e
+Fs(xterm)p Ft(\).)39 b(The)150 875 y(Readline)d Fs(SIGWINCH)e
+Ft(handler)g(up)s(dates)h(Readline's)h(in)m(ternal)h(screen)e(size)i
+(information,)g(and)e(then)150 984 y(calls)g(an)m(y)f
+Fs(SIGWINCH)e Ft(signal)i(handler)f(the)h(calling)h(application)g(has)f
+(installed.)51 b(Readline)35 b(calls)g(the)150 1094 y(application's)i
+Fs(SIGWINCH)c Ft(signal)i(handler)g(without)g(resetting)h(the)g
+(terminal)f(to)h(its)g(original)g(state.)150 1204 y(If)31
+b(the)i(application's)g(signal)g(handler)e(do)s(es)g(more)h(than)g(up)s
+(date)f(its)i(idea)f(of)g(the)g(terminal)h(size)g(and)150
+1313 y(return)28 b(\(for)i(example,)h(a)f Fs(longjmp)d
+Ft(bac)m(k)k(to)f(a)g(main)g(pro)s(cessing)f(lo)s(op\),)h(it)g
+Fk(must)39 b Ft(call)31 b Fs(rl_cleanup_)150 1423 y(after_signal\(\))26
+b Ft(\(describ)s(ed)k(b)s(elo)m(w\),)h(to)g(restore)g(the)g(terminal)g
+(state.)275 1560 y(When)38 b(an)h(application)h(is)f(using)g(the)g
+(callbac)m(k)i(in)m(terface)f(\(see)g(Section)g(2.4.12)h([Alternate)f
+(In-)150 1670 y(terface],)48 b(page)c(46\),)j(Readline)c(installs)h
+(signal)g(handlers)e(only)h(for)f(the)h(duration)g(of)g(the)g(call)h
+(to)150 1779 y Fs(rl_callback_read_char)p Ft(.)c(Applications)33
+b(using)f(the)g(callbac)m(k)j(in)m(terface)e(should)f(b)s(e)f(prepared)
+g(to)150 1889 y(clean)d(up)d(Readline's)j(state)g(if)e(they)h(wish)f
+(to)h(handle)f(the)h(signal)h(b)s(efore)e(the)h(line)g(handler)f
+(completes)150 1999 y(and)k(restores)h(the)f(terminal)h(state.)275
+2136 y(If)k(an)g(application)i(using)f(the)g(callbac)m(k)h(in)m
+(terface)h(wishes)d(to)h(ha)m(v)m(e)h(Readline)g(install)f(its)g
+(signal)150 2246 y(handlers)22 b(at)h(the)g(time)h(the)e(application)j
+(calls)e Fs(rl_callback_handler_instal)o(l)17 b Ft(and)22
+b(remo)m(v)m(e)i(them)150 2355 y(only)f(when)g(a)g(complete)i(line)f
+(of)f(input)f(has)h(b)s(een)g(read,)i(it)e(should)g(set)g(the)h
+Fs(rl_persistent_signal_)150 2465 y(handlers)c Ft(v)-5
+b(ariable)23 b(to)f(a)h(non-zero)f(v)-5 b(alue.)39 b(This)21
+b(allo)m(ws)i(an)f(application)i(to)f(defer)e(all)i(of)f(the)h
+(handling)150 2575 y(of)j(the)h(signals)f(Readline)h(catc)m(hes)h(to)f
+(Readline.)39 b(Applications)27 b(should)f(use)f(this)h(v)-5
+b(ariable)27 b(with)f(care;)150 2684 y(it)d(can)g(result)g(in)f
+(Readline)h(catc)m(hing)i(signals)e(and)f(not)h(acting)h(on)f(them)f
+(\(or)h(allo)m(wing)i(the)e(application)150 2794 y(to)36
+b(react)g(to)g(them\))g(un)m(til)f(the)h(application)g(calls)h
+Fs(rl_callback_read_char)p Ft(.)49 b(This)35 b(can)g(result)g(in)150
+2903 y(an)30 b(application)h(b)s(ecoming)f(less)g(resp)s(onsiv)m(e)f
+(to)i(k)m(eyb)s(oard)e(signals)h(lik)m(e)h(SIGINT.)f(If)f(an)h
+(application)150 3013 y(do)s(es)24 b(not)g(w)m(an)m(t)h(or)g(need)f(to)
+h(p)s(erform)d(an)m(y)j(signal)g(handling,)g(or)f(do)s(es)g(not)h(need)
+f(to)g(do)h(an)m(y)f(pro)s(cessing)150 3123 y(b)s(et)m(w)m(een)31
+b(calls)h(to)f Fs(rl_callback_read_char)p Ft(,)24 b(setting)32
+b(this)e(v)-5 b(ariable)31 b(ma)m(y)g(b)s(e)f(desirable.)275
+3260 y(Readline)f(pro)m(vides)f(t)m(w)m(o)i(v)-5 b(ariables)29
+b(that)h(allo)m(w)g(application)g(writers)e(to)h(con)m(trol)h(whether)e
+(or)h(not)150 3370 y(it)34 b(will)f(catc)m(h)i(certain)f(signals)f(and)
+g(act)h(on)f(them)g(when)f(they)i(are)f(receiv)m(ed.)51
+b(It)33 b(is)g(imp)s(ortan)m(t)g(that)150 3479 y(applications)38
+b(c)m(hange)g(the)e(v)-5 b(alues)37 b(of)g(these)g(v)-5
+b(ariables)37 b(only)g(when)f(calling)i Fs(readline\(\))p
+Ft(,)d(not)i(in)g(a)150 3589 y(signal)31 b(handler,)f(so)g(Readline's)i
+(in)m(ternal)f(signal)g(state)h(is)e(not)h(corrupted.)3371
+3779 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_catch_signals)390
+3889 y Ft(If)28 b(this)h(v)-5 b(ariable)30 b(is)f(non-zero,)h(Readline)
+f(will)g(install)h(signal)f(handlers)f(for)h Fs(SIGINT)p
+Ft(,)f Fs(SIGQUIT)p Ft(,)390 3998 y Fs(SIGTERM)p Ft(,)h
+Fs(SIGHUP)p Ft(,)g Fs(SIGALRM)p Ft(,)f Fs(SIGTSTP)p Ft(,)h
+Fs(SIGTTIN)p Ft(,)f(and)i Fs(SIGTTOU)p Ft(.)390 4136
+y(The)g(default)g(v)-5 b(alue)31 b(of)g Fs(rl_catch_signals)26
+b Ft(is)k(1.)3371 4326 y([V)-8 b(ariable])-3598 b Fh(int)53
+b(rl_catch_sigwinch)390 4436 y Ft(If)37 b(this)h(v)-5
+b(ariable)38 b(is)g(set)g(to)g(a)g(non-zero)g(v)-5 b(alue,)40
+b(Readline)f(will)f(install)g(a)g(signal)g(handler)f(for)390
+4546 y Fs(SIGWINCH)p Ft(.)390 4683 y(The)30 b(default)g(v)-5
+b(alue)31 b(of)g Fs(rl_catch_sigwinch)25 b Ft(is)31 b(1.)3371
+4874 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_persistent_signal_)q
+(hand)q(ler)q(s)390 4983 y Ft(If)31 b(an)h(application)g(using)g(the)f
+(callbac)m(k)j(in)m(terface)f(wishes)e(Readline's)h(signal)h(handlers)d
+(to)j(b)s(e)390 5093 y(installed)21 b(and)f(activ)m(e)j(during)d(the)h
+(set)g(of)f(calls)i(to)g Fs(rl_callback_read_char)14
+b Ft(that)22 b(constitutes)390 5202 y(an)30 b(en)m(tire)i(single)f
+(line,)g(it)f(should)g(set)h(this)f(v)-5 b(ariable)31
+b(to)g(a)g(non-zero)g(v)-5 b(alue.)390 5340 y(The)30
+b(default)g(v)-5 b(alue)31 b(of)g Fs(rl_persistent_signal_han)o(dle)o
+(rs)24 b Ft(is)31 b(0.)p eop end
+%%Page: 52 56
+TeXDict begin 52 55 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(52)3371
+299 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_change_environment)390
+408 y Ft(If)31 b(this)g(v)-5 b(ariable)32 b(is)f(set)h(to)g(a)g
+(non-zero)g(v)-5 b(alue,)32 b(and)f(Readline)h(is)f(handling)g
+Fs(SIGWINCH)p Ft(,)e(Read-)390 518 y(line)h(will)h(mo)s(dify)e(the)h
+Fj(LINES)35 b Ft(and)29 b Fj(COLUMNS)35 b Ft(en)m(vironmen)m(t)30
+b(v)-5 b(ariables)31 b(up)s(on)d(receipt)j(of)g(a)390
+628 y Fs(SIGWINCH)390 766 y Ft(The)f(default)g(v)-5 b(alue)31
+b(of)g Fs(rl_change_environment)24 b Ft(is)31 b(1.)275
+957 y(If)f(an)h(application)h(do)s(es)f(not)g(wish)f(to)i(ha)m(v)m(e)g
+(Readline)g(catc)m(h)g(an)m(y)f(signals,)h(or)f(to)h(handle)e(signals)
+150 1067 y(other)39 b(than)f(those)h(Readline)h(catc)m(hes)g(\()p
+Fs(SIGHUP)p Ft(,)g(for)e(example\),)k(Readline)d(pro)m(vides)g(con)m(v)
+m(enience)150 1177 y(functions)30 b(to)h(do)f(the)h(necessary)g
+(terminal)g(and)e(in)m(ternal)i(state)h(clean)m(up)f(up)s(on)e(receipt)
+i(of)g(a)f(signal.)3350 1368 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_pending_signal)e Fg(\()p Ff(v)m(oid)p
+Fg(\))390 1478 y Ft(Return)27 b(the)g(signal)h(n)m(um)m(b)s(er)e(of)i
+(the)f(most)h(recen)m(t)h(signal)f(Readline)g(receiv)m(ed)g(but)f(has)g
+(not)h(y)m(et)390 1587 y(handled,)i(or)g(0)h(if)f(there)h(is)f(no)g(p)s
+(ending)f(signal.)3350 1779 y([F)-8 b(unction])-3599
+b Fh(void)54 b(rl_cleanup_after_signal)e Fg(\()p Ff(v)m(oid)p
+Fg(\))390 1889 y Ft(This)33 b(function)h(will)g(reset)g(the)g(state)i
+(of)e(the)g(terminal)g(to)h(what)f(it)g(w)m(as)g(b)s(efore)g
+Fs(readline\(\))390 1998 y Ft(w)m(as)c(called,)h(and)d(remo)m(v)m(e)j
+(the)f(Readline)g(signal)g(handlers)e(for)h(all)h(signals,)h(dep)s
+(ending)d(on)h(the)390 2108 y(v)-5 b(alues)31 b(of)f
+Fs(rl_catch_signals)c Ft(and)k Fs(rl_catch_sigwinch)p
+Ft(.)3350 2300 y([F)-8 b(unction])-3599 b Fh(void)54
+b(rl_free_line_state)c Fg(\()p Ff(v)m(oid)p Fg(\))390
+2409 y Ft(This)38 b(will)i(free)f(an)m(y)h(partial)g(state)g(asso)s
+(ciated)h(with)e(the)g(curren)m(t)g(input)f(line)i(\(undo)e(infor-)390
+2519 y(mation,)46 b(an)m(y)d(partial)h(history)e(en)m(try)-8
+b(,)47 b(an)m(y)42 b(partially-en)m(tered)j(k)m(eyb)s(oard)d(macro,)47
+b(and)42 b(an)m(y)390 2628 y(partially-en)m(tered)50
+b(n)m(umeric)d(argumen)m(t\).)94 b(This)47 b(should)g(b)s(e)g(called)i
+(b)s(efore)e Fs(rl_cleanup_)390 2738 y(after_signal\(\))p
+Ft(.)74 b(The)42 b(Readline)h(signal)g(handler)f(for)h
+Fs(SIGINT)e Ft(calls)i(this)g(to)g(ab)s(ort)g(the)390
+2847 y(curren)m(t)30 b(input)g(line.)3350 3039 y([F)-8
+b(unction])-3599 b Fh(void)54 b(rl_reset_after_signal)d
+Fg(\()p Ff(v)m(oid)p Fg(\))390 3149 y Ft(This)28 b(will)g(reinitialize)
+j(the)e(terminal)g(and)f(reinstall)h(an)m(y)g(Readline)g(signal)g
+(handlers,)f(dep)s(end-)390 3258 y(ing)j(on)f(the)g(v)-5
+b(alues)31 b(of)g Fs(rl_catch_signals)26 b Ft(and)j Fs
+(rl_catch_sigwinch)p Ft(.)275 3450 y(If)j(an)g(application)i(w)m(an)m
+(ts)g(to)f(force)g(Readline)h(to)f(handle)g(an)m(y)g(signals)g(that)g
+(ha)m(v)m(e)h(arriv)m(ed)f(while)150 3560 y(it)j(has)g(b)s(een)f
+(executing,)j Fs(rl_check_signals\(\))31 b Ft(will)36
+b(call)h(Readline's)g(in)m(ternal)g(signal)f(handler)f(if)150
+3669 y(there)i(are)g(an)m(y)g(p)s(ending)e(signals.)61
+b(This)36 b(is)g(primarily)h(in)m(tended)f(for)h(those)g(applications)h
+(that)f(use)150 3779 y(a)h(custom)g Fs(rl_getc_function)33
+b Ft(\(see)39 b(Section)g(2.3)g([Readline)f(V)-8 b(ariables],)42
+b(page)c(29\))h(and)e(wish)g(to)150 3888 y(handle)30
+b(signals)h(receiv)m(ed)h(while)e(w)m(aiting)i(for)e(input.)3350
+4080 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_check_signals)c
+Fg(\()p Ff(v)m(oid)p Fg(\))390 4190 y Ft(If)40 b(there)h(are)g(an)m(y)g
+(p)s(ending)e(signals,)44 b(call)e(Readline's)g(in)m(ternal)f(signal)g
+(handling)f(functions)390 4299 y(to)j(pro)s(cess)g(them.)77
+b Fs(rl_pending_signal\(\))38 b Ft(can)43 b(b)s(e)f(used)g(indep)s
+(enden)m(tly)f(to)j(determine)390 4409 y(whether)30 b(or)g(not)h(there)
+f(are)h(an)m(y)g(p)s(ending)e(signals.)275 4600 y(If)38
+b(an)i(application)g(do)s(es)f(not)h(wish)f(Readline)h(to)g(catc)m(h)h
+Fs(SIGWINCH)p Ft(,)e(it)h(ma)m(y)g(call)h Fs(rl_resize_)150
+4710 y(terminal\(\))24 b Ft(or)j Fs(rl_set_screen_size\(\))22
+b Ft(to)28 b(force)g(Readline)f(to)h(up)s(date)f(its)g(idea)h(of)f(the)
+g(terminal)150 4820 y(size)k(when)f(it)h(receiv)m(es)h(a)e
+Fs(SIGWINCH)p Ft(.)3350 5011 y([F)-8 b(unction])-3599
+b Fh(void)54 b(rl_echo_signal_char)d Fg(\()p Ff(in)m(t)33
+b(sig)p Fg(\))390 5121 y Ft(If)41 b(an)g(application)h(wishes)f(to)h
+(install)g(its)f(o)m(wn)g(signal)h(handlers,)h(but)e(still)h(ha)m(v)m
+(e)g(Readline)390 5230 y(displa)m(y)31 b(c)m(haracters)h(that)f
+(generate)h(signals,)f(calling)h(this)e(function)g(with)g
+Fj(sig)39 b Ft(set)31 b(to)g Fs(SIGINT)p Ft(,)390 5340
+y Fs(SIGQUIT)p Ft(,)e(or)h Fs(SIGTSTP)e Ft(will)j(displa)m(y)g(the)f(c)
+m(haracter)i(generating)g(that)f(signal.)p eop end
+%%Page: 53 57
+TeXDict begin 53 56 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(53)3350
+299 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_resize_terminal)c
+Fg(\()p Ff(v)m(oid)p Fg(\))390 408 y Ft(Up)s(date)30
+b(Readline's)h(in)m(ternal)g(screen)g(size)g(b)m(y)f(reading)h(v)-5
+b(alues)31 b(from)f(the)g(k)m(ernel.)3350 592 y([F)-8
+b(unction])-3599 b Fh(void)54 b(rl_set_screen_size)c
+Fg(\()p Ff(in)m(t)34 b(ro)m(ws,)f(in)m(t)g(cols)p Fg(\))390
+702 y Ft(Set)28 b(Readline's)h(idea)f(of)g(the)g(terminal)g(size)h(to)g
+Fj(ro)m(ws)i Ft(ro)m(ws)d(and)f Fj(cols)33 b Ft(columns.)40
+b(If)27 b(either)h Fj(ro)m(ws)390 811 y Ft(or)35 b Fj(columns)k
+Ft(is)c(less)g(than)g(or)g(equal)h(to)g(0,)h(Readline's)f(idea)g(of)f
+(that)h(terminal)f(dimension)g(is)390 921 y(unc)m(hanged.)k(This)27
+b(is)h(in)m(tended)g(to)g(tell)h(Readline)f(the)g(ph)m(ysical)g
+(dimensions)f(of)h(the)g(terminal,)390 1031 y(and)44
+b(is)h(used)f(in)m(ternally)i(to)f(calculate)j(the)d(maxim)m(um)f(n)m
+(um)m(b)s(er)g(of)h(c)m(haracters)h(that)f(ma)m(y)390
+1140 y(app)s(ear)30 b(on)g(a)h(single)g(line)g(and)e(on)i(the)f
+(screen.)275 1324 y(If)i(an)i(application)g(do)s(es)f(not)h(w)m(an)m(t)
+g(to)g(install)g(a)g Fs(SIGWINCH)d Ft(handler,)j(but)e(is)i(still)g(in)
+m(terested)g(in)150 1434 y(the)d(screen)f(dimensions,)g(it)h(ma)m(y)g
+(query)f(Readline's)h(idea)g(of)f(the)h(screen)f(size.)3350
+1618 y([F)-8 b(unction])-3599 b Fh(void)54 b(rl_get_screen_size)c
+Fg(\()p Ff(in)m(t)34 b(*ro)m(ws,)f(in)m(t)g(*cols)p Fg(\))390
+1727 y Ft(Return)c(Readline's)i(idea)g(of)f(the)g(terminal's)h(size)g
+(in)f(the)g(v)-5 b(ariables)31 b(p)s(oin)m(ted)f(to)g(b)m(y)g(the)h
+(argu-)390 1837 y(men)m(ts.)3350 2021 y([F)-8 b(unction])-3599
+b Fh(void)54 b(rl_reset_screen_size)d Fg(\()p Ff(v)m(oid)p
+Fg(\))390 2130 y Ft(Cause)30 b(Readline)h(to)g(reobtain)g(the)g(screen)
+f(size)h(and)f(recalculate)j(its)e(dimensions.)275 2314
+y(The)e(follo)m(wing)j(functions)e(install)h(and)f(remo)m(v)m(e)i
+(Readline's)f(signal)g(handlers.)3350 2498 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_set_signals)d Fg(\()p Ff(v)m(oid)p Fg(\))390
+2607 y Ft(Install)40 b(Readline's)h(signal)f(handler)f(for)h
+Fs(SIGINT)p Ft(,)h Fs(SIGQUIT)p Ft(,)f Fs(SIGTERM)p Ft(,)h
+Fs(SIGHUP)p Ft(,)g Fs(SIGALRM)p Ft(,)390 2717 y Fs(SIGTSTP)p
+Ft(,)35 b Fs(SIGTTIN)p Ft(,)f Fs(SIGTTOU)p Ft(,)h(and)g
+Fs(SIGWINCH)p Ft(,)f(dep)s(ending)g(on)h(the)g(v)-5 b(alues)36
+b(of)f Fs(rl_catch_)390 2827 y(signals)28 b Ft(and)i
+Fs(rl_catch_sigwinch)p Ft(.)3350 3010 y([F)-8 b(unction])-3599
+b Fh(int)53 b(rl_clear_signals)e Fg(\()p Ff(v)m(oid)p
+Fg(\))390 3120 y Ft(Remo)m(v)m(e)32 b(all)f(of)g(the)g(Readline)g
+(signal)g(handlers)e(installed)i(b)m(y)f Fs(rl_set_signals\(\))p
+Ft(.)150 3361 y Fr(2.6)68 b(Custom)45 b(Completers)150
+3520 y Ft(T)m(ypically)-8 b(,)47 b(a)c(program)g(that)g(reads)f
+(commands)h(from)f(the)g(user)g(has)h(a)g(w)m(a)m(y)g(of)g(disam)m
+(biguating)150 3630 y(commands)35 b(and)g(data.)56 b(If)35
+b(y)m(our)h(program)f(is)g(one)h(of)g(these,)h(then)e(it)h(can)g(pro)m
+(vide)f(completion)i(for)150 3739 y(commands,)29 b(data,)i(or)e(b)s
+(oth.)39 b(The)29 b(follo)m(wing)i(sections)f(describ)s(e)e(ho)m(w)i(y)
+m(our)f(program)g(and)f(Readline)150 3849 y(co)s(op)s(erate)j(to)h(pro)
+m(vide)e(this)g(service.)150 4048 y Fi(2.6.1)63 b(Ho)m(w)40
+b(Completing)i(W)-10 b(orks)150 4195 y Ft(In)26 b(order)f(to)i
+(complete)h(some)f(text,)h(the)f(full)f(list)h(of)f(p)s(ossible)g
+(completions)h(m)m(ust)g(b)s(e)e(a)m(v)-5 b(ailable.)42
+b(That)150 4304 y(is,)28 b(it)f(is)g(not)g(p)s(ossible)g(to)g
+(accurately)i(expand)d(a)h(partial)h(w)m(ord)f(without)f(kno)m(wing)i
+(all)f(of)g(the)g(p)s(ossible)150 4414 y(w)m(ords)33
+b(whic)m(h)g(mak)m(e)h(sense)f(in)g(that)g(con)m(text.)51
+b(The)33 b(Readline)h(library)e(pro)m(vides)i(the)f(user)f(in)m
+(terface)150 4523 y(to)d(completion,)h(and)e(t)m(w)m(o)i(of)e(the)h
+(most)f(common)h(completion)h(functions:)39 b(\014lename)29
+b(and)e(username.)150 4633 y(F)-8 b(or)39 b(completing)g(other)f(t)m
+(yp)s(es)g(of)h(text,)i(y)m(ou)d(m)m(ust)g(write)g(y)m(our)g(o)m(wn)g
+(completion)h(function.)64 b(This)150 4743 y(section)32
+b(describ)s(es)d(exactly)j(what)f(suc)m(h)f(functions)g(m)m(ust)g(do,)g
+(and)g(pro)m(vides)g(an)h(example.)275 4877 y(There)e(are)i(three)g(ma)
+5 b(jor)30 b(functions)g(used)g(to)h(p)s(erform)e(completion:)199
+5011 y(1.)61 b(The)43 b(user-in)m(terface)h(function)f
+Fs(rl_complete\(\))p Ft(.)76 b(This)43 b(function)g(is)g(called)i(with)
+e(the)h(same)330 5121 y(argumen)m(ts)36 b(as)g(other)g(bindable)f
+(Readline)h(functions:)51 b Fj(coun)m(t)38 b Ft(and)d
+Fj(in)m(v)m(oking)p 3107 5121 28 4 v 41 w(k)m(ey)p Ft(.)57
+b(It)36 b(isolates)330 5230 y(the)i(w)m(ord)f(to)h(b)s(e)f(completed)i
+(and)d(calls)j Fs(rl_completion_matches\(\))31 b Ft(to)39
+b(generate)g(a)f(list)g(of)330 5340 y(p)s(ossible)31
+b(completions.)44 b(It)31 b(then)g(either)g(lists)h(the)f(p)s(ossible)g
+(completions,)h(inserts)f(the)g(p)s(ossible)p eop end
+%%Page: 54 58
+TeXDict begin 54 57 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(54)330
+299 y(completions,)50 b(or)45 b(actually)i(p)s(erforms)d(the)h
+(completion,)50 b(dep)s(ending)44 b(on)h(whic)m(h)g(b)s(eha)m(vior)g
+(is)330 408 y(desired.)199 552 y(2.)61 b(The)33 b(in)m(ternal)h
+(function)g Fs(rl_completion_matches\(\))27 b Ft(uses)33
+b(an)g(application-supplied)h Fj(gener-)330 662 y(ator)44
+b Ft(function)37 b(to)h(generate)g(the)f(list)h(of)f(p)s(ossible)f
+(matc)m(hes,)k(and)d(then)f(returns)g(the)h(arra)m(y)h(of)330
+771 y(these)h(matc)m(hes.)68 b(The)39 b(caller)h(should)e(place)i(the)f
+(address)f(of)h(its)g(generator)i(function)d(in)h Fs(rl_)330
+881 y(completion_entry_functio)o(n)p Ft(.)199 1024 y(3.)61
+b(The)22 b(generator)i(function)f(is)g(called)h(rep)s(eatedly)f(from)g
+Fs(rl_completion_matches\(\))o Ft(,)c(returning)330 1134
+y(a)33 b(string)g(eac)m(h)h(time.)48 b(The)32 b(argumen)m(ts)h(to)h
+(the)f(generator)h(function)e(are)h Fj(text)j Ft(and)c
+Fj(state)p Ft(.)49 b Fj(text)330 1244 y Ft(is)32 b(the)g(partial)h(w)m
+(ord)f(to)h(b)s(e)e(completed.)47 b Fj(state)38 b Ft(is)32
+b(zero)h(the)f(\014rst)g(time)g(the)h(function)e(is)h(called,)330
+1353 y(allo)m(wing)46 b(the)e(generator)h(to)f(p)s(erform)f(an)m(y)h
+(necessary)g(initialization,)51 b(and)43 b(a)h(p)s(ositiv)m(e)h(non-)
+330 1463 y(zero)30 b(in)m(teger)h(for)d(eac)m(h)j(subsequen)m(t)d
+(call.)42 b(The)29 b(generator)h(function)f(returns)f
+Fs(\(char)h(*\)NULL)e Ft(to)330 1572 y(inform)37 b Fs
+(rl_completion_matches\(\))32 b Ft(that)39 b(there)f(are)g(no)g(more)g
+(p)s(ossibilities)h(left.)65 b(Usually)330 1682 y(the)39
+b(generator)h(function)e(computes)h(the)g(list)g(of)g(p)s(ossible)f
+(completions)i(when)e Fj(state)45 b Ft(is)39 b(zero,)330
+1792 y(and)25 b(returns)f(them)i(one)f(at)i(a)f(time)g(on)f(subsequen)m
+(t)g(calls.)40 b(Eac)m(h)26 b(string)g(the)g(generator)g(function)330
+1901 y(returns)31 b(as)h(a)g(matc)m(h)h(m)m(ust)f(b)s(e)f(allo)s(cated)
+j(with)d Fs(malloc\(\))p Ft(;)g(Readline)h(frees)g(the)g(strings)g
+(when)330 2011 y(it)i(has)g(\014nished)e(with)i(them.)51
+b(Suc)m(h)33 b(a)h(generator)h(function)f(is)g(referred)f(to)h(as)h(an)
+e Fj(application-)330 2120 y(sp)s(eci\014c)d(completion)i(function)p
+Ft(.)3350 2341 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_complete)c
+Fg(\()p Ff(in)m(t)34 b(ignore,)e(in)m(t)i(in)m(v)m(oking)p
+2020 2341 30 5 v 43 w(k)m(ey)p Fg(\))390 2451 y Ft(Complete)d(the)g(w)m
+(ord)g(at)g(or)g(b)s(efore)f(p)s(oin)m(t.)41 b(Y)-8 b(ou)32
+b(ha)m(v)m(e)g(supplied)d(the)i(function)f(that)h(do)s(es)g(the)390
+2560 y(initial)42 b(simple)f(matc)m(hing)i(selection)f(algorithm)h
+(\(see)f Fs(rl_completion_matches\(\))o Ft(\).)67 b(The)390
+2670 y(default)31 b(is)f(to)h(do)f(\014lename)h(completion.)3371
+2890 y([V)-8 b(ariable])-3598 b Fh(rl_compentry_func_t)58
+b(*)53 b(rl_completion_entry_fun)q(cti)q(on)390 3000
+y Ft(This)39 b(is)h(a)g(p)s(oin)m(ter)g(to)h(the)f(generator)h
+(function)f(for)f Fs(rl_completion_matches\(\))p Ft(.)63
+b(If)40 b(the)390 3110 y(v)-5 b(alue)24 b(of)g Fs
+(rl_completion_entry_funct)o(ion)17 b Ft(is)24 b Fs(NULL)f
+Ft(then)g(the)h(default)g(\014lename)g(generator)390
+3219 y(function,)49 b Fs(rl_filename_completion_)o(fun)o(ctio)o(n\(\))p
+Ft(,)42 b(is)j(used.)84 b(An)44 b Fj(application-sp)s(eci\014c)390
+3329 y(completion)22 b(function)f Ft(is)g(a)h(function)e(whose)h
+(address)f(is)h(assigned)h(to)f Fs(rl_completion_entry_)390
+3438 y(function)28 b Ft(and)i(whose)g(return)f(v)-5 b(alues)31
+b(are)g(used)e(to)j(generate)f(p)s(ossible)f(completions.)150
+3656 y Fi(2.6.2)63 b(Completion)41 b(F)-10 b(unctions)150
+3803 y Ft(Here)31 b(is)f(the)h(complete)h(list)f(of)f(callable)j
+(completion)e(functions)f(presen)m(t)h(in)f(Readline.)3350
+4023 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_complete_internal)f
+Fg(\()p Ff(in)m(t)33 b(what)p 1861 4023 V 44 w(to)p 1994
+4023 V 43 w(do)p Fg(\))390 4133 y Ft(Complete)k(the)g(w)m(ord)f(at)i
+(or)e(b)s(efore)g(p)s(oin)m(t.)60 b Fj(what)p 2208 4133
+28 4 v 40 w(to)p 2328 4133 V 41 w(do)41 b Ft(sa)m(ys)c(what)f(to)i(do)e
+(with)g(the)h(com-)390 4243 y(pletion.)44 b(A)31 b(v)-5
+b(alue)32 b(of)f(`)p Fs(?)p Ft(')g(means)h(list)f(the)h(p)s(ossible)e
+(completions.)45 b(`)p Fs(TAB)p Ft(')31 b(means)g(do)g(standard)390
+4352 y(completion.)44 b(`)p Fs(*)p Ft(')32 b(means)f(insert)g(all)h(of)
+f(the)g(p)s(ossible)g(completions.)44 b(`)p Fs(!)p Ft(')32
+b(means)f(to)h(displa)m(y)f(all)390 4462 y(of)k(the)f(p)s(ossible)g
+(completions,)j(if)d(there)h(is)f(more)g(than)h(one,)g(as)g(w)m(ell)g
+(as)g(p)s(erforming)e(partial)390 4571 y(completion.)41
+b(`)p Fs(@)p Ft(')27 b(is)h(similar)f(to)h(`)p Fs(!)p
+Ft(',)h(but)d(p)s(ossible)h(completions)i(are)e(not)h(listed)g(if)f
+(the)g(p)s(ossible)390 4681 y(completions)32 b(share)e(a)g(common)h
+(pre\014x.)3350 4902 y([F)-8 b(unction])-3599 b Fh(int)53
+b(rl_complete)c Fg(\()p Ff(in)m(t)34 b(ignore,)e(in)m(t)i(in)m(v)m
+(oking)p 2020 4902 30 5 v 43 w(k)m(ey)p Fg(\))390 5011
+y Ft(Complete)42 b(the)f(w)m(ord)g(at)h(or)f(b)s(efore)g(p)s(oin)m(t.)
+73 b(Y)-8 b(ou)41 b(ha)m(v)m(e)i(supplied)c(the)j(function)f(that)g(do)
+s(es)390 5121 y(the)33 b(initial)h(simple)f(matc)m(hing)h(selection)h
+(algorithm)f(\(see)g Fs(rl_completion_matches\(\))27
+b Ft(and)390 5230 y Fs(rl_completion_entry_func)o(tion)o
+Ft(\).)52 b(The)35 b(default)h(is)g(to)h(do)e(\014lename)h(completion.)
+59 b(This)390 5340 y(calls)32 b Fs(rl_complete_internal\(\))24
+b Ft(with)30 b(an)g(argumen)m(t)h(dep)s(ending)e(on)h
+Fj(in)m(v)m(oking)p 3314 5340 28 4 v 41 w(k)m(ey)p Ft(.)p
+eop end
+%%Page: 55 59
+TeXDict begin 55 58 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(55)3350
+299 y([F)-8 b(unction])-3599 b Fh(int)53 b(rl_possible_completio)q(ns)f
+Fg(\()p Ff(in)m(t)33 b(coun)m(t,)h(in)m(t)f(in)m(v)m(oking)p
+2622 299 30 5 v 43 w(k)m(ey)p Fg(\))390 408 y Ft(List)41
+b(the)f(p)s(ossible)g(completions.)73 b(See)40 b(description)h(of)g
+Fs(rl_complete)27 b(\(\))p Ft(.)70 b(This)40 b(calls)i
+Fs(rl_)390 518 y(complete_internal\(\))25 b Ft(with)30
+b(an)g(argumen)m(t)h(of)g(`)p Fs(?)p Ft('.)3350 718 y([F)-8
+b(unction])-3599 b Fh(int)53 b(rl_insert_completions)f
+Fg(\()p Ff(in)m(t)34 b(coun)m(t,)f(in)m(t)g(in)m(v)m(oking)p
+2517 718 V 44 w(k)m(ey)p Fg(\))390 828 y Ft(Insert)g(the)h(list)g(of)g
+(p)s(ossible)f(completions)i(in)m(to)f(the)g(line,)h(deleting)g(the)f
+(partially-completed)390 937 y(w)m(ord.)44 b(See)32 b(description)g(of)
+g Fs(rl_complete\(\))p Ft(.)41 b(This)31 b(calls)i Fs
+(rl_complete_internal\(\))25 b Ft(with)390 1047 y(an)30
+b(argumen)m(t)h(of)g(`)p Fs(*)p Ft('.)3350 1247 y([F)-8
+b(unction])-3599 b Fh(int)53 b(rl_completion_mode)e Fg(\()p
+Ff(rl)p 1455 1247 V 44 w(command)p 1919 1247 V 44 w(func)p
+2147 1247 V 46 w(t)33 b(*cfunc)p Fg(\))390 1356 y Ft(Returns)40
+b(the)i(appropriate)g(v)-5 b(alue)41 b(to)i(pass)e(to)h
+Fs(rl_complete_internal\(\))35 b Ft(dep)s(ending)40 b(on)390
+1466 y(whether)g Fj(cfunc)46 b Ft(w)m(as)41 b(called)h(t)m(wice)g(in)f
+(succession)g(and)f(the)h(v)-5 b(alues)41 b(of)g(the)g
+Fs(show-all-if-)390 1575 y(ambiguous)25 b Ft(and)i Fs
+(show-all-if-unmodified)21 b Ft(v)-5 b(ariables.)41 b(Application-sp)s
+(eci\014c)29 b(completion)390 1685 y(functions)h(ma)m(y)h(use)f(this)g
+(function)g(to)h(presen)m(t)g(the)f(same)h(in)m(terface)h(as)f
+Fs(rl_complete\(\))p Ft(.)3350 1885 y([F)-8 b(unction])-3599
+b Fh(char)54 b(**)e(rl_completion_matches)g Fg(\()p Ff(const)34
+b(c)m(har)g(*text,)565 1995 y(rl)p 639 1995 V 44 w(comp)s(en)m(try)p
+1145 1995 V 44 w(func)p 1373 1995 V 45 w(t)f(*en)m(try)p
+1767 1995 V 44 w(func)p Fg(\))390 2104 y Ft(Returns)k(an)h(arra)m(y)g
+(of)g(strings)g(whic)m(h)f(is)h(a)g(list)h(of)f(completions)h(for)e
+Fj(text)p Ft(.)64 b(If)38 b(there)g(are)g(no)390 2214
+y(completions,)f(returns)c Fs(NULL)p Ft(.)52 b(The)34
+b(\014rst)f(en)m(try)i(in)f(the)h(returned)e(arra)m(y)i(is)g(the)f
+(substitution)390 2323 y(for)26 b Fj(text)p Ft(.)40 b(The)26
+b(remaining)h(en)m(tries)g(are)g(the)f(p)s(ossible)g(completions.)40
+b(The)26 b(arra)m(y)h(is)f(terminated)390 2433 y(with)k(a)h
+Fs(NULL)e Ft(p)s(oin)m(ter.)390 2575 y Fj(en)m(try)p
+603 2575 28 4 v 40 w(func)44 b Ft(is)c(a)g(function)f(of)h(t)m(w)m(o)g
+(args,)j(and)38 b(returns)h(a)g Fs(char)30 b(*)p Ft(.)67
+b(The)39 b(\014rst)g(argumen)m(t)h(is)390 2685 y Fj(text)p
+Ft(.)66 b(The)39 b(second)f(is)h(a)g(state)h(argumen)m(t;)j(it)c(is)g
+(zero)g(on)g(the)g(\014rst)f(call,)k(and)c(non-zero)h(on)390
+2794 y(subsequen)m(t)33 b(calls.)52 b Fj(en)m(try)p 1320
+2794 V 41 w(func)38 b Ft(returns)33 b(a)h Fs(NULL)f Ft(p)s(oin)m(ter)g
+(to)i(the)f(caller)h(when)e(there)h(are)g(no)390 2904
+y(more)d(matc)m(hes.)3350 3104 y([F)-8 b(unction])-3599
+b Fh(char)54 b(*)e(rl_filename_completion)q(_fu)q(nct)q(ion)g
+Fg(\()p Ff(const)34 b(c)m(har)g(*text,)e(in)m(t)565 3213
+y(state)p Fg(\))390 3323 y Ft(A)26 b(generator)h(function)e(for)g
+(\014lename)h(completion)h(in)e(the)h(general)h(case.)40
+b Fj(text)28 b Ft(is)e(a)g(partial)h(\014le-)390 3433
+y(name.)38 b(The)21 b(Bash)g(source)h(is)g(a)f(useful)g(reference)h
+(for)f(writing)h(application-sp)s(eci\014c)h(completion)390
+3542 y(functions)30 b(\(the)h(Bash)f(completion)i(functions)e(call)i
+(this)e(and)g(other)g(Readline)h(functions\).)3350 3742
+y([F)-8 b(unction])-3599 b Fh(char)54 b(*)e(rl_username_completion)q
+(_fu)q(nct)q(ion)g Fg(\()p Ff(const)34 b(c)m(har)g(*text,)e(in)m(t)565
+3852 y(state)p Fg(\))390 3961 y Ft(A)d(completion)g(generator)h(for)e
+(usernames.)40 b Fj(text)31 b Ft(con)m(tains)f(a)f(partial)g(username)f
+(preceded)g(b)m(y)390 4071 y(a)j(random)f(c)m(haracter)i(\(usually)e(`)
+p Fs(~)p Ft('\).)42 b(As)31 b(with)f(all)h(completion)h(generators,)g
+Fj(state)37 b Ft(is)31 b(zero)g(on)390 4180 y(the)g(\014rst)e(call)j
+(and)e(non-zero)h(for)f(subsequen)m(t)f(calls.)150 4388
+y Fi(2.6.3)63 b(Completion)41 b(V)-10 b(ariables)3371
+4592 y Ft([V)i(ariable])-3598 b Fh(rl_compentry_func_t)58
+b(*)53 b(rl_completion_entry_fun)q(cti)q(on)390 4702
+y Ft(A)34 b(p)s(oin)m(ter)f(to)h(the)g(generator)h(function)e(for)g
+Fs(rl_completion_matches\(\))p Ft(.)44 b Fs(NULL)32 b
+Ft(means)h(to)390 4811 y(use)d Fs(rl_filename_completion_fu)o(nct)o
+(ion\()o(\))p Ft(,)25 b(the)30 b(default)h(\014lename)f(completer.)3371
+5011 y([V)-8 b(ariable])-3598 b Fh(rl_completion_func_t)58
+b(*)53 b(rl_attempted_completio)q(n_f)q(unct)q(ion)390
+5121 y Ft(A)35 b(p)s(oin)m(ter)g(to)g(an)g(alternativ)m(e)i(function)d
+(to)i(create)g(matc)m(hes.)55 b(The)34 b(function)h(is)f(called)i(with)
+390 5230 y Fj(text)p Ft(,)26 b Fj(start)p Ft(,)f(and)d
+Fj(end)p Ft(.)38 b Fj(start)25 b Ft(and)e Fj(end)j Ft(are)d(indices)g
+(in)g Fs(rl_line_buffer)c Ft(de\014ning)j(the)h(b)s(ound-)390
+5340 y(aries)j(of)h Fj(text)p Ft(,)h(whic)m(h)d(is)h(a)h(c)m(haracter)g
+(string.)39 b(If)26 b(this)g(function)f(exists)i(and)e(returns)g
+Fs(NULL)p Ft(,)h(or)g(if)p eop end
+%%Page: 56 60
+TeXDict begin 56 59 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(56)390
+299 y(this)22 b(v)-5 b(ariable)22 b(is)g(set)h(to)f Fs(NULL)p
+Ft(,)h(then)f Fs(rl_complete\(\))c Ft(will)k(call)h(the)f(v)-5
+b(alue)23 b(of)f Fs(rl_completion_)390 408 y(entry_function)i
+Ft(to)30 b(generate)f(matc)m(hes,)i(otherwise)d(the)h(arra)m(y)g(of)f
+(strings)h(returned)e(will)i(b)s(e)390 518 y(used.)37
+b(If)22 b(this)g(function)g(sets)h(the)g Fs(rl_attempted_completion)o
+(_ove)o(r)16 b Ft(v)-5 b(ariable)24 b(to)f(a)f(non-zero)390
+628 y(v)-5 b(alue,)35 b(Readline)g(will)f(not)g(p)s(erform)f(its)h
+(default)g(completion)h(ev)m(en)g(if)f(this)g(function)f(returns)390
+737 y(no)d(matc)m(hes.)3371 913 y([V)-8 b(ariable])-3598
+b Fh(rl_quote_func_t)57 b(*)52 b(rl_filename_quoting_)q(func)q(tio)q(n)
+390 1022 y Ft(A)33 b(p)s(oin)m(ter)f(to)h(a)g(function)g(that)g(will)g
+(quote)g(a)g(\014lename)f(in)h(an)f(application-sp)s(eci\014c)i
+(fashion.)390 1132 y(This)k(is)i(called)g(if)f(\014lename)h(completion)
+g(is)f(b)s(eing)g(attempted)i(and)d(one)i(of)f(the)g(c)m(haracters)390
+1241 y(in)33 b Fs(rl_filename_quote_charac)o(ter)o(s)27
+b Ft(app)s(ears)33 b(in)g(a)g(completed)h(\014lename.)50
+b(The)32 b(function)390 1351 y(is)37 b(called)h(with)e
+Fj(text)p Ft(,)k Fj(matc)m(h)p 1438 1351 28 4 v 41 w(t)m(yp)s(e)p
+Ft(,)f(and)d Fj(quote)p 2119 1351 V 41 w(p)s(oin)m(ter)p
+Ft(.)60 b(The)36 b Fj(text)k Ft(is)d(the)g(\014lename)g(to)h(b)s(e)390
+1461 y(quoted.)76 b(The)42 b Fj(matc)m(h)p 1210 1461
+V 41 w(t)m(yp)s(e)48 b Ft(is)42 b(either)h Fs(SINGLE_MATCH)p
+Ft(,)f(if)g(there)g(is)h(only)f(one)h(completion)390
+1570 y(matc)m(h,)33 b(or)e Fs(MULT_MATCH)p Ft(.)41 b(Some)31
+b(functions)g(use)g(this)h(to)g(decide)f(whether)g(or)h(not)f(to)h
+(insert)g(a)390 1680 y(closing)22 b(quote)f(c)m(haracter.)40
+b(The)20 b Fj(quote)p 1751 1680 V 41 w(p)s(oin)m(ter)27
+b Ft(is)21 b(a)g(p)s(oin)m(ter)g(to)g(an)m(y)h(op)s(ening)e(quote)h(c)m
+(haracter)390 1789 y(the)31 b(user)e(t)m(yp)s(ed.)41
+b(Some)30 b(functions)g(c)m(ho)s(ose)h(to)g(reset)g(this)g(c)m
+(haracter.)3371 1965 y([V)-8 b(ariable])-3598 b Fh(rl_dequote_func_t)57
+b(*)c(rl_filename_dequoting_)q(fun)q(cti)q(on)390 2074
+y Ft(A)30 b(p)s(oin)m(ter)f(to)i(a)f(function)f(that)h(will)g(remo)m(v)
+m(e)h(application-sp)s(eci\014c)g(quoting)f(c)m(haracters)h(from)390
+2184 y(a)i(\014lename)g(b)s(efore)f(completion)h(is)g(attempted,)h(so)f
+(those)g(c)m(haracters)h(do)e(not)h(in)m(terfere)g(with)390
+2293 y(matc)m(hing)39 b(the)f(text)i(against)f(names)f(in)g(the)g
+(\014lesystem.)64 b(It)38 b(is)g(called)i(with)d Fj(text)p
+Ft(,)42 b(the)c(text)390 2403 y(of)k(the)h(w)m(ord)f(to)g(b)s(e)g
+(dequoted,)j(and)d Fj(quote)p 2014 2403 V 41 w(c)m(har)p
+Ft(,)j(whic)m(h)d(is)h(the)f(quoting)h(c)m(haracter)g(that)390
+2513 y(delimits)33 b(the)f(\014lename)g(\(usually)h(`)p
+Fs(')p Ft(')f(or)g(`)p Fs(")p Ft('\).)46 b(If)32 b Fj(quote)p
+2368 2513 V 41 w(c)m(har)39 b Ft(is)32 b(zero,)i(the)e(\014lename)g(w)m
+(as)h(not)390 2622 y(in)d(an)g(em)m(b)s(edded)g(string.)3371
+2798 y([V)-8 b(ariable])-3598 b Fh(rl_linebuf_func_t)57
+b(*)c(rl_char_is_quoted_p)390 2907 y Ft(A)37 b(p)s(oin)m(ter)g(to)g(a)g
+(function)g(to)g(call)h(that)g(determines)f(whether)f(or)h(not)g(a)g
+(sp)s(eci\014c)f(c)m(haracter)390 3017 y(in)e(the)h(line)f(bu\013er)g
+(is)g(quoted,)i(according)g(to)f(whatev)m(er)g(quoting)g(mec)m(hanism)g
+(the)f(program)390 3126 y(calling)26 b(Readline)g(uses.)38
+b(The)24 b(function)h(is)g(called)h(with)e(t)m(w)m(o)i(argumen)m(ts:)39
+b Fj(text)p Ft(,)27 b(the)e(text)h(of)f(the)390 3236
+y(line,)31 b(and)g Fj(index)p Ft(,)f(the)h(index)f(of)h(the)g(c)m
+(haracter)i(in)d(the)h(line.)42 b(It)31 b(is)g(used)f(to)h(decide)g
+(whether)g(a)390 3345 y(c)m(haracter)h(found)d(in)g Fs
+(rl_completer_word_break_ch)o(ara)o(cter)o(s)24 b Ft(should)29
+b(b)s(e)h(used)f(to)i(break)390 3455 y(w)m(ords)f(for)g(the)h
+(completer.)3371 3630 y([V)-8 b(ariable])-3598 b Fh
+(rl_compignore_func_t)58 b(*)53 b(rl_ignore_some_complet)q(ion)q(s_fu)q
+(nct)q(ion)390 3740 y Ft(This)37 b(function,)i(if)f(de\014ned,)g(is)g
+(called)h(b)m(y)e(the)h(completer)h(when)e(real)h(\014lename)g
+(completion)390 3850 y(is)c(done,)h(after)f(all)h(the)g(matc)m(hing)g
+(names)e(ha)m(v)m(e)j(b)s(een)d(generated.)53 b(It)34
+b(is)g(passed)f(a)i Fs(NULL)d Ft(ter-)390 3959 y(minated)f(arra)m(y)g
+(of)g(matc)m(hes.)43 b(The)31 b(\014rst)f(elemen)m(t)i(\()p
+Fs(matches[0])p Ft(\))d(is)h(the)h(maximal)h(substring)390
+4069 y(common)d(to)g(all)h(matc)m(hes.)41 b(This)28 b(function)h(can)g
+(re-arrange)g(the)g(list)h(of)f(matc)m(hes)g(as)g(required,)390
+4178 y(but)h(eac)m(h)h(elemen)m(t)h(deleted)f(from)f(the)h(arra)m(y)g
+(m)m(ust)f(b)s(e)g(freed.)3371 4354 y([V)-8 b(ariable])-3598
+b Fh(rl_icppfunc_t)56 b(*)d(rl_directory_completio)q(n_ho)q(ok)390
+4463 y Ft(This)44 b(function,)49 b(if)d(de\014ned,)i(is)d(allo)m(w)m
+(ed)i(to)f(mo)s(dify)e(the)i(directory)g(p)s(ortion)e(of)i(\014lenames)
+390 4573 y(Readline)35 b(completes.)56 b(It)35 b(could)g(b)s(e)f(used)g
+(to)i(expand)e(sym)m(b)s(olic)h(links)g(or)g(shell)g(v)-5
+b(ariables)35 b(in)390 4682 y(pathnames.)70 b(It)41 b(is)f(called)h
+(with)f(the)h(address)e(of)i(a)g(string)f(\(the)h(curren)m(t)f
+(directory)h(name\))390 4792 y(as)d(an)f(argumen)m(t,)j(and)d(ma)m(y)i
+(mo)s(dify)d(that)j(string.)62 b(If)37 b(the)h(string)f(is)h(replaced)g
+(with)f(a)h(new)390 4902 y(string,)j(the)d(old)h(v)-5
+b(alue)39 b(should)e(b)s(e)h(freed.)64 b(An)m(y)39 b(mo)s(di\014ed)e
+(directory)i(name)f(should)g(ha)m(v)m(e)i(a)390 5011
+y(trailing)c(slash.)54 b(The)35 b(mo)s(di\014ed)e(v)-5
+b(alue)36 b(will)f(b)s(e)f(used)g(as)i(part)e(of)h(the)h(completion,)h
+(replacing)390 5121 y(the)32 b(directory)g(p)s(ortion)f(of)h(the)g
+(pathname)f(the)h(user)f(t)m(yp)s(ed.)44 b(A)m(t)33 b(the)f(least,)h
+(ev)m(en)g(if)e(no)h(other)390 5230 y(expansion)j(is)h(p)s(erformed,)f
+(this)h(function)f(should)g(remo)m(v)m(e)i(an)m(y)f(quote)g(c)m
+(haracters)h(from)e(the)390 5340 y(directory)c(name,)g(b)s(ecause)f
+(its)h(result)f(will)h(b)s(e)e(passed)h(directly)h(to)g
+Fs(opendir\(\))p Ft(.)p eop end
+%%Page: 57 61
+TeXDict begin 57 60 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(57)390
+299 y(The)25 b(directory)i(completion)g(ho)s(ok)e(returns)g(an)h(in)m
+(teger)h(that)f(should)f(b)s(e)g(non-zero)i(if)e(the)i(func-)390
+408 y(tion)35 b(mo)s(di\014es)e(its)i(directory)f(argumen)m(t.)53
+b(The)33 b(function)h(should)f(not)i(mo)s(dify)e(the)h(directory)390
+518 y(argumen)m(t)d(if)f(it)h(returns)e(0.)3371 720 y([V)-8
+b(ariable])-3598 b Fh(rl_icppfunc_t)56 b(*)d(rl_directory_rewrite_h)q
+(ook;)390 830 y Ft(If)24 b(non-zero,)i(this)e(is)h(the)f(address)g(of)g
+(a)h(function)f(to)h(call)g(when)f(completing)h(a)g(directory)g(name.)
+390 939 y(This)h(function)g(tak)m(es)i(the)f(address)f(of)h(the)f
+(directory)h(name)g(to)g(b)s(e)f(mo)s(di\014ed)g(as)h(an)f(argumen)m
+(t.)390 1049 y(Unlik)m(e)40 b Fs(rl_directory_completion_h)o(ook)p
+Ft(,)35 b(it)40 b(only)f(mo)s(di\014es)f(the)i(directory)f(name)h(used)
+390 1159 y(in)35 b Fs(opendir)p Ft(,)g(not)g(what)h(is)f(displa)m(y)m
+(ed)h(when)e(the)i(p)s(ossible)f(completions)h(are)g(prin)m(ted)f(or)g
+(in-)390 1268 y(serted.)k(It)27 b(is)f(called)h(b)s(efore)f(rl)p
+1463 1268 28 4 v 40 w(directory)p 1859 1268 V 41 w(completion)p
+2333 1268 V 41 w(ho)s(ok.)39 b(A)m(t)27 b(the)g(least,)h(ev)m(en)f(if)g
+(no)f(other)390 1378 y(expansion)35 b(is)h(p)s(erformed,)f(this)h
+(function)f(should)g(remo)m(v)m(e)i(an)m(y)f(quote)g(c)m(haracters)h
+(from)e(the)390 1487 y(directory)c(name,)g(b)s(ecause)f(its)h(result)f
+(will)h(b)s(e)e(passed)h(directly)h(to)g Fs(opendir\(\))p
+Ft(.)390 1631 y(The)37 b(directory)i(rewrite)f(ho)s(ok)f(returns)g(an)h
+(in)m(teger)h(that)f(should)f(b)s(e)g(non-zero)i(if)e(the)i(func-)390
+1740 y(tion)c(mo)s(di\014es)e(its)i(directory)f(argumen)m(t.)53
+b(The)33 b(function)h(should)f(not)i(mo)s(dify)e(the)h(directory)390
+1850 y(argumen)m(t)d(if)f(it)h(returns)e(0.)3371 2052
+y([V)-8 b(ariable])-3598 b Fh(rl_icppfunc_t)56 b(*)d
+(rl_filename_stat_hook)390 2162 y Ft(If)30 b(non-zero,)h(this)f(is)g
+(the)g(address)f(of)h(a)h(function)f(for)f(the)i(completer)g(to)g(call)
+g(b)s(efore)f(deciding)390 2271 y(whic)m(h)g(c)m(haracter)i(to)e(app)s
+(end)f(to)i(a)f(completed)h(name.)41 b(This)29 b(function)h(mo)s
+(di\014es)f(its)i(\014lename)390 2381 y(name)36 b(argumen)m(t,)h(and)e
+(the)h(mo)s(di\014ed)e(v)-5 b(alue)36 b(is)g(passed)f(to)h
+Fs(stat\(\))e Ft(to)i(determine)g(the)g(\014le's)390
+2491 y(t)m(yp)s(e)41 b(and)f(c)m(haracteristics.)73 b(This)40
+b(function)g(do)s(es)g(not)h(need)f(to)h(remo)m(v)m(e)h(quote)f(c)m
+(haracters)390 2600 y(from)30 b(the)g(\014lename.)390
+2744 y(The)40 b(stat)h(ho)s(ok)f(returns)f(an)h(in)m(teger)h(that)g
+(should)e(b)s(e)h(non-zero)g(if)h(the)f(function)g(mo)s(di\014es)390
+2853 y(its)32 b(directory)f(argumen)m(t.)44 b(The)31
+b(function)f(should)h(not)g(mo)s(dify)g(the)g(directory)h(argumen)m(t)f
+(if)g(it)390 2963 y(returns)e(0.)3371 3165 y([V)-8 b(ariable])-3598
+b Fh(rl_dequote_func_t)57 b(*)c(rl_filename_rewrite_ho)q(ok)390
+3275 y Ft(If)39 b(non-zero,)k(this)d(is)f(the)h(address)f(of)h(a)g
+(function)g(called)g(when)f(reading)h(directory)g(en)m(tries)390
+3384 y(from)f(the)h(\014lesystem)g(for)g(completion)h(and)e(comparing)i
+(them)e(to)i(the)f(partial)h(w)m(ord)e(to)i(b)s(e)390
+3494 y(completed.)g(The)26 b(function)h(should)f(p)s(erform)f(an)m(y)j
+(necessary)f(application)i(or)e(system-sp)s(eci\014c)390
+3603 y(con)m(v)m(ersion)35 b(on)g(the)f(\014lename,)i(suc)m(h)d(as)i
+(con)m(v)m(erting)h(b)s(et)m(w)m(een)f(c)m(haracter)g(sets)g(or)f(con)m
+(v)m(erting)390 3713 y(from)f(a)g(\014lesystem)h(format)g(to)g(a)f(c)m
+(haracter)i(input)e(format.)50 b(The)32 b(function)h(tak)m(es)i(t)m(w)m
+(o)g(argu-)390 3823 y(men)m(ts:)49 b Fj(fname)p Ft(,)36
+b(the)e(\014lename)h(to)g(b)s(e)f(con)m(v)m(erted,)j(and)d
+Fj(fnlen)p Ft(,)h(its)g(length)g(in)f(b)m(ytes.)53 b(It)35
+b(m)m(ust)390 3932 y(either)24 b(return)e(its)h(\014rst)g(argumen)m(t)g
+(\(if)h(no)f(con)m(v)m(ersion)h(tak)m(es)h(place\))g(or)e(the)g(con)m
+(v)m(erted)i(\014lename)390 4042 y(in)j(newly-allo)s(cated)i(memory)-8
+b(.)41 b(The)27 b(con)m(v)m(erted)j(form)e(is)g(used)g(to)h(compare)f
+(against)i(the)e(w)m(ord)390 4151 y(to)g(b)s(e)e(completed,)j(and,)f
+(if)f(it)h(matc)m(hes,)h(is)e(added)f(to)i(the)g(list)f(of)h(matc)m
+(hes.)41 b(Readline)27 b(will)h(free)390 4261 y(the)j(allo)s(cated)h
+(string.)3371 4463 y([V)-8 b(ariable])-3598 b Fh(rl_compdisp_func_t)58
+b(*)52 b(rl_completion_display)q(_ma)q(tch)q(es_h)q(ook)390
+4573 y Ft(If)22 b(non-zero,)i(then)e(this)g(is)g(the)g(address)f(of)h
+(a)g(function)g(to)h(call)g(when)e(completing)i(a)g(w)m(ord)e(w)m(ould)
+390 4682 y(normally)h(displa)m(y)h(the)f(list)h(of)f(p)s(ossible)g
+(matc)m(hes.)39 b(This)21 b(function)h(is)g(called)i(in)e(lieu)g(of)g
+(Readline)390 4792 y(displa)m(ying)37 b(the)h(list.)61
+b(It)37 b(tak)m(es)i(three)e(argumen)m(ts:)54 b(\()p
+Fs(char)30 b(**)p Fj(matc)m(hes)p Ft(,)39 b Fs(int)d
+Fj(n)m(um)p 3370 4792 V 40 w(matc)m(hes)p Ft(,)390 4902
+y Fs(int)26 b Fj(max)p 735 4902 V 40 w(length)p Ft(\))h(where)f
+Fj(matc)m(hes)31 b Ft(is)c(the)f(arra)m(y)h(of)g(matc)m(hing)g
+(strings,)h Fj(n)m(um)p 3152 4902 V 39 w(matc)m(hes)j
+Ft(is)c(the)390 5011 y(n)m(um)m(b)s(er)35 b(of)i(strings)f(in)g(that)h
+(arra)m(y)-8 b(,)39 b(and)d Fj(max)p 2073 5011 V 40 w(length)h
+Ft(is)g(the)f(length)h(of)g(the)f(longest)i(string)390
+5121 y(in)f(that)i(arra)m(y)-8 b(.)63 b(Readline)39 b(pro)m(vides)e(a)h
+(con)m(v)m(enience)i(function,)f Fs(rl_display_match_list)p
+Ft(,)390 5230 y(that)33 b(tak)m(es)g(care)g(of)f(doing)g(the)g(displa)m
+(y)g(to)h(Readline's)g(output)e(stream.)46 b(Y)-8 b(ou)33
+b(ma)m(y)f(call)h(that)390 5340 y(function)d(from)g(this)g(ho)s(ok.)p
+eop end
+%%Page: 58 62
+TeXDict begin 58 61 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(58)3371
+299 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g
+(rl_basic_word_break_ch)q(ara)q(cter)q(s)390 408 y Ft(The)44
+b(basic)g(list)h(of)f(c)m(haracters)i(that)f(signal)g(a)f(break)g(b)s
+(et)m(w)m(een)h(w)m(ords)f(for)g(the)g(completer)390
+518 y(routine.)61 b(The)37 b(default)g(v)-5 b(alue)37
+b(of)h(this)f(v)-5 b(ariable)38 b(is)f(the)g(c)m(haracters)i(whic)m(h)e
+(break)g(w)m(ords)f(for)390 628 y(completion)c(in)e(Bash:)41
+b Fs(")30 b(\\t\\n\\"\\\\'`@$><=;|&{\(")p Ft(.)3371 819
+y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g
+(rl_basic_quote_charact)q(ers)390 929 y Ft(A)30 b(list)i(of)e(quote)h
+(c)m(haracters)h(whic)m(h)e(can)h(cause)g(a)f(w)m(ord)g(break.)3371
+1121 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g
+(rl_completer_word_brea)q(k_c)q(hara)q(cte)q(rs)390 1230
+y Ft(The)64 b(list)i(of)f(c)m(haracters)h(that)g(signal)g(a)f(break)g
+(b)s(et)m(w)m(een)g(w)m(ords)g(for)f Fs(rl_complete_)390
+1340 y(internal\(\))p Ft(.)38 b(The)30 b(default)g(list)h(is)g(the)f(v)
+-5 b(alue)31 b(of)g Fs(rl_basic_word_break_cha)o(ract)o(ers)p
+Ft(.)3371 1532 y([V)-8 b(ariable])-3598 b Fh(rl_cpvfunc_t)56
+b(*)d(rl_completion_word_brea)q(k_ho)q(ok)390 1641 y
+Ft(If)31 b(non-zero,)i(this)e(is)h(the)f(address)g(of)g(a)h(function)g
+(to)g(call)h(when)d(Readline)i(is)g(deciding)f(where)390
+1751 y(to)k(separate)g(w)m(ords)f(for)g(w)m(ord)g(completion.)54
+b(It)34 b(should)f(return)g(a)i(c)m(haracter)h(string)e(lik)m(e)i
+Fs(rl_)390 1861 y(completer_word_break_cha)o(ract)o(ers)26
+b Ft(to)34 b(b)s(e)e(used)g(to)i(p)s(erform)e(the)h(curren)m(t)f
+(completion.)390 1970 y(The)24 b(function)h(ma)m(y)g(c)m(ho)s(ose)h(to)
+f(set)g Fs(rl_completer_word_break_ch)o(arac)o(ter)o(s)19
+b Ft(itself.)39 b(If)25 b(the)390 2080 y(function)30
+b(returns)f Fs(NULL)p Ft(,)h Fs(rl_completer_word_break)o(_cha)o(rac)o
+(ters)24 b Ft(is)30 b(used.)3371 2271 y([V)-8 b(ariable])-3598
+b Fh(const)54 b(char)f(*)g(rl_completer_quote_cha)q(rac)q(ters)390
+2381 y Ft(A)34 b(list)g(of)g(c)m(haracters)h(whic)m(h)e(can)h(b)s(e)g
+(used)e(to)j(quote)f(a)g(substring)f(of)h(the)f(line.)51
+b(Completion)390 2491 y(o)s(ccurs)26 b(on)g(the)g(en)m(tire)i
+(substring,)e(and)f(within)h(the)g(substring)g Fs
+(rl_completer_word_break)o(_)390 2600 y(characters)32
+b Ft(are)k(treated)g(as)f(an)m(y)h(other)f(c)m(haracter,)j(unless)d
+(they)g(also)h(app)s(ear)e(within)h(this)390 2710 y(list.)3371
+2902 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g
+(rl_filename_quote_char)q(act)q(ers)390 3011 y Ft(A)34
+b(list)g(of)g(c)m(haracters)h(that)f(cause)h(a)f(\014lename)g(to)g(b)s
+(e)f(quoted)h(b)m(y)f(the)h(completer)h(when)e(they)390
+3121 y(app)s(ear)d(in)g(a)h(completed)g(\014lename.)41
+b(The)30 b(default)g(is)h(the)f(n)m(ull)h(string.)3371
+3313 y([V)-8 b(ariable])-3598 b Fh(const)54 b(char)f(*)g
+(rl_special_prefixes)390 3422 y Ft(The)27 b(list)i(of)e(c)m(haracters)j
+(that)e(are)g(w)m(ord)f(break)h(c)m(haracters,)i(but)d(should)f(b)s(e)h
+(left)i(in)e Fj(text)k Ft(when)390 3532 y(it)25 b(is)g(passed)f(to)h
+(the)g(completion)h(function.)38 b(Programs)25 b(can)g(use)f(this)h(to)
+g(help)f(determine)h(what)390 3641 y(kind)i(of)h(completing)h(to)f(do.)
+40 b(F)-8 b(or)29 b(instance,)g(Bash)f(sets)g(this)g(v)-5
+b(ariable)28 b(to)h Fs(")p Ft($@)p Fs(")e Ft(so)h(that)g(it)h(can)390
+3751 y(complete)j(shell)e(v)-5 b(ariables)31 b(and)f(hostnames.)3371
+3943 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_completion_query_i)q
+(tems)390 4052 y Ft(Up)36 b(to)h(this)f(man)m(y)g(items)h(will)f(b)s(e)
+g(displa)m(y)m(ed)h(in)e(resp)s(onse)h(to)h(a)f(p)s
+(ossible-completions)h(call.)390 4162 y(After)44 b(that,)49
+b(Readline)c(asks)f(the)h(user)e(for)h(con\014rmation)h(b)s(efore)e
+(displa)m(ying)i(them.)82 b(The)390 4271 y(default)36
+b(v)-5 b(alue)37 b(is)f(100.)58 b(A)36 b(negativ)m(e)i(v)-5
+b(alue)37 b(indicates)g(that)f(Readline)h(should)e(nev)m(er)h(ask)g
+(for)390 4381 y(con\014rmation.)3371 4573 y([V)-8 b(ariable])-3598
+b Fh(int)53 b(rl_completion_append_)q(char)q(act)q(er)390
+4682 y Ft(When)33 b(a)h(single)f(completion)i(alternativ)m(e)h(matc)m
+(hes)e(at)g(the)f(end)g(of)g(the)h(command)f(line,)h(this)390
+4792 y(c)m(haracter)23 b(is)e(app)s(ended)f(to)i(the)g(inserted)f
+(completion)i(text.)39 b(The)20 b(default)i(is)g(a)f(space)h(c)m
+(haracter)390 4902 y(\(`)31 b('\).)40 b(Setting)27 b(this)g(to)g(the)g
+(n)m(ull)f(c)m(haracter)j(\(`)p Fs(\\0)p Ft('\))e(prev)m(en)m(ts)g(an)m
+(ything)g(b)s(eing)f(app)s(ended)f(auto-)390 5011 y(matically)-8
+b(.)41 b(This)22 b(can)i(b)s(e)f(c)m(hanged)h(in)f(application-sp)s
+(eci\014c)h(completion)h(functions)e(to)h(pro)m(vide)390
+5121 y(the)d(\\most)i(sensible)e(w)m(ord)g(separator)h(c)m(haracter")h
+(according)f(to)g(an)f(application-sp)s(eci\014c)i(com-)390
+5230 y(mand)28 b(line)i(syn)m(tax)f(sp)s(eci\014cation.)42
+b(It)29 b(is)g(set)h(to)g(the)f(default)g(b)s(efore)g(an)m(y)g
+(application-sp)s(eci\014c)390 5340 y(completion)j(function)e(is)g
+(called,)i(and)e(ma)m(y)h(only)f(b)s(e)g(c)m(hanged)h(within)f(suc)m(h)
+g(a)h(function.)p eop end
+%%Page: 59 63
+TeXDict begin 59 62 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(59)3371
+299 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_completion_suppres)q
+(s_ap)q(pen)q(d)390 408 y Ft(If)33 b(non-zero,)i Fj(rl)p
+949 408 28 4 v 39 w(completion)p 1421 408 V 42 w(app)s(end)p
+1755 408 V 38 w(c)m(haracter)42 b Ft(is)33 b(not)g(app)s(ended)f(to)i
+(matc)m(hes)g(at)g(the)g(end)390 518 y(of)28 b(the)f(command)h(line,)h
+(as)e(describ)s(ed)g(ab)s(o)m(v)m(e.)41 b(It)27 b(is)h(set)g(to)g(0)g
+(b)s(efore)g(an)m(y)f(application-sp)s(eci\014c)390 628
+y(completion)32 b(function)e(is)g(called,)i(and)e(ma)m(y)h(only)f(b)s
+(e)g(c)m(hanged)h(within)f(suc)m(h)g(a)h(function.)3371
+847 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_completion_quote_c)q
+(hara)q(cte)q(r)390 956 y Ft(When)36 b(Readline)h(is)f(completing)h
+(quoted)g(text,)h(as)f(delimited)g(b)m(y)f(one)g(of)g(the)h(c)m
+(haracters)g(in)390 1066 y Fj(rl)p 457 1066 V 40 w(completer)p
+885 1066 V 41 w(quote)p 1145 1066 V 41 w(c)m(haracters)p
+Ft(,)43 b(it)c(sets)g(this)g(v)-5 b(ariable)40 b(to)g(the)f(quoting)g
+(c)m(haracter)i(found.)390 1176 y(This)30 b(is)g(set)h(b)s(efore)f(an)m
+(y)h(application-sp)s(eci\014c)g(completion)h(function)e(is)h(called.)
+3371 1395 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_completion_suppres)
+q(s_qu)q(ote)390 1504 y Ft(If)32 b(non-zero,)h(Readline)g(do)s(es)f
+(not)h(app)s(end)d(a)j(matc)m(hing)g(quote)g(c)m(haracter)h(when)d(p)s
+(erforming)390 1614 y(completion)25 b(on)e(a)h(quoted)g(string.)38
+b(It)24 b(is)f(set)h(to)h(0)f(b)s(efore)f(an)m(y)h(application-sp)s
+(eci\014c)h(completion)390 1724 y(function)30 b(is)g(called,)i(and)e
+(ma)m(y)h(only)g(b)s(e)e(c)m(hanged)i(within)f(suc)m(h)g(a)h(function.)
+3371 1943 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_completion_found_q)
+q(uote)390 2052 y Ft(When)31 b(Readline)i(is)e(completing)i(quoted)f
+(text,)h(it)f(sets)g(this)g(v)-5 b(ariable)32 b(to)h(a)f(non-zero)g(v)
+-5 b(alue)32 b(if)390 2162 y(the)21 b(w)m(ord)g(b)s(eing)g(completed)h
+(con)m(tains)g(or)f(is)g(delimited)h(b)m(y)f(an)m(y)g(quoting)h(c)m
+(haracters,)i(including)390 2271 y(bac)m(kslashes.)42
+b(This)29 b(is)i(set)g(b)s(efore)f(an)m(y)g(application-sp)s(eci\014c)i
+(completion)g(function)e(is)g(called.)3371 2491 y([V)-8
+b(ariable])-3598 b Fh(int)53 b(rl_completion_mark_sy)q(mlin)q(k_d)q
+(irs)390 2600 y Ft(If)31 b(non-zero,)i(a)f(slash)g(will)g(b)s(e)f(app)s
+(ended)f(to)j(completed)g(\014lenames)e(that)i(are)f(sym)m(b)s(olic)g
+(links)390 2710 y(to)25 b(directory)g(names,)g(sub)5
+b(ject)24 b(to)h(the)f(v)-5 b(alue)25 b(of)f(the)h(user-settable)g
+Fj(mark-directories)k Ft(v)-5 b(ariable.)390 2819 y(This)27
+b(v)-5 b(ariable)28 b(exists)g(so)f(that)h(application-sp)s(eci\014c)h
+(completion)g(functions)e(can)g(o)m(v)m(erride)i(the)390
+2929 y(user's)42 b(global)h(preference)g(\(set)g(via)g(the)f
+Fj(mark-symlink)m(ed-directories)48 b Ft(Readline)43
+b(v)-5 b(ariable\))390 3039 y(if)38 b(appropriate.)62
+b(This)37 b(v)-5 b(ariable)38 b(is)g(set)g(to)g(the)g(user's)f
+(preference)g(b)s(efore)g(an)m(y)h(application-)390 3148
+y(sp)s(eci\014c)31 b(completion)i(function)f(is)f(called,)j(so)e
+(unless)f(that)h(function)f(mo)s(di\014es)g(the)h(v)-5
+b(alue,)33 b(the)390 3258 y(user's)d(preferences)g(are)h(honored.)3371
+3477 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_ignore_completion_)q
+(dupl)q(ica)q(tes)390 3587 y Ft(If)30 b(non-zero,)h(then)f(duplicates)h
+(in)f(the)h(matc)m(hes)g(are)g(remo)m(v)m(ed.)42 b(The)29
+b(default)i(is)f(1.)3371 3806 y([V)-8 b(ariable])-3598
+b Fh(int)53 b(rl_filename_completio)q(n_de)q(sir)q(ed)390
+3915 y Ft(Non-zero)33 b(means)f(that)g(the)g(results)f(of)h(the)g(matc)
+m(hes)h(are)f(to)h(b)s(e)e(treated)i(as)f(\014lenames.)45
+b(This)390 4025 y(is)40 b Fk(always)49 b Ft(zero)41 b(when)e
+(completion)i(is)f(attempted,)j(and)d(can)g(only)g(b)s(e)f(c)m(hanged)i
+(within)e(an)390 4134 y(application-sp)s(eci\014c)i(completion)g
+(function.)67 b(If)39 b(it)h(is)f(set)h(to)h(a)e(non-zero)h(v)-5
+b(alue)40 b(b)m(y)f(suc)m(h)h(a)390 4244 y(function,)24
+b(directory)f(names)f(ha)m(v)m(e)h(a)g(slash)f(app)s(ended)e(and)i
+(Readline)h(attempts)g(to)g(quote)g(com-)390 4354 y(pleted)35
+b(\014lenames)g(if)g(they)h(con)m(tain)g(an)m(y)f(c)m(haracters)i(in)e
+Fs(rl_filename_quote_chara)o(cter)o(s)390 4463 y Ft(and)30
+b Fs(rl_filename_quoting_des)o(ired)24 b Ft(is)30 b(set)h(to)g(a)g
+(non-zero)g(v)-5 b(alue.)3371 4682 y([V)d(ariable])-3598
+b Fh(int)53 b(rl_filename_quoting_d)q(esir)q(ed)390 4792
+y Ft(Non-zero)29 b(means)f(that)h(the)f(results)g(of)g(the)g(matc)m
+(hes)i(are)e(to)h(b)s(e)e(quoted)h(using)g(double)f(quotes)390
+4902 y(\(or)43 b(an)f(application-sp)s(eci\014c)i(quoting)f(mec)m
+(hanism\))g(if)f(the)h(completed)g(\014lename)g(con)m(tains)390
+5011 y(an)m(y)28 b(c)m(haracters)h(in)e Fs(rl_filename_quote_chars)p
+Ft(.)34 b(This)27 b(is)g Fk(always)37 b Ft(non-zero)28
+b(when)f(comple-)390 5121 y(tion)h(is)g(attempted,)h(and)e(can)h(only)g
+(b)s(e)f(c)m(hanged)h(within)f(an)h(application-sp)s(eci\014c)h
+(completion)390 5230 y(function.)37 b(The)21 b(quoting)g(is)g
+(e\013ected)i(via)e(a)h(call)g(to)g(the)f(function)g(p)s(oin)m(ted)g
+(to)g(b)m(y)g Fs(rl_filename_)390 5340 y(quoting_function)p
+Ft(.)p eop end
+%%Page: 60 64
+TeXDict begin 60 63 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(60)3371
+299 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_attempted_completi)q
+(on_o)q(ver)390 408 y Ft(If)93 b(an)h(application-sp)s(eci\014c)i
+(completion)f(function)f(assigned)g(to)h Fs(rl_attempted_)390
+518 y(completion_function)48 b Ft(sets)53 b(this)g(v)-5
+b(ariable)54 b(to)g(a)f(non-zero)h(v)-5 b(alue,)60 b(Readline)53
+b(will)h(not)390 628 y(p)s(erform)28 b(its)i(default)g(\014lename)g
+(completion)h(ev)m(en)f(if)g(the)f(application's)i(completion)g
+(function)390 737 y(returns)e(no)h(matc)m(hes.)42 b(It)31
+b(should)e(b)s(e)h(set)h(only)f(b)m(y)h(an)f(application's)i
+(completion)f(function.)3371 922 y([V)-8 b(ariable])-3598
+b Fh(int)53 b(rl_sort_completion_ma)q(tche)q(s)390 1031
+y Ft(If)29 b(an)h(application)h(sets)f(this)g(v)-5 b(ariable)31
+b(to)f(0,)h(Readline)f(will)g(not)g(sort)g(the)g(list)h(of)f
+(completions)390 1141 y(\(whic)m(h)25 b(implies)f(that)i(it)f(cannot)g
+(remo)m(v)m(e)h(an)m(y)f(duplicate)g(completions\).)40
+b(The)24 b(default)h(v)-5 b(alue)25 b(is)390 1250 y(1,)32
+b(whic)m(h)f(means)g(that)h(Readline)g(will)f(sort)h(the)f(completions)
+h(and,)f(dep)s(ending)f(on)h(the)g(v)-5 b(alue)390 1360
+y(of)31 b Fs(rl_ignore_completion_du)o(pli)o(cate)o(s)p
+Ft(,)25 b(will)30 b(attempt)i(to)f(remo)m(v)m(e)h(duplicate)f(matc)m
+(hes.)3371 1544 y([V)-8 b(ariable])-3598 b Fh(int)53
+b(rl_completion_type)390 1654 y Ft(Set)35 b(to)h(a)f(c)m(haracter)i
+(describing)e(the)g(t)m(yp)s(e)g(of)g(completion)i(Readline)e(is)g
+(curren)m(tly)h(attempt-)390 1763 y(ing;)f(see)f(the)g(description)f
+(of)g Fs(rl_complete_internal\(\))28 b Ft(\(see)34 b(Section)g(2.6.2)h
+([Completion)390 1873 y(F)-8 b(unctions],)39 b(page)f(54\))f(for)g(the)
+g(list)g(of)g(c)m(haracters.)61 b(This)36 b(is)g(set)i(to)f(the)g
+(appropriate)f(v)-5 b(alue)390 1983 y(b)s(efore)31 b(an)m(y)h
+(application-sp)s(eci\014c)h(completion)g(function)f(is)f(called,)j
+(allo)m(wing)f(suc)m(h)e(functions)390 2092 y(to)g(presen)m(t)g(the)f
+(same)h(in)m(terface)h(as)e Fs(rl_complete\(\))p Ft(.)3371
+2276 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_completion_invokin)q
+(g_ke)q(y)390 2386 y Ft(Set)41 b(to)g(the)g(\014nal)g(c)m(haracter)h
+(in)e(the)h(k)m(ey)g(sequence)h(that)f(in)m(v)m(ok)m(ed)h(one)f(of)g
+(the)g(completion)390 2496 y(functions)c(that)h(call)h
+Fs(rl_complete_internal\(\))p Ft(.)56 b(This)37 b(is)g(set)h(to)g(the)g
+(appropriate)f(v)-5 b(alue)390 2605 y(b)s(efore)30 b(an)m(y)h
+(application-sp)s(eci\014c)h(completion)f(function)f(is)h(called.)3371
+2790 y([V)-8 b(ariable])-3598 b Fh(int)53 b(rl_inhibit_completion)390
+2899 y Ft(If)28 b(this)g(v)-5 b(ariable)29 b(is)f(non-zero,)i
+(completion)f(is)f(inhibited.)40 b(The)28 b(completion)h(c)m(haracter)h
+(will)f(b)s(e)390 3009 y(inserted)h(as)h(an)m(y)g(other)f(b)s(ound)e
+(to)k Fs(self-insert)p Ft(.)150 3208 y Fi(2.6.4)63 b(A)40
+b(Short)i(Completion)g(Example)150 3355 y Ft(Here)30
+b(is)f(a)g(small)h(application)g(demonstrating)f(the)h(use)e(of)i(the)f
+(GNU)h(Readline)f(library)-8 b(.)40 b(It)30 b(is)f(called)150
+3465 y Fs(fileman)p Ft(,)40 b(and)f(the)h(source)g(co)s(de)g(resides)f
+(in)g Fs(examples/fileman.c)p Ft(.)64 b(This)39 b(sample)h(application)
+150 3574 y(pro)m(vides)26 b(completion)i(of)e(command)g(names,)h(line)f
+(editing)h(features,)h(and)d(access)j(to)f(the)f(history)g(list.)p
+eop end
+%%Page: 61 65
+TeXDict begin 61 64 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(61)390
+299 y Fe(/*)40 b(fileman.c)h(--)f(A)f(tiny)h(application)i(which)e
+(demonstrates)i(how)e(to)g(use)g(the)508 386 y(GNU)g(Readline)h
+(library.)80 b(This)40 b(application)i(interactively)g(allows)f(users)
+508 473 y(to)e(manipulate)j(files)e(and)g(their)h(modes.)f(*/)390
+648 y(#ifdef)h(HAVE_CONFIG_H)390 735 y(#)79 b(include)40
+b(<config.h>)390 822 y(#endif)390 996 y(#include)h(<sys/types.h>)390
+1083 y(#ifdef)g(HAVE_SYS_FILE_H)390 1171 y(#)79 b(include)40
+b(<sys/file.h>)390 1258 y(#endif)390 1345 y(#include)h(<sys/stat.h>)390
+1519 y(#ifdef)g(HAVE_UNISTD_H)390 1606 y(#)79 b(include)40
+b(<unistd.h>)390 1694 y(#endif)390 1868 y(#include)h(<fcntl.h>)390
+1955 y(#include)g(<stdio.h>)390 2042 y(#include)g(<errno.h>)390
+2130 y(#include)g(<locale.h>)390 2304 y(#if)f(defined)h
+(\(HAVE_STRING_H\))390 2391 y(#)79 b(include)40 b(<string.h>)390
+2478 y(#else)g(/*)g(!HAVE_STRING_H)i(*/)390 2565 y(#)79
+b(include)40 b(<strings.h>)390 2653 y(#endif)h(/*)e(!HAVE_STRING_H)k
+(*/)390 2827 y(#ifdef)e(HAVE_STDLIB_H)390 2914 y(#)79
+b(include)40 b(<stdlib.h>)390 3001 y(#endif)390 3176
+y(#include)h(<time.h>)390 3350 y(#include)g(<readline/readline.h>)390
+3437 y(#include)g(<readline/history.h>)390 3611 y(extern)g(char)f
+(*xmalloc)h(PARAMS\(\(size_t\)\);)390 3786 y(/*)f(The)g(names)g(of)g
+(functions)h(that)f(actually)h(do)f(the)g(manipulation.)i(*/)390
+3873 y(int)e(com_list)h(PARAMS\(\(char)h(*\)\);)390 3960
+y(int)e(com_view)h(PARAMS\(\(char)h(*\)\);)390 4047 y(int)e(com_rename)
+h(PARAMS\(\(char)h(*\)\);)390 4134 y(int)e(com_stat)h(PARAMS\(\(char)h
+(*\)\);)390 4222 y(int)e(com_pwd)h(PARAMS\(\(char)h(*\)\);)390
+4309 y(int)e(com_delete)h(PARAMS\(\(char)h(*\)\);)390
+4396 y(int)e(com_help)h(PARAMS\(\(char)h(*\)\);)390 4483
+y(int)e(com_cd)g(PARAMS\(\(char)i(*\)\);)390 4570 y(int)e(com_quit)h
+(PARAMS\(\(char)h(*\)\);)390 4745 y(/*)e(A)f(structure)i(which)g
+(contains)g(information)h(on)d(the)h(commands)h(this)f(program)508
+4832 y(can)g(understand.)h(*/)390 5006 y(typedef)g(struct)f({)468
+5093 y(char)h(*name;)f(/*)g(User)g(printable)h(name)f(of)g(the)g
+(function.)h(*/)468 5181 y(rl_icpfunc_t)h(*func;)f(/*)f(Function)h(to)e
+(call)i(to)e(do)h(the)g(job.)g(*/)468 5268 y(char)h(*doc;)f(/*)g
+(Documentation)i(for)e(this)g(function.)80 b(*/)p eop
+end
+%%Page: 62 66
+TeXDict begin 62 65 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(62)390
+299 y Fe(})39 b(COMMAND;)390 473 y(COMMAND)i(commands[])g(=)f({)468
+560 y({)g("cd",)g(com_cd,)h("Change)g(to)f(directory)h(DIR")f(},)468
+648 y({)g("delete",)h(com_delete,)h("Delete)f(FILE")f(},)468
+735 y({)g("help",)h(com_help,)g("Display)g(this)f(text")h(},)468
+822 y({)f("?",)g(com_help,)h("Synonym)g(for)f(`help'")h(},)468
+909 y({)f("list",)h(com_list,)g("List)f(files)h(in)e(DIR")i(},)468
+996 y({)f("ls",)g(com_list,)i("Synonym)f(for)f(`list'")g(},)468
+1083 y({)g("pwd",)g(com_pwd,)i("Print)e(the)g(current)h(working)g
+(directory")g(},)468 1171 y({)f("quit",)h(com_quit,)g("Quit)f(using)h
+(Fileman")g(},)468 1258 y({)f("rename",)h(com_rename,)h("Rename)f(FILE)
+f(to)g(NEWNAME")h(},)468 1345 y({)f("stat",)h(com_stat,)g("Print)g(out)
+f(statistics)h(on)f(FILE")g(},)468 1432 y({)g("view",)h(com_view,)g
+("View)f(the)g(contents)h(of)f(FILE")g(},)468 1519 y({)g(\(char)g
+(*\)NULL,)h(\(rl_icpfunc_t)h(*\)NULL,)f(\(char)f(*\)NULL)h(})390
+1606 y(};)390 1781 y(/*)f(Forward)g(declarations.)j(*/)390
+1868 y(char)d(*stripwhite)i(\(\);)390 1955 y(COMMAND)f(*find_command)h
+(\(\);)390 2130 y(/*)e(The)g(name)g(of)f(this)i(program,)g(as)e(taken)i
+(from)f(argv[0].)h(*/)390 2217 y(char)f(*progname;)390
+2391 y(/*)g(When)g(non-zero,)h(this)f(global)h(means)f(the)g(user)g(is)
+g(done)g(using)g(this)h(program.)g(*/)390 2478 y(int)f(done;)390
+2653 y(char)g(*)390 2740 y(dupstr)h(\(s\))586 2827 y(char)f(*s;)390
+2914 y({)468 3001 y(char)h(*r;)468 3176 y(r)f(=)f(xmalloc)i(\(strlen)g
+(\(s\))f(+)f(1\);)468 3263 y(strcpy)i(\(r,)f(s\);)468
+3350 y(return)h(\(r\);)390 3437 y(})390 3611 y(main)f(\(argc,)h(argv\))
+586 3699 y(int)f(argc;)586 3786 y(char)g(**argv;)390
+3873 y({)468 3960 y(char)h(*line,)f(*s;)468 4134 y(setlocale)i
+(\(LC_ALL,)f(""\);)468 4309 y(progname)g(=)f(argv[0];)468
+4483 y(initialize_readline)k(\(\);)c(/*)g(Bind)g(our)g(completer.)h(*/)
+468 4658 y(/*)f(Loop)g(reading)h(and)f(executing)h(lines)g(until)f(the)
+g(user)g(quits.)h(*/)468 4745 y(for)f(\()g(;)f(done)h(==)g(0;)g(\))547
+4832 y({)625 4919 y(line)g(=)g(readline)h(\("FileMan:)h("\);)625
+5093 y(if)e(\(!line\))704 5181 y(break;)p eop end
+%%Page: 63 67
+TeXDict begin 63 66 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(63)625
+299 y Fe(/*)40 b(Remove)h(leading)f(and)g(trailing)h(whitespace)h(from)
+e(the)g(line.)743 386 y(Then,)g(if)g(there)g(is)g(anything)h(left,)g
+(add)e(it)h(to)g(the)g(history)h(list)743 473 y(and)f(execute)h(it.)f
+(*/)625 560 y(s)g(=)f(stripwhite)j(\(line\);)625 735
+y(if)e(\(*s\))704 822 y({)782 909 y(add_history)i(\(s\);)782
+996 y(execute_line)g(\(s\);)704 1083 y(})625 1258 y(free)e(\(line\);)
+547 1345 y(})468 1432 y(exit)h(\(0\);)390 1519 y(})390
+1694 y(/*)f(Execute)g(a)g(command)h(line.)f(*/)390 1781
+y(int)390 1868 y(execute_line)i(\(line\))586 1955 y(char)e(*line;)390
+2042 y({)468 2130 y(register)h(int)f(i;)468 2217 y(COMMAND)h(*command;)
+468 2304 y(char)g(*word;)468 2478 y(/*)f(Isolate)h(the)f(command)h
+(word.)f(*/)468 2565 y(i)g(=)f(0;)468 2653 y(while)i(\(line[i])g(&&)f
+(whitespace)h(\(line[i]\)\))547 2740 y(i++;)468 2827
+y(word)g(=)e(line)h(+)g(i;)468 3001 y(while)h(\(line[i])g(&&)f
+(!whitespace)h(\(line[i]\)\))547 3088 y(i++;)468 3263
+y(if)f(\(line[i]\))547 3350 y(line[i++])h(=)f('\\0';)468
+3524 y(command)h(=)f(find_command)i(\(word\);)468 3699
+y(if)e(\(!command\))547 3786 y({)625 3873 y(fprintf)h(\(stderr,)g
+("\045s:)f(No)g(such)g(command)h(for)f(FileMan.\\n",)i(word\);)625
+3960 y(return)f(\(-1\);)547 4047 y(})468 4222 y(/*)f(Get)g(argument)h
+(to)f(command,)h(if)f(any.)g(*/)468 4309 y(while)h(\(whitespace)h
+(\(line[i]\)\))547 4396 y(i++;)468 4570 y(word)f(=)e(line)h(+)g(i;)468
+4745 y(/*)g(Call)g(the)g(function.)h(*/)468 4832 y(return)g
+(\(\(*\(command->func\)\))j(\(word\)\);)390 4919 y(})390
+5093 y(/*)c(Look)g(up)f(NAME)i(as)e(the)h(name)g(of)g(a)g(command,)h
+(and)e(return)i(a)f(pointer)g(to)g(that)508 5181 y(command.)80
+b(Return)41 b(a)e(NULL)h(pointer)h(if)f(NAME)g(isn't)g(a)g(command)g
+(name.)h(*/)390 5268 y(COMMAND)g(*)p eop end
+%%Page: 64 68
+TeXDict begin 64 67 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(64)390
+299 y Fe(find_command)42 b(\(name\))586 386 y(char)e(*name;)390
+473 y({)468 560 y(register)h(int)f(i;)468 735 y(for)g(\(i)g(=)f(0;)h
+(commands[i].name;)j(i++\))547 822 y(if)d(\(strcmp)g(\(name,)h
+(commands[i].name\))i(==)d(0\))625 909 y(return)h(\(&commands[i]\);)468
+1083 y(return)g(\(\(COMMAND)g(*\)NULL\);)390 1171 y(})390
+1345 y(/*)f(Strip)g(whitespace)i(from)e(the)g(start)g(and)g(end)g(of)f
+(STRING.)81 b(Return)40 b(a)g(pointer)508 1432 y(into)g(STRING.)h(*/)
+390 1519 y(char)f(*)390 1606 y(stripwhite)h(\(string\))586
+1694 y(char)f(*string;)390 1781 y({)468 1868 y(register)h(char)g(*s,)f
+(*t;)468 2042 y(for)g(\(s)g(=)f(string;)i(whitespace)h(\(*s\);)e(s++\))
+547 2130 y(;)468 2304 y(if)g(\(*s)g(==)g(0\))547 2391
+y(return)g(\(s\);)468 2565 y(t)g(=)f(s)h(+)f(strlen)i(\(s\))f(-)f(1;)
+468 2653 y(while)i(\(t)e(>)h(s)f(&&)h(whitespace)i(\(*t\)\))547
+2740 y(t--;)468 2827 y(*++t)f(=)e('\\0';)468 3001 y(return)i(s;)390
+3088 y(})390 3263 y(/*)f(******************************)q(*****)q(****)
+q(*****)q(****)q(****)q(*****)q(****)q(***)45 b(*/)390
+3350 y(/*)2589 b(*/)390 3437 y(/*)707 b(Interface)41
+b(to)f(Readline)h(Completion)629 b(*/)390 3524 y(/*)2589
+b(*/)390 3611 y(/*)40 b(******************************)q(*****)q(****)q
+(*****)q(****)q(****)q(*****)q(****)q(***)45 b(*/)390
+3786 y(char)40 b(*command_generator)j(PARAMS\(\(const)g(char)d(*,)f
+(int\)\);)390 3873 y(char)h(**fileman_completion)k(PARAMS\(\(const)e
+(char)e(*,)g(int,)g(int\)\);)390 4047 y(/*)g(Tell)g(the)g(GNU)g
+(Readline)h(library)g(how)e(to)h(complete.)81 b(We)39
+b(want)h(to)g(try)g(to)g(complete)508 4134 y(on)f(command)i(names)g(if)
+e(this)h(is)g(the)g(first)g(word)g(in)g(the)g(line,)g(or)g(on)g
+(filenames)508 4222 y(if)f(not.)h(*/)390 4309 y(initialize_readline)k
+(\(\))390 4396 y({)468 4483 y(/*)c(Allow)g(conditional)i(parsing)f(of)f
+(the)g(~/.inputrc)h(file.)g(*/)468 4570 y(rl_readline_name)i(=)d
+("FileMan";)468 4745 y(/*)g(Tell)g(the)g(completer)h(that)g(we)e(want)h
+(a)g(crack)g(first.)h(*/)468 4832 y(rl_attempted_completion_fun)q(ctio)
+q(n)k(=)39 b(fileman_completion;)390 4919 y(})390 5093
+y(/*)h(Attempt)g(to)g(complete)h(on)f(the)g(contents)h(of)f(TEXT.)79
+b(START)41 b(and)e(END)h(bound)h(the)508 5181 y(region)f(of)g
+(rl_line_buffer)i(that)f(contains)g(the)e(word)i(to)e(complete.)81
+b(TEXT)40 b(is)508 5268 y(the)g(word)g(to)f(complete.)81
+b(We)40 b(can)g(use)f(the)h(entire)h(contents)g(of)f(rl_line_buffer)p
+eop end
+%%Page: 65 69
+TeXDict begin 65 68 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(65)508
+299 y Fe(in)39 b(case)h(we)g(want)g(to)g(do)g(some)g(simple)g(parsing.)
+81 b(Return)40 b(the)g(array)h(of)e(matches,)508 386
+y(or)g(NULL)h(if)g(there)h(aren't)f(any.)g(*/)390 473
+y(char)g(**)390 560 y(fileman_completion)j(\(text,)e(start,)g(end\))586
+648 y(const)f(char)h(*text;)586 735 y(int)f(start,)h(end;)390
+822 y({)468 909 y(char)g(**matches;)468 1083 y(matches)g(=)f(\(char)g
+(**\)NULL;)468 1258 y(/*)g(If)g(this)g(word)g(is)g(at)f(the)h(start)h
+(of)e(the)h(line,)h(then)f(it)g(is)f(a)h(command)586
+1345 y(to)g(complete.)80 b(Otherwise)42 b(it)d(is)h(the)g(name)g(of)g
+(a)f(file)h(in)g(the)g(current)586 1432 y(directory.)i(*/)468
+1519 y(if)e(\(start)h(==)e(0\))547 1606 y(matches)i(=)e
+(rl_completion_matches)44 b(\(text,)d(command_generator\);)468
+1781 y(return)g(\(matches\);)390 1868 y(})390 2042 y(/*)f(Generator)h
+(function)g(for)f(command)h(completion.)81 b(STATE)40
+b(lets)g(us)g(know)g(whether)508 2130 y(to)f(start)i(from)f(scratch;)h
+(without)g(any)f(state)g(\(i.e.)g(STATE)h(==)e(0\),)h(then)g(we)508
+2217 y(start)g(at)g(the)g(top)g(of)f(the)h(list.)h(*/)390
+2304 y(char)f(*)390 2391 y(command_generator)j(\(text,)e(state\))586
+2478 y(const)f(char)h(*text;)586 2565 y(int)f(state;)390
+2653 y({)468 2740 y(static)h(int)f(list_index,)i(len;)468
+2827 y(char)f(*name;)468 3001 y(/*)f(If)g(this)g(is)g(a)f(new)h(word)g
+(to)g(complete,)h(initialize)h(now.)79 b(This)40 b(includes)586
+3088 y(saving)h(the)f(length)g(of)g(TEXT)g(for)g(efficiency,)i(and)e
+(initializing)i(the)d(index)586 3176 y(variable)i(to)f(0.)g(*/)468
+3263 y(if)g(\(!state\))547 3350 y({)625 3437 y(list_index)i(=)d(0;)625
+3524 y(len)h(=)g(strlen)g(\(text\);)547 3611 y(})468
+3786 y(/*)g(Return)h(the)f(next)g(name)g(which)g(partially)i(matches)e
+(from)h(the)e(command)i(list.)g(*/)468 3873 y(while)g(\(name)f(=)g
+(commands[list_index].name\))547 3960 y({)625 4047 y(list_index++;)625
+4222 y(if)g(\(strncmp)h(\(name,)g(text,)f(len\))g(==)g(0\))704
+4309 y(return)g(\(dupstr\(name\)\);)547 4396 y(})468
+4570 y(/*)g(If)g(no)f(names)i(matched,)g(then)f(return)h(NULL.)f(*/)468
+4658 y(return)h(\(\(char)g(*\)NULL\);)390 4745 y(})390
+4919 y(/*)f(******************************)q(*****)q(****)q(*****)q
+(****)q(****)q(*****)q(****)q(***)45 b(*/)390 5006 y(/*)2589
+b(*/)390 5093 y(/*)903 b(FileMan)41 b(Commands)1060 b(*/)390
+5181 y(/*)2589 b(*/)390 5268 y(/*)40 b(******************************)q
+(*****)q(****)q(*****)q(****)q(****)q(*****)q(****)q(***)45
+b(*/)p eop end
+%%Page: 66 70
+TeXDict begin 66 69 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(66)390
+386 y Fe(/*)40 b(String)g(to)g(pass)g(to)g(system)g(\(\).)80
+b(This)40 b(is)f(for)h(the)g(LIST,)h(VIEW)f(and)g(RENAME)508
+473 y(commands.)h(*/)390 560 y(static)g(char)f(syscom[1024];)390
+735 y(/*)g(List)g(the)g(file\(s\))h(named)f(in)g(arg.)g(*/)390
+822 y(com_list)h(\(arg\))586 909 y(char)f(*arg;)390 996
+y({)468 1083 y(if)g(\(!arg\))547 1171 y(arg)g(=)f("";)468
+1345 y(sprintf)i(\(syscom,)g("ls)f(-FClg)h(\045s",)f(arg\);)468
+1432 y(return)h(\(system)g(\(syscom\)\);)390 1519 y(})390
+1694 y(com_view)g(\(arg\))586 1781 y(char)f(*arg;)390
+1868 y({)468 1955 y(if)g(\(!valid_argument)j(\("view",)e(arg\)\))547
+2042 y(return)f(1;)390 2217 y(#if)g(defined)h(\(__MSDOS__\))468
+2304 y(/*)f(more.com)h(doesn't)g(grok)f(slashes)h(in)f(pathnames)h(*/)
+468 2391 y(sprintf)g(\(syscom,)g("less)g(\045s",)f(arg\);)390
+2478 y(#else)468 2565 y(sprintf)h(\(syscom,)g("more)g(\045s",)f(arg\);)
+390 2653 y(#endif)468 2740 y(return)h(\(system)g(\(syscom\)\);)390
+2827 y(})390 3001 y(com_rename)g(\(arg\))586 3088 y(char)f(*arg;)390
+3176 y({)468 3263 y(too_dangerous)j(\("rename"\);)468
+3350 y(return)e(\(1\);)390 3437 y(})390 3611 y(com_stat)g(\(arg\))586
+3699 y(char)f(*arg;)390 3786 y({)468 3873 y(struct)h(stat)f(finfo;)468
+4047 y(if)g(\(!valid_argument)j(\("stat",)e(arg\)\))547
+4134 y(return)f(\(1\);)468 4309 y(if)g(\(stat)g(\(arg,)h(&finfo\))g(==)
+e(-1\))547 4396 y({)625 4483 y(perror)i(\(arg\);)625
+4570 y(return)g(\(1\);)547 4658 y(})468 4832 y(printf)g(\("Statistics)h
+(for)e(`\045s':\\n",)h(arg\);)468 5006 y(printf)g(\("\045s)f(has)g
+(\045d)g(link\045s,)h(and)f(is)f(\045d)h(byte\045s)g(in)g(length.\\n",)
+468 5093 y(arg,)782 5181 y(finfo.st_nlink,)782 5268 y(\(finfo.st_nlink)
+j(==)d(1\))f(?)h("")f(:)h("s",)p eop end
+%%Page: 67 71
+TeXDict begin 67 70 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(67)782
+299 y Fe(finfo.st_size,)782 386 y(\(finfo.st_size)43
+b(==)c(1\))h(?)g("")f(:)h("s"\);)468 473 y(printf)h(\("Inode)g(Last)f
+(Change)h(at:)f(\045s",)g(ctime)g(\(&finfo.st_ctime\)\);)468
+560 y(printf)h(\(")236 b(Last)40 b(access)h(at:)f(\045s",)g(ctime)g
+(\(&finfo.st_atime\)\);)468 648 y(printf)h(\(")157 b(Last)41
+b(modified)g(at:)f(\045s",)g(ctime)g(\(&finfo.st_mtime\)\);)468
+735 y(return)h(\(0\);)390 822 y(})390 996 y(com_delete)g(\(arg\))586
+1083 y(char)f(*arg;)390 1171 y({)468 1258 y(too_dangerous)j
+(\("delete"\);)468 1345 y(return)e(\(1\);)390 1432 y(})390
+1606 y(/*)f(Print)g(out)g(help)g(for)g(ARG,)g(or)g(for)g(all)g(of)f
+(the)h(commands)h(if)f(ARG)g(is)508 1694 y(not)g(present.)h(*/)390
+1781 y(com_help)g(\(arg\))586 1868 y(char)f(*arg;)390
+1955 y({)468 2042 y(register)h(int)f(i;)468 2130 y(int)g(printed)h(=)f
+(0;)468 2304 y(for)g(\(i)g(=)f(0;)h(commands[i].name;)j(i++\))547
+2391 y({)625 2478 y(if)d(\(!*arg)h(||)e(\(strcmp)i(\(arg,)g
+(commands[i].name\))i(==)c(0\)\))704 2565 y({)782 2653
+y(printf)i(\("\045s\\t\\t\045s.\\n",)i(commands[i].name,)g
+(commands[i].doc\);)782 2740 y(printed++;)704 2827 y(})547
+2914 y(})468 3088 y(if)d(\(!printed\))547 3176 y({)625
+3263 y(printf)h(\("No)f(commands)h(match)g(`\045s'.)79
+b(Possibilities)42 b(are:\\n",)f(arg\);)625 3437 y(for)f(\(i)g(=)f(0;)h
+(commands[i].name;)j(i++\))704 3524 y({)782 3611 y(/*)d(Print)g(in)g
+(six)g(columns.)h(*/)782 3699 y(if)f(\(printed)h(==)f(6\))861
+3786 y({)939 3873 y(printed)h(=)e(0;)939 3960 y(printf)i(\("\\n"\);)861
+4047 y(})782 4222 y(printf)g(\("\045s\\t",)g(commands[i].name\);)782
+4309 y(printed++;)704 4396 y(})625 4570 y(if)f(\(printed\))704
+4658 y(printf)g(\("\\n"\);)547 4745 y(})468 4832 y(return)h(\(0\);)390
+4919 y(})390 5093 y(/*)f(Change)g(to)g(the)g(directory)h(ARG.)f(*/)390
+5181 y(com_cd)h(\(arg\))586 5268 y(char)f(*arg;)p eop
+end
+%%Page: 68 72
+TeXDict begin 68 71 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(68)390
+299 y Fe({)468 386 y(if)40 b(\(chdir)h(\(arg\))f(==)g(-1\))547
+473 y({)625 560 y(perror)h(\(arg\);)625 648 y(return)g(1;)547
+735 y(})468 909 y(com_pwd)g(\(""\);)468 996 y(return)g(\(0\);)390
+1083 y(})390 1258 y(/*)f(Print)g(out)g(the)g(current)h(working)g
+(directory.)g(*/)390 1345 y(com_pwd)g(\(ignore\))586
+1432 y(char)f(*ignore;)390 1519 y({)468 1606 y(char)h(dir[1024],)g(*s;)
+468 1781 y(s)f(=)f(getcwd)i(\(dir,)f(sizeof\(dir\))i(-)e(1\);)468
+1868 y(if)g(\(s)g(==)f(0\))547 1955 y({)625 2042 y(printf)i(\("Error)g
+(getting)g(pwd:)f(\045s\\n",)g(dir\);)625 2130 y(return)h(1;)547
+2217 y(})468 2391 y(printf)g(\("Current)g(directory)h(is)d(\045s\\n",)i
+(dir\);)468 2478 y(return)g(0;)390 2565 y(})390 2740
+y(/*)f(The)g(user)g(wishes)g(to)g(quit)g(using)h(this)f(program.)80
+b(Just)40 b(set)g(DONE)g(non-zero.)h(*/)390 2827 y(com_quit)g(\(arg\))
+586 2914 y(char)f(*arg;)390 3001 y({)468 3088 y(done)h(=)e(1;)468
+3176 y(return)i(\(0\);)390 3263 y(})390 3437 y(/*)f(Function)h(which)f
+(tells)g(you)g(that)h(you)e(can't)i(do)e(this.)i(*/)390
+3524 y(too_dangerous)h(\(caller\))586 3611 y(char)e(*caller;)390
+3699 y({)468 3786 y(fprintf)h(\(stderr,)821 3873 y("\045s:)g(Too)f
+(dangerous)h(for)f(me)f(to)h(distribute.)81 b(Write)40
+b(it)g(yourself.\\n",)821 3960 y(caller\);)390 4047 y(})390
+4222 y(/*)g(Return)g(non-zero)h(if)f(ARG)g(is)g(a)f(valid)h(argument)h
+(for)f(CALLER,)h(else)f(print)508 4309 y(an)f(error)i(message)g(and)e
+(return)i(zero.)f(*/)390 4396 y(int)390 4483 y(valid_argument)i
+(\(caller,)f(arg\))586 4570 y(char)f(*caller,)h(*arg;)390
+4658 y({)468 4745 y(if)f(\(!arg)g(||)g(!*arg\))547 4832
+y({)625 4919 y(fprintf)h(\(stderr,)g("\045s:)f(Argument)h
+(required.\\n",)i(caller\);)625 5006 y(return)e(\(0\);)547
+5093 y(})468 5268 y(return)g(\(1\);)p eop end
+%%Page: 69 73
+TeXDict begin 69 72 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(69)390
+299 y Fe(})p eop end
+%%Page: 70 74
+TeXDict begin 70 73 bop 3659 -116 a Ft(70)150 299 y Fp(App)t(endix)52
+b(A)81 b(GNU)54 b(F)-13 b(ree)53 b(Do)t(cumen)l(tation)e(License)1359
+502 y Ft(V)-8 b(ersion)31 b(1.3,)g(3)g(No)m(v)m(em)m(b)s(er)h(2008)390
+635 y(Cop)m(yrigh)m(t)842 632 y(c)817 635 y Fq(\015)e
+Ft(2000,)j(2001,)f(2002,)g(2007,)h(2008)f(F)-8 b(ree)31
+b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 745
+y Fs(http://fsf.org/)390 964 y Ft(Ev)m(ery)m(one)g(is)g(p)s(ermitted)f
+(to)h(cop)m(y)g(and)f(distribute)g(v)m(erbatim)h(copies)390
+1074 y(of)g(this)f(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f
+(is)f(not)h(allo)m(w)m(ed.)199 1207 y(0.)61 b(PREAMBLE)330
+1340 y(The)37 b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g
+(a)g(man)m(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330
+1450 y(useful)29 b(do)s(cumen)m(t)h Fj(free)36 b Ft(in)29
+b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j
+(the)e(e\013ectiv)m(e)j(freedom)330 1559 y(to)f(cop)m(y)g(and)f
+(redistribute)g(it,)h(with)g(or)f(without)g(mo)s(difying)g(it,)i
+(either)f(commercially)h(or)e(non-)330 1669 y(commercially)-8
+b(.)56 b(Secondarily)-8 b(,)36 b(this)f(License)g(preserv)m(es)g(for)f
+(the)h(author)f(and)g(publisher)f(a)i(w)m(a)m(y)330 1778
+y(to)i(get)g(credit)g(for)f(their)g(w)m(ork,)i(while)e(not)g(b)s(eing)g
+(considered)g(resp)s(onsible)f(for)h(mo)s(di\014cations)330
+1888 y(made)30 b(b)m(y)h(others.)330 2021 y(This)22 b(License)i(is)f(a)
+h(kind)e(of)i(\\cop)m(yleft",)j(whic)m(h)c(means)g(that)h(deriv)-5
+b(ativ)m(e)24 b(w)m(orks)f(of)h(the)f(do)s(cumen)m(t)330
+2131 y(m)m(ust)34 b(themselv)m(es)h(b)s(e)e(free)h(in)g(the)g(same)g
+(sense.)51 b(It)34 b(complemen)m(ts)h(the)f(GNU)g(General)h(Public)330
+2240 y(License,)c(whic)m(h)f(is)h(a)f(cop)m(yleft)i(license)g(designed)
+e(for)g(free)h(soft)m(w)m(are.)330 2373 y(W)-8 b(e)31
+b(ha)m(v)m(e)f(designed)g(this)f(License)h(in)f(order)g(to)i(use)e(it)h
+(for)f(man)m(uals)h(for)f(free)h(soft)m(w)m(are,)h(b)s(ecause)330
+2483 y(free)42 b(soft)m(w)m(are)i(needs)e(free)g(do)s(cumen)m(tation:)
+65 b(a)42 b(free)h(program)f(should)f(come)i(with)f(man)m(uals)330
+2592 y(pro)m(viding)29 b(the)g(same)g(freedoms)f(that)i(the)f(soft)m(w)
+m(are)h(do)s(es.)40 b(But)29 b(this)f(License)i(is)f(not)g(limited)g
+(to)330 2702 y(soft)m(w)m(are)j(man)m(uals;)f(it)g(can)g(b)s(e)f(used)g
+(for)g(an)m(y)h(textual)h(w)m(ork,)f(regardless)g(of)g(sub)5
+b(ject)30 b(matter)i(or)330 2812 y(whether)f(it)h(is)f(published)f(as)i
+(a)f(prin)m(ted)g(b)s(o)s(ok.)44 b(W)-8 b(e)32 b(recommend)f(this)h
+(License)g(principally)f(for)330 2921 y(w)m(orks)f(whose)h(purp)s(ose)d
+(is)j(instruction)f(or)g(reference.)199 3054 y(1.)61
+b(APPLICABILITY)29 b(AND)j(DEFINITIONS)330 3187 y(This)39
+b(License)i(applies)f(to)g(an)m(y)h(man)m(ual)f(or)g(other)g(w)m(ork,)i
+(in)e(an)m(y)g(medium,)i(that)e(con)m(tains)i(a)330 3297
+y(notice)h(placed)f(b)m(y)f(the)h(cop)m(yrigh)m(t)h(holder)e(sa)m(ying)
+h(it)g(can)g(b)s(e)f(distributed)f(under)g(the)i(terms)330
+3407 y(of)c(this)f(License.)62 b(Suc)m(h)37 b(a)h(notice)h(gran)m(ts)f
+(a)g(w)m(orld-wide,)h(ro)m(y)m(alt)m(y-free)i(license,)f(unlimited)d
+(in)330 3516 y(duration,)49 b(to)d(use)f(that)g(w)m(ork)h(under)d(the)j
+(conditions)f(stated)h(herein.)85 b(The)45 b(\\Do)s(cumen)m(t",)330
+3626 y(b)s(elo)m(w,)29 b(refers)f(to)h(an)m(y)g(suc)m(h)f(man)m(ual)h
+(or)f(w)m(ork.)40 b(An)m(y)29 b(mem)m(b)s(er)e(of)i(the)f(public)g(is)g
+(a)h(licensee,)i(and)330 3735 y(is)25 b(addressed)f(as)h(\\y)m(ou".)40
+b(Y)-8 b(ou)26 b(accept)g(the)f(license)h(if)f(y)m(ou)h(cop)m(y)-8
+b(,)27 b(mo)s(dify)d(or)h(distribute)g(the)g(w)m(ork)330
+3845 y(in)30 b(a)h(w)m(a)m(y)g(requiring)f(p)s(ermission)f(under)g(cop)
+m(yrigh)m(t)j(la)m(w.)330 3978 y(A)i(\\Mo)s(di\014ed)f(V)-8
+b(ersion")35 b(of)f(the)g(Do)s(cumen)m(t)g(means)g(an)m(y)g(w)m(ork)f
+(con)m(taining)j(the)e(Do)s(cumen)m(t)g(or)330 4088 y(a)k(p)s(ortion)f
+(of)h(it,)i(either)e(copied)g(v)m(erbatim,)i(or)d(with)h(mo)s
+(di\014cations)f(and/or)h(translated)g(in)m(to)330 4197
+y(another)31 b(language.)330 4330 y(A)26 b(\\Secondary)g(Section")h(is)
+f(a)h(named)e(app)s(endix)f(or)i(a)h(fron)m(t-matter)g(section)g(of)f
+(the)g(Do)s(cumen)m(t)330 4440 y(that)c(deals)g(exclusiv)m(ely)h(with)e
+(the)g(relationship)h(of)f(the)h(publishers)d(or)i(authors)g(of)h(the)f
+(Do)s(cumen)m(t)330 4549 y(to)38 b(the)f(Do)s(cumen)m(t's)i(o)m(v)m
+(erall)g(sub)5 b(ject)37 b(\(or)h(to)g(related)g(matters\))g(and)f(con)
+m(tains)h(nothing)f(that)330 4659 y(could)j(fall)h(directly)g(within)f
+(that)h(o)m(v)m(erall)i(sub)5 b(ject.)70 b(\(Th)m(us,)42
+b(if)e(the)h(Do)s(cumen)m(t)g(is)f(in)g(part)h(a)330
+4769 y(textb)s(o)s(ok)24 b(of)g(mathematics,)j(a)d(Secondary)f(Section)
+h(ma)m(y)g(not)g(explain)g(an)m(y)g(mathematics.\))40
+b(The)330 4878 y(relationship)28 b(could)f(b)s(e)g(a)g(matter)i(of)e
+(historical)i(connection)f(with)f(the)h(sub)5 b(ject)27
+b(or)g(with)g(related)330 4988 y(matters,)38 b(or)d(of)h(legal,)i
+(commercial,)h(philosophical,)f(ethical)f(or)e(p)s(olitical)i(p)s
+(osition)f(regarding)330 5097 y(them.)330 5230 y(The)25
+b(\\In)m(v)-5 b(arian)m(t)27 b(Sections")g(are)f(certain)g(Secondary)g
+(Sections)g(whose)f(titles)i(are)f(designated,)i(as)330
+5340 y(b)s(eing)e(those)h(of)g(In)m(v)-5 b(arian)m(t)27
+b(Sections,)i(in)d(the)h(notice)h(that)f(sa)m(ys)g(that)g(the)g(Do)s
+(cumen)m(t)g(is)g(released)p eop end
+%%Page: 71 75
+TeXDict begin 71 74 bop 150 -116 a Ft(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(71)330 299 y(under)26 b(this)i(License.)40 b(If)27
+b(a)h(section)h(do)s(es)f(not)f(\014t)h(the)g(ab)s(o)m(v)m(e)h
+(de\014nition)e(of)h(Secondary)f(then)h(it)g(is)330 408
+y(not)k(allo)m(w)m(ed)i(to)e(b)s(e)g(designated)g(as)g(In)m(v)-5
+b(arian)m(t.)46 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f(con)m(tain)i(zero)
+e(In)m(v)-5 b(arian)m(t)330 518 y(Sections.)39 b(If)25
+b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)g(an)m(y)g(In)m(v)
+-5 b(arian)m(t)25 b(Sections)h(then)e(there)h(are)g(none.)330
+669 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g(short)
+g(passages)g(of)g(text)g(that)h(are)f(listed,)i(as)d(F)-8
+b(ron)m(t-Co)m(v)m(er)330 778 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m(er)
+j(T)-8 b(exts,)27 b(in)d(the)h(notice)i(that)e(sa)m(ys)h(that)g(the)f
+(Do)s(cumen)m(t)h(is)f(released)g(under)330 888 y(this)h(License.)40
+b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29 b(T)-8 b(ext)26
+b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)g(Bac)m(k-Co)m
+(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 998 y(b)s(e)k(at)h(most)g(25)g(w)m
+(ords.)330 1148 y(A)36 b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g
+(the)f(Do)s(cumen)m(t)h(means)g(a)g(mac)m(hine-readable)h(cop)m(y)-8
+b(,)38 b(represen)m(ted)330 1258 y(in)d(a)h(format)g(whose)g(sp)s
+(eci\014cation)g(is)g(a)m(v)-5 b(ailable)38 b(to)f(the)f(general)g
+(public,)h(that)f(is)g(suitable)g(for)330 1367 y(revising)c(the)g(do)s
+(cumen)m(t)f(straigh)m(tforw)m(ardly)i(with)e(generic)i(text)g(editors)
+f(or)f(\(for)h(images)h(com-)330 1477 y(p)s(osed)23 b(of)h(pixels\))g
+(generic)h(pain)m(t)f(programs)g(or)f(\(for)h(dra)m(wings\))g(some)g
+(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 1587
+y(editor,)k(and)f(that)g(is)g(suitable)h(for)f(input)f(to)i(text)g
+(formatters)f(or)g(for)g(automatic)i(translation)f(to)330
+1696 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input)
+g(to)i(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)g(an)g
+(otherwise)330 1806 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g
+(whose)f(markup,)i(or)e(absence)h(of)g(markup,)g(has)g(b)s(een)f
+(arranged)g(to)330 1915 y(th)m(w)m(art)27 b(or)g(discourage)g
+(subsequen)m(t)f(mo)s(di\014cation)h(b)m(y)g(readers)f(is)g(not)h(T)-8
+b(ransparen)m(t.)39 b(An)27 b(image)330 2025 y(format)35
+b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g
+(substan)m(tial)h(amoun)m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g
+(is)330 2134 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i
+(\\Opaque".)330 2285 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T)
+-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fm(asci)r(i)g
+Ft(without)330 2395 y(markup,)37 b(T)-8 b(exinfo)36 b(input)f(format,)j
+(LaT)1759 2414 y(E)1810 2395 y(X)e(input)f(format,)j
+Fd(SGML)f Ft(or)f Fd(XML)g Ft(using)g(a)g(publicly)330
+2504 y(a)m(v)-5 b(ailable)42 b Fd(DTD)p Ft(,)h(and)c
+(standard-conforming)g(simple)h Fd(HTML)p Ft(,)i(P)m(ostScript)e(or)f
+Fd(PDF)h Ft(designed)330 2614 y(for)e(h)m(uman)f(mo)s(di\014cation.)65
+b(Examples)38 b(of)h(transparen)m(t)f(image)h(formats)g(include)f
+Fd(PNG)p Ft(,)i Fd(X)n(CF)330 2724 y Ft(and)e Fd(JPG)p
+Ft(.)64 b(Opaque)38 b(formats)h(include)f(proprietary)h(formats)f(that)
+h(can)g(b)s(e)f(read)h(and)f(edited)330 2833 y(only)54
+b(b)m(y)f(proprietary)h(w)m(ord)f(pro)s(cessors,)59 b
+Fd(SGML)54 b Ft(or)f Fd(XML)h Ft(for)g(whic)m(h)f(the)h
+Fd(DTD)g Ft(and/or)330 2943 y(pro)s(cessing)61 b(to)s(ols)h(are)f(not)g
+(generally)i(a)m(v)-5 b(ailable,)71 b(and)60 b(the)h(mac)m
+(hine-generated)j Fd(HTML)p Ft(,)330 3052 y(P)m(ostScript)31
+b(or)f Fd(PDF)h Ft(pro)s(duced)d(b)m(y)j(some)f(w)m(ord)g(pro)s
+(cessors)g(for)g(output)g(purp)s(oses)f(only)-8 b(.)330
+3203 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m(ted)f(b)
+s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f(follo)m
+(wing)330 3313 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g(legibly)-8
+b(,)30 b(the)e(material)h(this)e(License)i(requires)e(to)h(app)s(ear)f
+(in)h(the)330 3422 y(title)g(page.)40 b(F)-8 b(or)28
+b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h(an)m(y)e
+(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330
+3532 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s
+(earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330
+3641 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330
+3792 y(The)j(\\publisher")g(means)h(an)m(y)f(p)s(erson)g(or)h(en)m(tit)
+m(y)h(that)f(distributes)f(copies)i(of)e(the)h(Do)s(cumen)m(t)330
+3902 y(to)c(the)g(public.)330 4052 y(A)f(section)h(\\En)m(titled)g
+(XYZ")f(means)f(a)h(named)g(subunit)e(of)h(the)h(Do)s(cumen)m(t)h
+(whose)e(title)i(either)330 4162 y(is)d(precisely)g(XYZ)g(or)f(con)m
+(tains)i(XYZ)f(in)f(paren)m(theses)i(follo)m(wing)g(text)g(that)f
+(translates)h(XYZ)e(in)330 4271 y(another)e(language.)40
+b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g(sp)s(eci\014c)g(section)h(name)f
+(men)m(tioned)h(b)s(elo)m(w,)g(suc)m(h)330 4381 y(as)i(\\Ac)m(kno)m
+(wledgemen)m(ts",)33 b(\\Dedications",)e(\\Endorsemen)m(ts",)e(or)f
+(\\History".\))42 b(T)-8 b(o)29 b(\\Preserv)m(e)330 4491
+y(the)34 b(Title")h(of)e(suc)m(h)h(a)g(section)g(when)f(y)m(ou)h(mo)s
+(dify)e(the)i(Do)s(cumen)m(t)h(means)e(that)h(it)g(remains)g(a)330
+4600 y(section)e(\\En)m(titled)f(XYZ")g(according)g(to)g(this)g
+(de\014nition.)330 4751 y(The)c(Do)s(cumen)m(t)i(ma)m(y)f(include)f(W)
+-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)g(the)g(notice)h(whic)m
+(h)e(states)i(that)330 4861 y(this)34 b(License)g(applies)g(to)h(the)f
+(Do)s(cumen)m(t.)52 b(These)33 b(W)-8 b(arran)m(t)m(y)36
+b(Disclaimers)f(are)g(considered)e(to)330 4970 y(b)s(e)k(included)g(b)m
+(y)g(reference)h(in)g(this)f(License,)j(but)d(only)h(as)g(regards)f
+(disclaiming)i(w)m(arran)m(ties:)330 5080 y(an)m(y)e(other)g
+(implication)i(that)e(these)g(W)-8 b(arran)m(t)m(y)39
+b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g(and)f(has)h(no)330
+5189 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h(this)f(License.)199
+5340 y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)p eop end
+%%Page: 72 76
+TeXDict begin 72 75 bop 150 -116 a Ft(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(72)330 299 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h
+(the)g(Do)s(cumen)m(t)h(in)f(an)m(y)g(medium,)h(either)g(commercially)h
+(or)330 408 y(noncommercially)-8 b(,)48 b(pro)m(vided)42
+b(that)h(this)f(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j
+(and)42 b(the)h(license)330 518 y(notice)37 b(sa)m(ying)g(this)e
+(License)i(applies)e(to)i(the)f(Do)s(cumen)m(t)g(are)g(repro)s(duced)e
+(in)i(all)g(copies,)j(and)330 628 y(that)27 b(y)m(ou)g(add)f(no)h
+(other)f(conditions)h(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f
+(License.)40 b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330
+737 y(tec)m(hnical)35 b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h
+(the)f(reading)g(or)g(further)e(cop)m(ying)j(of)f(the)g(copies)330
+847 y(y)m(ou)25 b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28
+b(y)m(ou)d(ma)m(y)g(accept)h(comp)s(ensation)f(in)f(exc)m(hange)j(for)d
+(copies.)330 956 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f
+(n)m(um)m(b)s(er)f(of)h(copies)h(y)m(ou)f(m)m(ust)h(also)g(follo)m(w)g
+(the)f(conditions)330 1066 y(in)e(section)i(3.)330 1200
+y(Y)-8 b(ou)21 b(ma)m(y)h(also)f(lend)g(copies,)i(under)d(the)h(same)g
+(conditions)g(stated)h(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g
+(publicly)330 1310 y(displa)m(y)31 b(copies.)199 1443
+y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1577 y(If)25
+b(y)m(ou)g(publish)f(prin)m(ted)g(copies)i(\(or)g(copies)g(in)f(media)g
+(that)h(commonly)g(ha)m(v)m(e)g(prin)m(ted)f(co)m(v)m(ers\))i(of)330
+1687 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f
+(100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)f(notice)h(requires)330
+1797 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i
+(the)e(copies)h(in)f(co)m(v)m(ers)i(that)f(carry)-8 b(,)36
+b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 1906 y(these)j(Co)m(v)m
+(er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41
+b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44
+b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330
+2016 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m)
+m(ust)e(also)h(clearly)g(and)f(legibly)h(iden)m(tify)f(y)m(ou)h(as)f
+(the)h(publisher)330 2125 y(of)k(these)h(copies.)53 b(The)34
+b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)f(title)i
+(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 2235 y(equally)e
+(prominen)m(t)e(and)g(visible.)43 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g
+(other)g(material)h(on)f(the)g(co)m(v)m(ers)h(in)e(addition.)330
+2345 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v)
+m(ers,)i(as)d(long)h(as)g(they)f(preserv)m(e)g(the)h(title)g(of)g(the)
+330 2454 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d
+(b)s(e)g(treated)h(as)f(v)m(erbatim)h(cop)m(ying)g(in)f(other)330
+2564 y(resp)s(ects.)330 2698 y(If)32 b(the)h(required)f(texts)i(for)e
+(either)h(co)m(v)m(er)i(are)e(to)s(o)g(v)m(oluminous)g(to)g(\014t)g
+(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 2807 y(the)h(\014rst)f
+(ones)h(listed)g(\(as)h(man)m(y)f(as)g(\014t)g(reasonably\))g(on)g(the)
+g(actual)h(co)m(v)m(er,)h(and)e(con)m(tin)m(ue)h(the)330
+2917 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 3051
+y(If)27 b(y)m(ou)g(publish)e(or)i(distribute)g(Opaque)f(copies)i(of)f
+(the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)f(more)i(than)e(100,)330
+3160 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g
+(T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)g(with)e(eac)m(h)i(Opaque)
+330 3270 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h
+(Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)h(from)d
+(whic)m(h)330 3380 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e
+(has)h(access)i(to)f(do)m(wnload)f(using)g(public-standard)f(net)m(w)m
+(ork)330 3489 y(proto)s(cols)40 b(a)f(complete)h(T)-8
+b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g
+(added)f(material.)67 b(If)330 3599 y(y)m(ou)39 b(use)g(the)g(latter)h
+(option,)h(y)m(ou)f(m)m(ust)e(tak)m(e)j(reasonably)e(pruden)m(t)e
+(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3708 y(distribution)f(of)g
+(Opaque)g(copies)h(in)e(quan)m(tit)m(y)-8 b(,)43 b(to)38
+b(ensure)g(that)h(this)f(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330
+3818 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s
+(cation)h(un)m(til)e(at)h(least)h(one)e(y)m(ear)h(after)g(the)f(last)h
+(time)330 3927 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i
+(\(directly)g(or)e(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))h
+(of)f(that)330 4037 y(edition)31 b(to)g(the)g(public.)330
+4171 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g
+(con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330
+4281 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s
+(er)d(of)i(copies,)h(to)f(giv)m(e)h(them)f(a)g(c)m(hance)h(to)f(pro)m
+(vide)g(y)m(ou)330 4390 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g
+(the)f(Do)s(cumen)m(t.)199 4524 y(4.)61 b(MODIFICA)-8
+b(TIONS)330 4658 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a)
+h(Mo)s(di\014ed)f(V)-8 b(ersion)26 b(of)g(the)g(Do)s(cumen)m(t)g(under)
+e(the)h(conditions)330 4768 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v)
+m(e,)k(pro)m(vided)20 b(that)i(y)m(ou)f(release)i(the)e(Mo)s(di\014ed)f
+(V)-8 b(ersion)22 b(under)d(precisely)330 4877 y(this)29
+b(License,)h(with)f(the)g(Mo)s(di\014ed)f(V)-8 b(ersion)30
+b(\014lling)f(the)g(role)h(of)f(the)g(Do)s(cumen)m(t,)h(th)m(us)f
+(licensing)330 4987 y(distribution)k(and)h(mo)s(di\014cation)g(of)h
+(the)f(Mo)s(di\014ed)f(V)-8 b(ersion)35 b(to)g(who)s(ev)m(er)f(p)s
+(ossesses)f(a)i(cop)m(y)g(of)330 5096 y(it.)41 b(In)30
+b(addition,)h(y)m(ou)f(m)m(ust)h(do)f(these)h(things)f(in)g(the)h(Mo)s
+(di\014ed)e(V)-8 b(ersion:)357 5230 y(A.)60 b(Use)33
+b(in)f(the)h(Title)h(P)m(age)g(\(and)f(on)f(the)h(co)m(v)m(ers,)i(if)e
+(an)m(y\))g(a)g(title)h(distinct)f(from)g(that)g(of)g(the)510
+5340 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f(previous)f(v)m
+(ersions)h(\(whic)m(h)g(should,)g(if)g(there)g(w)m(ere)g(an)m(y)-8
+b(,)p eop end
+%%Page: 73 77
+TeXDict begin 73 76 bop 150 -116 a Ft(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(73)510 299 y(b)s(e)31 b(listed)h(in)f(the)g(History)h(section)g(of)g
+(the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same)
+h(title)h(as)510 408 y(a)e(previous)f(v)m(ersion)g(if)h(the)f(original)
+i(publisher)d(of)h(that)h(v)m(ersion)g(giv)m(es)h(p)s(ermission.)360
+545 y(B.)61 b(List)31 b(on)f(the)h(Title)g(P)m(age,)i(as)d(authors,)h
+(one)g(or)f(more)h(p)s(ersons)e(or)h(en)m(tities)j(resp)s(onsible)c
+(for)510 655 y(authorship)c(of)h(the)h(mo)s(di\014cations)f(in)g(the)g
+(Mo)s(di\014ed)f(V)-8 b(ersion,)28 b(together)g(with)d(at)i(least)h
+(\014v)m(e)510 765 y(of)c(the)g(principal)g(authors)f(of)i(the)f(Do)s
+(cumen)m(t)g(\(all)h(of)g(its)f(principal)g(authors,)h(if)f(it)g(has)g
+(few)m(er)510 874 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g
+(y)m(ou)g(from)f(this)g(requiremen)m(t.)359 1011 y(C.)60
+b(State)32 b(on)e(the)h(Title)h(page)f(the)g(name)g(of)g(the)g
+(publisher)e(of)i(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)32
+b(as)f(the)510 1121 y(publisher.)355 1258 y(D.)61 b(Preserv)m(e)31
+b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f(of)g(the)f(Do)s(cumen)m(t.)
+363 1395 y(E.)60 b(Add)30 b(an)i(appropriate)f(cop)m(yrigh)m(t)i
+(notice)f(for)g(y)m(our)f(mo)s(di\014cations)g(adjacen)m(t)i(to)f(the)g
+(other)510 1504 y(cop)m(yrigh)m(t)g(notices.)365 1641
+y(F.)61 b(Include,)28 b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g
+(notices,)h(a)e(license)h(notice)g(giving)g(the)f(public)510
+1751 y(p)s(ermission)23 b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8
+b(ersion)25 b(under)e(the)i(terms)f(of)h(this)f(License,)j(in)d(the)g
+(form)510 1861 y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353
+1998 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f
+(full)g(lists)g(of)g(In)m(v)-5 b(arian)m(t)23 b(Sections)h(and)e
+(required)g(Co)m(v)m(er)510 2107 y(T)-8 b(exts)31 b(giv)m(en)g(in)f
+(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2244
+y(H.)60 b(Include)30 b(an)g(unaltered)g(cop)m(y)h(of)g(this)f(License.)
+392 2381 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g
+(\\History",)h(Preserv)m(e)f(its)f(Title,)i(and)d(add)h(to)h(it)f(an)g
+(item)510 2491 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d
+(authors,)i(and)e(publisher)f(of)j(the)f(Mo)s(di\014ed)f(V)-8
+b(ersion)510 2600 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45
+b(If)31 b(there)h(is)f(no)g(section)i(En)m(titled)f(\\History")h(in)e
+(the)g(Do)s(cu-)510 2710 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f
+(title,)i(y)m(ear,)g(authors,)f(and)e(publisher)f(of)i(the)g(Do)s
+(cumen)m(t)510 2819 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i
+(then)d(add)g(an)g(item)g(describing)g(the)g(Mo)s(di\014ed)g(V)-8
+b(ersion)37 b(as)510 2929 y(stated)31 b(in)f(the)h(previous)f(sen)m
+(tence.)378 3066 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s
+(cation,)i(if)d(an)m(y)-8 b(,)34 b(giv)m(en)f(in)g(the)f(Do)s(cumen)m
+(t)h(for)g(public)e(access)j(to)510 3176 y(a)e(T)-8 b(ransparen)m(t)30
+b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m(ewise)h(the)g(net)
+m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3285 y(the)g(Do)s(cumen)m
+(t)g(for)g(previous)f(v)m(ersions)h(it)g(w)m(as)g(based)f(on.)45
+b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3395
+y(\\History")27 b(section.)40 b(Y)-8 b(ou)25 b(ma)m(y)h(omit)g(a)f(net)
+m(w)m(ork)h(lo)s(cation)g(for)f(a)h(w)m(ork)f(that)g(w)m(as)h
+(published)510 3504 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e
+(the)h(Do)s(cumen)m(t)h(itself,)h(or)d(if)h(the)g(original)h(publisher)
+d(of)i(the)510 3614 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s
+(ermission.)354 3751 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m
+(titled)h(\\Ac)m(kno)m(wledgemen)m(ts")i(or)d(\\Dedications",)k
+(Preserv)m(e)c(the)g(Title)510 3861 y(of)j(the)f(section,)j(and)d
+(preserv)m(e)h(in)f(the)h(section)g(all)h(the)e(substance)h(and)f(tone)
+h(of)f(eac)m(h)i(of)f(the)510 3970 y(con)m(tributor)k(ac)m(kno)m
+(wledgemen)m(ts)i(and/or)d(dedications)h(giv)m(en)h(therein.)368
+4107 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5
+b(arian)m(t)36 b(Sections)g(of)f(the)h(Do)s(cumen)m(t,)h(unaltered)f
+(in)f(their)g(text)i(and)510 4217 y(in)f(their)g(titles.)58
+b(Section)37 b(n)m(um)m(b)s(ers)d(or)i(the)g(equiv)-5
+b(alen)m(t)38 b(are)e(not)g(considered)g(part)g(of)g(the)510
+4326 y(section)c(titles.)341 4463 y(M.)61 b(Delete)33
+b(an)m(y)e(section)h(En)m(titled)f(\\Endorsemen)m(ts".)42
+b(Suc)m(h)30 b(a)i(section)f(ma)m(y)h(not)f(b)s(e)f(included)510
+4573 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357
+4710 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f
+(to)g(b)s(e)f(En)m(titled)h(\\Endorsemen)m(ts")g(or)f(to)h(con\015ict)g
+(in)510 4819 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31
+b(Section.)354 4956 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 5121 y(If)h(the)g(Mo)s(di\014ed)g
+(V)-8 b(ersion)34 b(includes)f(new)g(fron)m(t-matter)i(sections)f(or)f
+(app)s(endices)g(that)h(qualify)330 5230 y(as)28 b(Secondary)g
+(Sections)g(and)f(con)m(tain)j(no)d(material)j(copied)e(from)f(the)h
+(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)330 5340 y(y)m(our)k(option)h
+(designate)h(some)e(or)h(all)g(of)f(these)h(sections)h(as)e(in)m(v)-5
+b(arian)m(t.)48 b(T)-8 b(o)33 b(do)f(this,)h(add)f(their)p
+eop end
+%%Page: 74 78
+TeXDict begin 74 77 bop 150 -116 a Ft(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(74)330 299 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5
+b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8
+b(ersion's)36 b(license)g(notice.)57 b(These)330 408
+y(titles)32 b(m)m(ust)e(b)s(e)g(distinct)h(from)e(an)m(y)i(other)g
+(section)g(titles.)330 551 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section)
+i(En)m(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g
+(nothing)g(but)330 661 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s
+(di\014ed)g(V)-8 b(ersion)31 b(b)m(y)e(v)-5 b(arious)30
+b(parties|for)g(example,)g(statemen)m(ts)i(of)330 770
+y(p)s(eer)27 b(review)g(or)g(that)h(the)f(text)i(has)d(b)s(een)h(appro)
+m(v)m(ed)g(b)m(y)g(an)h(organization)h(as)e(the)h(authoritativ)m(e)330
+880 y(de\014nition)i(of)h(a)f(standard.)330 1022 y(Y)-8
+b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g(up)e(to)i(\014v)m(e)g(w)m
+(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er)30 b(T)-8
+b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 1132 y(to)g(25)g(w)m(ords)e
+(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext,)29 b(to)f(the)f(end)f(of)i
+(the)f(list)h(of)f(Co)m(v)m(er)h(T)-8 b(exts)27 b(in)g(the)h(Mo)s
+(di\014ed)330 1241 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f
+(F)-8 b(ron)m(t-Co)m(v)m(er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m
+(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1351
+y(added)27 b(b)m(y)g(\(or)h(through)f(arrangemen)m(ts)h(made)g(b)m(y\))
+g(an)m(y)g(one)f(en)m(tit)m(y)-8 b(.)42 b(If)27 b(the)h(Do)s(cumen)m(t)
+g(already)330 1461 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g
+(same)h(co)m(v)m(er,)h(previously)e(added)f(b)m(y)h(y)m(ou)g(or)g(b)m
+(y)g(arrangemen)m(t)330 1570 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m
+(y)i(y)m(ou)f(are)f(acting)i(on)e(b)s(ehalf)f(of,)j(y)m(ou)f(ma)m(y)g
+(not)f(add)g(another;)j(but)330 1680 y(y)m(ou)c(ma)m(y)h(replace)g(the)
+f(old)g(one,)i(on)e(explicit)h(p)s(ermission)e(from)g(the)i(previous)e
+(publisher)f(that)330 1789 y(added)e(the)g(old)h(one.)330
+1932 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s
+(cumen)m(t)h(do)g(not)f(b)m(y)h(this)f(License)h(giv)m(e)h(p)s
+(ermission)330 2041 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g
+(for)h(or)f(to)h(assert)g(or)f(imply)g(endorsemen)m(t)g(of)h(an)m(y)g
+(Mo)s(di\014ed)330 2151 y(V)-8 b(ersion.)199 2293 y(5.)61
+b(COMBINING)31 b(DOCUMENTS)330 2436 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m
+(bine)h(the)f(Do)s(cumen)m(t)g(with)g(other)f(do)s(cumen)m(ts)h
+(released)g(under)f(this)g(License,)330 2545 y(under)f(the)h(terms)g
+(de\014ned)f(in)h(section)h(4)g(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)f
+(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2655
+y(include)25 b(in)g(the)g(com)m(bination)i(all)f(of)g(the)f(In)m(v)-5
+b(arian)m(t)26 b(Sections)g(of)g(all)g(of)f(the)h(original)g(do)s
+(cumen)m(ts,)330 2765 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g
+(as)g(In)m(v)-5 b(arian)m(t)28 b(Sections)f(of)g(y)m(our)g(com)m(bined)
+g(w)m(ork)f(in)h(its)g(license)330 2874 y(notice,)32
+b(and)e(that)h(y)m(ou)f(preserv)m(e)h(all)g(their)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 3017 y(The)e(com)m(bined)g(w)m
+(ork)h(need)e(only)i(con)m(tain)g(one)g(cop)m(y)g(of)f(this)g(License,)
+i(and)d(m)m(ultiple)i(iden)m(tical)330 3126 y(In)m(v)-5
+b(arian)m(t)33 b(Sections)g(ma)m(y)g(b)s(e)f(replaced)h(with)f(a)h
+(single)g(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)g(In)m
+(v)-5 b(arian)m(t)330 3236 y(Sections)27 b(with)g(the)g(same)g(name)g
+(but)f(di\013eren)m(t)h(con)m(ten)m(ts,)i(mak)m(e)f(the)f(title)h(of)f
+(eac)m(h)h(suc)m(h)f(section)330 3345 y(unique)33 b(b)m(y)h(adding)f
+(at)i(the)f(end)g(of)g(it,)h(in)f(paren)m(theses,)i(the)e(name)g(of)g
+(the)g(original)h(author)f(or)330 3455 y(publisher)23
+b(of)i(that)h(section)g(if)f(kno)m(wn,)h(or)f(else)h(a)f(unique)f(n)m
+(um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330
+3565 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5
+b(arian)m(t)26 b(Sections)f(in)f(the)g(license)i(notice)g(of)e(the)h
+(com)m(bined)330 3674 y(w)m(ork.)330 3817 y(In)41 b(the)g(com)m
+(bination,)46 b(y)m(ou)41 b(m)m(ust)g(com)m(bine)h(an)m(y)g(sections)g
+(En)m(titled)g(\\History")h(in)e(the)g(v)-5 b(ari-)330
+3926 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h
+(En)m(titled)g(\\History";)i(lik)m(ewise)f(com)m(bine)f(an)m(y)330
+4036 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31
+b(an)m(y)h(sections)h(En)m(titled)g(\\Dedications".)47
+b(Y)-8 b(ou)330 4145 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m
+(titled)f(\\Endorsemen)m(ts.")199 4288 y(6.)61 b(COLLECTIONS)28
+b(OF)i(DOCUMENTS)330 4430 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f
+(collection)i(consisting)f(of)f(the)g(Do)s(cumen)m(t)g(and)g(other)g
+(do)s(cumen)m(ts)f(released)330 4540 y(under)41 b(this)h(License,)k
+(and)c(replace)h(the)g(individual)f(copies)h(of)f(this)g(License)h(in)f
+(the)h(v)-5 b(arious)330 4650 y(do)s(cumen)m(ts)42 b(with)g(a)h(single)
+g(cop)m(y)h(that)f(is)f(included)g(in)g(the)h(collection,)48
+b(pro)m(vided)42 b(that)i(y)m(ou)330 4759 y(follo)m(w)38
+b(the)g(rules)e(of)h(this)g(License)h(for)f(v)m(erbatim)h(cop)m(ying)g
+(of)f(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)h(all)330
+4869 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32
+b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h
+(collection,)i(and)d(distribute)g(it)h(individu-)330
+5121 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g
+(a)g(cop)m(y)h(of)f(this)g(License)g(in)m(to)h(the)g(extracted)330
+5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g
+(other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330
+5340 y(that)d(do)s(cumen)m(t.)p eop end
+%%Page: 75 79
+TeXDict begin 75 78 bop 150 -116 a Ft(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(75)199 299 y(7.)61 b(A)m(GGREGA)-8 b(TION)32 b(WITH)e(INDEPENDENT)h
+(W)m(ORKS)330 441 y(A)d(compilation)i(of)e(the)g(Do)s(cumen)m(t)h(or)f
+(its)g(deriv)-5 b(ativ)m(es)30 b(with)d(other)i(separate)g(and)e(indep)
+s(enden)m(t)330 551 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h
+(on)f(a)g(v)m(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g
+(is)h(called)330 661 y(an)c(\\aggregate")k(if)c(the)g(cop)m(yrigh)m(t)i
+(resulting)e(from)f(the)i(compilation)g(is)f(not)h(used)e(to)i(limit)g
+(the)330 770 y(legal)d(righ)m(ts)f(of)g(the)g(compilation's)h(users)e
+(b)s(ey)m(ond)g(what)g(the)h(individual)f(w)m(orks)g(p)s(ermit.)39
+b(When)330 880 y(the)g(Do)s(cumen)m(t)g(is)f(included)g(in)g(an)g
+(aggregate,)44 b(this)38 b(License)h(do)s(es)f(not)h(apply)f(to)h(the)g
+(other)330 989 y(w)m(orks)30 b(in)g(the)h(aggregate)i(whic)m(h)d(are)h
+(not)g(themselv)m(es)g(deriv)-5 b(ativ)m(e)32 b(w)m(orks)f(of)f(the)h
+(Do)s(cumen)m(t.)330 1132 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8
+b(ext)23 b(requiremen)m(t)g(of)g(section)h(3)f(is)g(applicable)h(to)f
+(these)h(copies)f(of)g(the)g(Do)s(cumen)m(t,)330 1241
+y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f(than)g(one)h(half)f
+(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s(cumen)m(t's)g(Co)m(v)m
+(er)330 1351 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)h(on)g(co)m(v)m
+(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)f(the)h
+(aggregate,)j(or)d(the)330 1461 y(electronic)37 b(equiv)-5
+b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m(t)h(is)f
+(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330
+1570 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f
+(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1713 y(8.)61
+b(TRANSLA)-8 b(TION)330 1855 y(T)g(ranslation)41 b(is)f(considered)f(a)
+i(kind)e(of)h(mo)s(di\014cation,)j(so)d(y)m(ou)g(ma)m(y)h(distribute)e
+(translations)330 1965 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h
+(terms)h(of)f(section)i(4.)83 b(Replacing)45 b(In)m(v)-5
+b(arian)m(t)45 b(Sections)g(with)330 2074 y(translations)h(requires)f
+(sp)s(ecial)h(p)s(ermission)f(from)g(their)g(cop)m(yrigh)m(t)i
+(holders,)i(but)c(y)m(ou)g(ma)m(y)330 2184 y(include)24
+b(translations)i(of)e(some)h(or)g(all)g(In)m(v)-5 b(arian)m(t)25
+b(Sections)g(in)f(addition)h(to)g(the)g(original)h(v)m(ersions)330
+2293 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44
+b(Y)-8 b(ou)32 b(ma)m(y)g(include)f(a)h(translation)g(of)g(this)f
+(License,)i(and)d(all)j(the)330 2403 y(license)42 b(notices)g(in)f(the)
+h(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42
+b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2513
+y(also)f(include)f(the)g(original)h(English)f(v)m(ersion)g(of)g(this)g
+(License)h(and)e(the)h(original)h(v)m(ersions)g(of)330
+2622 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33
+b(case)i(of)g(a)f(disagreemen)m(t)h(b)s(et)m(w)m(een)g(the)f
+(translation)i(and)330 2732 y(the)f(original)i(v)m(ersion)e(of)h(this)f
+(License)h(or)f(a)g(notice)i(or)e(disclaimer,)i(the)f(original)g(v)m
+(ersion)g(will)330 2841 y(prev)-5 b(ail.)330 2984 y(If)28
+b(a)h(section)h(in)e(the)h(Do)s(cumen)m(t)h(is)e(En)m(titled)i(\\Ac)m
+(kno)m(wledgemen)m(ts",)i(\\Dedications",)g(or)d(\\His-)330
+3093 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m
+(e)g(its)f(Title)i(\(section)f(1\))g(will)g(t)m(ypically)h(require)330
+3203 y(c)m(hanging)j(the)g(actual)h(title.)199 3345 y(9.)61
+b(TERMINA)-8 b(TION)330 3488 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8
+b(,)31 b(mo)s(dify)-8 b(,)30 b(sublicense,)g(or)g(distribute)f(the)h
+(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3598 y(pro)m(vided)38
+b(under)f(this)i(License.)65 b(An)m(y)39 b(attempt)h(otherwise)f(to)g
+(cop)m(y)-8 b(,)42 b(mo)s(dify)-8 b(,)40 b(sublicense,)h(or)330
+3707 y(distribute)30 b(it)h(is)f(v)m(oid,)h(and)f(will)h(automatically)
+i(terminate)f(y)m(our)e(righ)m(ts)h(under)e(this)h(License.)330
+3850 y(Ho)m(w)m(ev)m(er,)35 b(if)e(y)m(ou)f(cease)i(all)f(violation)i
+(of)d(this)g(License,)i(then)e(y)m(our)h(license)g(from)f(a)h
+(particular)330 3959 y(cop)m(yrigh)m(t)k(holder)e(is)h(reinstated)h
+(\(a\))f(pro)m(visionally)-8 b(,)39 b(unless)c(and)g(un)m(til)h(the)g
+(cop)m(yrigh)m(t)h(holder)330 4069 y(explicitly)42 b(and)e(\014nally)h
+(terminates)g(y)m(our)g(license,)j(and)c(\(b\))h(p)s(ermanen)m(tly)-8
+b(,)43 b(if)e(the)g(cop)m(yrigh)m(t)330 4178 y(holder)34
+b(fails)h(to)g(notify)g(y)m(ou)g(of)f(the)h(violation)h(b)m(y)e(some)h
+(reasonable)g(means)g(prior)e(to)i(60)h(da)m(ys)330 4288
+y(after)31 b(the)f(cessation.)330 4430 y(Moreo)m(v)m(er,)k(y)m(our)d
+(license)i(from)e(a)h(particular)f(cop)m(yrigh)m(t)i(holder)e(is)h
+(reinstated)g(p)s(ermanen)m(tly)f(if)330 4540 y(the)d(cop)m(yrigh)m(t)h
+(holder)f(noti\014es)g(y)m(ou)g(of)g(the)g(violation)h(b)m(y)f(some)g
+(reasonable)h(means,)f(this)g(is)g(the)330 4650 y(\014rst)f(time)i(y)m
+(ou)f(ha)m(v)m(e)h(receiv)m(ed)g(notice)g(of)f(violation)i(of)e(this)f
+(License)i(\(for)f(an)m(y)g(w)m(ork\))g(from)f(that)330
+4759 y(cop)m(yrigh)m(t)33 b(holder,)g(and)e(y)m(ou)h(cure)g(the)g
+(violation)i(prior)d(to)i(30)f(da)m(ys)h(after)f(y)m(our)g(receipt)h
+(of)f(the)330 4869 y(notice.)330 5011 y(T)-8 b(ermination)28
+b(of)g(y)m(our)f(righ)m(ts)h(under)e(this)i(section)g(do)s(es)f(not)h
+(terminate)h(the)e(licenses)i(of)f(parties)330 5121 y(who)38
+b(ha)m(v)m(e)h(receiv)m(ed)h(copies)e(or)h(righ)m(ts)f(from)g(y)m(ou)g
+(under)f(this)h(License.)64 b(If)38 b(y)m(our)g(righ)m(ts)h(ha)m(v)m(e)
+330 5230 y(b)s(een)25 b(terminated)i(and)e(not)h(p)s(ermanen)m(tly)g
+(reinstated,)i(receipt)f(of)f(a)g(cop)m(y)h(of)f(some)h(or)f(all)h(of)f
+(the)330 5340 y(same)31 b(material)h(do)s(es)e(not)g(giv)m(e)i(y)m(ou)f
+(an)m(y)g(righ)m(ts)f(to)i(use)e(it.)p eop end
+%%Page: 76 80
+TeXDict begin 76 79 bop 150 -116 a Ft(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(76)154 299 y(10.)61 b(FUTURE)30 b(REVISIONS)f(OF)i(THIS)e(LICENSE)330
+433 y(The)41 b(F)-8 b(ree)43 b(Soft)m(w)m(are)f(F)-8
+b(oundation)43 b(ma)m(y)f(publish)e(new,)k(revised)d(v)m(ersions)h(of)g
+(the)g(GNU)g(F)-8 b(ree)330 543 y(Do)s(cumen)m(tation)34
+b(License)e(from)g(time)h(to)g(time.)46 b(Suc)m(h)31
+b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h(in)g(spirit)330
+653 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)m(y)h(di\013er)f
+(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i(concerns.)330
+762 y(See)c Fs(http://www.gnu.org/copy)o(left)o(/)p Ft(.)330
+897 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m(en)g(a)g
+(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39 b(If)29
+b(the)g(Do)s(cumen)m(t)330 1006 y(sp)s(eci\014es)45 b(that)h(a)g
+(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g(License)h
+(\\or)g(an)m(y)g(later)g(v)m(ersion")330 1116 y(applies)33
+b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f(follo)m(wing)i
+(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330
+1225 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m
+(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g
+(b)m(y)330 1335 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8
+b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s
+(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 1445
+y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m
+(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the)
+h(F)-8 b(ree)330 1554 y(Soft)m(w)m(are)33 b(F)-8 b(oundation.)46
+b(If)32 b(the)g(Do)s(cumen)m(t)g(sp)s(eci\014es)g(that)g(a)h(pro)m(xy)f
+(can)g(decide)g(whic)m(h)g(future)330 1664 y(v)m(ersions)h(of)g(this)f
+(License)h(can)g(b)s(e)f(used,)g(that)i(pro)m(xy's)e(public)g(statemen)
+m(t)i(of)f(acceptance)i(of)e(a)330 1773 y(v)m(ersion)e(p)s(ermanen)m
+(tly)f(authorizes)h(y)m(ou)g(to)g(c)m(ho)s(ose)g(that)g(v)m(ersion)g
+(for)f(the)h(Do)s(cumen)m(t.)154 1908 y(11.)61 b(RELICENSING)330
+2042 y(\\Massiv)m(e)39 b(Multiauthor)f(Collab)s(oration)g(Site")h(\(or)
+e(\\MMC)h(Site"\))h(means)e(an)m(y)h(W)-8 b(orld)37 b(Wide)330
+2152 y(W)-8 b(eb)36 b(serv)m(er)g(that)h(publishes)d(cop)m(yrigh)m
+(table)k(w)m(orks)e(and)f(also)i(pro)m(vides)e(prominen)m(t)h
+(facilities)330 2262 y(for)27 b(an)m(yb)s(o)s(dy)g(to)h(edit)g(those)g
+(w)m(orks.)39 b(A)28 b(public)f(wiki)h(that)g(an)m(yb)s(o)s(dy)e(can)i
+(edit)g(is)f(an)h(example)g(of)330 2371 y(suc)m(h)33
+b(a)h(serv)m(er.)51 b(A)34 b(\\Massiv)m(e)i(Multiauthor)e(Collab)s
+(oration")h(\(or)f(\\MMC"\))h(con)m(tained)g(in)f(the)330
+2481 y(site)d(means)f(an)m(y)h(set)g(of)g(cop)m(yrigh)m(table)h(w)m
+(orks)e(th)m(us)g(published)f(on)h(the)h(MMC)f(site.)330
+2615 y(\\CC-BY-SA")36 b(means)f(the)g(Creativ)m(e)i(Commons)e(A)m
+(ttribution-Share)g(Alik)m(e)i(3.0)f(license)g(pub-)330
+2725 y(lished)27 b(b)m(y)f(Creativ)m(e)j(Commons)d(Corp)s(oration,)h(a)
+g(not-for-pro\014t)g(corp)s(oration)h(with)e(a)h(principal)330
+2834 y(place)g(of)f(business)e(in)i(San)f(F)-8 b(rancisco,)29
+b(California,)f(as)e(w)m(ell)h(as)f(future)f(cop)m(yleft)i(v)m(ersions)
+f(of)g(that)330 2944 y(license)31 b(published)e(b)m(y)h(that)h(same)g
+(organization.)330 3078 y(\\Incorp)s(orate")h(means)e(to)h(publish)e
+(or)i(republish)e(a)i(Do)s(cumen)m(t,)g(in)g(whole)g(or)f(in)g(part,)h
+(as)g(part)330 3188 y(of)g(another)f(Do)s(cumen)m(t.)330
+3323 y(An)c(MMC)g(is)h(\\eligible)h(for)e(relicensing")h(if)g(it)f(is)h
+(licensed)f(under)f(this)h(License,)i(and)e(if)g(all)h(w)m(orks)330
+3432 y(that)43 b(w)m(ere)f(\014rst)f(published)f(under)h(this)h
+(License)g(somewhere)g(other)g(than)g(this)g(MMC,)h(and)330
+3542 y(subsequen)m(tly)34 b(incorp)s(orated)h(in)f(whole)h(or)g(in)f
+(part)h(in)m(to)h(the)f(MMC,)g(\(1\))h(had)e(no)h(co)m(v)m(er)h(texts)
+330 3651 y(or)30 b(in)m(v)-5 b(arian)m(t)32 b(sections,)g(and)d(\(2\))j
+(w)m(ere)f(th)m(us)f(incorp)s(orated)g(prior)g(to)h(No)m(v)m(em)m(b)s
+(er)g(1,)g(2008.)330 3786 y(The)40 b(op)s(erator)h(of)g(an)f(MMC)h
+(Site)g(ma)m(y)g(republish)e(an)h(MMC)h(con)m(tained)h(in)e(the)h(site)
+g(under)330 3895 y(CC-BY-SA)30 b(on)g(the)h(same)f(site)h(at)g(an)m(y)g
+(time)g(b)s(efore)e(August)h(1,)h(2009,)h(pro)m(vided)e(the)g(MMC)h(is)
+330 4005 y(eligible)h(for)e(relicensing.)p eop end
+%%Page: 77 81
+TeXDict begin 77 80 bop 150 -116 a Ft(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(77)150 299 y Fr(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g(this)h(License)f
+(for)g(y)l(our)g(do)t(cumen)l(ts)150 458 y Ft(T)-8 b(o)35
+b(use)f(this)h(License)g(in)f(a)h(do)s(cumen)m(t)g(y)m(ou)f(ha)m(v)m(e)
+i(written,)g(include)f(a)f(cop)m(y)i(of)f(the)f(License)h(in)g(the)150
+568 y(do)s(cumen)m(t)30 b(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh)
+m(t)g(and)e(license)h(notices)g(just)f(after)h(the)g(title)h(page:)468
+680 y Fe(Copyright)42 b(\(C\))79 b Fc(year)g(your)40
+b(name)p Fe(.)468 767 y(Permission)i(is)e(granted)g(to)g(copy,)h
+(distribute)g(and/or)g(modify)f(this)g(document)468 854
+y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i
+(License,)f(Version)g(1.3)468 941 y(or)f(any)g(later)g(version)h
+(published)h(by)d(the)h(Free)g(Software)h(Foundation;)468
+1029 y(with)g(no)e(Invariant)j(Sections,)f(no)f(Front-Cover)h(Texts,)g
+(and)f(no)f(Back-Cover)468 1116 y(Texts.)80 b(A)40 b(copy)g(of)g(the)f
+(license)i(is)f(included)h(in)f(the)g(section)g(entitled)h(``GNU)468
+1203 y(Free)g(Documentation)h(License''.)275 1337 y Ft(If)d(y)m(ou)h
+(ha)m(v)m(e)h(In)m(v)-5 b(arian)m(t)41 b(Sections,)i(F)-8
+b(ron)m(t-Co)m(v)m(er)42 b(T)-8 b(exts)41 b(and)e(Bac)m(k-Co)m(v)m(er)k
+(T)-8 b(exts,)43 b(replace)e(the)150 1447 y(\\with)6
+b(.)22 b(.)g(.)12 b(T)-8 b(exts.")41 b(line)31 b(with)f(this:)547
+1559 y Fe(with)40 b(the)g(Invariant)h(Sections)g(being)g
+Fc(list)f(their)g(titles)p Fe(,)h(with)547 1646 y(the)f(Front-Cover)i
+(Texts)e(being)g Fc(list)p Fe(,)h(and)f(with)g(the)g(Back-Cover)h
+(Texts)547 1733 y(being)f Fc(list)p Fe(.)275 1868 y Ft(If)34
+b(y)m(ou)i(ha)m(v)m(e)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(without)f
+(Co)m(v)m(er)h(T)-8 b(exts,)38 b(or)d(some)g(other)h(com)m(bination)g
+(of)g(the)150 1978 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g
+(alternativ)m(es)i(to)e(suit)f(the)h(situation.)275 2112
+y(If)23 b(y)m(our)h(do)s(cumen)m(t)f(con)m(tains)i(non)m(trivial)g
+(examples)g(of)f(program)f(co)s(de,)j(w)m(e)e(recommend)g(releasing)150
+2222 y(these)44 b(examples)f(in)g(parallel)h(under)e(y)m(our)h(c)m
+(hoice)i(of)e(free)g(soft)m(w)m(are)h(license,)k(suc)m(h)43
+b(as)g(the)g(GNU)150 2331 y(General)31 b(Public)f(License,)i(to)f(p)s
+(ermit)e(their)i(use)f(in)g(free)g(soft)m(w)m(are.)p
+eop end
+%%Page: 78 82
+TeXDict begin 78 81 bop 150 -116 a Ft(Concept)31 b(Index)2927
+b(78)150 100 y Fp(Concept)52 b(Index)146 434 y Fr(A)150
+550 y Fb(application-sp)r(eci\014c)27 b(completion)f(functions)e
+Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)37 b Fb(53)146 796 y
+Fr(C)150 913 y Fb(command)26 b(editing)6 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fb(1)146 1159
+y Fr(E)150 1275 y Fb(editing)26 b(command)g(lines)c Fa(:)13
+b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 b Fb(1)146 1522 y Fr(I)150
+1638 y Fb(initialization)28 b(\014le,)e(readline)c Fa(:)13
+b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)36 b Fb(4)150 1726 y(in)n(teraction,)27
+b(readline)12 b Fa(:)h(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)26
+b Fb(1)146 1972 y Fr(K)150 2088 y Fb(kill)g(ring)12 b
+Fa(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)g(:)27 b Fb(2)150 2176 y(killing)g(text)11
+b Fa(:)h(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)26 b Fb(2)2021 434 y Fr(N)2025 566 y Fb(notation,)g
+(readline)17 b Fa(:)d(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+32 b Fb(1)2021 970 y Fr(R)2025 1102 y Fb(readline,)26
+b(function)18 b Fa(:)c(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)33
+b Fb(26)2021 1507 y Fr(V)2025 1639 y Fb(v)l(ariables,)27
+b(readline)11 b Fa(:)j(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)
+26 b Fb(4)2021 2043 y Fr(Y)2025 2176 y Fb(y)n(anking)f(text)17
+b Fa(:)12 b(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)32 b Fb(2)p eop end
+%%Page: 79 83
+TeXDict begin 79 82 bop 3659 -116 a Ft(79)150 299 y Fp(F)-13
+b(unction)52 b(and)h(V)-13 b(ariable)53 b(Index)p 156
+740 41 6 v 150 860 a Fe(_rl_digit_p)10 b Fa(:)16 b(:)d(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)25 b Fb(44)150
+948 y Fe(_rl_digit_value)17 b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)32 b Fb(44)150 1036 y Fe(_rl_lowercase_p)17
+b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)32
+b Fb(44)150 1125 y Fe(_rl_to_lower)8 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)22 b Fb(44)150
+1213 y Fe(_rl_to_upper)8 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)22 b Fb(44)150 1300 y Fe(_rl_uppercase_p)17
+b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)32
+b Fb(44)146 1569 y Fr(A)150 1689 y Fe(abort)27 b(\(C-g\))17
+b Fa(:)d(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)31 b Fb(23)150 1777 y Fe(accept-line)d(\(Newline)g(or)e(Return\))14
+b Fa(:)g(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)28
+b Fb(18)150 1866 y(activ)n(e-region-end-color)20 b Fa(:)13
+b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)34 b Fb(5)150 1953 y(activ)n
+(e-region-start-color)17 b Fa(:)e(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)31
+b Fb(5)146 2220 y Fr(B)150 2339 y Fe(backward-char)e(\(C-b\))14
+b Fa(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fb(17)150 2428
+y Fe(backward-delete-char)i(\(Rubout\))24 b Fa(:)14 b(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fb(20)150 2516
+y Fe(backward-kill-line)30 b(\(C-x)c(Rubout\))7 b Fa(:)15
+b(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)21 b
+Fb(21)150 2604 y Fe(backward-kill-word)30 b(\(M-DEL\))13
+b Fa(:)h(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)27 b Fb(21)150 2693 y Fe(backward-word)i(\(M-b\))14
+b Fa(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fb(17)150 2781
+y Fe(beginning-of-history)i(\(M-<\))13 b Fa(:)h(:)g(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)27 b Fb(18)150
+2869 y Fe(beginning-of-line)i(\(C-a\))22 b Fa(:)13 b(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35
+b Fb(17)150 2958 y(b)r(ell-st)n(yle)9 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)24
+b Fb(5)150 3046 y(bind-tt)n(y-sp)r(ecial-c)n(hars)c Fa(:)13
+b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fb(5)150 3134
+y(blink-matc)n(hing-paren)6 b Fa(:)12 b(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)21 b Fb(5)150 3222 y Fe(bracketed-paste-begin)30
+b(\(\))18 b Fa(:)c(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)33 b Fb(20)146 3491 y Fr(C)150
+3610 y Fe(call-last-kbd-macro)d(\(C-x)c(e\))17 b Fa(:)d(:)f(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)32 b Fb(23)150
+3699 y Fe(capitalize-word)d(\(M-c\))9 b Fa(:)14 b(:)f(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+23 b Fb(21)150 3787 y Fe(character-search)29 b(\(C-]\))6
+b Fa(:)15 b(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)21 b Fb(24)150 3875 y Fe
+(character-search-backward)31 b(\(M-C-]\))12 b Fa(:)j(:)e(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)27 b Fb(24)150 3964 y Fe(clear-display)i(\(M-C-l\))9
+b Fa(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)23 b Fb(17)150 4052 y
+Fe(clear-screen)28 b(\(C-l\))16 b Fa(:)f(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)31 b Fb(18)150 4140 y(colored-completion-pre\014x)9
+b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)24 b Fb(5)150 4229 y(colored-stats)17
+b Fa(:)d(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)h(:)31 b Fb(6)150 4317 y(commen)n(t-b)r(egin)6 b Fa(:)14
+b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21
+b Fb(6)150 4405 y Fe(complete)27 b(\(TAB\))10 b Fa(:)k(:)f(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fb(22)150 4494
+y(completion-displa)n(y-width)10 b Fa(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)25
+b Fb(6)150 4582 y(completion-ignore-case)c Fa(:)13 b(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)34 b Fb(6)150 4670 y(completion-map-case)15
+b Fa(:)f(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)30 b Fb(6)150
+4759 y(completion-pre\014x-displa)n(y-length)14 b Fa(:)e(:)h(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)28 b
+Fb(6)150 4847 y(completion-query-items)6 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)21 b Fb(6)150 4936 y(con)n(v)n(ert-meta)9
+b Fa(:)k(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)24 b Fb(6)150 5024 y Fe(copy-backward-word)30
+b(\(\))9 b Fa(:)k(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)23 b Fb(22)150
+5112 y Fe(copy-forward-word)29 b(\(\))11 b Fa(:)j(:)f(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)26 b Fb(22)150 5199 y Fe(copy-region-as-kill)k(\(\))6
+b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)21 b Fb(22)2021 817 y Fr(D)2025
+933 y Fe(delete-char)28 b(\(C-d\))20 b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)34 b Fb(20)2025 1020 y Fe(delete-char-or-list)c(\(\))6
+b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fb(23)2025 1108 y Fe
+(delete-horizontal-space)31 b(\(\))13 b Fa(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)28 b Fb(22)2025
+1195 y Fe(digit-argument)h(\()p Fc(M-0)p Fe(,)d Fc(M-1)p
+Fe(,)h(...)f Fc(M--)p Fe(\))13 b Fa(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)28 b Fb(22)2025 1282 y(disable-completion)20 b Fa(:)13
+b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(7)2025
+1370 y Fe(do-lowercase-version)c(\(M-A,)d(M-B,)f(M-)p
+Fc(x)p Fe(,)h(...\))12 b Fa(:)i(:)27 b Fb(23)2025 1457
+y Fe(downcase-word)h(\(M-l\))14 b Fa(:)g(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)28
+b Fb(20)2025 1544 y Fe(dump-functions)h(\(\))19 b Fa(:)13
+b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(24)2025
+1631 y Fe(dump-macros)28 b(\(\))10 b Fa(:)j(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)24 b Fb(25)2025 1719 y Fe(dump-variables)29
+b(\(\))19 b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34
+b Fb(25)2021 1965 y Fr(E)2025 2081 y Fb(ec)n(ho-con)n(trol-c)n
+(haracters)13 b Fa(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)29
+b Fb(7)2025 2169 y(editing-mo)r(de)10 b Fa(:)j(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)25 b Fb(7)2025
+2256 y Fe(emacs-editing-mode)k(\(C-e\))18 b Fa(:)d(:)e(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)33
+b Fb(25)2025 2343 y(emacs-mo)r(de-string)18 b Fa(:)c(:)f(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)33 b Fb(7)2025 2431 y(enable-activ)n
+(e-region)15 b Fa(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)30
+b Fb(7)2025 2518 y(enable-brac)n(k)n(eted-paste)18 b
+Fa(:)12 b(:)h(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)33 b Fb(7)2025
+2605 y(enable-k)n(eypad)7 b Fa(:)12 b(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)23 b Fb(7)2025 2692 y
+Fe(end-kbd-macro)28 b(\(C-x)f(\)\))16 b Fa(:)d(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)30
+b Fb(23)2025 2780 y Fc(end-of-file)e Fe(\(usually)f(C-d\))d
+Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)37 b Fb(19)2025 2867 y Fe(end-of-history)29
+b(\(M->\))11 b Fa(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 b Fb(18)2025
+2954 y Fe(end-of-line)i(\(C-e\))20 b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)34 b Fb(17)2025 3042 y Fe(exchange-point-and-mark)d(\(C-x)
+26 b(C-x\))20 b Fa(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34
+b Fb(24)2025 3129 y(expand-tilde)19 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fb(8)2021
+3373 y Fr(F)2025 3490 y Fe(fetch-history)28 b(\(\))22
+b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36
+b Fb(19)2025 3577 y Fe(forward-backward-delete-char)c(\(\))17
+b Fa(:)d(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)32
+b Fb(20)2025 3664 y Fe(forward-char)c(\(C-f\))16 b Fa(:)f(:)e(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)31 b Fb(17)2025 3751 y Fe(forward-search-history)f
+(\(C-s\))8 b Fa(:)15 b(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)23 b Fb(18)2025 3839 y Fe(forward-word)28
+b(\(M-f\))16 b Fa(:)f(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)31
+b Fb(17)2021 4075 y Fr(H)2025 4191 y Fb(history-preserv)n(e-p)r(oin)n
+(t)15 b Fa(:)d(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)30 b Fb(8)2025
+4278 y Fe(history-search-backward)h(\(\))13 b Fa(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)28 b
+Fb(18)2025 4366 y Fe(history-search-forward)i(\(\))16
+b Fa(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)30 b Fb(18)2025 4453 y(history-size)22 b Fa(:)13
+b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)37 b Fb(8)2025 4540 y Fe(history-substring-search-backw)q(ard)32
+b(\(\))22 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)36 b Fb(19)2025
+4628 y Fe(history-substring-search-forwa)q(rd)c(\(\))7
+b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)22 b Fb(19)2025
+4715 y(horizon)n(tal-scroll-mo)r(de)10 b Fa(:)15 b(:)e(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)g(:)h(:)25 b Fb(8)2021 4950 y Fr(I)2025 5066 y Fb(input-meta)9
+b Fa(:)j(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)24 b Fb(8)2025 5154 y Fe(insert-comment)29
+b(\(M-#\))11 b Fa(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 b Fb(24)2025
+5241 y Fe(insert-completions)j(\(M-*\))18 b Fa(:)d(:)e(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)33
+b Fb(23)2025 5328 y(isearc)n(h-terminators)9 b Fa(:)14
+b(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)24 b Fb(8)p
+eop end
+%%Page: 80 84
+TeXDict begin 80 83 bop 150 -116 a Ft(F)-8 b(unction)31
+b(and)f(V)-8 b(ariable)32 b(Index)2370 b(80)146 294 y
+Fr(K)150 423 y Fb(k)n(eymap)14 b Fa(:)e(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)29
+b Fb(8)150 514 y Fe(kill-line)f(\(C-k\))7 b Fa(:)14 b(:)f(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fb(21)150 605 y
+Fe(kill-region)28 b(\(\))10 b Fa(:)j(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)24 b Fb(22)150 697 y Fe(kill-whole-line)29
+b(\(\))16 b Fa(:)e(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)31
+b Fb(21)150 784 y Fe(kill-word)d(\(M-d\))7 b Fa(:)14
+b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21
+b Fb(21)146 1106 y Fr(M)150 1235 y Fb(mark-mo)r(di\014ed-lines)c
+Fa(:)c(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)32 b Fb(9)150
+1326 y(mark-symlink)n(ed-directories)14 b Fa(:)f(:)g(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)29
+b Fb(9)150 1417 y(matc)n(h-hidden-\014les)7 b Fa(:)12
+b(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)22
+b Fb(9)150 1509 y Fe(menu-complete)29 b(\(\))22 b Fa(:)13
+b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fb(23)150
+1600 y Fe(menu-complete-backward)31 b(\(\))16 b Fa(:)d(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)30
+b Fb(23)150 1692 y(men)n(u-complete-displa)n(y-pre\014x)10
+b Fa(:)h(:)j(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)25 b Fb(9)150 1779 y(meta-\015ag)d Fa(:)13
+b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)36 b Fb(8)146 2109 y Fr(N)150 2238 y Fe(next-history)28
+b(\(C-n\))16 b Fa(:)f(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)31
+b Fb(18)150 2329 y Fe(next-screen-line)e(\(\))14 b Fa(:)g(:)f(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)28 b Fb(17)150 2401 y Fe(non-incremental-forward-)227
+2488 y(search-history)h(\(M-n\))7 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21
+b Fb(18)150 2576 y Fe(non-incremental-reverse-)227 2663
+y(search-history)29 b(\(M-p\))7 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21
+b Fb(18)146 3004 y Fr(O)150 3133 y Fe(operate-and-get-next)30
+b(\(C-o\))13 b Fa(:)h(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)27 b Fb(19)150 3224 y(output-meta)18
+b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)34 b Fb(9)150 3311 y Fe(overwrite-mode)29 b(\(\))19
+b Fa(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fb(21)146
+3633 y Fr(P)150 3762 y Fb(page-completions)6 b Fa(:)15
+b(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)20
+b Fb(10)150 3853 y Fe(possible-completions)30 b(\(M-?\))13
+b Fa(:)h(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)27 b Fb(22)150 3945 y Fe(prefix-meta)h(\(ESC\))20
+b Fa(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fb(24)150
+4036 y Fe(previous-history)c(\(C-p\))6 b Fa(:)15 b(:)e(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)21
+b Fb(18)150 4128 y Fe(previous-screen-line)30 b(\(\))21
+b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)35 b Fb(17)150 4215 y Fe(print-last-kbd-macro)30
+b(\(\))21 b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fb(23)146 4547 y
+Fr(Q)150 4672 y Fe(quoted-insert)29 b(\(C-q)d(or)g(C-v\))10
+b Fa(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)24 b Fb(20)2021 294 y Fr(R)2025 410 y Fe(re-read-init-file)29
+b(\(C-x)e(C-r\))17 b Fa(:)d(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)32 b Fb(23)2025 498 y Fe(readline)18
+b Fa(:)d(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)33 b Fb(26)2025 585 y Fe(redraw-current-line)d(\(\))6
+b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fb(18)2025 672 y Fe
+(reverse-search-history)30 b(\(C-r\))8 b Fa(:)15 b(:)e(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)23 b Fb(18)2025
+760 y(rev)n(ert-all-at-newline)8 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)23 b Fb(10)2025 847 y Fe(revert-line)28 b(\(M-r\))20
+b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(24)2025
+935 y Fe(rl_activate_mark)15 b Fa(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)29 b Fb(45)2025 1022 y Fe(rl_add_defun)8 b Fa(:)15
+b(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)22
+b Fb(35)2025 1109 y Fe(rl_add_funmap_entry)7 b Fa(:)17
+b(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)22 b Fb(39)2025 1197 y
+Fe(rl_add_undo)10 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)25 b Fb(39)2025 1284 y Fe(rl_alphabetic)g
+Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)37
+b Fb(44)2025 1371 y Fe(rl_begin_undo_group)7 b Fa(:)17
+b(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)22 b Fb(39)2025 1459 y
+Fe(rl_bind_key)10 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)25 b Fb(36)2025 1546 y Fe
+(rl_bind_key_if_unbound)16 b Fa(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)31
+b Fb(36)2025 1633 y Fe(rl_bind_key_if_unbound_in_map)16
+b Fa(:)j(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30
+b Fb(36)2025 1721 y Fe(rl_bind_key_in_map)10 b Fa(:)17
+b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fb(36)2025 1808
+y Fe(rl_bind_keyseq)f Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)34 b Fb(37)2025 1896 y Fe(rl_bind_keyseq_if_unbound)9
+b Fa(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)23 b Fb(37)2025 1983 y Fe(rl_bind_keyseq_if_unbound_in_m)q
+(ap)8 b Fa(:)19 b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)23
+b Fb(37)2025 2070 y Fe(rl_bind_keyseq_in_map)h Fa(:)13
+b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)34 b Fb(37)2025 2158 y Fe
+(rl_callback_handler_install)27 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fb(46)2025 2245 y
+Fe(rl_callback_handler_remove)6 b Fa(:)19 b(:)13 b(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fb(46)2025
+2332 y Fe(rl_callback_read_char)j Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34
+b Fb(46)2025 2420 y Fe(rl_callback_sigcleanup)16 b Fa(:)i(:)13
+b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)31 b Fb(46)2025 2507 y Fe(rl_check_signals)15
+b Fa(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)29 b
+Fb(52)2025 2595 y Fe(rl_cleanup_after_signal)14 b Fa(:)k(:)13
+b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)h(:)28 b Fb(52)2025 2682 y Fe(rl_clear_history)15
+b Fa(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)29 b
+Fb(45)2025 2769 y Fe(rl_clear_message)15 b Fa(:)h(:)d(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)29 b Fb(40)2025 2857 y Fe(rl_clear_pending_input)16
+b Fa(:)i(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)31 b Fb(42)2025 2944 y Fe(rl_clear_signals)15
+b Fa(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)29 b
+Fb(53)2025 3031 y Fe(rl_clear_visible_line)24 b Fa(:)13
+b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)34 b Fb(40)2025 3119 y Fe(rl_complete)10
+b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)25 b Fb(54)2025 3206 y Fe(rl_complete_internal)h
+Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)36 b Fb(54)2025 3293 y
+Fe(rl_completion_matches)24 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34
+b Fb(55)2025 3381 y Fe(rl_completion_mode)10 b Fa(:)17
+b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fb(55)2025 3468
+y Fe(rl_copy_keymap)f Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)34 b Fb(35)2025 3556 y Fe(rl_copy_text)8 b Fa(:)15
+b(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)22
+b Fb(41)2025 3643 y Fe(rl_crlf)g Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35
+b Fb(40)2025 3730 y Fe(rl_deactivate_mark)10 b Fa(:)17
+b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fb(45)2025 3818
+y Fe(rl_delete_text)f Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)34 b Fb(41)2025 3905 y Fe(rl_deprep_terminal)10
+b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fb(43)2025
+3992 y Fe(rl_ding)e Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fb(44)2025
+4080 y Fe(rl_discard_keymap)12 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)27 b Fb(35)2025 4167 y Fe(rl_display_match_list)d
+Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(44)2025 4255 y Fe(rl_do_undo)13
+b Fa(:)i(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)h(:)27 b Fb(39)2025 4342 y Fe(rl_echo_signal_char)7
+b Fa(:)17 b(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)22 b Fb(52)2025
+4429 y Fe(rl_empty_keymap)17 b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)32 b Fb(35)2025 4517 y Fe(rl_end_undo_group)12
+b Fa(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)27 b Fb(39)2025
+4604 y Fe(rl_execute_next)17 b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)32 b Fb(42)2025 4691 y Fe(rl_expand_prompt)15
+b Fa(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)29 b
+Fb(41)2025 4779 y Fe(rl_extend_line_buffer)24 b Fa(:)13
+b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)34 b Fb(44)2025 4866 y Fe
+(rl_filename_completion_functio)q(n)11 b Fa(:)19 b(:)13
+b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)25 b Fb(55)2025
+4954 y Fe(rl_forced_update_display)11 b Fa(:)19 b(:)13
+b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)26 b Fb(40)2025 5041 y Fe(rl_free)c Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35
+b Fb(43)2025 5128 y Fe(rl_free_keymap)23 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)34 b Fb(35)p eop end
+%%Page: 81 85
+TeXDict begin 81 84 bop 150 -116 a Ft(F)-8 b(unction)31
+b(and)f(V)-8 b(ariable)32 b(Index)2370 b(81)150 260 y
+Fe(rl_free_line_state)10 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24
+b Fb(52)150 348 y Fe(rl_free_undo_list)12 b Fa(:)17 b(:)c(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)h(:)26 b Fb(39)150 437 y Fe(rl_function_dumper)10
+b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fb(38)150
+525 y Fe(rl_function_of_keyseq)g Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33
+b Fb(38)150 614 y Fe(rl_function_of_keyseq_len)9 b Fa(:)19
+b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)23 b Fb(38)150 702 y Fe(rl_funmap_names)17 b Fa(:)g(:)c(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)g(:)g(:)32 b Fb(39)150 791 y Fe(rl_generic_bind)17
+b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)32
+b Fb(37)150 879 y Fe(rl_get_keymap)25 b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fb(35)150 968 y
+Fe(rl_get_keymap_by_name)24 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33
+b Fb(36)150 1057 y Fe(rl_get_keymap_name)10 b Fa(:)17
+b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fb(36)150 1145
+y Fe(rl_get_screen_size)10 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+24 b Fb(53)150 1234 y Fe(rl_get_termcap)f Fa(:)13 b(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)34 b Fb(45)150 1322 y Fe(rl_getc)22
+b Fa(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)35 b Fb(42)150 1411 y Fe(rl_initialize)25
+b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37
+b Fb(44)150 1499 y Fe(rl_insert_completions)24 b Fa(:)13
+b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)33 b Fb(55)150 1588 y Fe(rl_insert_text)23
+b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)34
+b Fb(41)150 1676 y Fe(rl_invoking_keyseqs)7 b Fa(:)17
+b(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fb(38)150 1765 y
+Fe(rl_invoking_keyseqs_in_map)7 b Fa(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21 b Fb(38)150
+1853 y Fe(rl_keep_mark_active)7 b Fa(:)17 b(:)d(:)f(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+21 b Fb(46)150 1942 y Fe(rl_kill_text)8 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)22 b Fb(41)150
+2030 y Fe(rl_list_funmap_names)k Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)36
+b Fb(38)150 2119 y Fe(rl_macro_bind)25 b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fb(45)150 2207 y
+Fe(rl_macro_dumper)17 b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+g(:)32 b Fb(45)150 2296 y Fe(rl_make_bare_keymap)7 b
+Fa(:)17 b(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fb(35)150
+2384 y Fe(rl_make_keymap)i Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)34 b Fb(35)150 2473 y Fe(rl_mark_active_p)15
+b Fa(:)h(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)29 b
+Fb(46)150 2561 y Fe(rl_message)13 b Fa(:)i(:)e(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)27 b Fb(40)150
+2650 y Fe(rl_modifying)8 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)22 b Fb(40)150 2738 y Fe(rl_named_function)
+12 b Fa(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)26
+b Fb(38)150 2827 y Fe(rl_on_new_line)d Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)34 b Fb(40)150 2915 y Fe
+(rl_on_new_line_with_prompt)7 b Fa(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21 b Fb(40)150
+3004 y Fe(rl_parse_and_bind)12 b Fa(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)h(:)26 b Fb(37)150 3092 y Fe(rl_pending_signal)12
+b Fa(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)26 b Fb(52)150
+3181 y Fe(rl_possible_completions)14 b Fa(:)k(:)13 b(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28
+b Fb(55)150 3269 y Fe(rl_prep_terminal)15 b Fa(:)h(:)e(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)29 b Fb(43)150 3358 y Fe(rl_push_macro_input)7
+b Fa(:)17 b(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fb(41)150
+3446 y Fe(rl_read_init_file)12 b Fa(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)h(:)26 b Fb(38)150 3535 y Fe(rl_read_key)10 b Fa(:)16
+b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)25
+b Fb(42)150 3623 y Fe(rl_redisplay)8 b Fa(:)16 b(:)d(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)22 b Fb(40)150
+3712 y Fe(rl_replace_line)17 b Fa(:)g(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)32 b Fb(43)150 3801 y Fe(rl_reset_after_signal)24
+b Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fb(52)150 3889 y Fe
+(rl_reset_line_state)7 b Fa(:)17 b(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21
+b Fb(40)150 3978 y Fe(rl_reset_screen_size)26 b Fa(:)13
+b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)36 b Fb(53)150 4066 y Fe(rl_reset_terminal)12
+b Fa(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)26 b Fb(43)150
+4155 y Fe(rl_resize_terminal)10 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)24 b Fb(53)150 4243 y Fe(rl_restore_prompt)12 b Fa(:)17
+b(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)26 b Fb(41)150
+4332 y Fe(rl_restore_state)15 b Fa(:)h(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)29 b Fb(43)150 4420 y Fe(rl_save_prompt)23 b
+Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)34
+b Fb(41)150 4509 y Fe(rl_save_state)25 b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fb(43)150 4597 y
+Fe(rl_set_key)13 b Fa(:)i(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)27 b Fb(37)150 4686 y Fe
+(rl_set_keyboard_input_timeout)17 b Fa(:)h(:)c(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)30 b Fb(42)150 4774 y Fe(rl_set_keymap)25
+b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37
+b Fb(35)150 4863 y Fe(rl_set_keymap_name)10 b Fa(:)17
+b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fb(36)150 4951
+y Fe(rl_set_paren_blink_timeout)7 b Fa(:)18 b(:)13 b(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21 b Fb(45)150
+5040 y Fe(rl_set_prompt)k Fa(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)37 b Fb(41)150 5128 y Fe(rl_set_screen_size)10
+b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fb(53)2025
+260 y Fe(rl_set_signals)f Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)34 b Fb(53)2025 349 y Fe(rl_set_timeout)23
+b Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)34
+b Fb(42)2025 438 y Fe(rl_show_char)8 b Fa(:)15 b(:)f(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)22 b Fb(40)2025
+527 y Fe(rl_stuff_char)j Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)37 b Fb(42)2025 615 y Fe(rl_timeout_remaining)26
+b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)36 b Fb(42)2025 704 y
+Fe(rl_trim_arg_from_keyseq)14 b Fa(:)k(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)28
+b Fb(38)2025 793 y Fe(rl_tty_set_default_bindings)f Fa(:)13
+b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35
+b Fb(43)2025 882 y Fe(rl_tty_set_echoing)10 b Fa(:)17
+b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fb(43)2025 971
+y Fe(rl_tty_unset_default_bindings)16 b Fa(:)j(:)13 b(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30 b Fb(43)2025 1060 y
+Fe(rl_unbind_command_in_map)11 b Fa(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26
+b Fb(37)2025 1149 y Fe(rl_unbind_function_in_map)9 b
+Fa(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)23 b Fb(37)2025 1238 y Fe(rl_unbind_key)i
+Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)37
+b Fb(37)2025 1326 y Fe(rl_unbind_key_in_map)26 b Fa(:)13
+b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)36 b Fb(37)2025 1415 y Fe
+(rl_username_completion_functio)q(n)11 b Fa(:)19 b(:)13
+b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)25 b Fb(55)2025
+1504 y Fe(rl_variable_bind)15 b Fa(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)29 b Fb(45)2025 1593 y Fe(rl_variable_dumper)10
+b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fb(45)2025
+1680 y Fe(rl_variable_value)12 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)27 b Fb(45)2021 1951 y Fr(S)2025 2072 y Fe(self-insert)h(\(a,)e
+(b,)g(A,)g(1,)g(!,)g(...)q(\))15 b Fa(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)29 b Fb(20)2025 2161 y Fe(set-mark)e(\(C-@\))10
+b Fa(:)k(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)24
+b Fb(24)2025 2250 y Fe(shell-transpose-words)30 b(\(M-C-t\))24
+b Fa(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)37
+b Fb(21)2025 2339 y(sho)n(w-all-if-am)n(biguous)18 b
+Fa(:)d(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)32 b Fb(10)2025 2428
+y(sho)n(w-all-if-unmo)r(di\014ed)9 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)24 b Fb(10)2025 2517 y(sho)n(w-mo)r(de-in-prompt)12
+b Fa(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)27 b Fb(10)2025 2606
+y(skip-completed-text)15 b Fa(:)c(:)i(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+29 b Fb(10)2025 2695 y Fe(skip-csi-sequence)g(\(\))11
+b Fa(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 b Fb(24)2025 2782
+y Fe(start-kbd-macro)j(\(C-x)d(\(\))10 b Fa(:)k(:)f(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)25
+b Fb(23)2021 3052 y Fr(T)2025 3173 y Fe(tab-insert)j(\(M-TAB\))16
+b Fa(:)f(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)31 b Fb(20)2025
+3262 y Fe(tilde-expand)d(\(M-~\))16 b Fa(:)f(:)e(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)31 b Fb(24)2025 3351 y Fe(transpose-chars)e(\(C-t\))9
+b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)23 b Fb(20)2025 3438 y
+Fe(transpose-words)29 b(\(M-t\))9 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)23
+b Fb(20)2021 3718 y Fr(U)2025 3839 y Fe(undo)j(\(C-_)h(or)f(C-x)g
+(C-u\))12 b Fa(:)i(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)27 b Fb(24)2025
+3928 y Fe(universal-argument)i(\(\))9 b Fa(:)14 b(:)f(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+23 b Fb(22)2025 4017 y Fe(unix-filename-rubout)30 b(\(\))21
+b Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)35 b Fb(21)2025 4106 y Fe(unix-line-discard)29
+b(\(C-u\))22 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fb(21)2025 4195
+y Fe(unix-word-rubout)29 b(\(C-w\))6 b Fa(:)14 b(:)g(:)f(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21
+b Fb(21)2025 4282 y Fe(upcase-word)28 b(\(M-u\))20 b
+Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fb(20)2021
+4562 y Fr(V)2025 4683 y Fb(vi-cmd-mo)r(de-string)18 b
+Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fb(11)2025
+4772 y Fe(vi-editing-mode)c(\(M-C-j\))22 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35
+b Fb(25)2025 4861 y(vi-ins-mo)r(de-string)8 b Fa(:)13
+b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)23 b Fb(11)2025
+4948 y(visible-stats)11 b Fa(:)j(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)26 b Fb(11)p eop end
+%%Page: 82 86
+TeXDict begin 82 85 bop 150 -116 a Ft(F)-8 b(unction)31
+b(and)f(V)-8 b(ariable)32 b(Index)2370 b(82)146 294 y
+Fr(Y)150 410 y Fe(yank)27 b(\(C-y\))20 b Fa(:)13 b(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)34 b
+Fb(22)150 497 y Fe(yank-last-arg)29 b(\(M-.)d(or)g(M-_\))10
+b Fa(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)24 b Fb(19)150 584 y Fe(yank-nth-arg)k(\(M-C-y\))11
+b Fa(:)k(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)26 b Fb(19)150 671 y
+Fe(yank-pop)h(\(M-y\))10 b Fa(:)k(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)24 b Fb(22)p eop end
+%%Trailer
+
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/doc/readline_3.ps b/doc/readline_3.ps
new file mode 100644
index 0000000..91d94ef
--- /dev/null
+++ b/doc/readline_3.ps
@@ -0,0 +1,1782 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.22.4
+%%CreationDate: Tue Sep 20 10:17:06 2022
+%%DocumentNeededResources: font Times-Roman
+%%+ font Times-Bold
+%%+ font Times-Italic
+%%+ font Courier
+%%DocumentSuppliedResources: procset grops 1.22 4
+%%Pages: 17
+%%PageOrder: Ascend
+%%DocumentMedia: Default 612 792 0 () ()
+%%Orientation: Portrait
+%%EndComments
+%%BeginDefaults
+%%PageMedia: Default
+%%EndDefaults
+%%BeginProlog
+%%BeginResource: procset grops 1.22 4
+%!PS-Adobe-3.0 Resource-ProcSet
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/MANUAL{
+statusdict begin/manualfeed true store end
+}bind def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+DEFS/BPhook known{DEFS begin BPhook end}if
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/Fr{
+setrgbcolor fill
+}bind def
+/setcmykcolor where{
+pop
+/Fk{
+setcmykcolor fill
+}bind def
+}if
+/Fg{
+setgray fill
+}bind def
+/FL/fill load def
+/LW/setlinewidth load def
+/Cr/setrgbcolor load def
+/setcmykcolor where{
+pop
+/Ck/setcmykcolor load def
+}if
+/Cg/setgray load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne
+2 index/UniqueID ne
+and
+{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+/setpagedevice{}def
+mark
+}bind def
+/PEND{
+cleartomark
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%BeginFeature: *PageSize Default
+<< /PageSize [ 612 792 ] /ImagingBBox null >> setpagedevice
+%%EndFeature
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Times-Bold
+%%IncludeResource: font Times-Italic
+%%IncludeResource: font Courier
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72
+def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron
+/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent
+/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen
+/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
+/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O
+/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex
+/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y
+/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft
+/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl
+/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen
+/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft
+/logicalnot/minus/registered/macron/degree/plusminus/twosuperior
+/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
+/ordmasculine/guilsinglright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
+/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
+/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash
+/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def
+/Courier@0 ENC0/Courier RE/Times-Italic@0 ENC0/Times-Italic RE
+/Times-Bold@0 ENC0/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10.95/Times-Bold@0 SF
+-.219(NA)72 84 S(ME).219 E F0
+(readline \255 get a line from a user with editing)108 96 Q F1(SYNOPSIS)
+72 112.8 Q/F2 10/Times-Bold@0 SF(#include <stdio.h>)108 124.8 Q
+(#include <r)108 136.8 Q(eadline/r)-.18 E(eadline.h>)-.18 E(#include <r)
+108 148.8 Q(eadline/history)-.18 E(.h>)-.7 E/F3 10/Times-Italic@0 SF
+-.15(ch)108 165.6 S(ar *).15 E F2 -.18(re)108 177.6 S(adline).18 E F0
+(\()2.5 E F3(const c)A(har *pr)-.15 E(ompt)-.45 E F0(\);)A F1(COPYRIGHT)
+72 194.4 Q F0(Readline is Cop)108 206.4 Q
+(yright \251 1989\2552020 Free Softw)-.1 E(are F)-.1 E(oundation, Inc.)
+-.15 E F1(DESCRIPTION)72 223.2 Q F2 -.18(re)108 235.2 S(adline).18 E F0
+.088(will read a line from the terminal and return it, using)2.588 F F2
+(pr)2.587 E(ompt)-.18 E F0 .087(as a prompt.)2.587 F(If)5.087 E F2(pr)
+2.587 E(ompt)-.18 E F0(is)2.587 E F2(NULL)2.587 E F0(or)2.587 E .399
+(the empty string, no prompt is issued.)108 247.2 R .399
+(The line returned is allocated with)5.399 F F3(malloc)3.28 E F0 .4
+(\(3\); the caller must free it).31 F(when \214nished.)108 259.2 Q
+(The line returned has the \214nal ne)5 E(wline remo)-.25 E -.15(ve)-.15
+G(d, so only the te).15 E(xt of the line remains.)-.15 E F2 -.18(re)108
+276 S(adline).18 E F0(of)3.79 E 1.29
+(fers editing capabilities while the user is entering the line.)-.25 F
+1.289(By def)6.289 F 1.289(ault, the line editing com-)-.1 F
+(mands are similar to those of emacs.)108 288 Q 2.5(Av)5 G
+(i\255style line editing interf)-2.5 E(ace is also a)-.1 E -.25(va)-.2 G
+(ilable.).25 E .272
+(This manual page describes only the most basic use of)108 304.8 R F2
+-.18(re)2.772 G(adline).18 E F0 5.272(.M)C .272
+(uch more functionality is a)-5.272 F -.25(va)-.2 G .272(ilable; see).25
+F F3(The GNU Readline Libr)108 316.8 Q(ary)-.15 E F0(and)2.5 E F3
+(The GNU History Libr)2.5 E(ary)-.15 E F0(for additional information.)
+2.5 E F1(RETURN V)72 333.6 Q(ALUE)-1.478 E F2 -.18(re)108 345.6 S
+(adline).18 E F0 1.09(returns the te)3.59 F 1.09(xt of the line read.)
+-.15 F 3.589(Ab)6.09 G 1.089(lank line returns the empty string.)-3.589
+F(If)6.089 E F2(EOF)3.589 E F0 1.089(is encountered)3.589 F .283
+(while reading a line, and the line is empty)108 357.6 R(,)-.65 E F2
+(NULL)2.783 E F0 .283(is returned.)2.783 F .283(If an)5.283 F F2(EOF)
+2.783 E F0 .283(is read with a non\255empty line, it)2.783 F
+(is treated as a ne)108 369.6 Q(wline.)-.25 E F1(NO)72 386.4 Q -.986(TA)
+-.438 G(TION)-.054 E F0 .077
+(An Emacs-style notation is used to denote k)108 398.4 R -.15(ey)-.1 G
+(strok).15 E 2.576(es. Control)-.1 F -.1(ke)2.576 G .076
+(ys are denoted by C\255)-.05 F F3 -.1(ke)C(y)-.2 E F0 2.576(,e)C .076
+(.g., C\255n means)-2.576 F 2.582(Control\255N. Similarly)108 410.4 R(,)
+-.65 E F3(meta)2.962 E F0 -.1(ke)2.842 G .082(ys are denoted by M\255)
+-.05 F F3 -.1(ke)C(y)-.2 E F0 2.583(,s)C 2.583(oM)-2.583 G .083
+(\255x means Meta\255X.)-2.583 F .083(\(On k)5.083 F -.15(ey)-.1 G .083
+(boards without a).15 F F3(meta)108.38 422.4 Q F0 -.1(ke)3.472 G 2.012
+-.65(y, M)-.05 H<ad>.65 E F3(x)A F0 .712(means ESC)3.212 F F3(x)3.212 E
+F0 3.212(,i)C .712(.e., press the Escape k)-3.212 F 1.011 -.15(ey t)-.1
+H .711(hen the).15 F F3(x)3.981 E F0 -.1(ke)3.741 G 4.511 -.65(y. T)-.05
+H .711(his mak).65 F .711(es ESC the)-.1 F F3 .711(meta pr)3.211 F
+(e\214x)-.37 E F0(.)A .48(The combination M\255C\255)108 434.4 R F3(x)A
+F0 .48(means ESC\255Control\255)2.98 F F3(x)A F0 2.98(,o)C 2.98(rp)-2.98
+G .48(ress the Escape k)-2.98 F .78 -.15(ey t)-.1 H .48
+(hen hold the Control k).15 F .78 -.15(ey w)-.1 H(hile).15 E
+(pressing the)108 446.4 Q F3(x)3.27 E F0 -.1(ke)3.03 G -.65(y.)-.05 G
+(\)).65 E .596(Readline commands may be gi)108 463.2 R -.15(ve)-.25 G
+3.096(nn).15 G(umeric)-3.096 E F3(ar)3.426 E(guments)-.37 E F0 3.096(,w)
+.27 G .596(hich normally act as a repeat count.)-3.096 F(Sometimes,)
+5.595 E(ho)108 475.2 Q(we)-.25 E -.15(ve)-.25 G 1.418 -.4(r, i).15 H
+3.118(ti).4 G 3.119(st)-3.118 G .619(he sign of the ar)-3.119 F .619
+(gument that is signi\214cant.)-.18 F -.15(Pa)5.619 G .619(ssing a ne)
+.15 F -.05(ga)-.15 G(ti).05 E .919 -.15(ve a)-.25 H -.18(rg).15 G .619
+(ument to a command that).18 F 1.019(acts in the forw)108 487.2 R 1.018
+(ard direction \(e.g.,)-.1 F F2(kill\255line)3.518 E F0 3.518(\)c)C
+1.018(auses that command to act in a backw)-3.518 F 1.018
+(ard direction.)-.1 F(Com-)6.018 E(mands whose beha)108 499.2 Q
+(vior with ar)-.2 E(guments de)-.18 E(viates from this are noted belo)
+-.25 E -.65(w.)-.25 G .811(When a command is described as)108 516 R F3
+(killing)3.311 E F0(te)3.311 E .811(xt, the te)-.15 F .811
+(xt deleted is sa)-.15 F -.15(ve)-.2 G 3.311(df).15 G .812
+(or possible future retrie)-3.311 F -.25(va)-.25 G 3.312(l\().25 G F3
+(yank-)-3.312 E(ing)108 528 Q F0 2.529(\). The)B .029(killed te)2.529 F
+.029(xt is sa)-.15 F -.15(ve)-.2 G 2.529(di).15 G 2.529(na)-2.529 G F3
+.029(kill ring)B F0 5.029(.C)C(onsecuti)-5.029 E .329 -.15(ve k)-.25 H
+.029(ills cause the te).15 F .029(xt to be accumulated into one unit,)
+-.15 F .567(which can be yank)108 540 R .567(ed all at once.)-.1 F .567
+(Commands which do not kill te)5.567 F .567
+(xt separate the chunks of te)-.15 F .567(xt on the kill)-.15 F(ring.)
+108 552 Q F1(INITIALIZA)72 568.8 Q(TION FILE)-1.04 E F0 .091(Readline i\
+s customized by putting commands in an initialization \214le \(the)108
+580.8 R F3(inputr)2.591 E(c)-.37 E F0 2.591(\214le\). The)2.591 F .091
+(name of this \214le)2.591 F .156(is tak)108 592.8 R .156(en from the v)
+-.1 F .156(alue of the)-.25 F F2(INPUTRC)2.656 E F0(en)2.656 E .156
+(vironment v)-.4 F 2.656(ariable. If)-.25 F .156(that v)2.656 F .156
+(ariable is unset, the def)-.25 F .157(ault is)-.1 F F3(~/.in-)2.157 E
+(putr)108 604.8 Q(c)-.37 E F0 5.905(.I).31 G 3.405(ft)-5.905 G .905
+(hat \214le)-3.405 F .905(does not e)5.905 F .904
+(xist or cannot be read, the ultimate def)-.15 F .904(ault is)-.1 F F3
+(/etc/inputr)4.554 E(c)-.37 E F0 5.904(.W).31 G .904(hen a program)
+-5.904 F 1.158(which uses the readline library starts up, the init \214\
+le is read, and the k)108 616.8 R 1.459 -.15(ey b)-.1 H 1.159
+(indings and v).15 F 1.159(ariables are set.)-.25 F .029
+(There are only a fe)108 628.8 R 2.529(wb)-.25 G .029
+(asic constructs allo)-2.529 F .028(wed in the readline init \214le.)
+-.25 F .028(Blank lines are ignored.)5.028 F .028(Lines be)5.028 F(gin-)
+-.15 E .553(ning with a)108 640.8 R F2(#)3.053 E F0 .554(are comments.)
+3.053 F .554(Lines be)5.554 F .554(ginning with a)-.15 F F2($)3.054 E F0
+.554(indicate conditional constructs.)3.054 F .554(Other lines denote)
+5.554 F -.1(ke)108 652.8 S 2.987(yb)-.05 G .487(indings and v)-2.987 F
+.487(ariable settings.)-.25 F .487
+(Each program using this library may add its o)5.487 F .486
+(wn commands and bind-)-.25 F(ings.)108 664.8 Q -.15(Fo)108 681.6 S 2.5
+(re).15 G(xample, placing)-2.65 E(M\255Control\255u: uni)144 698.4 Q
+-.15(ve)-.25 G(rsal\255ar).15 E(gument)-.18 E(or)108 710.4 Q
+(C\255Meta\255u: uni)144 722.4 Q -.15(ve)-.25 G(rsal\255ar).15 E(gument)
+-.18 E(GNU Readline 8.2)72 768 Q(2022 September 19)120.405 E(1)190.115 E
+0 Cg EP
+%%Page: 2 2
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E(into the)108 84 Q/F1 10
+/Times-Italic@0 SF(inputr)2.51 E(c)-.37 E F0 -.1(wo)2.81 G(uld mak).1 E
+2.5(eM)-.1 G(\255C\255u e)-2.5 E -.15(xe)-.15 G
+(cute the readline command).15 E F1(univer)2.58 E(sal\255ar)-.1 E
+(gument)-.37 E F0(.).68 E 1.153(The follo)108 100.8 R 1.154
+(wing symbolic character names are recognized while processing k)-.25 F
+1.454 -.15(ey b)-.1 H(indings:).15 E F1(DEL)4.234 E F0(,).53 E F1(ESC)
+4.164 E F0(,).72 E F1(ES-)4.164 E(CAPE)108 112.8 Q F0(,).73 E F1(LFD)
+3.08 E F0(,).28 E F1(NEWLINE)3.2 E F0(,).73 E F1(RET)3.13 E F0(,)1.27 E
+F1(RETURN)3.13 E F0(,)1.1 E F1 -.4(RU)2.5 G(BOUT).4 E F0(,)1.27 E F1(SP)
+2.83 E -.3(AC)-.9 G(E).3 E F0(,).73 E F1(SPC)2.83 E F0 2.5(,a).72 G(nd)
+-2.5 E F1 -.5(TA)2.5 G(B).5 E F0(.).27 E .209
+(In addition to command names, readline allo)108 129.6 R .209(ws k)-.25
+F -.15(ey)-.1 G 2.709(st).15 G 2.709(ob)-2.709 G 2.709(eb)-2.709 G .209
+(ound to a string that is inserted when the k)-2.709 F .509 -.15(ey i)
+-.1 H(s).15 E(pressed \(a)108 141.6 Q F1(macr)2.5 E(o)-.45 E F0(\).)A/F2
+10/Times-Bold@0 SF -.25(Ke)87 158.4 S 2.5(yB).25 G(indings)-2.5 E F0
+.366(The syntax for controlling k)108 170.4 R .666 -.15(ey b)-.1 H .366
+(indings in the).15 F F1(inputr)2.876 E(c)-.37 E F0 .366
+(\214le is simple.)3.176 F .366(All that is required is the name of the)
+5.366 F .264(command or the te)108 182.4 R .264(xt of a macro and a k)
+-.15 F .564 -.15(ey s)-.1 H .264(equence to which it should be bound.)
+.15 F .263(The name may be speci-)5.264 F .138(\214ed in one of tw)108
+194.4 R 2.638(ow)-.1 G .138(ays: as a symbolic k)-2.738 F .438 -.15
+(ey n)-.1 H .138(ame, possibly with).15 F F1(Meta\255)2.638 E F0(or)
+2.638 E F1(Contr)2.638 E(ol\255)-.45 E F0(pre\214x)2.638 E .138
+(es, or as a k)-.15 F .439 -.15(ey s)-.1 H(e-).15 E 3.409(quence. The)
+108 206.4 R .909(name and k)3.409 F 1.209 -.15(ey s)-.1 H .909
+(equence are separated by a colon.).15 F .909
+(There can be no whitespace between the)5.909 F(name and the colon.)108
+218.4 Q .361(When using the form)108 235.2 R F2 -.1(ke)2.861 G(yname).1
+E F0(:)A F1(function-name).833 E F0(or)2.861 E F1(macr)2.861 E(o)-.45 E
+F0(,)A F1 -.1(ke)2.861 G(yname)-.2 E F0 .362(is the name of a k)3.042 F
+.662 -.15(ey s)-.1 H .362(pelled out in Eng-).15 F 2.5(lish. F)108 247.2
+R(or e)-.15 E(xample:)-.15 E(Control\255u: uni)144 271.2 Q -.15(ve)-.25
+G(rsal\255ar).15 E(gument)-.18 E(Meta\255Rubout: backw)144 283.2 Q
+(ard\255kill\255w)-.1 E(ord)-.1 E(Control\255o: "> output")144 295.2 Q
+.148(In the abo)108 312 R .448 -.15(ve ex)-.15 H(ample,).15 E F1(C\255u)
+2.488 E F0 .148(is bound to the function)2.898 F F2(uni)2.647 E -.1(ve)
+-.1 G(rsal\255ar).1 E(gument)-.1 E F0(,)A F1(M-DEL)3.327 E F0 .147
+(is bound to the function)3.177 F F2(backward\255kill\255w)108 324 Q
+(ord)-.1 E F0 3.005(,a)C(nd)-3.005 E F1(C\255o)2.845 E F0 .505
+(is bound to run the macro e)3.185 F .506
+(xpressed on the right hand side \(that is, to in-)-.15 F(sert the te)
+108 336 Q(xt)-.15 E/F3 10/Courier@0 SF 6(>o)2.5 G(utput)-6 E F0
+(into the line\).)2.5 E .056(In the second form,)108 352.8 R F2("k)2.556
+E(eyseq")-.1 E F0(:)A F1(function\255name).833 E F0(or)2.556 E F1(macr)
+2.556 E(o)-.45 E F0(,)A F2 -.1(ke)2.556 G(yseq).1 E F0(dif)2.555 E .055
+(fers from)-.25 F F2 -.1(ke)2.555 G(yname).1 E F0(abo)2.555 E .355 -.15
+(ve i)-.15 H 2.555(nt).15 G .055(hat strings)-2.555 F 1.284
+(denoting an entire k)108 364.8 R 1.584 -.15(ey s)-.1 H 1.284(equence m\
+ay be speci\214ed by placing the sequence within double quotes.).15 F
+(Some)6.284 E .386(GNU Emacs style k)108 376.8 R .686 -.15(ey e)-.1 H
+.385(scapes can be used, as in the follo).15 F .385(wing e)-.25 F .385
+(xample, b)-.15 F .385(ut the symbolic character names)-.2 F
+(are not recognized.)108 388.8 Q("\\C\255u": uni)144 412.8 Q -.15(ve)
+-.25 G(rsal\255ar).15 E(gument)-.18 E
+("\\C\255x\\C\255r": re\255read\255init\255\214le)144 424.8 Q
+("\\e[11~": "Function K)144 436.8 Q .3 -.15(ey 1)-.25 H(").15 E .198
+(In this e)108 453.6 R(xample,)-.15 E F1(C-u)2.538 E F0 .199(is ag)2.949
+F .199(ain bound to the function)-.05 F F2(uni)2.699 E -.1(ve)-.1 G
+(rsal\255ar).1 E(gument)-.1 E F0(.)A F1 .199(C-x C-r)5.039 F F0 .199
+(is bound to the function)3.429 F F2 -.18(re)108 465.6 S<ad72>.18 E
+(ead\255init\255\214le)-.18 E F0 2.5(,a)C(nd)-2.5 E F1(ESC [ 1 1 ~)3.01
+E F0(is bound to insert the te)3.94 E(xt)-.15 E F3(Function Key 1)2.5 E
+F0(.)A(The full set of GNU Emacs style escape sequences a)108 482.4 Q
+-.25(va)-.2 G(ilable when specifying k).25 E .3 -.15(ey s)-.1 H
+(equences is).15 E F2<5c43ad>144 494.4 Q F0(control pre\214x)180 494.4 Q
+F2<5c4dad>144 506.4 Q F0(meta pre\214x)180 506.4 Q F2(\\e)144 518.4 Q F0
+(an escape character)180 518.4 Q F2(\\\\)144 530.4 Q F0(backslash)180
+530.4 Q F2(\\")144 542.4 Q F0(literal ", a double quote)180 542.4 Q F2
+(\\')144 554.4 Q F0(literal ', a single quote)180 554.4 Q(In addition t\
+o the GNU Emacs style escape sequences, a second set of backslash escap\
+es is a)108 571.2 Q -.25(va)-.2 G(ilable:).25 E F2(\\a)144 583.2 Q F0
+(alert \(bell\))180 583.2 Q F2(\\b)144 595.2 Q F0(backspace)180 595.2 Q
+F2(\\d)144 607.2 Q F0(delete)180 607.2 Q F2(\\f)144 619.2 Q F0
+(form feed)180 619.2 Q F2(\\n)144 631.2 Q F0(ne)180 631.2 Q(wline)-.25 E
+F2(\\r)144 643.2 Q F0(carriage return)180 643.2 Q F2(\\t)144 655.2 Q F0
+(horizontal tab)180 655.2 Q F2(\\v)144 667.2 Q F0 -.15(ve)180 667.2 S
+(rtical tab).15 E F2(\\)144 679.2 Q F1(nnn)A F0
+(the eight-bit character whose v)180 679.2 Q(alue is the octal v)-.25 E
+(alue)-.25 E F1(nnn)2.5 E F0(\(one to three digits\))2.5 E F2(\\x)144
+691.2 Q F1(HH)A F0(the eight-bit character whose v)180 691.2 Q
+(alue is the he)-.25 E(xadecimal v)-.15 E(alue)-.25 E F1(HH)2.5 E F0
+(\(one or tw)2.5 E 2.5(oh)-.1 G .3 -.15(ex d)-2.5 H(igits\)).15 E .74
+(When entering the te)108 708 R .74(xt of a macro, single or double quo\
+tes should be used to indicate a macro de\214nition.)-.15 F .089
+(Unquoted te)108 720 R .089(xt is assumed to be a function name.)-.15 F
+.09(In the macro body)5.089 F 2.59(,t)-.65 G .09
+(he backslash escapes described abo)-2.59 F -.15(ve)-.15 G
+(GNU Readline 8.2)72 768 Q(2022 September 19)120.405 E(2)190.115 E 0 Cg
+EP
+%%Page: 3 3
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E(are e)108 84 Q 2.5
+(xpanded. Backslash)-.15 F(will quote an)2.5 E 2.5(yo)-.15 G
+(ther character in the macro te)-2.5 E(xt, including " and '.)-.15 E/F1
+10/Times-Bold@0 SF(Bash)108 100.8 Q F0(allo)2.93 E .43
+(ws the current readline k)-.25 F .73 -.15(ey b)-.1 H .429
+(indings to be displayed or modi\214ed with the).15 F F1(bind)2.929 E F0
+-.2(bu)2.929 G .429(iltin command.).2 F 1.095
+(The editing mode may be switched during interacti)108 112.8 R 1.395
+-.15(ve u)-.25 H 1.095(se by using the).15 F F1<ad6f>3.595 E F0 1.095
+(option to the)3.595 F F1(set)3.595 E F0 -.2(bu)3.595 G 1.095
+(iltin com-).2 F 3.076(mand. Other)108 124.8 R .576
+(programs using this library pro)3.076 F .575(vide similar mechanisms.)
+-.15 F(The)5.575 E/F2 10/Times-Italic@0 SF(inputr)3.085 E(c)-.37 E F0
+.575(\214le may be edited and)3.385 F(re-read if a program does not pro)
+108 136.8 Q(vide an)-.15 E 2.5(yo)-.15 G(ther means to incorporate ne)
+-2.5 E 2.5(wb)-.25 G(indings.)-2.5 E F1 -.92(Va)87 153.6 S(riables).92 E
+F0 .043(Readline has v)108 165.6 R .043
+(ariables that can be used to further customize its beha)-.25 F(vior)-.2
+E 5.043(.A)-.55 G -.25(va)-2.5 G .043(riable may be set in the).25 F F2
+(inpu-)2.554 E(tr)108 177.6 Q(c)-.37 E F0
+(\214le with a statement of the form)2.81 E F1(set)144 194.4 Q F2
+(variable\255name value)2.5 E F0 .79(Except where noted, readline v)108
+211.2 R .79(ariables can tak)-.25 F 3.29(et)-.1 G .79(he v)-3.29 F
+(alues)-.25 E F1(On)3.29 E F0(or)3.29 E F1(Off)3.29 E F0 .79
+(\(without re)3.29 F -.05(ga)-.15 G .79(rd to case\).).05 F(Unrecog-)
+5.79 E .448(nized v)108 223.2 R .448(ariable names are ignored.)-.25 F
+.448(When a v)5.448 F .448(ariable v)-.25 F .448
+(alue is read, empty or null v)-.25 F .449(alues, "on" \(case-insensi-)
+-.25 F(ti)108 235.2 Q -.15(ve)-.25 G .468(\), and "1" are equi).15 F
+-.25(va)-.25 G .468(lent to).25 F F1(On)2.968 E F0 5.468(.A)C .468
+(ll other v)-5.468 F .468(alues are equi)-.25 F -.25(va)-.25 G .468
+(lent to).25 F F1(Off)2.968 E F0 5.468(.T)C .467(he v)-5.468 F .467
+(ariables and their def)-.25 F(ault)-.1 E -.25(va)108 247.2 S(lues are:)
+.25 E F1(acti)108 264 Q -.1(ve)-.1 G<ad72>.1 E(egion\255start\255color)
+-.18 E F0 2.729(As)144 276 S .229(tring v)-2.729 F .229
+(ariable that controls the te)-.25 F .229
+(xt color and background when displaying the te)-.15 F .23
+(xt in the acti)-.15 F -.15(ve)-.25 G(re)144 288 Q 1.527
+(gion \(see the description of)-.15 F F1(enable\255acti)4.026 E -.1(ve)
+-.1 G<ad72>.1 E(egion)-.18 E F0(belo)4.026 E 4.026(w\). This)-.25 F
+1.526(string must not tak)4.026 F 4.026(eu)-.1 G 4.026(pa)-4.026 G -.15
+(ny)-4.026 G(ph)144 300 Q .283
+(ysical character positions on the display)-.05 F 2.783(,s)-.65 G 2.784
+(oi)-2.783 G 2.784(ts)-2.784 G .284
+(hould consist only of terminal escape sequences.)-2.784 F .45
+(It is output to the terminal before displaying the te)144 312 R .45
+(xt in the acti)-.15 F .75 -.15(ve r)-.25 H -.15(eg).15 G 2.95
+(ion. This).15 F -.25(va)2.95 G .45(riable is reset to).25 F .378
+(the def)144 324 R .378(ault v)-.1 F .378(alue whene)-.25 F -.15(ve)-.25
+G 2.878(rt).15 G .379(he terminal type changes.)-2.878 F .379(The def)
+5.379 F .379(ault v)-.1 F .379(alue is the string that puts the)-.25 F
+.655(terminal in standout mode, as obtained from the terminal')144 336 R
+3.154(st)-.55 G .654(erminfo description.)-3.154 F 3.154(As)5.654 G .654
+(ample v)-3.154 F(alue)-.25 E(might be)144 348 Q/F3 10/Courier@0 SF
+("\\e[01;33m")2.5 E F0(.)A F1(acti)108 360 Q -.1(ve)-.1 G<ad72>.1 E
+(egion\255end\255color)-.18 E F0 3.908(As)144 372 S 1.408(tring v)-3.908
+F 1.408(ariable that "undoes" the ef)-.25 F 1.408(fects of)-.25 F F1
+(acti)3.908 E -.1(ve)-.1 G<ad72>.1 E(egion\255start\255color)-.18 E F0
+1.409(and restores "normal")3.908 F .216
+(terminal display appearance after displaying te)144 384 R .216
+(xt in the acti)-.15 F .516 -.15(ve r)-.25 H -.15(eg).15 G 2.716
+(ion. This).15 F .216(string must not tak)2.716 F 2.716(eu)-.1 G(p)
+-2.716 E(an)144 396 Q 3.737(yp)-.15 G -.05(hy)-3.737 G 1.237
+(sical character positions on the display).05 F 3.737(,s)-.65 G 3.737
+(oi)-3.737 G 3.737(ts)-3.737 G 1.238
+(hould consist only of terminal escape se-)-3.737 F 2.928(quences. It)
+144 408 R .428(is output to the terminal after displaying the te)2.928 F
+.427(xt in the acti)-.15 F .727 -.15(ve r)-.25 H -.15(eg).15 G 2.927
+(ion. This).15 F -.25(va)2.927 G .427(riable is).25 F .518
+(reset to the def)144 420 R .518(ault v)-.1 F .518(alue whene)-.25 F
+-.15(ve)-.25 G 3.018(rt).15 G .518(he terminal type changes.)-3.018 F
+.518(The def)5.518 F .518(ault v)-.1 F .518(alue is the string that)-.25
+F .252(restores the terminal from standout mode, as obtained from the t\
+erminal')144 432 R 2.751(st)-.55 G .251(erminfo description.)-2.751 F(A)
+5.251 E(sample v)144 444 Q(alue might be)-.25 E F3("\\e[0m)2.5 E F0(".)A
+F1(bell\255style \(audible\))108 456 Q F0 .01
+(Controls what happens when readline w)144 468 R .011
+(ants to ring the terminal bell.)-.1 F .011(If set to)5.011 F F1(none)
+2.511 E F0 2.511(,r)C .011(eadline ne)-2.511 F -.15(ve)-.25 G(r).15 E
+.94(rings the bell.)144 480 R .94(If set to)5.94 F F1(visible)3.44 E F0
+3.44(,r)C .94(eadline uses a visible bell if one is a)-3.44 F -.25(va)
+-.2 G 3.44(ilable. If).25 F .94(set to)3.44 F F1(audible)3.44 E F0(,)A
+(readline attempts to ring the terminal')144 492 Q 2.5(sb)-.55 G(ell.)
+-2.5 E F1(bind\255tty\255special\255chars \(On\))108 504 Q F0 .333
+(If set to)144 516 R F1(On)2.833 E F0 .334(\(the def)2.833 F .334
+(ault\), readline attempts to bind the control characters)-.1 F .334
+(treated specially by the)7.834 F -.1(ke)144 528 S(rnel').1 E 2.5(st)
+-.55 G(erminal dri)-2.5 E -.15(ve)-.25 G 2.5(rt).15 G 2.5(ot)-2.5 G
+(heir readline equi)-2.5 E -.25(va)-.25 G(lents.).25 E F1
+(blink\255matching\255par)108 540 Q(en \(Off\))-.18 E F0 .21(If set to)
+144 552 R F1(On)2.71 E F0 2.71(,r)C .21
+(eadline attempts to brie\215y mo)-2.71 F .51 -.15(ve t)-.15 H .21
+(he cursor to an opening parenthesis when a closing).15 F
+(parenthesis is inserted.)144 564 Q F1(color)108 576 Q
+(ed\255completion\255pr)-.18 E(e\214x \(Off\))-.18 E F0 .515(If set to)
+144 588 R F1(On)3.015 E F0 3.015(,w)C .515(hen listing completions, rea\
+dline displays the common pre\214x of the set of possible)-3.015 F 2.936
+(completions using a dif)144 600 R 2.936(ferent color)-.25 F 7.936(.T)
+-.55 G 2.936(he color de\214nitions are tak)-7.936 F 2.935
+(en from the v)-.1 F 2.935(alue of the)-.25 F F1(LS_COLORS)144 612 Q F0
+(en)3.076 E .577(vironment v)-.4 F 3.077(ariable. If)-.25 F .577
+(there is a color de\214nition in)3.077 F F1($LS_COLORS)3.077 E F0 .577
+(for the cus-)3.077 F .135(tom suf)144 624 R .135(\214x "readline-color\
+ed-completion-pre\214x", readline uses this color for the common pre\
+\214x in-)-.25 F(stead of its def)144 636 Q(ault.)-.1 E F1(color)108 648
+Q(ed\255stats \(Off\))-.18 E F0 1.579(If set to)144 660 R F1(On)4.079 E
+F0 4.079(,r)C 1.579(eadline displays possible completions using dif)
+-4.079 F 1.58(ferent colors to indicate their \214le)-.25 F 2.5
+(type. The)144 672 R(color de\214nitions are tak)2.5 E(en from the v)-.1
+E(alue of the)-.25 E F1(LS_COLORS)2.5 E F0(en)2.5 E(vironment v)-.4 E
+(ariable.)-.25 E F1(comment\255begin \(`)108 684 Q(`#')-.63 E('\))-.63 E
+F0 .062(The string that is inserted in)144 696 R F1(vi)2.562 E F0 .062
+(mode when the)2.562 F F1(insert\255comment)2.562 E F0 .062
+(command is e)2.562 F -.15(xe)-.15 G 2.562(cuted. This).15 F(com-)2.562
+E(mand is bound to)144 708 Q F1(M\255#)2.5 E F0(in emacs mode and to)2.5
+E F1(#)2.5 E F0(in vi command mode.)2.5 E(GNU Readline 8.2)72 768 Q
+(2022 September 19)120.405 E(3)190.115 E 0 Cg EP
+%%Page: 4 4
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10/Times-Bold@0 SF
+(completion\255display\255width \(\2551\))108 84 Q F0 1.453(The number \
+of screen columns used to display possible matches when performing comp\
+letion.)144 96 R .194(The v)144 108 R .193(alue is ignored if it is les\
+s than 0 or greater than the terminal screen width.)-.25 F 2.693(Av)
+5.193 G .193(alue of 0 will)-2.943 F
+(cause matches to be displayed one per line.)144 120 Q(The def)5 E
+(ault v)-.1 E(alue is \2551.)-.25 E F1(completion\255ignor)108 132 Q
+(e\255case \(Off\))-.18 E F0(If set to)144 144 Q F1(On)2.5 E F0 2.5(,r)C
+(eadline performs \214lename matching and completion in a case\255insen\
+siti)-2.5 E .3 -.15(ve f)-.25 H(ashion.).05 E F1
+(completion\255map\255case \(Off\))108 156 Q F0 .093(If set to)144 168 R
+F1(On)2.593 E F0 2.593(,a)C(nd)-2.593 E F1(completion\255ignor)2.593 E
+(e\255case)-.18 E F0 .093(is enabled, readline treats h)2.593 F .093
+(yphens \()-.05 F/F2 10/Times-Italic@0 SF<ad>A F0 2.593(\)a)C .094
+(nd underscores)-2.593 F(\()144 180 Q F2(_)A F0 2.5(\)a)C 2.5(se)-2.5 G
+(qui)-2.5 E -.25(va)-.25 G(lent when performing case\255insensiti).25 E
+.3 -.15(ve \214)-.25 H(lename matching and completion.).15 E F1
+(completion\255pr)108 192 Q(e\214x\255display\255length \(0\))-.18 E F0
+.829(The length in characters of the common pre\214x of a list of possi\
+ble completions that is displayed)144 204 R 1.274
+(without modi\214cation.)144 216 R 1.274(When set to a v)6.274 F 1.274
+(alue greater than zero, common pre\214x)-.25 F 1.275
+(es longer than this)-.15 F -.25(va)144 228 S(lue are replaced with an \
+ellipsis when displaying possible completions.).25 E F1
+(completion\255query\255items \(100\))108 240 Q F0 .53
+(This determines when the user is queried about vie)144 252 R .529
+(wing the number of possible completions gen-)-.25 F .56(erated by the)
+144 264 R F1(possible\255completions)3.06 E F0 3.06(command. It)3.06 F
+.561(may be set to an)3.061 F 3.061(yi)-.15 G(nte)-3.061 E .561(ger v)
+-.15 F .561(alue greater than or)-.25 F .783(equal to zero.)144 276 R
+.783(If the number of possible completions is greater than or equal to \
+the v)5.783 F .782(alue of this)-.25 F -.25(va)144 288 S .367
+(riable, readline will ask whether or not the user wishes to vie).25 F
+2.868(wt)-.25 G .368(hem; otherwise the)-2.868 F 2.868(ya)-.15 G .368
+(re simply)-2.868 F(listed on the terminal.)144 300 Q 2.5(An)5 G -2.25
+-.15(eg a)-2.5 H(ti).15 E .3 -.15(ve v)-.25 H
+(alue causes readline to ne)-.1 E -.15(ve)-.25 G 2.5(ra).15 G(sk.)-2.5 E
+F1(con)108 312 Q -.1(ve)-.4 G(rt\255meta \(On\)).1 E F0 .613(If set to)
+144 324 R F1(On)3.113 E F0 3.113(,r)C .613(eadline will con)-3.113 F
+-.15(ve)-.4 G .613(rt characters with the eighth bit set to an ASCII k)
+.15 F .912 -.15(ey s)-.1 H .612(equence by).15 F 1.315(stripping the ei\
+ghth bit and pre\214xing it with an escape character \(in ef)144 336 R
+1.316(fect, using escape as the)-.25 F F2 .503(meta pr)144 348 R(e\214x)
+-.37 E F0 3.003(\). The)B(def)3.003 E .503(ault is)-.1 F F2(On)3.003 E
+F0 3.003(,b)C .503(ut readline will set it to)-3.203 F F2(Of)3.003 E(f)
+-.18 E F0 .502(if the locale contains eight-bit char)3.003 F(-)-.2 E
+3.049(acters. This)144 360 R -.25(va)3.049 G .549
+(riable is dependent on the).25 F F1(LC_CTYPE)3.049 E F0 .549
+(locale cate)3.049 F(gory)-.15 E 3.049(,a)-.65 G .55
+(nd may change if the lo-)-3.049 F(cale is changed.)144 372 Q F1
+(disable\255completion \(Off\))108 384 Q F0 .038(If set to)144 396 R F1
+(On)2.538 E F0 2.538(,r)C .038(eadline will inhibit w)-2.538 F .038
+(ord completion.)-.1 F .038
+(Completion characters will be inserted into the)5.038 F(line as if the)
+144 408 Q 2.5(yh)-.15 G(ad been mapped to)-2.5 E F1(self-insert)2.5 E F0
+(.)A F1(echo\255contr)108 420 Q(ol\255characters \(On\))-.18 E F0 1.21
+(When set to)144 432 R F1(On)3.71 E F0 3.71(,o)C 3.71(no)-3.71 G 1.211
+(perating systems that indicate the)-3.71 F 3.711(ys)-.15 G 1.211
+(upport it, readline echoes a character)-3.711 F
+(corresponding to a signal generated from the k)144 444 Q -.15(ey)-.1 G
+(board.).15 E F1(editing\255mode \(emacs\))108 456 Q F0 .142
+(Controls whether readline be)144 468 R .141(gins with a set of k)-.15 F
+.441 -.15(ey b)-.1 H .141(indings similar to).15 F F2(Emacs)2.641 E F0
+(or)2.641 E F2(vi)2.641 E F0(.)A F1(editing\255mode)5.141 E F0
+(can be set to either)144 480 Q F1(emacs)2.5 E F0(or)2.5 E F1(vi)2.5 E
+F0(.)A F1(emacs\255mode\255string \(@\))108 492 Q F0 .517(If the)144 504
+R F2(show\255mode\255in\255pr)3.017 E(ompt)-.45 E F0 -.25(va)3.017 G
+.518(riable is enabled, this string is displayed immediately before the)
+.25 F .622
+(last line of the primary prompt when emacs editing mode is acti)144 516
+R -.15(ve)-.25 G 5.622(.T).15 G .622(he v)-5.622 F .621(alue is e)-.25 F
+.621(xpanded lik)-.15 F 3.121(ea)-.1 G -.1(ke)144 528 S 3.339(yb)-.05 G
+.839(inding, so the standard set of meta- and control pre\214x)-3.339 F
+.84(es and backslash escape sequences is)-.15 F -.2(av)144 540 S 2.798
+(ailable. Use)-.05 F .298(the \\1 and \\2 escapes to be)2.798 F .298
+(gin and end sequences of non-printing characters, which)-.15 F
+(can be used to embed a terminal control sequence into the mode string.)
+144 552 Q F1(enable\255acti)108 564 Q -.1(ve)-.1 G<ad72>.1 E
+(egion \(On\))-.18 E F0(The)144 576 Q F2(point)3.245 E F0 .746
+(is the current cursor position, and)3.245 F F2(mark)3.246 E F0 .746
+(refers to a sa)3.246 F -.15(ve)-.2 G 3.246(dc).15 G .746
+(ursor position.)-3.246 F .746(The te)5.746 F .746(xt be-)-.15 F .344
+(tween the point and mark is referred to as the)144 588 R F2 -.37(re)
+2.844 G(gion)-.03 E F0 5.344(.W)C .344(hen this v)-5.344 F .344
+(ariable is set to)-.25 F F2(On)2.844 E F0 2.844(,r)C .344(eadline al-)
+-2.844 F(lo)144 600 Q .098(ws certain commands to designate the re)-.25
+F .098(gion as)-.15 F F2(active)2.598 E F0 5.098(.W)C .098(hen the re)
+-5.098 F .098(gion is acti)-.15 F -.15(ve)-.25 G 2.598(,r).15 G .098
+(eadline high-)-2.598 F .971(lights the te)144 612 R .971(xt in the re)
+-.15 F .971(gion using the v)-.15 F .971(alue of the)-.25 F F1(acti)3.47
+E -.1(ve)-.1 G<ad72>.1 E(egion\255start\255color)-.18 E F0 3.47(,w)C .97
+(hich def)-3.47 F .97(aults to)-.1 F .484
+(the string that enables the terminal')144 624 R 2.985(ss)-.55 G .485
+(tandout mode.)-2.985 F .485(The acti)5.485 F .785 -.15(ve r)-.25 H -.15
+(eg).15 G .485(ion sho).15 F .485(ws the te)-.25 F .485(xt inserted by)
+-.15 F(brack)144 636 Q(eted-paste and an)-.1 E 2.5(ym)-.15 G(atching te)
+-2.5 E(xt found by incremental and non-incremental history searches.)
+-.15 E F1(enable\255brack)108 648 Q(eted\255paste \(On\))-.1 E F0 .841
+(When set to)144 660 R F1(On)3.341 E F0 3.341(,r)C .841(eadline con\214\
+gures the terminal to insert each paste into the editing b)-3.341 F(uf)
+-.2 E .84(fer as a)-.25 F .799(single string of characters, instead of \
+treating each character as if it had been read from the k)144 672 R -.15
+(ey)-.1 G(-).15 E 3.159(board. This)144 684 R(pre)3.159 E -.15(ve)-.25 G
+.659(nts readline from e).15 F -.15(xe)-.15 G .659(cuting an).15 F 3.158
+(ye)-.15 G .658(diting commands bound to k)-3.158 F .958 -.15(ey s)-.1 H
+.658(equences ap-).15 F(pearing in the pasted te)144 696 Q(xt.)-.15 E
+(GNU Readline 8.2)72 768 Q(2022 September 19)120.405 E(4)190.115 E 0 Cg
+EP
+%%Page: 5 5
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10/Times-Bold@0 SF
+(enable\255k)108 84 Q(eypad \(Off\))-.1 E F0 .892(When set to)144 96 R
+F1(On)3.393 E F0 3.393(,r)C .893
+(eadline will try to enable the application k)-3.393 F -.15(ey)-.1 G
+.893(pad when it is called.).15 F .893(Some sys-)5.893 F
+(tems need this to enable the arro)144 108 Q 2.5(wk)-.25 G -.15(ey)-2.6
+G(s.).15 E F1(enable\255meta\255k)108 120 Q(ey \(On\))-.1 E F0 .64
+(When set to)144 132 R F1(On)3.14 E F0 3.14(,r)C .64
+(eadline will try to enable an)-3.14 F 3.14(ym)-.15 G .64
+(eta modi\214er k)-3.14 F .94 -.15(ey t)-.1 H .64
+(he terminal claims to support).15 F(when it is called.)144 144 Q
+(On man)5 E 2.5(yt)-.15 G(erminals, the meta k)-2.5 E .3 -.15(ey i)-.1 H
+2.5(su).15 G(sed to send eight-bit characters.)-2.5 E F1
+(expand\255tilde \(Off\))108 156 Q F0(If set to)144 168 Q F1(On)2.5 E F0
+2.5(,t)C(ilde e)-2.5 E(xpansion is performed when readline attempts w)
+-.15 E(ord completion.)-.1 E F1(history\255pr)108 180 Q(eser)-.18 E -.1
+(ve)-.1 G(\255point \(Off\)).1 E F0 .552(If set to)144 192 R F1(On)3.052
+E F0 3.052(,t)C .552(he history code attempts to place point at the sam\
+e location on each history line re-)-3.052 F(trie)144 204 Q -.15(ve)-.25
+G 2.5(dw).15 G(ith)-2.5 E F1(pr)2.5 E -.15(ev)-.18 G(ious-history).15 E
+F0(or)2.5 E F1(next-history)2.5 E F0(.)A F1(history\255size \(unset\))
+108 216 Q F0 .949(Set the maximum number of history entries sa)144 228 R
+-.15(ve)-.2 G 3.448(di).15 G 3.448(nt)-3.448 G .948(he history list.)
+-3.448 F .948(If set to zero, an)5.948 F 3.448(ye)-.15 G(xisting)-3.598
+E .482(history entries are deleted and no ne)144 240 R 2.982(we)-.25 G
+.483(ntries are sa)-2.982 F -.15(ve)-.2 G 2.983(d. If).15 F .483
+(set to a v)2.983 F .483(alue less than zero, the num-)-.25 F .356
+(ber of history entries is not limited.)144 252 R .356(By def)5.356 F
+.355(ault, the number of history entries is not limited.)-.1 F .355
+(If an)5.355 F .82(attempt is made to set)144 264 R/F2 10/Times-Italic@0
+SF(history\255size)3.32 E F0 .821(to a non-numeric v)3.321 F .821
+(alue, the maximum number of history en-)-.25 F
+(tries will be set to 500.)144 276 Q F1(horizontal\255scr)108 288 Q
+(oll\255mode \(Off\))-.18 E F0 .449(When set to)144 300 R F1(On)2.949 E
+F0 2.949(,m)C(ak)-2.949 E .448
+(es readline use a single line for display)-.1 F 2.948(,s)-.65 G .448
+(crolling the input horizontally on a)-2.948 F 1.194(single screen line\
+ when it becomes longer than the screen width rather than wrapping to a\
+ ne)144 312 R(w)-.25 E 2.5(line. This)144 324 R
+(setting is automatically enabled for terminals of height 1.)2.5 E F1
+(input\255meta \(Off\))108 336 Q F0 .367(If set to)144 348 R F1(On)2.867
+E F0 2.867(,r)C .367(eadline will enable eight-bit input \(that is, it \
+will not clear the eighth bit in the char)-2.867 F(-)-.2 E .956
+(acters it reads\), re)144 360 R -.05(ga)-.15 G .956
+(rdless of what the terminal claims it can support.).05 F .957(The name)
+5.956 F F1(meta\255\215ag)3.457 E F0 .957(is a)3.457 F(synon)144 372 Q
+.77(ym for this v)-.15 F 3.27(ariable. The)-.25 F(def)3.27 E .77
+(ault is)-.1 F F2(Of)3.27 E(f)-.18 E F0 3.27(,b)C .77
+(ut readline will set it to)-3.47 F F2(On)3.27 E F0 .77
+(if the locale contains)3.27 F 1.866(eight-bit characters.)144 384 R
+1.866(This v)6.866 F 1.867(ariable is dependent on the)-.25 F F1
+(LC_CTYPE)4.367 E F0 1.867(locale cate)4.367 F(gory)-.15 E 4.367(,a)-.65
+G 1.867(nd may)-4.367 F(change if the locale is changed.)144 396 Q F1
+(isear)108 408 Q(ch\255terminators \(`)-.18 E(`C\255[ C\255J')-.63 E
+('\))-.63 E F0 .439(The string of characters that should terminate an i\
+ncremental search without subsequently e)144 420 R -.15(xe)-.15 G(cut-)
+.15 E .934(ing the character as a command.)144 432 R .935(If this v)
+5.935 F .935(ariable has not been gi)-.25 F -.15(ve)-.25 G 3.435(nav).15
+G .935(alue, the characters)-3.685 F F2(ESC)3.435 E F0(and)144 444 Q F2
+(C\255J)2.5 E F0(will terminate an incremental search.)2.5 E F1 -.1(ke)
+108 456 S(ymap \(emacs\)).1 E F0 2.323(Set the current readline k)144
+468 R -.15(ey)-.1 G 4.823(map. The).15 F 2.323(set of le)4.823 F -.05
+(ga)-.15 G 4.823(lk).05 G -.15(ey)-4.923 G 2.323(map names is).15 F F2
+2.323(emacs, emacs-standar)4.823 F(d,)-.37 E .781
+(emacs-meta, emacs-ctlx, vi, vi-mo)144 480 R(ve)-.1 E 3.282(,v)-.1 G
+(i-command)-3.282 E F0 3.282(,a)C(nd)-3.282 E F2(vi-insert)3.572 E F0(.)
+.68 E F2(vi)5.782 E F0 .782(is equi)3.282 F -.25(va)-.25 G .782(lent to)
+.25 F F2(vi-command)3.282 E F0(;)A F2(emacs)144 492 Q F0 .683(is equi)
+3.183 F -.25(va)-.25 G .683(lent to).25 F F2(emacs-standar)3.183 E(d)
+-.37 E F0 5.682(.T)C .682(he def)-5.682 F .682(ault v)-.1 F .682
+(alue is)-.25 F F2(emacs)3.372 E F0 5.682(.T).27 G .682(he v)-5.682 F
+.682(alue of)-.25 F F1(editing\255mode)3.182 E F0(also af)144 504 Q
+(fects the def)-.25 E(ault k)-.1 E -.15(ey)-.1 G(map.).15 E F1 -.1(ke)
+108 516 S(yseq\255timeout \(500\)).1 E F0 .367(Speci\214es the duration)
+144 528 R F2 -.37(re)2.867 G(adline).37 E F0 .367(will w)2.867 F .367
+(ait for a character when reading an ambiguous k)-.1 F .668 -.15(ey s)
+-.1 H(equence).15 E .525(\(one that can form a complete k)144 540 R .825
+-.15(ey s)-.1 H .524(equence using the input read so f).15 F(ar)-.1 E
+3.024(,o)-.4 G 3.024(rc)-3.024 G .524(an tak)-3.024 F 3.024(ea)-.1 G
+.524(dditional in-)-3.024 F .806(put to complete a longer k)144 552 R
+1.106 -.15(ey s)-.1 H 3.306(equence\). If).15 F .806(no input is recei)
+3.306 F -.15(ve)-.25 G 3.306(dw).15 G .807(ithin the timeout,)-3.306 F
+F2 -.37(re)3.307 G(adline).37 E F0(will)3.307 E .907(use the shorter b)
+144 564 R .907(ut complete k)-.2 F 1.207 -.15(ey s)-.1 H 3.407
+(equence. The).15 F -.25(va)3.407 G .907
+(lue is speci\214ed in milliseconds, so a v).25 F .906(alue of)-.25 F
+.05(1000 means that)144 576 R F2 -.37(re)2.55 G(adline).37 E F0 .05
+(will w)2.55 F .05(ait one second for additional input.)-.1 F .05
+(If this v)5.05 F .05(ariable is set to a v)-.25 F(alue)-.25 E .051
+(less than or equal to zero, or to a non-numeric v)144 588 R(alue,)-.25
+E F2 -.37(re)2.551 G(adline).37 E F0 .051(will w)2.551 F .051
+(ait until another k)-.1 F .351 -.15(ey i)-.1 H 2.551(sp).15 G(ressed)
+-2.551 E(to decide which k)144 600 Q .3 -.15(ey s)-.1 H
+(equence to complete.).15 E F1(mark\255dir)108 612 Q(ectories \(On\))
+-.18 E F0(If set to)144 624 Q F1(On)2.5 E F0 2.5(,c)C
+(ompleted directory names ha)-2.5 E .3 -.15(ve a s)-.2 H(lash appended.)
+.15 E F1(mark\255modi\214ed\255lines \(Off\))108 636 Q F0(If set to)144
+648 Q F1(On)2.5 E F0 2.5(,h)C(istory lines that ha)-2.5 E .3 -.15(ve b)
+-.2 H(een modi\214ed are displayed with a preceding asterisk \().15 E F1
+(*)A F0(\).)A F1(mark\255symlink)108 660 Q(ed\255dir)-.1 E
+(ectories \(Off\))-.18 E F0 .175(If set to)144 672 R F1(On)2.675 E F0
+2.675(,c)C .175
+(ompleted names which are symbolic links to directories ha)-2.675 F .475
+-.15(ve a s)-.2 H .175(lash appended \(sub-).15 F(ject to the v)144 684
+Q(alue of)-.25 E F1(mark\255dir)2.5 E(ectories)-.18 E F0(\).)A F1
+(match\255hidden\255\214les \(On\))108 696 Q F0 .193(This v)144 708 R
+.193(ariable, when set to)-.25 F F1(On)2.693 E F0 2.693(,c)C .192
+(auses readline to match \214les whose names be)-2.693 F .192
+(gin with a `.)-.15 F 2.692('\()-.7 G(hidden)-2.692 E .456
+(\214les\) when performing \214lename completion.)144 720 R .456
+(If set to)5.456 F F1(Off)2.956 E F0 2.956(,t)C .456(he leading `.)
+-2.956 F 2.956('m)-.7 G .457(ust be supplied by the)-2.956 F
+(GNU Readline 8.2)72 768 Q(2022 September 19)120.405 E(5)190.115 E 0 Cg
+EP
+%%Page: 6 6
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E
+(user in the \214lename to be completed.)144 84 Q/F1 10/Times-Bold@0 SF
+(menu\255complete\255display\255pr)108 96 Q(e\214x \(Off\))-.18 E F0
+1.586(If set to)144 108 R F1(On)4.086 E F0 4.086(,m)C 1.585(enu complet\
+ion displays the common pre\214x of the list of possible completions)
+-4.086 F(\(which may be empty\) before c)144 120 Q
+(ycling through the list.)-.15 E F1(output\255meta \(Off\))108 132 Q F0
+.506(If set to)144 144 R F1(On)3.006 E F0 3.006(,r)C .507(eadline will \
+display characters with the eighth bit set directly rather than as a me\
+ta-)-3.006 F(pre\214x)144 156 Q .885(ed escape sequence.)-.15 F .884
+(The def)5.884 F .884(ault is)-.1 F/F2 10/Times-Italic@0 SF(Of)3.384 E
+(f)-.18 E F0 3.384(,b)C .884(ut readline will set it to)-3.584 F F2(On)
+3.384 E F0 .884(if the locale contains)3.384 F 1.866
+(eight-bit characters.)144 168 R 1.866(This v)6.866 F 1.867
+(ariable is dependent on the)-.25 F F1(LC_CTYPE)4.367 E F0 1.867
+(locale cate)4.367 F(gory)-.15 E 4.367(,a)-.65 G 1.867(nd may)-4.367 F
+(change if the locale is changed.)144 180 Q F1
+(page\255completions \(On\))108 192 Q F0 .809(If set to)144 204 R F1(On)
+3.308 E F0 3.308(,r)C .808(eadline uses an internal)-3.308 F F2(mor)
+3.308 E(e)-.37 E F0(-lik)A 3.308(ep)-.1 G .808
+(ager to display a screenful of possible comple-)-3.308 F
+(tions at a time.)144 216 Q F1
+(print\255completions\255horizontally \(Off\))108 228 Q F0 .227
+(If set to)144 240 R F1(On)2.727 E F0 2.727(,r)C .227(eadline will disp\
+lay completions with matches sorted horizontally in alphabetical or)
+-2.727 F(-)-.2 E(der)144 252 Q 2.5(,r)-.4 G(ather than do)-2.5 E
+(wn the screen.)-.25 E F1 -2.29 -.18(re v)108 264 T
+(ert\255all\255at\255newline \(Off\)).08 E F0 .699(If set to)144 276 R
+F1(On)3.199 E F0 3.199(,r)C .699
+(eadline will undo all changes to history lines before returning when)
+-3.199 F F1(accept\255line)3.198 E F0(is)3.198 E -.15(exe)144 288 S
+2.686(cuted. By).15 F(def)2.686 E .186
+(ault, history lines may be modi\214ed and retain indi)-.1 F .186
+(vidual undo lists across calls to)-.25 F F1 -.18(re)144 300 S(adline)
+.18 E F0(.)A F1(sho)108 312 Q(w\255all\255if\255ambiguous \(Off\))-.1 E
+F0 .304(This alters the def)144 324 R .304(ault beha)-.1 F .304
+(vior of the completion functions.)-.2 F .304(If set to)5.304 F F1(On)
+2.804 E F0 2.803(,w)C .303(ords which ha)-2.903 F .603 -.15(ve m)-.2 H
+(ore).15 E 1.264(than one possible completion cause the matches to be l\
+isted immediately instead of ringing the)144 336 R(bell.)144 348 Q F1
+(sho)108 360 Q(w\255all\255if\255unmodi\214ed \(Off\))-.1 E F0 5.346
+(This alters the def)144 372 R 5.346(ault beha)-.1 F 5.345
+(vior of the completion functions in a f)-.2 F 5.345(ashion similar to)
+-.1 F F1(sho)144 384 Q(w\255all\255if\255ambiguous)-.1 E F0 6.69(.I)C
+4.19(fs)-6.69 G 1.691(et to)-4.19 F F1(On)4.191 E F0 4.191(,w)C 1.691
+(ords which ha)-4.291 F 1.991 -.15(ve m)-.2 H 1.691
+(ore than one possible completion).15 F 1.04(without an)144 396 R 3.54
+(yp)-.15 G 1.039
+(ossible partial completion \(the possible completions don')-3.54 F
+3.539(ts)-.18 G 1.039(hare a common pre\214x\))-3.539 F(cause the match\
+es to be listed immediately instead of ringing the bell.)144 408 Q F1
+(sho)108 420 Q(w\255mode\255in\255pr)-.1 E(ompt \(Off\))-.18 E F0 1.021
+(If set to)144 432 R F1(On)3.521 E F0 3.521(,a)C 1.022
+(dd a string to the be)-3.521 F 1.022
+(ginning of the prompt indicating the editing mode: emacs, vi)-.15 F
+(command, or vi insertion.)144 444 Q(The mode strings are user)5 E
+(-settable \(e.g.,)-.2 E F2(emacs\255mode\255string)2.5 E F0(\).)A F1
+(skip\255completed\255text \(Off\))108 456 Q F0 .095(If set to)144 468 R
+F1(On)2.595 E F0 2.595(,t)C .095(his alters the def)-2.595 F .095
+(ault completion beha)-.1 F .094
+(vior when inserting a single match into the line.)-.2 F(It')144 480 Q
+2.545(so)-.55 G .045(nly acti)-2.545 F .345 -.15(ve w)-.25 H .046
+(hen performing completion in the middle of a w).15 F 2.546(ord. If)-.1
+F .046(enabled, readline does not)2.546 F 1.394(insert characters from \
+the completion that match characters after point in the w)144 492 R
+1.394(ord being com-)-.1 F(pleted, so portions of the w)144 504 Q
+(ord follo)-.1 E(wing the cursor are not duplicated.)-.25 E F1
+(vi\255cmd\255mode\255string \(\(cmd\)\))108 516 Q F0 .517(If the)144
+528 R F2(show\255mode\255in\255pr)3.017 E(ompt)-.45 E F0 -.25(va)3.017 G
+.518(riable is enabled, this string is displayed immediately before the)
+.25 F .475(last line of the primary prompt when vi editing mode is acti)
+144 540 R .775 -.15(ve a)-.25 H .475(nd in command mode.).15 F .475
+(The v)5.475 F(alue)-.25 E .33(is e)144 552 R .33(xpanded lik)-.15 F
+2.83(eak)-.1 G .63 -.15(ey b)-2.93 H .33
+(inding, so the standard set of meta- and control pre\214x).15 F .33
+(es and backslash es-)-.15 F .245(cape sequences is a)144 564 R -.25(va)
+-.2 G 2.745(ilable. Use).25 F .244(the \\1 and \\2 escapes to be)2.745 F
+.244(gin and end sequences of non-printing)-.15 F(characters, which can\
+ be used to embed a terminal control sequence into the mode string.)144
+576 Q F1(vi\255ins\255mode\255string \(\(ins\)\))108 588 Q F0 .517
+(If the)144 600 R F2(show\255mode\255in\255pr)3.017 E(ompt)-.45 E F0
+-.25(va)3.017 G .518
+(riable is enabled, this string is displayed immediately before the).25
+F .186(last line of the primary prompt when vi editing mode is acti)144
+612 R .486 -.15(ve a)-.25 H .186(nd in insertion mode.).15 F .186(The v)
+5.186 F .186(alue is)-.25 F -.15(ex)144 624 S .923(panded lik).15 F
+3.423(eak)-.1 G 1.223 -.15(ey b)-3.523 H .924
+(inding, so the standard set of meta- and control pre\214x).15 F .924
+(es and backslash es-)-.15 F .245(cape sequences is a)144 636 R -.25(va)
+-.2 G 2.745(ilable. Use).25 F .244(the \\1 and \\2 escapes to be)2.745 F
+.244(gin and end sequences of non-printing)-.15 F(characters, which can\
+ be used to embed a terminal control sequence into the mode string.)144
+648 Q F1(visible\255stats \(Off\))108 660 Q F0 .846(If set to)144 672 R
+F1(On)3.346 E F0 3.346(,ac)C .846(haracter denoting a \214le')-3.346 F
+3.346(st)-.55 G .846(ype as reported by)-3.346 F F2(stat)3.346 E F0 .846
+(\(2\) is appended to the \214lename)B
+(when listing possible completions.)144 684 Q F1(Conditional Constructs)
+87 700.8 Q F0 .05(Readline implements a f)108 712.8 R .05(acility simil\
+ar in spirit to the conditional compilation features of the C preproces\
+sor)-.1 F .096(which allo)108 724.8 R .096(ws k)-.25 F .396 -.15(ey b)
+-.1 H .096(indings and v).15 F .096
+(ariable settings to be performed as the result of tests.)-.25 F .097
+(There are four parser)5.096 F(GNU Readline 8.2)72 768 Q
+(2022 September 19)120.405 E(6)190.115 E 0 Cg EP
+%%Page: 7 7
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E(directi)108 84 Q -.15
+(ve)-.25 G 2.5(su).15 G(sed.)-2.5 E/F1 10/Times-Bold@0 SF($if)108 100.8
+Q F0(The)144 100.8 Q F1($if)2.963 E F0 .463(construct allo)2.963 F .462
+(ws bindings to be made based on the editing mode, the terminal being u\
+sed,)-.25 F .961(or the application using readline.)144 112.8 R .961
+(The te)5.961 F .961(xt of the test, after an)-.15 F 3.462(yc)-.15 G
+.962(omparison operator)-3.462 F 3.462(,e)-.4 G .962(xtends to)-3.612 F
+(the end of the line; unless otherwise noted, no characters are require\
+d to isolate it.)144 124.8 Q F1(mode)144 141.6 Q F0(The)180 141.6 Q F1
+(mode=)3.712 E F0 1.212(form of the)3.712 F F1($if)3.711 E F0(directi)
+3.711 E 1.511 -.15(ve i)-.25 H 3.711(su).15 G 1.211
+(sed to test whether readline is in emacs or vi)-3.711 F 3.065
+(mode. This)180 153.6 R .565(may be used in conjunction with the)3.065 F
+F1 .565(set k)3.065 F(eymap)-.1 E F0 .565(command, for instance, to)
+3.065 F .03(set bindings in the)180 165.6 R/F2 10/Times-Italic@0 SF
+(emacs-standar)2.529 E(d)-.37 E F0(and)2.529 E F2(emacs-ctlx)2.529 E F0
+-.1(ke)2.529 G .029(ymaps only if readline is starting out)-.05 F
+(in emacs mode.)180 177.6 Q F1(term)144 194.4 Q F0(The)180 194.4 Q F1
+(term=)3.196 E F0 .696
+(form may be used to include terminal-speci\214c k)3.196 F .996 -.15
+(ey b)-.1 H .697(indings, perhaps to bind).15 F .654(the k)180 206.4 R
+.954 -.15(ey s)-.1 H .654(equences output by the terminal').15 F 3.154
+(sf)-.55 G .654(unction k)-3.154 F -.15(ey)-.1 G 3.154(s. The).15 F -.1
+(wo)3.154 G .654(rd on the right side of).1 F(the)180 218.4 Q F1(=)3.003
+E F0 .503(is tested ag)3.003 F .504(ainst the full name of the terminal\
+ and the portion of the terminal name)-.05 F(before the \214rst)180
+230.4 Q F1<ad>2.5 E F0 5(.T)C(his allo)-5 E(ws)-.25 E F2(sun)2.84 E F0
+(to match both)2.74 E F2(sun)2.84 E F0(and)2.74 E F2(sun\255cmd)2.84 E
+F0 2.5(,f).77 G(or instance.)-2.5 E F1 -.1(ve)144 247.2 S(rsion).1 E F0
+(The)180 259.2 Q F1 -.1(ve)3.109 G(rsion).1 E F0 .608
+(test may be used to perform comparisons ag)3.109 F .608
+(ainst speci\214c readline v)-.05 F(ersions.)-.15 E(The)180 271.2 Q F1
+-.1(ve)2.771 G(rsion).1 E F0 -.15(ex)2.771 G .271
+(pands to the current readline v).15 F 2.772(ersion. The)-.15 F .272
+(set of comparison operators in-)2.772 F(cludes)180 283.2 Q F1(=)3.064 E
+F0 3.064(,\()C(and)-3.064 E F1(==)3.064 E F0(\),)A F1(!=)3.064 E F0(,)A
+F1(<=)3.064 E F0(,)A F1(>=)3.064 E F0(,)A F1(<)3.064 E F0 3.064(,a)C(nd)
+-3.064 E F1(>)3.064 E F0 5.563(.T)C .563(he v)-5.563 F .563
+(ersion number supplied on the right side)-.15 F .318
+(of the operator consists of a major v)180 295.2 R .318(ersion number)
+-.15 F 2.818(,a)-.4 G 2.818(no)-2.818 G .318
+(ptional decimal point, and an op-)-2.818 F .101(tional minor v)180
+307.2 R .101(ersion \(e.g.,)-.15 F F1(7.1)2.601 E F0 .101
+(\). If the minor v)B .1(ersion is omitted, it is assumed to be)-.15 F
+F1(0)2.6 E F0 5.1(.T)C(he)-5.1 E .06
+(operator may be separated from the string)180 319.2 R F1 -.1(ve)2.56 G
+(rsion).1 E F0 .06(and from the v)2.56 F .06(ersion number ar)-.15 F
+(gument)-.18 E(by whitespace.)180 331.2 Q F1(application)144 348 Q F0
+(The)180 360 Q F1(application)3.003 E F0 .503
+(construct is used to include application-speci\214c settings.)3.003 F
+.503(Each program)5.503 F .114(using the readline library sets the)180
+372 R F2 .114(application name)2.614 F F0 2.614(,a)C .114
+(nd an initialization \214le can test for a)-2.614 F .501(particular v)
+180 384 R 3.001(alue. This)-.25 F .501(could be used to bind k)3.001 F
+.801 -.15(ey s)-.1 H .5(equences to functions useful for a spe-).15 F
+.396(ci\214c program.)180 396 R -.15(Fo)5.396 G 2.896(ri).15 G .396
+(nstance, the follo)-2.896 F .396(wing command adds a k)-.25 F .696 -.15
+(ey s)-.1 H .397(equence that quotes the).15 F(current or pre)180 408 Q
+(vious w)-.25 E(ord in)-.1 E F1(bash)2.5 E F0(:)A F1($if)180 432 Q F0
+(Bash)2.5 E 2.5(#Q)180 444 S(uote the current or pre)-2.5 E(vious w)-.25
+E(ord)-.1 E("\\C-xq": "\\eb\\"\\ef\\"")180 456 Q F1($endif)180 468 Q F2
+(variable)144 484.8 Q F0(The)180 496.8 Q F2(variable)3.777 E F0 1.277
+(construct pro)3.777 F 1.276(vides simple equality tests for readline v)
+-.15 F 1.276(ariables and v)-.25 F(alues.)-.25 E .079
+(The permitted comparison operators are)180 508.8 R F2(=)2.579 E F0(,)A
+F2(==)2.579 E F0 2.579(,a)C(nd)-2.579 E F2(!=)2.579 E F0 5.079(.T)C .079
+(he v)-5.079 F .08(ariable name must be sepa-)-.25 F .98(rated from the\
+ comparison operator by whitespace; the operator may be separated from)
+180 520.8 R .129(the v)180 532.8 R .129
+(alue on the right hand side by whitespace.)-.25 F .13
+(Both string and boolean v)5.129 F .13(ariables may be)-.25 F
+(tested. Boolean v)180 544.8 Q(ariables must be tested ag)-.25 E
+(ainst the v)-.05 E(alues)-.25 E F2(on)2.5 E F0(and)2.5 E F2(of)2.5 E(f)
+-.18 E F0(.)A F1($endif)108 561.6 Q F0(This command, as seen in the pre)
+144 561.6 Q(vious e)-.25 E(xample, terminates an)-.15 E F1($if)2.5 E F0
+(command.)2.5 E F1($else)108 578.4 Q F0(Commands in this branch of the)
+144 578.4 Q F1($if)2.5 E F0(directi)2.5 E .3 -.15(ve a)-.25 H(re e).15 E
+-.15(xe)-.15 G(cuted if the test f).15 E(ails.)-.1 E F1($include)108
+595.2 Q F0 .357(This directi)144 607.2 R .657 -.15(ve t)-.25 H(ak).15 E
+.357(es a single \214lename as an ar)-.1 F .356
+(gument and reads commands and bindings from that)-.18 F 2.5(\214le. F)
+144 619.2 R(or e)-.15 E(xample, the follo)-.15 E(wing directi)-.25 E .3
+-.15(ve w)-.25 H(ould read).05 E F2(/etc/inputr)2.5 E(c)-.37 E F0(:)A F1
+($include)144 643.2 Q F2(/etc/inputr)5.833 E(c)-.37 E/F3 10.95
+/Times-Bold@0 SF(SEARCHING)72 660 Q F0 1.003(Readline pro)108 672 R
+1.003(vides commands for searching through the command history for line\
+s containing a speci\214ed)-.15 F 2.5(string. There)108 684 R(are tw)2.5
+E 2.5(os)-.1 G(earch modes:)-2.5 E F2(incr)2.51 E(emental)-.37 E F0(and)
+3.01 E F2(non-incr)2.86 E(emental)-.37 E F0(.).51 E .698
+(Incremental searches be)108 700.8 R .698
+(gin before the user has \214nished typing the search string.)-.15 F
+.697(As each character of the)5.697 F .112
+(search string is typed, readline displays the ne)108 712.8 R .112
+(xt entry from the history matching the string typed so f)-.15 F(ar)-.1
+E 5.113(.A)-.55 G(n)-5.113 E .545
+(incremental search requires only as man)108 724.8 R 3.045(yc)-.15 G
+.544(haracters as needed to \214nd the desired history entry)-3.045 F
+5.544(.T)-.65 G 3.044(os)-6.344 G(earch)-3.044 E(GNU Readline 8.2)72 768
+Q(2022 September 19)120.405 E(7)190.115 E 0 Cg EP
+%%Page: 8 8
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E(backw)108 84 Q .18
+(ard in the history for a particular string, type)-.1 F/F1 10
+/Times-Bold@0 SF(C\255r)2.681 E F0 5.181(.T)C(yping)-5.981 E F1(C\255s)
+2.681 E F0 .181(searches forw)2.681 F .181(ard through the history)-.1 F
+(.)-.65 E .354(The characters present in the v)108 96 R .354
+(alue of the)-.25 F F1(isear)2.854 E(ch-terminators)-.18 E F0 -.25(va)
+2.854 G .354(riable are used to terminate an incremen-).25 F .6
+(tal search.)108 108 R .6(If that v)5.6 F .6
+(ariable has not been assigned a v)-.25 F .6(alue the)-.25 F/F2 10
+/Times-Italic@0 SF(Escape)3.1 E F0(and)3.1 E F1(C\255J)3.1 E F0 .6
+(characters will terminate an)3.1 F .123(incremental search.)108 120 R
+F1(C\255G)5.123 E F0 .123
+(will abort an incremental search and restore the original line.)2.623 F
+.122(When the search is)5.122 F(terminated, the history entry containin\
+g the search string becomes the current line.)108 132 Q 2.406 -.8
+(To \214)108 148.8 T .806
+(nd other matching entries in the history list, type).8 F F1(C\255s)
+3.306 E F0(or)3.306 E F1(C\255r)3.306 E F0 .806(as appropriate.)3.306 F
+.807(This will search back-)5.806 F -.1(wa)108 160.8 S .536(rd or forw)
+.1 F .536(ard in the history for the ne)-.1 F .535
+(xt line matching the search string typed so f)-.15 F(ar)-.1 E 5.535(.A)
+-.55 G .835 -.15(ny o)-5.535 H .535(ther k).15 F .835 -.15(ey s)-.1 H
+(e-).15 E .384
+(quence bound to a readline command will terminate the search and e)108
+172.8 R -.15(xe)-.15 G .385(cute that command.).15 F -.15(Fo)5.385 G
+2.885(ri).15 G .385(nstance, a)-2.885 F(ne)108 184.8 Q .338
+(wline will terminate the search and accept the line, thereby e)-.25 F
+-.15(xe)-.15 G .337(cuting the command from the history list.).15 F
+2.997(Am)108 196.8 S -.15(ove)-2.997 G .497
+(ment command will terminate the search, mak).15 F 2.997(et)-.1 G .497
+(he last line found the current line, and be)-2.997 F .498(gin edit-)
+-.15 F(ing.)108 208.8 Q .567(Non-incremental searches read the entire s\
+earch string before starting to search for matching history lines.)108
+225.6 R(The search string may be typed by the user or be part of the co\
+ntents of the current line.)108 237.6 Q/F3 10.95/Times-Bold@0 SF
+(EDITING COMMANDS)72 254.4 Q F0 1.391(The follo)108 266.4 R 1.391
+(wing is a list of the names of the commands and the def)-.25 F 1.391
+(ault k)-.1 F 1.691 -.15(ey s)-.1 H 1.391(equences to which the).15 F
+3.892(ya)-.15 G(re)-3.892 E 2.5(bound. Command)108 278.4 R
+(names without an accompan)2.5 E(ying k)-.15 E .3 -.15(ey s)-.1 H
+(equence are unbound by def).15 E(ault.)-.1 E .055(In the follo)108
+295.2 R .055(wing descriptions,)-.25 F F2(point)2.555 E F0 .055
+(refers to the current cursor position, and)2.555 F F2(mark)2.555 E F0
+.054(refers to a cursor position)2.554 F(sa)108 307.2 Q -.15(ve)-.2 G
+2.5(db).15 G 2.5(yt)-2.5 G(he)-2.5 E F1(set\255mark)2.5 E F0 2.5
+(command. The)2.5 F(te)2.5 E
+(xt between the point and mark is referred to as the)-.15 E F2 -.37(re)
+2.5 G(gion)-.03 E F0(.)A F1(Commands f)87 324 Q(or Mo)-.25 E(ving)-.1 E
+(beginning\255of\255line \(C\255a\))108 336 Q F0(Mo)144 348 Q .3 -.15
+(ve t)-.15 H 2.5(ot).15 G(he start of the current line.)-2.5 E F1
+(end\255of\255line \(C\255e\))108 360 Q F0(Mo)144 372 Q .3 -.15(ve t)
+-.15 H 2.5(ot).15 G(he end of the line.)-2.5 E F1 -.25(fo)108 384 S
+(rward\255char \(C\255f\)).25 E F0(Mo)144 396 Q .3 -.15(ve f)-.15 H(orw)
+.15 E(ard a character)-.1 E(.)-.55 E F1(backward\255char \(C\255b\))108
+408 Q F0(Mo)144 420 Q .3 -.15(ve b)-.15 H(ack a character).15 E(.)-.55 E
+F1 -.25(fo)108 432 S(rward\255w).25 E(ord \(M\255f\))-.1 E F0(Mo)144 444
+Q .822 -.15(ve f)-.15 H(orw).15 E .522(ard to the end of the ne)-.1 F
+.523(xt w)-.15 F 3.023(ord. W)-.1 F .523
+(ords are composed of alphanumeric characters \(let-)-.8 F
+(ters and digits\).)144 456 Q F1(backward\255w)108 468 Q(ord \(M\255b\))
+-.1 E F0(Mo)144 480 Q 1.71 -.15(ve b)-.15 H 1.41
+(ack to the start of the current or pre).15 F 1.41(vious w)-.25 F 3.91
+(ord. W)-.1 F 1.41(ords are composed of alphanumeric)-.8 F
+(characters \(letters and digits\).)144 492 Q F1(pr)108 504 Q -.15(ev)
+-.18 G(ious\255scr).15 E(een\255line)-.18 E F0 .89(Attempt to mo)144 516
+R 1.19 -.15(ve p)-.15 H .89(oint to the same ph).15 F .891
+(ysical screen column on the pre)-.05 F .891(vious ph)-.25 F .891
+(ysical screen line.)-.05 F 1.056(This will not ha)144 528 R 1.356 -.15
+(ve t)-.2 H 1.056(he desired ef).15 F 1.056
+(fect if the current readline line does not tak)-.25 F 3.555(eu)-.1 G
+3.555(pm)-3.555 G 1.055(ore than one)-3.555 F(ph)144 540 Q(ysical line \
+or if point is not greater than the length of the prompt plus the scree\
+n width.)-.05 E F1(next\255scr)108 552 Q(een\255line)-.18 E F0 .637
+(Attempt to mo)144 564 R .937 -.15(ve p)-.15 H .637(oint to the same ph)
+.15 F .638(ysical screen column on the ne)-.05 F .638(xt ph)-.15 F .638
+(ysical screen line. This)-.05 F .195(will not ha)144 576 R .495 -.15
+(ve t)-.2 H .195(he desired ef).15 F .194
+(fect if the current readline line does not tak)-.25 F 2.694(eu)-.1 G
+2.694(pm)-2.694 G .194(ore than one ph)-2.694 F(ysical)-.05 E .164(line\
+ or if the length of the current readline line is not greater than the \
+length of the prompt plus the)144 588 R(screen width.)144 600 Q F1
+(clear\255display \(M\255C\255l\))108 612 Q F0 1.499
+(Clear the screen and, if possible, the terminal')144 624 R 3.999(ss)
+-.55 G 1.498(crollback b)-3.999 F(uf)-.2 E(fer)-.25 E 3.998(,t)-.4 G
+1.498(hen redra)-3.998 F 3.998(wt)-.15 G 1.498(he current line,)-3.998 F
+(lea)144 636 Q(ving the current line at the top of the screen.)-.2 E F1
+(clear\255scr)108 648 Q(een \(C\255l\))-.18 E F0 1.36
+(Clear the screen, then redra)144 660 R 3.86(wt)-.15 G 1.36
+(he current line, lea)-3.86 F 1.36
+(ving the current line at the top of the screen.)-.2 F -.4(Wi)144 672 S
+(th an ar).4 E
+(gument, refresh the current line without clearing the screen.)-.18 E F1
+-.18(re)108 684 S(draw\255curr).18 E(ent\255line)-.18 E F0
+(Refresh the current line.)144 696 Q(GNU Readline 8.2)72 768 Q
+(2022 September 19)120.405 E(8)190.115 E 0 Cg EP
+%%Page: 9 9
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10/Times-Bold@0 SF
+(Commands f)87 84 Q(or Manipulating the History)-.25 E
+(accept\255line \(Newline, Retur)108 96 Q(n\))-.15 E F0 .365
+(Accept the line re)144 108 R -.05(ga)-.15 G .364
+(rdless of where the cursor is.).05 F .364(If this line is non-empty)
+5.364 F 2.864(,i)-.65 G 2.864(tm)-2.864 G .364(ay be added to the)-2.864
+F .74(history list for future recall with)144 120 R F1(add_history\(\))
+3.24 E F0 5.741(.I)C 3.241(ft)-5.741 G .741
+(he line is a modi\214ed history line, the history)-3.241 F
+(line is restored to its original state.)144 132 Q F1(pr)108 144 Q -.15
+(ev)-.18 G(ious\255history \(C\255p\)).15 E F0(Fetch the pre)144 156 Q
+(vious command from the history list, mo)-.25 E(ving back in the list.)
+-.15 E F1(next\255history \(C\255n\))108 168 Q F0(Fetch the ne)144 180 Q
+(xt command from the history list, mo)-.15 E(ving forw)-.15 E
+(ard in the list.)-.1 E F1(beginning\255of\255history \(M\255<\))108 192
+Q F0(Mo)144 204 Q .3 -.15(ve t)-.15 H 2.5(ot).15 G
+(he \214rst line in the history)-2.5 E(.)-.65 E F1
+(end\255of\255history \(M\255>\))108 216 Q F0(Mo)144 228 Q .3 -.15(ve t)
+-.15 H 2.5(ot).15 G(he end of the input history)-2.5 E 2.5(,i)-.65 G
+(.e., the line currently being entered.)-2.5 E F1
+(operate\255and\255get\255next \(C\255o\))108 240 Q F0 .733(Accept the \
+current line for return to the calling application as if a ne)144 252 R
+.733(wline had been entered, and)-.25 F .367(fetch the ne)144 264 R .367
+(xt line relati)-.15 F .667 -.15(ve t)-.25 H 2.867(ot).15 G .367
+(he current line from the history for editing.)-2.867 F 2.867(An)5.367 G
+.367(umeric ar)-2.867 F .368(gument, if)-.18 F(supplied, speci\214es th\
+e history entry to use instead of the current line.)144 276 Q F1
+(fetch\255history)108 288 Q F0 -.4(Wi)144 300 S .257(th a numeric ar).4
+F .257(gument, fetch that entry from the history list and mak)-.18 F
+2.756(ei)-.1 G 2.756(tt)-2.756 G .256(he current line.)-2.756 F -.4(Wi)
+5.256 G(th-).4 E(out an ar)144 312 Q(gument, mo)-.18 E .3 -.15(ve b)-.15
+H(ack to the \214rst entry in the history list.).15 E F1 -2.29 -.18
+(re v)108 324 T(erse\255sear).08 E(ch\255history \(C\255r\))-.18 E F0
+1.47(Search backw)144 336 R 1.471
+(ard starting at the current line and mo)-.1 F 1.471
+(ving `up' through the history as necessary)-.15 F(.)-.65 E
+(This is an incremental search.)144 348 Q F1 -.25(fo)108 360 S
+(rward\255sear).25 E(ch\255history \(C\255s\))-.18 E F0 1.132
+(Search forw)144 372 R 1.132(ard starting at the current line and mo)-.1
+F 1.131(ving `do)-.15 F 1.131(wn' through the history as necessary)-.25
+F(.)-.65 E(This is an incremental search.)144 384 Q F1(non\255incr)108
+396 Q(emental\255r)-.18 E -2.3 -.15(ev e)-.18 H(rse\255sear).15 E
+(ch\255history \(M\255p\))-.18 E F0 .164(Search backw)144 408 R .164(ar\
+d through the history starting at the current line using a non-incremen\
+tal search for)-.1 F 2.5(as)144 420 S(tring supplied by the user)-2.5 E
+(.)-.55 E F1(non\255incr)108 432 Q(emental\255f)-.18 E(orward\255sear)
+-.25 E(ch\255history \(M\255n\))-.18 E F0 1.354(Search forw)144 444 R
+1.354(ard through the history using a non-incremental search for a stri\
+ng supplied by the)-.1 F(user)144 456 Q(.)-.55 E F1(history\255sear)108
+468 Q(ch\255backward)-.18 E F0 .95(Search backw)144 480 R .951(ard thro\
+ugh the history for the string of characters between the start of the c\
+urrent)-.1 F .12(line and the current cursor position \(the)144 492 R/F2
+10/Times-Italic@0 SF(point)2.62 E F0 2.62(\). The)B .12
+(search string must match at the be)2.62 F .12(ginning of a)-.15 F
+(history line.)144 504 Q(This is a non-incremental search.)5 E F1
+(history\255sear)108 516 Q(ch\255f)-.18 E(orward)-.25 E F0 .248
+(Search forw)144 528 R .249(ard through the history for the string of c\
+haracters between the start of the current line)-.1 F .036
+(and the point.)144 540 R .036(The search string must match at the be)
+5.036 F .035(ginning of a history line.)-.15 F .035
+(This is a non-incre-)5.035 F(mental search.)144 552 Q F1
+(history\255substring\255sear)108 564 Q(ch\255backward)-.18 E F0 .95
+(Search backw)144 576 R .951(ard through the history for the string of \
+characters between the start of the current)-.1 F .007
+(line and the current cursor position \(the)144 588 R F2(point)2.507 E
+F0 2.507(\). The)B .007(search string may match an)2.507 F .006
+(ywhere in a history)-.15 F 2.5(line. This)144 600 R
+(is a non-incremental search.)2.5 E F1(history\255substring\255sear)108
+612 Q(ch\255f)-.18 E(orward)-.25 E F0 .248(Search forw)144 624 R .249(a\
+rd through the history for the string of characters between the start o\
+f the current line)-.1 F .319(and the point.)144 636 R .319
+(The search string may match an)5.319 F .319(ywhere in a history line.)
+-.15 F .318(This is a non-incremental)5.318 F(search.)144 648 Q F1
+(yank\255nth\255ar)108 660 Q 2.5(g\()-.1 G<4dad43ad7929>-2.5 E F0 .622
+(Insert the \214rst ar)144 672 R .622(gument to the pre)-.18 F .622
+(vious command \(usually the second w)-.25 F .622(ord on the pre)-.1 F
+.622(vious line\))-.25 F .773(at point.)144 684 R -.4(Wi)5.773 G .773
+(th an ar).4 F(gument)-.18 E F2(n)3.633 E F0 3.273(,i).24 G .773
+(nsert the)-3.273 F F2(n)3.273 E F0 .773(th w)B .773(ord from the pre)
+-.1 F .773(vious command \(the w)-.25 F .773(ords in the)-.1 F(pre)144
+696 Q .291(vious command be)-.25 F .291(gin with w)-.15 F .291(ord 0\).)
+-.1 F 2.791(An)5.291 G -2.25 -.15(eg a)-2.791 H(ti).15 E .591 -.15(ve a)
+-.25 H -.18(rg).15 G .291(ument inserts the).18 F F2(n)2.791 E F0 .291
+(th w)B .292(ord from the end of)-.1 F .282(the pre)144 708 R .282
+(vious command.)-.25 F .282(Once the ar)5.282 F(gument)-.18 E F2(n)2.781
+E F0 .281(is computed, the ar)2.781 F .281(gument is e)-.18 F .281
+(xtracted as if the "!)-.15 F F2(n)A F0(")A(history e)144 720 Q
+(xpansion had been speci\214ed.)-.15 E(GNU Readline 8.2)72 768 Q
+(2022 September 19)120.405 E(9)190.115 E 0 Cg EP
+%%Page: 10 10
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10/Times-Bold@0 SF
+(yank\255last\255ar)108 84 Q 2.5(g\()-.1 G -1.667(M\255. ,)-2.5 F -1.667
+(M\255_ \))2.5 F F0 1.307(Insert the last ar)144 96 R 1.307
+(gument to the pre)-.18 F 1.307(vious command \(the last w)-.25 F 1.308
+(ord of the pre)-.1 F 1.308(vious history entry\).)-.25 F -.4(Wi)144 108
+S .204(th a numeric ar).4 F .204(gument, beha)-.18 F .504 -.15(ve ex)-.2
+H .204(actly lik).15 F(e)-.1 E F1(yank\255nth\255ar)2.704 E(g)-.1 E F0
+5.203(.S)C(uccessi)-5.203 E .503 -.15(ve c)-.25 H .203(alls to).15 F F1
+(yank\255last\255ar)2.703 E(g)-.1 E F0(mo)144 120 Q .806 -.15(ve b)-.15
+H .507(ack through the history list, inserting the last w).15 F .507
+(ord \(or the w)-.1 F .507(ord speci\214ed by the ar)-.1 F(gument)-.18 E
+.416(to the \214rst call\) of each line in turn.)144 132 R(An)5.416 E
+2.916(yn)-.15 G .416(umeric ar)-2.916 F .416
+(gument supplied to these successi)-.18 F .715 -.15(ve c)-.25 H .415
+(alls de-).15 F 1.217(termines the direction to mo)144 144 R 1.518 -.15
+(ve t)-.15 H 1.218(hrough the history).15 F 6.218(.A)-.65 G(ne)-2.5 E
+-.05(ga)-.15 G(ti).05 E 1.518 -.15(ve a)-.25 H -.18(rg).15 G 1.218
+(ument switches the direction).18 F .494
+(through the history \(back or forw)144 156 R 2.994(ard\). The)-.1 F
+.494(history e)2.994 F .494(xpansion f)-.15 F .494
+(acilities are used to e)-.1 F .494(xtract the last)-.15 F(ar)144 168 Q
+(gument, as if the "!$" history e)-.18 E(xpansion had been speci\214ed.)
+-.15 E F1(Commands f)87 184.8 Q(or Changing T)-.25 E(ext)-.92 E/F2 10
+/Times-Italic@0 SF(end\255of\255\214le)108 196.8 Q F1
+(\(usually C\255d\))2.5 E F0 .798
+(The character indicating end-of-\214le as set, for e)144 208.8 R .799
+(xample, by)-.15 F/F3 10/Courier@0 SF(stty)3.299 E F0 5.799(.I)C 3.299
+(ft)-5.799 G .799(his character is read when)-3.299 F .167
+(there are no characters on the line, and point is at the be)144 220.8 R
+.167(ginning of the line, readline interprets it as)-.15 F
+(the end of input and returns)144 232.8 Q/F4 9/Times-Bold@0 SF(EOF)2.5 E
+/F5 9/Times-Roman@0 SF(.)A F1(delete\255char \(C\255d\))108 244.8 Q F0
+.441(Delete the character at point.)144 256.8 R .442
+(If this function is bound to the same character as the tty)5.441 F F1
+(EOF)2.942 E F0(char)2.942 E(-)-.2 E(acter)144 268.8 Q 2.5(,a)-.4 G(s)
+-2.5 E F1(C\255d)2.5 E F0(commonly is, see abo)2.5 E .3 -.15(ve f)-.15 H
+(or the ef).15 E(fects.)-.25 E F1(backward\255delete\255char \(Rubout\))
+108 280.8 Q F0 .553(Delete the character behind the cursor)144 292.8 R
+5.553(.W)-.55 G .553(hen gi)-5.553 F -.15(ve)-.25 G 3.053(nan).15 G .553
+(umeric ar)-3.053 F .552(gument, sa)-.18 F .852 -.15(ve t)-.2 H .552
+(he deleted te).15 F .552(xt on)-.15 F(the kill ring.)144 304.8 Q F1
+-.25(fo)108 316.8 S(rward\255backward\255delete\255char).25 E F0 .473
+(Delete the character under the cursor)144 328.8 R 2.973(,u)-.4 G .474
+(nless the cursor is at the end of the line, in which case the)-2.973 F
+(character behind the cursor is deleted.)144 340.8 Q F1
+(quoted\255insert \(C\255q, C\255v\))108 352.8 Q F0 1.229(Add the ne)144
+364.8 R 1.228(xt character that you type to the line v)-.15 F 3.728
+(erbatim. This)-.15 F 1.228(is ho)3.728 F 3.728(wt)-.25 G 3.728(oi)
+-3.728 G 1.228(nsert characters lik)-3.728 F(e)-.1 E F1(C\255q)144 376.8
+Q F0 2.5(,f)C(or e)-2.5 E(xample.)-.15 E F1(tab\255insert \(M-T)108
+388.8 Q(AB\))-.9 E F0(Insert a tab character)144 400.8 Q(.)-.55 E F1
+(self\255insert \(a, b, A, 1, !, ...\))108 412.8 Q F0
+(Insert the character typed.)144 424.8 Q F1
+(transpose\255chars \(C\255t\))108 436.8 Q F0 .321
+(Drag the character before point forw)144 448.8 R .321(ard o)-.1 F -.15
+(ve)-.15 G 2.821(rt).15 G .321(he character at point, mo)-2.821 F .322
+(ving point forw)-.15 F .322(ard as well.)-.1 F .372
+(If point is at the end of the line, then this transposes the tw)144
+460.8 R 2.872(oc)-.1 G .372(haracters before point.)-2.872 F(Ne)5.372 E
+-.05(ga)-.15 G(ti).05 E .672 -.15(ve a)-.25 H -.2(r-).15 G(guments ha)
+144 472.8 Q .3 -.15(ve n)-.2 H 2.5(oe).15 G -.25(ff)-2.5 G(ect.).25 E F1
+(transpose\255w)108 484.8 Q(ords \(M\255t\))-.1 E F0 .023(Drag the w)144
+496.8 R .023(ord before point past the w)-.1 F .023(ord after point, mo)
+-.1 F .023(ving point o)-.15 F -.15(ve)-.15 G 2.524(rt).15 G .024(hat w)
+-2.524 F .024(ord as well.)-.1 F .024(If point)5.024 F
+(is at the end of the line, this transposes the last tw)144 508.8 Q 2.5
+(ow)-.1 G(ords on the line.)-2.6 E F1(upcase\255w)108 520.8 Q
+(ord \(M\255u\))-.1 E F0 1.699(Uppercase the current \(or follo)144
+532.8 R 1.698(wing\) w)-.25 F 4.198(ord. W)-.1 F 1.698(ith a ne)-.4 F
+-.05(ga)-.15 G(ti).05 E 1.998 -.15(ve a)-.25 H -.18(rg).15 G 1.698
+(ument, uppercase the pre).18 F(vious)-.25 E -.1(wo)144 544.8 S(rd, b).1
+E(ut do not mo)-.2 E .3 -.15(ve p)-.15 H(oint.).15 E F1(do)108 556.8 Q
+(wncase\255w)-.1 E(ord \(M\255l\))-.1 E F0(Lo)144 568.8 Q 1.647
+(wercase the current \(or follo)-.25 F 1.647(wing\) w)-.25 F 4.147
+(ord. W)-.1 F 1.648(ith a ne)-.4 F -.05(ga)-.15 G(ti).05 E 1.948 -.15
+(ve a)-.25 H -.18(rg).15 G 1.648(ument, lo).18 F 1.648(wercase the pre)
+-.25 F(vious)-.25 E -.1(wo)144 580.8 S(rd, b).1 E(ut do not mo)-.2 E .3
+-.15(ve p)-.15 H(oint.).15 E F1(capitalize\255w)108 592.8 Q
+(ord \(M\255c\))-.1 E F0 1.975(Capitalize the current \(or follo)144
+604.8 R 1.974(wing\) w)-.25 F 4.474(ord. W)-.1 F 1.974(ith a ne)-.4 F
+-.05(ga)-.15 G(ti).05 E 2.274 -.15(ve a)-.25 H -.18(rg).15 G 1.974
+(ument, capitalize the pre).18 F(vious)-.25 E -.1(wo)144 616.8 S(rd, b)
+.1 E(ut do not mo)-.2 E .3 -.15(ve p)-.15 H(oint.).15 E F1 -.1(ove)108
+628.8 S(rwrite\255mode).1 E F0 -.8(To)144 640.8 S .437(ggle o).8 F -.15
+(ve)-.15 G .437(rwrite mode.).15 F -.4(Wi)5.437 G .437(th an e).4 F .437
+(xplicit positi)-.15 F .738 -.15(ve n)-.25 H .438(umeric ar).15 F .438
+(gument, switches to o)-.18 F -.15(ve)-.15 G .438(rwrite mode.).15 F -.4
+(Wi)144 652.8 S .781(th an e).4 F .781(xplicit non-positi)-.15 F 1.081
+-.15(ve n)-.25 H .781(umeric ar).15 F .781
+(gument, switches to insert mode.)-.18 F .78(This command af)5.781 F
+(fects)-.25 E(only)144 664.8 Q F1(emacs)4.394 E F0(mode;)4.394 E F1(vi)
+4.394 E F0 1.894(mode does o)4.394 F -.15(ve)-.15 G 1.894(rwrite dif).15
+F(ferently)-.25 E 6.894(.E)-.65 G 1.894(ach call to)-6.894 F F2 -.37(re)
+4.395 G(adline\(\)).37 E F0 1.895(starts in insert)4.395 F 3.969
+(mode. In)144 676.8 R -.15(ove)3.969 G 1.469
+(rwrite mode, characters bound to).15 F F1(self\255insert)3.969 E F0
+1.468(replace the te)3.969 F 1.468(xt at point rather than)-.15 F .957
+(pushing the te)144 688.8 R .957(xt to the right.)-.15 F .958
+(Characters bound to)5.957 F F1(backward\255delete\255char)3.458 E F0
+.958(replace the character)3.458 F(before point with a space.)144 700.8
+Q(By def)5 E(ault, this command is unbound.)-.1 E(GNU Readline 8.2)72
+768 Q(2022 September 19)120.405 E(10)185.115 E 0 Cg EP
+%%Page: 11 11
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10/Times-Bold@0 SF
+(Killing and Y)87 84 Q(anking)-.85 E(kill\255line \(C\255k\))108 96 Q F0
+(Kill the te)144 108 Q(xt from point to the end of the line.)-.15 E F1
+(backward\255kill\255line \(C\255x Rubout\))108 120 Q F0(Kill backw)144
+132 Q(ard to the be)-.1 E(ginning of the line.)-.15 E F1
+(unix\255line\255discard \(C\255u\))108 144 Q F0(Kill backw)144 156 Q
+(ard from point to the be)-.1 E(ginning of the line.)-.15 E
+(The killed te)5 E(xt is sa)-.15 E -.15(ve)-.2 G 2.5(do).15 G 2.5(nt)
+-2.5 G(he kill-ring.)-2.5 E F1(kill\255whole\255line)108 168 Q F0
+(Kill all characters on the current line, no matter where point is.)144
+180 Q F1(kill\255w)108 192 Q(ord \(M\255d\))-.1 E F0 1.308
+(Kill from point the end of the current w)144 204 R 1.308
+(ord, or if between w)-.1 F 1.308(ords, to the end of the ne)-.1 F 1.307
+(xt w)-.15 F(ord.)-.1 E -.8(Wo)144 216 S
+(rd boundaries are the same as those used by).8 E F1 -.25(fo)2.5 G
+(rward\255w).25 E(ord)-.1 E F0(.)A F1(backward\255kill\255w)108 228 Q
+(ord \(M\255Rubout\))-.1 E F0(Kill the w)144 240 Q(ord behind point.)-.1
+E -.8(Wo)5 G(rd boundaries are the same as those used by).8 E F1
+(backward\255w)2.5 E(ord)-.1 E F0(.)A F1(unix\255w)108 252 Q
+(ord\255rubout \(C\255w\))-.1 E F0 .364(Kill the w)144 264 R .364
+(ord behind point, using white space as a w)-.1 F .365(ord boundary)-.1
+F 5.365(.T)-.65 G .365(he killed te)-5.365 F .365(xt is sa)-.15 F -.15
+(ve)-.2 G 2.865(do).15 G 2.865(nt)-2.865 G(he)-2.865 E(kill-ring.)144
+276 Q F1(unix\255\214lename\255rubout)108 288 Q F0 .167(Kill the w)144
+300 R .166
+(ord behind point, using white space and the slash character as the w)
+-.1 F .166(ord boundaries.)-.1 F(The)5.166 E(killed te)144 312 Q
+(xt is sa)-.15 E -.15(ve)-.2 G 2.5(do).15 G 2.5(nt)-2.5 G(he kill-ring.)
+-2.5 E F1(delete\255horizontal\255space \(M\255\\\))108 324 Q F0
+(Delete all spaces and tabs around point.)144 336 Q F1(kill\255r)108 348
+Q(egion)-.18 E F0 .301(Kill the te)144 360 R .301
+(xt between the point and)-.15 F/F2 10/Times-Italic@0 SF(mark)2.801 E F0
+(\(sa)2.801 E -.15(ve)-.2 G 2.801(dc).15 G .301(ursor position\).)-2.801
+F .301(This te)5.301 F .301(xt is referred to as the)-.15 F F2 -.37(re)
+2.802 G(-).37 E(gion)144 372 Q F0(.)A F1(copy\255r)108 384 Q
+(egion\255as\255kill)-.18 E F0(Cop)144 396 Q 2.5(yt)-.1 G(he te)-2.5 E
+(xt in the re)-.15 E(gion to the kill b)-.15 E(uf)-.2 E(fer)-.25 E(.)
+-.55 E F1(copy\255backward\255w)108 408 Q(ord)-.1 E F0(Cop)144 420 Q
+4.801(yt)-.1 G 2.301(he w)-4.801 F 2.301(ord before point to the kill b)
+-.1 F(uf)-.2 E(fer)-.25 E 7.301(.T)-.55 G 2.301(he w)-7.301 F 2.3
+(ord boundaries are the same as)-.1 F F1(back-)4.8 E(ward\255w)144 432 Q
+(ord)-.1 E F0(.)A F1(copy\255f)108 444 Q(orward\255w)-.25 E(ord)-.1 E F0
+(Cop)144 456 Q 4.507(yt)-.1 G 2.007(he w)-4.507 F 2.007(ord follo)-.1 F
+2.007(wing point to the kill b)-.25 F(uf)-.2 E(fer)-.25 E 7.008(.T)-.55
+G 2.008(he w)-7.008 F 2.008(ord boundaries are the same as)-.1 F F1 -.25
+(fo)4.508 G -.37(r-).25 G(ward\255w)144 468 Q(ord)-.1 E F0(.)A F1
+(yank \(C\255y\))108 480 Q F0 -1(Ya)144 492 S
+(nk the top of the kill ring into the b)1 E(uf)-.2 E(fer at point.)-.25
+E F1(yank\255pop \(M\255y\))108 504 Q F0
+(Rotate the kill ring, and yank the ne)144 516 Q 2.5(wt)-.25 G 2.5
+(op. Only)-2.5 F -.1(wo)2.5 G(rks follo).1 E(wing)-.25 E F1(yank)2.5 E
+F0(or)2.5 E F1(yank\255pop)2.5 E F0(.)A F1(Numeric Ar)87 532.8 Q
+(guments)-.1 E(digit\255ar)108 544.8 Q
+(gument \(M\2550, M\2551, ..., M\255\255\))-.1 E F0 .367
+(Add this digit to the ar)144 556.8 R .367
+(gument already accumulating, or start a ne)-.18 F 2.867(wa)-.25 G -.18
+(rg)-2.867 G 2.867(ument. M\255\255).18 F .366(starts a ne)2.867 F -.05
+(ga)-.15 G(-).05 E(ti)144 568.8 Q .3 -.15(ve a)-.25 H -.18(rg).15 G
+(ument.).18 E F1(uni)108 580.8 Q -.1(ve)-.1 G(rsal\255ar).1 E(gument)-.1
+E F0 .778(This is another w)144 592.8 R .779(ay to specify an ar)-.1 F
+3.279(gument. If)-.18 F .779(this command is follo)3.279 F .779
+(wed by one or more digits,)-.25 F 1.376
+(optionally with a leading minus sign, those digits de\214ne the ar)144
+604.8 R 3.876(gument. If)-.18 F 1.376(the command is fol-)3.876 F(lo)144
+616.8 Q 1.17(wed by digits, e)-.25 F -.15(xe)-.15 G(cuting).15 E F1(uni)
+3.67 E -.1(ve)-.1 G(rsal\255ar).1 E(gument)-.1 E F0(ag)3.67 E 1.17
+(ain ends the numeric ar)-.05 F 1.17(gument, b)-.18 F 1.17(ut is other)
+-.2 F(-)-.2 E .899(wise ignored.)144 628.8 R .898
+(As a special case, if this command is immediately follo)5.899 F .898
+(wed by a character that is)-.25 F .243
+(neither a digit or minus sign, the ar)144 640.8 R .243
+(gument count for the ne)-.18 F .243(xt command is multiplied by four)
+-.15 F 5.243(.T)-.55 G(he)-5.243 E(ar)144 652.8 Q .378
+(gument count is initially one, so e)-.18 F -.15(xe)-.15 G .378
+(cuting this function the \214rst time mak).15 F .378(es the ar)-.1 F
+.378(gument count)-.18 F(four)144 664.8 Q 2.5(,as)-.4 G(econd time mak)
+-2.5 E(es the ar)-.1 E(gument count sixteen, and so on.)-.18 E F1
+(Completing)87 681.6 Q(complete \(T)108 693.6 Q(AB\))-.9 E F0 .681
+(Attempt to perform completion on the te)144 705.6 R .681
+(xt before point.)-.15 F .682(The actual completion performed is ap-)
+5.682 F(plication-speci\214c.)144 717.6 Q F1(Bash)6.244 E F0 3.744(,f)C
+1.244(or instance, attempts completion treating the te)-3.744 F 1.244
+(xt as a v)-.15 F 1.243(ariable \(if the)-.25 F(te)144 729.6 Q .656
+(xt be)-.15 F .656(gins with)-.15 F F1($)3.156 E F0 .656
+(\), username \(if the te)B .656(xt be)-.15 F .656(gins with)-.15 F F1
+(~)3.156 E F0 .656(\), hostname \(if the te)B .656(xt be)-.15 F .656
+(gins with)-.15 F F1(@)3.157 E F0 .657(\), or)B(GNU Readline 8.2)72 768
+Q(2022 September 19)120.405 E(11)185.115 E 0 Cg EP
+%%Page: 12 12
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E .93
+(command \(including aliases and functions\) in turn.)144 84 R .929
+(If none of these produces a match, \214lename)5.929 F 1.273
+(completion is attempted.)144 96 R/F1 10/Times-Bold@0 SF(Gdb)6.273 E F0
+3.773(,o)C 3.773(nt)-3.773 G 1.273(he other hand, allo)-3.773 F 1.273
+(ws completion of program functions and)-.25 F -.25(va)144 108 S(riable\
+s, and only attempts \214lename completion under certain circumstances.)
+.25 E F1(possible\255completions \(M\255?\))108 120 Q F0 .262
+(List the possible completions of the te)144 132 R .262
+(xt before point.)-.15 F .261
+(When displaying completions, readline sets)5.261 F 1.002
+(the number of columns used for display to the v)144 144 R 1.002
+(alue of)-.25 F F1(completion-display-width)3.502 E F0 3.502(,t)C 1.003
+(he v)-3.502 F 1.003(alue of)-.25 F(the en)144 156 Q(vironment v)-.4 E
+(ariable)-.25 E/F2 9/Times-Bold@0 SF(COLUMNS)2.5 E/F3 9/Times-Roman@0 SF
+(,)A F0(or the screen width, in that order)2.25 E(.)-.55 E F1
+(insert\255completions \(M\255*\))108 168 Q F0 .783
+(Insert all completions of the te)144 180 R .783(xt before point that w)
+-.15 F .783(ould ha)-.1 F 1.083 -.15(ve b)-.2 H .783(een generated by)
+.15 F F1(possible\255com-)3.282 E(pletions)144 192 Q F0(.)A F1
+(menu\255complete)108 204 Q F0 .928(Similar to)144 216 R F1(complete)
+3.428 E F0 3.428(,b)C .929(ut replaces the w)-3.628 F .929
+(ord to be completed with a single match from the list of)-.1 F 1.194
+(possible completions.)144 228 R 1.194(Repeated e)6.194 F -.15(xe)-.15 G
+1.194(cution of).15 F F1(menu\255complete)3.694 E F0 1.193
+(steps through the list of possible)3.694 F .828
+(completions, inserting each match in turn.)144 240 R .828
+(At the end of the list of completions, the bell is rung)5.828 F .727
+(\(subject to the setting of)144 252 R F1(bell\255style)3.227 E F0 3.227
+(\)a)C .727(nd the original te)-3.227 F .727(xt is restored.)-.15 F .727
+(An ar)5.727 F .727(gument of)-.18 F/F4 10/Times-Italic@0 SF(n)3.227 E
+F0(mo)3.227 E -.15(ve)-.15 G(s).15 E F4(n)3.227 E F0 1.73
+(positions forw)144 264 R 1.73(ard in the list of matches; a ne)-.1 F
+-.05(ga)-.15 G(ti).05 E 2.03 -.15(ve a)-.25 H -.18(rg).15 G 1.73
+(ument may be used to mo).18 F 2.03 -.15(ve b)-.15 H(ackw).15 E(ard)-.1
+E(through the list.)144 276 Q(This command is intended to be bound to)5
+E F1 -.9(TA)2.5 G(B).9 E F0 2.5(,b)C(ut is unbound by def)-2.7 E(ault.)
+-.1 E F1(menu\255complete\255backward)108 288 Q F0 .82(Identical to)144
+300 R F1(menu\255complete)3.32 E F0 3.32(,b)C .82(ut mo)-3.52 F -.15(ve)
+-.15 G 3.32(sb).15 G(ackw)-3.32 E .82
+(ard through the list of possible completions, as if)-.1 F F1
+(menu\255complete)144 312 Q F0(had been gi)2.5 E -.15(ve)-.25 G 2.5(nan)
+.15 G -2.25 -.15(eg a)-2.5 H(ti).15 E .3 -.15(ve a)-.25 H -.18(rg).15 G
+2.5(ument. This).18 F(command is unbound by def)2.5 E(ault.)-.1 E F1
+(delete\255char\255or\255list)108 324 Q F0 .373
+(Deletes the character under the cursor if not at the be)144 336 R .374
+(ginning or end of the line \(lik)-.15 F(e)-.1 E F1(delete-char)2.874 E
+F0(\).)A(If at the end of the line, beha)144 348 Q -.15(ve)-.2 G 2.5(si)
+.15 G(dentically to)-2.5 E F1(possible-completions)2.5 E F0(.)A F1 -.25
+(Ke)87 364.8 S(yboard Macr).25 E(os)-.18 E(start\255kbd\255macr)108
+376.8 Q 2.5(o\()-.18 G(C\255x \()-2.5 E(\)).833 E F0(Be)144 388.8 Q
+(gin sa)-.15 E(ving the characters typed into the current k)-.2 E -.15
+(ey)-.1 G(board macro.).15 E F1(end\255kbd\255macr)108 400.8 Q 2.5(o\()
+-.18 G(C\255x \))-2.5 E(\)).833 E F0(Stop sa)144 412.8 Q
+(ving the characters typed into the current k)-.2 E -.15(ey)-.1 G
+(board macro and store the de\214nition.).15 E F1
+(call\255last\255kbd\255macr)108 424.8 Q 2.5(o\()-.18 G(C\255x e\))-2.5
+E F0(Re-e)144 436.8 Q -.15(xe)-.15 G 1(cute the last k).15 F -.15(ey)-.1
+G .999(board macro de\214ned, by making the characters in the macro app\
+ear as if).15 F(typed at the k)144 448.8 Q -.15(ey)-.1 G(board.).15 E F1
+(print\255last\255kbd\255macr)108 460.8 Q 2.5(o\()-.18 G(\))-2.5 E F0
+(Print the last k)144 472.8 Q -.15(ey)-.1 G
+(board macro de\214ned in a format suitable for the).15 E F4(inputr)2.5
+E(c)-.37 E F0(\214le.)2.5 E F1(Miscellaneous)87 489.6 Q -.18(re)108
+501.6 S<ad72>.18 E(ead\255init\255\214le \(C\255x C\255r\))-.18 E F0
+1.776(Read in the contents of the)144 513.6 R F4(inputr)4.276 E(c)-.37 E
+F0 1.777(\214le, and incorporate an)4.276 F 4.277(yb)-.15 G 1.777
+(indings or v)-4.277 F 1.777(ariable assignments)-.25 F(found there.)144
+525.6 Q F1(abort \(C\255g\))108 537.6 Q F0 3.249
+(Abort the current editing command and ring the terminal')144 549.6 R
+5.748(sb)-.55 G 3.248(ell \(subject to the setting of)-5.748 F F1
+(bell\255style)144 561.6 Q F0(\).)A F1(do\255lo)108 573.6 Q(wer)-.1 E
+(case\255v)-.18 E(ersion \(M\255A, M\255B, M\255)-.1 E F4(x)A F1 2.5(,.)
+C(..\))-2.5 E F0 1.738(If the meta\214ed character)144 585.6 R F4(x)
+4.238 E F0 1.739
+(is uppercase, run the command that is bound to the corresponding)4.238
+F(meta\214ed lo)144 597.6 Q(wercase character)-.25 E 5(.T)-.55 G
+(he beha)-5 E(vior is unde\214ned if)-.2 E F4(x)2.5 E F0(is already lo)
+2.5 E(wercase.)-.25 E F1(pr)108 609.6 Q(e\214x\255meta \(ESC\))-.18 E F0
+(Metafy the ne)144 621.6 Q(xt character typed.)-.15 E F2(ESC)5 E F1(f)
+2.25 E F0(is equi)2.5 E -.25(va)-.25 G(lent to).25 E F1(Meta\255f)2.5 E
+F0(.)A F1(undo \(C\255_, C\255x C\255u\))108 633.6 Q F0
+(Incremental undo, separately remembered for each line.)144 645.6 Q F1
+-2.29 -.18(re v)108 657.6 T(ert\255line \(M\255r\)).08 E F0 .231
+(Undo all changes made to this line.)144 669.6 R .231(This is lik)5.231
+F 2.731(ee)-.1 G -.15(xe)-2.881 G .23(cuting the).15 F F1(undo)2.73 E F0
+.23(command enough times to re-)2.73 F
+(turn the line to its initial state.)144 681.6 Q F1
+(tilde\255expand \(M\255&\))108 693.6 Q F0(Perform tilde e)144 705.6 Q
+(xpansion on the current w)-.15 E(ord.)-.1 E(GNU Readline 8.2)72 768 Q
+(2022 September 19)120.405 E(12)185.115 E 0 Cg EP
+%%Page: 13 13
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E/F1 10/Times-Bold@0 SF
+(set\255mark \(C\255@, M\255<space>\))108 84 Q F0
+(Set the mark to the point.)144 96 Q(If a numeric ar)5 E
+(gument is supplied, the mark is set to that position.)-.18 E F1
+(exchange\255point\255and\255mark \(C\255x C\255x\))108 108 Q F0(Sw)144
+120 Q .282(ap the point with the mark.)-.1 F .283
+(The current cursor position is set to the sa)5.283 F -.15(ve)-.2 G
+2.783(dp).15 G .283(osition, and the old)-2.783 F(cursor position is sa)
+144 132 Q -.15(ve)-.2 G 2.5(da).15 G 2.5(st)-2.5 G(he mark.)-2.5 E F1
+(character\255sear)108 144 Q(ch \(C\255]\))-.18 E F0 3.112(Ac)144 156 S
+.612(haracter is read and point is mo)-3.112 F -.15(ve)-.15 G 3.112(dt)
+.15 G 3.112(ot)-3.112 G .612(he ne)-3.112 F .612
+(xt occurrence of that character)-.15 F 5.611(.A)-.55 G(ne)-2.5 E -.05
+(ga)-.15 G(ti).05 E .911 -.15(ve a)-.25 H -.18(rg).15 G(u-).18 E
+(ment searches for pre)144 168 Q(vious occurrences.)-.25 E F1
+(character\255sear)108 180 Q(ch\255backward \(M\255C\255]\))-.18 E F0
+2.694(Ac)144 192 S .194(haracter is read and point is mo)-2.694 F -.15
+(ve)-.15 G 2.694(dt).15 G 2.694(ot)-2.694 G .194(he pre)-2.694 F .194
+(vious occurrence of that character)-.25 F 5.194(.A)-.55 G(ne)-2.499 E
+-.05(ga)-.15 G(ti).05 E .495 -.15(ve a)-.25 H -.2(r-).15 G
+(gument searches for subsequent occurrences.)144 204 Q F1
+(skip\255csi\255sequence)108 216 Q F0 1.827
+(Read enough characters to consume a multi-k)144 228 R 2.126 -.15(ey s)
+-.1 H 1.826(equence such as those de\214ned for k).15 F -.15(ey)-.1 G
+4.326(sl).15 G(ik)-4.326 E(e)-.1 E .79(Home and End.)144 240 R .791
+(Such sequences be)5.79 F .791
+(gin with a Control Sequence Indicator \(CSI\), usually ESC\255[.)-.15 F
+.332(If this sequence is bound to "\\[", k)144 252 R -.15(ey)-.1 G 2.831
+(sp).15 G .331(roducing such sequences will ha)-2.831 F .631 -.15(ve n)
+-.2 H 2.831(oe).15 G -.25(ff)-2.831 G .331(ect unless e).25 F(xplic-)
+-.15 E .026(itly bound to a readline command, instead of inserting stra\
+y characters into the editing b)144 264 R(uf)-.2 E(fer)-.25 E 5.026(.T)
+-.55 G(his)-5.026 E(is unbound by def)144 276 Q(ault, b)-.1 E
+(ut usually bound to ESC\255[.)-.2 E F1(insert\255comment \(M\255#\))108
+288 Q F0 -.4(Wi)144 300 S .481(thout a numeric ar).4 F .481
+(gument, the v)-.18 F .481(alue of the readline)-.25 F F1
+(comment\255begin)2.981 E F0 -.25(va)2.981 G .48
+(riable is inserted at the).25 F(be)144 312 Q .244
+(ginning of the current line.)-.15 F .245(If a numeric ar)5.244 F .245
+(gument is supplied, this command acts as a toggle: if)-.18 F .322
+(the characters at the be)144 324 R .321
+(ginning of the line do not match the v)-.15 F .321(alue of)-.25 F F1
+(comment\255begin)2.821 E F0 2.821(,t)C .321(he v)-2.821 F .321(alue is)
+-.25 F 1.013(inserted, otherwise the characters in)144 336 R F1
+(comment-begin)3.514 E F0 1.014(are deleted from the be)3.514 F 1.014
+(ginning of the line.)-.15 F 1.469
+(In either case, the line is accepted as if a ne)144 348 R 1.468
+(wline had been typed.)-.25 F 1.468(The def)6.468 F 1.468(ault v)-.1 F
+1.468(alue of)-.25 F F1(com-)3.968 E(ment\255begin)144 360 Q F0(mak)
+2.982 E .483(es the current line a shell comment.)-.1 F .483
+(If a numeric ar)5.483 F .483(gument causes the comment)-.18 F
+(character to be remo)144 372 Q -.15(ve)-.15 G(d, the line will be e).15
+E -.15(xe)-.15 G(cuted by the shell.).15 E F1(dump\255functions)108 384
+Q F0 .627(Print all of the functions and their k)144 396 R .927 -.15
+(ey b)-.1 H .626(indings to the readline output stream.).15 F .626
+(If a numeric ar)5.626 F(gu-)-.18 E
+(ment is supplied, the output is formatted in such a w)144 408 Q
+(ay that it can be made part of an)-.1 E/F2 10/Times-Italic@0 SF(inputr)
+2.5 E(c)-.37 E F0(\214le.)2.5 E F1(dump\255v)108 420 Q(ariables)-.1 E F0
+.283(Print all of the settable v)144 432 R .283(ariables and their v)
+-.25 F .283(alues to the readline output stream.)-.25 F .283
+(If a numeric ar)5.283 F(gu-)-.18 E
+(ment is supplied, the output is formatted in such a w)144 444 Q
+(ay that it can be made part of an)-.1 E F2(inputr)2.5 E(c)-.37 E F0
+(\214le.)2.5 E F1(dump\255macr)108 456 Q(os)-.18 E F0 .593
+(Print all of the readline k)144 468 R .893 -.15(ey s)-.1 H .592
+(equences bound to macros and the strings the).15 F 3.092(yo)-.15 G
+3.092(utput. If)-3.092 F 3.092(an)3.092 G(umeric)-3.092 E(ar)144 480 Q
+.528(gument is supplied, the output is formatted in such a w)-.18 F .528
+(ay that it can be made part of an)-.1 F F2(inputr)3.028 E(c)-.37 E F0
+(\214le.)144 492 Q F1(emacs\255editing\255mode \(C\255e\))108 504 Q F0
+(When in)144 516 Q F1(vi)2.5 E F0(command mode, this causes a switch to)
+2.5 E F1(emacs)2.5 E F0(editing mode.)2.5 E F1
+(vi\255editing\255mode \(M\255C\255j\))108 528 Q F0(When in)144 540 Q F1
+(emacs)2.5 E F0(editing mode, this causes a switch to)2.5 E F1(vi)2.5 E
+F0(editing mode.)2.5 E/F3 10.95/Times-Bold@0 SF(DEF)72 556.8 Q -.548(AU)
+-.986 G 2.014 -1.007(LT K).548 H(EY BINDINGS)1.007 E F0 .065(The follo)
+108 568.8 R .065(wing is a list of the def)-.25 F .065
+(ault emacs and vi bindings.)-.1 F .064
+(Characters with the eighth bit set are written as)5.064 F .527
+(M\255<character>, and are referred to as)108 580.8 R F2(meta\214ed)
+3.407 E F0 3.027(characters. The)3.797 F .527
+(printable ASCII characters not mentioned)3.027 F 1.116
+(in the list of emacs standard bindings are bound to the)108 592.8 R F1
+(self\255insert)3.615 E F0 1.115(function, which just inserts the gi)
+3.615 F -.15(ve)-.25 G(n).15 E .945(character into the input line.)108
+604.8 R .945(In vi insertion mode, all characters not speci\214cally me\
+ntioned are bound to)5.945 F F1(self\255insert)108 616.8 Q F0 5.338(.C)C
+.338(haracters assigned to signal generation by)-5.338 F F2(stty)3.178 E
+F0 .337(\(1\) or the terminal dri).32 F -.15(ve)-.25 G 1.137 -.4(r, s)
+.15 H .337(uch as C-Z or C-C,).4 F .187(retain that function.)108 628.8
+R .187(Upper and lo)5.187 F .188(wer case meta\214ed characters are bou\
+nd to the same function in the emacs)-.25 F .305(mode meta k)108 640.8 R
+-.15(ey)-.1 G 2.805(map. The).15 F .305(remaining characters are unboun\
+d, which causes readline to ring the bell \(subject)2.805 F
+(to the setting of the)108 652.8 Q F1(bell\255style)2.5 E F0 -.25(va)2.5
+G(riable\).).25 E F1(Emacs Mode)87 669.6 Q F0(Emacs Standard bindings)
+151.2 681.6 Q 2.5("C-@" set-mark)151.2 705.6 R 2.5("C-A" be)151.2 717.6
+R(ginning-of-line)-.15 E 2.5("C-B" backw)151.2 729.6 R(ard-char)-.1 E
+(GNU Readline 8.2)72 768 Q(2022 September 19)120.405 E(13)185.115 E 0 Cg
+EP
+%%Page: 14 14
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E 2.5("C-D" delete-char)
+151.2 84 R 2.5("C-E" end-of-line)151.2 96 R 2.5("C-F" forw)151.2 108 R
+(ard-char)-.1 E 2.5("C-G" abort)151.2 120 R 2.5("C-H" backw)151.2 132 R
+(ard-delete-char)-.1 E 2.5("C-I" complete)151.2 144 R 2.5
+("C-J" accept-line)151.2 156 R 2.5("C-K" kill-line)151.2 168 R 2.5
+("C-L" clear)151.2 180 R(-screen)-.2 E 2.5("C-M" accept-line)151.2 192 R
+2.5("C-N" ne)151.2 204 R(xt-history)-.15 E 2.5("C-P" pre)151.2 216 R
+(vious-history)-.25 E 2.5("C-Q" quoted-insert)151.2 228 R 2.5("C-R" re)
+151.2 240 R -.15(ve)-.25 G(rse-search-history).15 E 2.5("C-S" forw)151.2
+252 R(ard-search-history)-.1 E 2.5("C-T" transpose-chars)151.2 264 R 2.5
+("C-U" unix-line-discard)151.2 276 R 2.5("C-V" quoted-insert)151.2 288 R
+2.5("C-W" unix-w)151.2 300 R(ord-rubout)-.1 E 2.5("C-Y" yank)151.2 312 R
+2.5("C-]" character)151.2 324 R(-search)-.2 E 2.5("C-_" undo)151.2 336 R
+3.333("")151.2 348 S(to "/")-.833 E(self-insert)5 E 2.5("0" to)151.2 360
+R 2.5("9" self-insert)2.5 F 2.5(":" to)151.2 372 R 2.5("~" self-insert)
+2.5 F 2.5("C-?" backw)151.2 384 R(ard-delete-char)-.1 E
+(Emacs Meta bindings)151.2 400.8 Q 2.5("M-C-G" abort)151.2 424.8 R 2.5
+("M-C-H" backw)151.2 436.8 R(ard-kill-w)-.1 E(ord)-.1 E 2.5
+("M-C-I" tab-insert)151.2 448.8 R 2.5("M-C-J" vi-editing-mode)151.2
+460.8 R 2.5("M-C-L" clear)151.2 472.8 R(-display)-.2 E 2.5
+("M-C-M" vi-editing-mode)151.2 484.8 R 2.5("M-C-R" re)151.2 496.8 R -.15
+(ve)-.25 G(rt-line).15 E 2.5("M-C-Y" yank-nth-ar)151.2 508.8 R(g)-.18 E
+2.5("M-C-[" complete)151.2 520.8 R 2.5("M-C-]" character)151.2 532.8 R
+(-search-backw)-.2 E(ard)-.1 E 2.5("M-space" set-mark)151.2 544.8 R 2.5
+("M-#" insert-comment)151.2 556.8 R 2.5("M-&" tilde-e)151.2 568.8 R
+(xpand)-.15 E 2.5("M-*" insert-completions)151.2 580.8 R 2.5
+("M--" digit-ar)151.2 592.8 R(gument)-.18 E 2.5("M-." yank-last-ar)151.2
+604.8 R(g)-.18 E 2.5("M-0" digit-ar)151.2 616.8 R(gument)-.18 E 2.5
+("M-1" digit-ar)151.2 628.8 R(gument)-.18 E 2.5("M-2" digit-ar)151.2
+640.8 R(gument)-.18 E 2.5("M-3" digit-ar)151.2 652.8 R(gument)-.18 E 2.5
+("M-4" digit-ar)151.2 664.8 R(gument)-.18 E 2.5("M-5" digit-ar)151.2
+676.8 R(gument)-.18 E 2.5("M-6" digit-ar)151.2 688.8 R(gument)-.18 E 2.5
+("M-7" digit-ar)151.2 700.8 R(gument)-.18 E 2.5("M-8" digit-ar)151.2
+712.8 R(gument)-.18 E 2.5("M-9" digit-ar)151.2 724.8 R(gument)-.18 E
+(GNU Readline 8.2)72 768 Q(2022 September 19)120.405 E(14)185.115 E 0 Cg
+EP
+%%Page: 15 15
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E 2.5("M-<" be)151.2 84 R
+(ginning-of-history)-.15 E 2.5("M-=" possible-completions)151.2 96 R 2.5
+("M->" end-of-history)151.2 108 R 2.5("M-?" possible-completions)151.2
+120 R 2.5("M-B" backw)151.2 132 R(ard-w)-.1 E(ord)-.1 E 2.5
+("M-C" capitalize-w)151.2 144 R(ord)-.1 E 2.5("M-D" kill-w)151.2 156 R
+(ord)-.1 E 2.5("M-F" forw)151.2 168 R(ard-w)-.1 E(ord)-.1 E 2.5
+("M-L" do)151.2 180 R(wncase-w)-.25 E(ord)-.1 E 2.5
+("M-N" non-incremental-forw)151.2 192 R(ard-search-history)-.1 E 2.5
+("M-P" non-incremental-re)151.2 204 R -.15(ve)-.25 G(rse-search-history)
+.15 E 2.5("M-R" re)151.2 216 R -.15(ve)-.25 G(rt-line).15 E 2.5
+("M-T" transpose-w)151.2 228 R(ords)-.1 E 2.5("M-U" upcase-w)151.2 240 R
+(ord)-.1 E 2.5("M-Y" yank-pop)151.2 252 R 2.5
+("M-\\" delete-horizontal-space)151.2 264 R 2.5("M-~" tilde-e)151.2 276
+R(xpand)-.15 E 2.5("M-C-?" backw)151.2 288 R(ard-kill-w)-.1 E(ord)-.1 E
+2.5("M-_" yank-last-ar)151.2 300 R(g)-.18 E(Emacs Control-X bindings)
+151.2 316.8 Q 2.5("C-XC-G" abort)151.2 340.8 R 2.5
+("C-XC-R" re-read-init-\214le)151.2 352.8 R 2.5("C-XC-U" undo)151.2
+364.8 R 2.5("C-XC-X" e)151.2 376.8 R(xchange-point-and-mark)-.15 E 2.5
+("C-X\(" start-kbd-macro)151.2 388.8 R 2.5("C-X\)" end-kbd-macro)151.2
+400.8 R 2.5("C-XE" call-last-kbd-macro)151.2 412.8 R 2.5("C-XC-?" backw)
+151.2 424.8 R(ard-kill-line)-.1 E/F1 10/Times-Bold@0 SF
+(VI Mode bindings)87 453.6 Q F0(VI Insert Mode functions)151.2 465.6 Q
+2.5("C-D" vi-eof-maybe)151.2 489.6 R 2.5("C-H" backw)151.2 501.6 R
+(ard-delete-char)-.1 E 2.5("C-I" complete)151.2 513.6 R 2.5
+("C-J" accept-line)151.2 525.6 R 2.5("C-M" accept-line)151.2 537.6 R 2.5
+("C-R" re)151.2 549.6 R -.15(ve)-.25 G(rse-search-history).15 E 2.5
+("C-S" forw)151.2 561.6 R(ard-search-history)-.1 E 2.5
+("C-T" transpose-chars)151.2 573.6 R 2.5("C-U" unix-line-discard)151.2
+585.6 R 2.5("C-V" quoted-insert)151.2 597.6 R 2.5("C-W" unix-w)151.2
+609.6 R(ord-rubout)-.1 E 2.5("C-Y" yank)151.2 621.6 R 2.5("C-[" vi-mo)
+151.2 633.6 R -.15(ve)-.15 G(ment-mode).15 E 2.5("C-_" undo)151.2 645.6
+R 3.333("")151.2 657.6 S(to "~")-.833 E(self-insert)5 E 2.5("C-?" backw)
+151.2 669.6 R(ard-delete-char)-.1 E(VI Command Mode functions)151.2
+686.4 Q 2.5("C-D" vi-eof-maybe)151.2 710.4 R 2.5
+("C-E" emacs-editing-mode)151.2 722.4 R(GNU Readline 8.2)72 768 Q
+(2022 September 19)120.405 E(15)185.115 E 0 Cg EP
+%%Page: 16 16
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E 2.5("C-G" abort)151.2 84
+R 2.5("C-H" backw)151.2 96 R(ard-char)-.1 E 2.5("C-J" accept-line)151.2
+108 R 2.5("C-K" kill-line)151.2 120 R 2.5("C-L" clear)151.2 132 R
+(-screen)-.2 E 2.5("C-M" accept-line)151.2 144 R 2.5("C-N" ne)151.2 156
+R(xt-history)-.15 E 2.5("C-P" pre)151.2 168 R(vious-history)-.25 E 2.5
+("C-Q" quoted-insert)151.2 180 R 2.5("C-R" re)151.2 192 R -.15(ve)-.25 G
+(rse-search-history).15 E 2.5("C-S" forw)151.2 204 R(ard-search-history)
+-.1 E 2.5("C-T" transpose-chars)151.2 216 R 2.5("C-U" unix-line-discard)
+151.2 228 R 2.5("C-V" quoted-insert)151.2 240 R 2.5("C-W" unix-w)151.2
+252 R(ord-rubout)-.1 E 2.5("C-Y" yank)151.2 264 R 2.5("C-_" vi-undo)
+151.2 276 R -4.166 3.333("" f)151.2 288 T(orw)-3.333 E(ard-char)-.1 E
+2.5("#" insert-comment)151.2 300 R 2.5("$" end-of-line)151.2 312 R 2.5
+("%" vi-match)151.2 324 R 2.5("&" vi-tilde-e)151.2 336 R(xpand)-.15 E
+2.5("*" vi-complete)151.2 348 R 2.5("+" ne)151.2 360 R(xt-history)-.15 E
+2.5("," vi-char)151.2 372 R(-search)-.2 E 2.5("-" pre)151.2 384 R
+(vious-history)-.25 E 2.5("." vi-redo)151.2 396 R 2.5("/" vi-search)
+151.2 408 R 2.5("0" be)151.2 420 R(ginning-of-line)-.15 E("1" to "9")
+151.2 432 Q(vi-ar)5 E(g-digit)-.18 E 2.5(";" vi-char)151.2 444 R
+(-search)-.2 E 2.5("=" vi-complete)151.2 456 R 2.5("?" vi-search)151.2
+468 R 2.5("A" vi-append-eol)151.2 480 R 2.5("B" vi-pre)151.2 492 R(v-w)
+-.25 E(ord)-.1 E 2.5("C" vi-change-to)151.2 504 R 2.5("D" vi-delete-to)
+151.2 516 R 2.5("E" vi-end-w)151.2 528 R(ord)-.1 E 2.5("F" vi-char)151.2
+540 R(-search)-.2 E 2.5("G" vi-fetch-history)151.2 552 R 2.5
+("I" vi-insert-be)151.2 564 R(g)-.15 E 2.5("N" vi-search-ag)151.2 576 R
+(ain)-.05 E 2.5("P" vi-put)151.2 588 R 2.5("R" vi-replace)151.2 600 R
+2.5("S" vi-subst)151.2 612 R 2.5("T" vi-char)151.2 624 R(-search)-.2 E
+2.5("U" re)151.2 636 R -.15(ve)-.25 G(rt-line).15 E 2.5("W" vi-ne)151.2
+648 R(xt-w)-.15 E(ord)-.1 E 2.5("X" backw)151.2 660 R(ard-delete-char)
+-.1 E 2.5("Y" vi-yank-to)151.2 672 R 2.5("\\" vi-complete)151.2 684 R
+2.5("^" vi-\214rst-print)151.2 696 R 2.5("_" vi-yank-ar)151.2 708 R(g)
+-.18 E 2.5("`" vi-goto-mark)151.2 720 R(GNU Readline 8.2)72 768 Q
+(2022 September 19)120.405 E(16)185.115 E 0 Cg EP
+%%Page: 17 17
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 117.355(READLINE\(3\) Library)72 48 R
+(Functions Manual)2.5 E(READLINE\(3\))119.855 E 2.5("a" vi-append-mode)
+151.2 84 R 2.5("b" vi-pre)151.2 96 R(v-w)-.25 E(ord)-.1 E 2.5
+("c" vi-change-to)151.2 108 R 2.5("d" vi-delete-to)151.2 120 R 2.5
+("e" vi-end-w)151.2 132 R(ord)-.1 E 2.5("f" vi-char)151.2 144 R(-search)
+-.2 E 2.5("h" backw)151.2 156 R(ard-char)-.1 E 2.5
+("i" vi-insertion-mode)151.2 168 R 2.5("j" ne)151.2 180 R(xt-history)
+-.15 E 2.5("k" pre)151.2 192 R(v-history)-.25 E 2.5("l" forw)151.2 204 R
+(ard-char)-.1 E 2.5("m" vi-set-mark)151.2 216 R 2.5("n" vi-search-ag)
+151.2 228 R(ain)-.05 E 2.5("p" vi-put)151.2 240 R 2.5
+("r" vi-change-char)151.2 252 R 2.5("s" vi-subst)151.2 264 R 2.5
+("t" vi-char)151.2 276 R(-search)-.2 E 2.5("u" vi-undo)151.2 288 R 2.5
+("w" vi-ne)151.2 300 R(xt-w)-.15 E(ord)-.1 E 2.5("x" vi-delete)151.2 312
+R 2.5("y" vi-yank-to)151.2 324 R 2.5("|" vi-column)151.2 336 R 2.5
+("~" vi-change-case)151.2 348 R/F1 10.95/Times-Bold@0 SF(SEE ALSO)72
+364.8 Q/F2 10/Times-Italic@0 SF(The Gnu Readline Libr)108 376.8 Q(ary)
+-.15 E F0 2.5(,B)C(rian F)-2.5 E(ox and Chet Rame)-.15 E(y)-.15 E F2
+(The Gnu History Libr)108 388.8 Q(ary)-.15 E F0 2.5(,B)C(rian F)-2.5 E
+(ox and Chet Rame)-.15 E(y)-.15 E F2(bash)108 400.8 Q F0(\(1\))A F1
+(FILES)72 417.6 Q F2(~/.inputr)109.666 429.6 Q(c)-.37 E F0(Indi)144
+441.6 Q(vidual)-.25 E/F3 10/Times-Bold@0 SF -.18(re)2.5 G(adline).18 E
+F0(initialization \214le)2.5 E F1 -.548(AU)72 458.4 S(THORS).548 E F0
+(Brian F)108 470.4 Q(ox, Free Softw)-.15 E(are F)-.1 E(oundation)-.15 E
+(bfox@gnu.or)108 482.4 Q(g)-.18 E(Chet Rame)108 499.2 Q 1.3 -.65(y, C)
+-.15 H(ase W).65 E(estern Reserv)-.8 E 2.5(eU)-.15 G(ni)-2.5 E -.15(ve)
+-.25 G(rsity).15 E(chet.rame)108 511.2 Q(y@case.edu)-.15 E F1 -.11(BU)72
+528 S 2.738(GR).11 G(EPOR)-2.738 E(TS)-.438 E F0 .69(If you \214nd a b)
+108 540 R .69(ug in)-.2 F F3 -.18(re)3.19 G(adline,).18 E F0 .69
+(you should report it.)3.19 F .691(But \214rst, you should mak)5.69 F
+3.191(es)-.1 G .691(ure that it really is a b)-3.191 F(ug,)-.2 E
+(and that it appears in the latest v)108 552 Q(ersion of the)-.15 E F3
+-.18(re)2.5 G(adline).18 E F0(library that you ha)2.5 E -.15(ve)-.2 G(.)
+.15 E .705(Once you ha)108 568.8 R 1.005 -.15(ve d)-.2 H .705
+(etermined that a b).15 F .704(ug actually e)-.2 F .704(xists, mail a b)
+-.15 F .704(ug report to)-.2 F F2 -.2(bu)3.204 G(g\255r).2 E(eadline)
+-.37 E F0(@)A F2(gnu.or)A(g)-.37 E F0 5.704(.I)C 3.204(fy)-5.704 G(ou)
+-3.204 E(ha)108 580.8 Q 1.809 -.15(ve a \214)-.2 H 1.509
+(x, you are welcome to mail that as well!).15 F 1.51
+(Suggestions and `philosophical' b)6.51 F 1.51(ug reports may be)-.2 F
+(mailed to)108 592.8 Q F2 -.2(bu)2.5 G(g-r).2 E(eadline)-.37 E F0(@)A F2
+(gnu.or)A(g)-.37 E F0(or posted to the Usenet ne)2.5 E(wsgroup)-.25 E F3
+(gnu.bash.b)2.5 E(ug)-.2 E F0(.)A(Comments and b)108 609.6 Q
+(ug reports concerning this manual page should be directed to)-.2 E F2
+-.15(ch)2.5 G(et.r).15 E(ame)-.15 E(y@case)-.3 E(.edu)-.15 E F0(.).25 E
+F1 -.11(BU)72 626.4 S(GS).11 E F0(It')108 638.4 Q 2.5(st)-.55 G
+(oo big and too slo)-2.5 E -.65(w.)-.25 G(GNU Readline 8.2)72 768 Q
+(2022 September 19)120.405 E(17)185.115 E 0 Cg EP
+%%Trailer
+end
+%%EOF
diff --git a/doc/rlman.texi b/doc/rlman.texi
new file mode 100644
index 0000000..d046b87
--- /dev/null
+++ b/doc/rlman.texi
@@ -0,0 +1,84 @@
+\input texinfo @c -*-texinfo-*-
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename readline.info
+@settitle GNU Readline Library
+@include version.texi
+
+@comment %**end of header (This is for running Texinfo on a region.)
+@synindex vr fn
+
+@copying
+This manual describes the GNU Readline Library
+(version @value{VERSION}, @value{UPDATED}), a library which aids in the
+consistency of user interface across discrete programs which provide
+a command line interface.
+
+Copyright @copyright{} 1988--2022 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+
+@end quotation
+@end copying
+
+@dircategory Libraries
+@direntry
+* Readline: (readline). The GNU readline library API.
+@end direntry
+
+@titlepage
+@title GNU Readline Library
+@subtitle Edition @value{EDITION}, for @code{Readline Library} Version @value{VERSION}.
+@subtitle @value{UPDATED-MONTH}
+@author Chet Ramey, Case Western Reserve University
+@author Brian Fox, Free Software Foundation
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top GNU Readline Library
+
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs which
+provide a command line interface.
+The Readline home page is @url{http://www.gnu.org/software/readline/}.
+
+@menu
+* Command Line Editing:: GNU Readline User's Manual.
+* Programming with GNU Readline:: GNU Readline Programmer's Manual.
+* GNU Free Documentation License:: License for copying this manual.
+* Concept Index:: Index of concepts described in this manual.
+* Function and Variable Index:: Index of externally visible functions
+ and variables.
+@end menu
+@end ifnottex
+
+@include rluser.texi
+@include rltech.texi
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+
+@include fdl.texi
+
+@node Concept Index
+@unnumbered Concept Index
+@printindex cp
+
+@node Function and Variable Index
+@unnumbered Function and Variable Index
+@printindex fn
+
+@bye
diff --git a/doc/rltech.texi b/doc/rltech.texi
new file mode 100644
index 0000000..a93f77d
--- /dev/null
+++ b/doc/rltech.texi
@@ -0,0 +1,2815 @@
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename rltech.info
+@comment %**end of header (This is for running Texinfo on a region.)
+
+@ifinfo
+This document describes the GNU Readline Library, a utility for aiding
+in the consistency of user interface across discrete programs that need
+to provide a command line interface.
+
+Copyright (C) 1988--2022 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+pare preserved on all copies.
+
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+@end ignore
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+@end ifinfo
+
+@node Programming with GNU Readline
+@chapter Programming with GNU Readline
+
+This chapter describes the interface between the @sc{gnu} Readline Library and
+other programs. If you are a programmer, and you wish to include the
+features found in @sc{gnu} Readline
+such as completion, line editing, and interactive history manipulation
+in your own programs, this section is for you.
+
+@menu
+* Basic Behavior:: Using the default behavior of Readline.
+* Custom Functions:: Adding your own functions to Readline.
+* Readline Variables:: Variables accessible to custom
+ functions.
+* Readline Convenience Functions:: Functions which Readline supplies to
+ aid in writing your own custom
+ functions.
+* Readline Signal Handling:: How Readline behaves when it receives signals.
+* Custom Completers:: Supplanting or supplementing Readline's
+ completion functions.
+@end menu
+
+@node Basic Behavior
+@section Basic Behavior
+
+Many programs provide a command line interface, such as @code{mail},
+@code{ftp}, and @code{sh}. For such programs, the default behaviour of
+Readline is sufficient. This section describes how to use Readline in
+the simplest way possible, perhaps to replace calls in your code to
+@code{gets()} or @code{fgets()}.
+
+@findex readline
+@cindex readline, function
+
+The function @code{readline()} prints a prompt @var{prompt}
+and then reads and returns a single line of text from the user.
+If @var{prompt} is @code{NULL} or the empty string, no prompt is displayed.
+The line @code{readline} returns is allocated with @code{malloc()};
+the caller should @code{free()} the line when it has finished with it.
+The declaration for @code{readline} in ANSI C is
+
+@example
+@code{char *readline (const char *@var{prompt});}
+@end example
+
+@noindent
+So, one might say
+@example
+@code{char *line = readline ("Enter a line: ");}
+@end example
+@noindent
+in order to read a line of text from the user.
+The line returned has the final newline removed, so only the
+text remains.
+
+If @code{readline} encounters an @code{EOF} while reading the line, and the
+line is empty at that point, then @code{(char *)NULL} is returned.
+Otherwise, the line is ended just as if a newline had been typed.
+
+Readline performs some expansion on the @var{prompt} before it is
+displayed on the screen. See the description of @code{rl_expand_prompt}
+(@pxref{Redisplay}) for additional details, especially if @var{prompt}
+will contain characters that do not consume physical screen space when
+displayed.
+
+If you want the user to be able to get at the line later, (with
+@key{C-p} for example), you must call @code{add_history()} to save the
+line away in a @dfn{history} list of such lines.
+
+@example
+@code{add_history (line)};
+@end example
+
+@noindent
+For full details on the GNU History Library, see the associated manual.
+
+It is preferable to avoid saving empty lines on the history list, since
+users rarely have a burning need to reuse a blank line. Here is
+a function which usefully replaces the standard @code{gets()} library
+function, and has the advantage of no static buffer to overflow:
+
+@example
+/* A static variable for holding the line. */
+static char *line_read = (char *)NULL;
+
+/* Read a string, and return a pointer to it.
+ Returns NULL on EOF. */
+char *
+rl_gets ()
+@{
+ /* If the buffer has already been allocated,
+ return the memory to the free pool. */
+ if (line_read)
+ @{
+ free (line_read);
+ line_read = (char *)NULL;
+ @}
+
+ /* Get a line from the user. */
+ line_read = readline ("");
+
+ /* If the line has any text in it,
+ save it on the history. */
+ if (line_read && *line_read)
+ add_history (line_read);
+
+ return (line_read);
+@}
+@end example
+
+This function gives the user the default behaviour of @key{TAB}
+completion: completion on file names. If you do not want Readline to
+complete on filenames, you can change the binding of the @key{TAB} key
+with @code{rl_bind_key()}.
+
+@example
+@code{int rl_bind_key (int @var{key}, rl_command_func_t *@var{function});}
+@end example
+
+@code{rl_bind_key()} takes two arguments: @var{key} is the character that
+you want to bind, and @var{function} is the address of the function to
+call when @var{key} is pressed. Binding @key{TAB} to @code{rl_insert()}
+makes @key{TAB} insert itself.
+@code{rl_bind_key()} returns non-zero if @var{key} is not a valid
+ASCII character code (between 0 and 255).
+
+Thus, to disable the default @key{TAB} behavior, the following suffices:
+@example
+@code{rl_bind_key ('\t', rl_insert);}
+@end example
+
+This code should be executed once at the start of your program; you
+might write a function called @code{initialize_readline()} which
+performs this and other desired initializations, such as installing
+custom completers (@pxref{Custom Completers}).
+
+@node Custom Functions
+@section Custom Functions
+
+Readline provides many functions for manipulating the text of
+the line, but it isn't possible to anticipate the needs of all
+programs. This section describes the various functions and variables
+defined within the Readline library which allow a user program to add
+customized functionality to Readline.
+
+Before declaring any functions that customize Readline's behavior, or
+using any functionality Readline provides in other code, an
+application writer should include the file @code{<readline/readline.h>}
+in any file that uses Readline's features. Since some of the definitions
+in @code{readline.h} use the @code{stdio} library, the file
+@code{<stdio.h>} should be included before @code{readline.h}.
+
+@code{readline.h} defines a C preprocessor variable that should
+be treated as an integer, @code{RL_READLINE_VERSION}, which may
+be used to conditionally compile application code depending on
+the installed Readline version. The value is a hexadecimal
+encoding of the major and minor version numbers of the library,
+of the form 0x@var{MMmm}. @var{MM} is the two-digit major
+version number; @var{mm} is the two-digit minor version number.
+For Readline 4.2, for example, the value of
+@code{RL_READLINE_VERSION} would be @code{0x0402}.
+
+@menu
+* Readline Typedefs:: C declarations to make code readable.
+* Function Writing:: Variables and calling conventions.
+@end menu
+
+@node Readline Typedefs
+@subsection Readline Typedefs
+
+For readability, we declare a number of new object types, all pointers
+to functions.
+
+The reason for declaring these new types is to make it easier to write
+code describing pointers to C functions with appropriately prototyped
+arguments and return values.
+
+For instance, say we want to declare a variable @var{func} as a pointer
+to a function which takes two @code{int} arguments and returns an
+@code{int} (this is the type of all of the Readline bindable functions).
+Instead of the classic C declaration
+
+@code{int (*func)();}
+
+@noindent
+or the ANSI-C style declaration
+
+@code{int (*func)(int, int);}
+
+@noindent
+we may write
+
+@code{rl_command_func_t *func;}
+
+The full list of function pointer types available is
+
+@table @code
+@item typedef int rl_command_func_t (int, int);
+
+@item typedef char *rl_compentry_func_t (const char *, int);
+
+@item typedef char **rl_completion_func_t (const char *, int, int);
+
+@item typedef char *rl_quote_func_t (char *, int, char *);
+
+@item typedef char *rl_dequote_func_t (char *, int);
+
+@item typedef int rl_compignore_func_t (char **);
+
+@item typedef void rl_compdisp_func_t (char **, int, int);
+
+@item typedef int rl_hook_func_t (void);
+
+@item typedef int rl_getc_func_t (FILE *);
+
+@item typedef int rl_linebuf_func_t (char *, int);
+
+@item typedef int rl_intfunc_t (int);
+@item #define rl_ivoidfunc_t rl_hook_func_t
+@item typedef int rl_icpfunc_t (char *);
+@item typedef int rl_icppfunc_t (char **);
+
+@item typedef void rl_voidfunc_t (void);
+@item typedef void rl_vintfunc_t (int);
+@item typedef void rl_vcpfunc_t (char *);
+@item typedef void rl_vcppfunc_t (char **);
+
+@end table
+
+@node Function Writing
+@subsection Writing a New Function
+
+In order to write new functions for Readline, you need to know the
+calling conventions for keyboard-invoked functions, and the names of the
+variables that describe the current state of the line read so far.
+
+The calling sequence for a command @code{foo} looks like
+
+@example
+@code{int foo (int count, int key)}
+@end example
+
+@noindent
+where @var{count} is the numeric argument (or 1 if defaulted) and
+@var{key} is the key that invoked this function.
+
+It is completely up to the function as to what should be done with the
+numeric argument. Some functions use it as a repeat count, some
+as a flag, and others to choose alternate behavior (refreshing the current
+line as opposed to refreshing the screen, for example). Some choose to
+ignore it. In general, if a
+function uses the numeric argument as a repeat count, it should be able
+to do something useful with both negative and positive arguments.
+At the very least, it should be aware that it can be passed a
+negative argument.
+
+A command function should return 0 if its action completes successfully,
+and a value greater than zero if some error occurs.
+This is the convention obeyed by all of the builtin Readline bindable
+command functions.
+
+@node Readline Variables
+@section Readline Variables
+
+These variables are available to function writers.
+
+@deftypevar {char *} rl_line_buffer
+This is the line gathered so far. You are welcome to modify the
+contents of the line, but see @ref{Allowing Undoing}. The
+function @code{rl_extend_line_buffer} is available to increase
+the memory allocated to @code{rl_line_buffer}.
+@end deftypevar
+
+@deftypevar int rl_point
+The offset of the current cursor position in @code{rl_line_buffer}
+(the @emph{point}).
+@end deftypevar
+
+@deftypevar int rl_end
+The number of characters present in @code{rl_line_buffer}. When
+@code{rl_point} is at the end of the line, @code{rl_point} and
+@code{rl_end} are equal.
+@end deftypevar
+
+@deftypevar int rl_mark
+The @var{mark} (saved position) in the current line. If set, the mark
+and point define a @emph{region}.
+@end deftypevar
+
+@deftypevar int rl_done
+Setting this to a non-zero value causes Readline to return the current
+line immediately.
+Readline will set this variable when it has read a key sequence bound
+to @code{accept-line} and is about to return the line to the caller.
+@end deftypevar
+
+@deftypevar int rl_eof_found
+Readline will set this variable when it has read an EOF character (e.g., the
+stty @samp{EOF} character) on an empty line or encountered a read error and
+is about to return a NULL line to the caller.
+@end deftypevar
+
+@deftypevar int rl_num_chars_to_read
+Setting this to a positive value before calling @code{readline()} causes
+Readline to return after accepting that many characters, rather
+than reading up to a character bound to @code{accept-line}.
+@end deftypevar
+
+@deftypevar int rl_pending_input
+Setting this to a value makes it the next keystroke read. This is a
+way to stuff a single character into the input stream.
+@end deftypevar
+
+@deftypevar int rl_dispatching
+Set to a non-zero value if a function is being called from a key binding;
+zero otherwise. Application functions can test this to discover whether
+they were called directly or by Readline's dispatching mechanism.
+@end deftypevar
+
+@deftypevar int rl_erase_empty_line
+Setting this to a non-zero value causes Readline to completely erase
+the current line, including any prompt, any time a newline is typed as
+the only character on an otherwise-empty line. The cursor is moved to
+the beginning of the newly-blank line.
+@end deftypevar
+
+@deftypevar {char *} rl_prompt
+The prompt Readline uses. This is set from the argument to
+@code{readline()}, and should not be assigned to directly.
+The @code{rl_set_prompt()} function (@pxref{Redisplay}) may
+be used to modify the prompt string after calling @code{readline()}.
+@end deftypevar
+
+@deftypevar {char *} rl_display_prompt
+The string displayed as the prompt. This is usually identical to
+@var{rl_prompt}, but may be changed temporarily by functions that
+use the prompt string as a message area, such as incremental search.
+@end deftypevar
+
+@deftypevar int rl_already_prompted
+If an application wishes to display the prompt itself, rather than have
+Readline do it the first time @code{readline()} is called, it should set
+this variable to a non-zero value after displaying the prompt.
+The prompt must also be passed as the argument to @code{readline()} so
+the redisplay functions can update the display properly.
+The calling application is responsible for managing the value; Readline
+never sets it.
+@end deftypevar
+
+@deftypevar {const char *} rl_library_version
+The version number of this revision of the library.
+@end deftypevar
+
+@deftypevar int rl_readline_version
+An integer encoding the current version of the library. The encoding is
+of the form 0x@var{MMmm}, where @var{MM} is the two-digit major version
+number, and @var{mm} is the two-digit minor version number.
+For example, for Readline-4.2, @code{rl_readline_version} would have the
+value 0x0402.
+@end deftypevar
+
+@deftypevar {int} rl_gnu_readline_p
+Always set to 1, denoting that this is @sc{gnu} Readline rather than some
+emulation.
+@end deftypevar
+
+@deftypevar {const char *} rl_terminal_name
+The terminal type, used for initialization. If not set by the application,
+Readline sets this to the value of the @env{TERM} environment variable
+the first time it is called.
+@end deftypevar
+
+@deftypevar {const char *} rl_readline_name
+This variable is set to a unique name by each application using Readline.
+The value allows conditional parsing of the inputrc file
+(@pxref{Conditional Init Constructs}).
+@end deftypevar
+
+@deftypevar {FILE *} rl_instream
+The stdio stream from which Readline reads input.
+If @code{NULL}, Readline defaults to @var{stdin}.
+@end deftypevar
+
+@deftypevar {FILE *} rl_outstream
+The stdio stream to which Readline performs output.
+If @code{NULL}, Readline defaults to @var{stdout}.
+@end deftypevar
+
+@deftypevar int rl_prefer_env_winsize
+If non-zero, Readline gives values found in the @env{LINES} and
+@env{COLUMNS} environment variables greater precedence than values fetched
+from the kernel when computing the screen dimensions.
+@end deftypevar
+
+@deftypevar {rl_command_func_t *} rl_last_func
+The address of the last command function Readline executed. May be used to
+test whether or not a function is being executed twice in succession, for
+example.
+@end deftypevar
+
+@deftypevar {rl_hook_func_t *} rl_startup_hook
+If non-zero, this is the address of a function to call just
+before @code{readline} prints the first prompt.
+@end deftypevar
+
+@deftypevar {rl_hook_func_t *} rl_pre_input_hook
+If non-zero, this is the address of a function to call after
+the first prompt has been printed and just before @code{readline}
+starts reading input characters.
+@end deftypevar
+
+@deftypevar {rl_hook_func_t *} rl_event_hook
+If non-zero, this is the address of a function to call periodically
+when Readline is waiting for terminal input.
+By default, this will be called at most ten times a second if there
+is no keyboard input.
+@end deftypevar
+
+@deftypevar {rl_getc_func_t *} rl_getc_function
+If non-zero, Readline will call indirectly through this pointer
+to get a character from the input stream. By default, it is set to
+@code{rl_getc}, the default Readline character input function
+(@pxref{Character Input}).
+In general, an application that sets @var{rl_getc_function} should consider
+setting @var{rl_input_available_hook} as well.
+@end deftypevar
+
+@deftypevar {rl_hook_func_t *} rl_signal_event_hook
+If non-zero, this is the address of a function to call if a read system
+call is interrupted when Readline is reading terminal input.
+@end deftypevar
+
+@deftypevar {rl_hook_func_t *} rl_timeout_event_hook
+If non-zero, this is the address of a function to call if Readline times
+out while reading input.
+@end deftypevar
+
+@deftypevar {rl_hook_func_t *} rl_input_available_hook
+If non-zero, Readline will use this function's return value when it needs
+to determine whether or not there is available input on the current input
+source.
+The default hook checks @code{rl_instream}; if an application is using a
+different input source, it should set the hook appropriately.
+Readline queries for available input when implementing intra-key-sequence
+timeouts during input and incremental searches.
+This may use an application-specific timeout before returning a value;
+Readline uses the value passed to @code{rl_set_keyboard_input_timeout()}
+or the value of the user-settable @var{keyseq-timeout} variable.
+This is designed for use by applications using Readline's callback interface
+(@pxref{Alternate Interface}), which may not use the traditional
+@code{read(2)} and file descriptor interface, or other applications using
+a different input mechanism.
+If an application uses an input mechanism or hook that can potentially exceed
+the value of @var{keyseq-timeout}, it should increase the timeout or set
+this hook appropriately even when not using the callback interface.
+In general, an application that sets @var{rl_getc_function} should consider
+setting @var{rl_input_available_hook} as well.
+@end deftypevar
+
+@deftypevar {rl_voidfunc_t *} rl_redisplay_function
+If non-zero, Readline will call indirectly through this pointer
+to update the display with the current contents of the editing buffer.
+By default, it is set to @code{rl_redisplay}, the default Readline
+redisplay function (@pxref{Redisplay}).
+@end deftypevar
+
+@deftypevar {rl_vintfunc_t *} rl_prep_term_function
+If non-zero, Readline will call indirectly through this pointer
+to initialize the terminal. The function takes a single argument, an
+@code{int} flag that says whether or not to use eight-bit characters.
+By default, this is set to @code{rl_prep_terminal}
+(@pxref{Terminal Management}).
+@end deftypevar
+
+@deftypevar {rl_voidfunc_t *} rl_deprep_term_function
+If non-zero, Readline will call indirectly through this pointer
+to reset the terminal. This function should undo the effects of
+@code{rl_prep_term_function}.
+By default, this is set to @code{rl_deprep_terminal}
+(@pxref{Terminal Management}).
+@end deftypevar
+
+@deftypevar {Keymap} rl_executing_keymap
+This variable is set to the keymap (@pxref{Keymaps}) in which the
+currently executing Readline function was found.
+@end deftypevar
+
+@deftypevar {Keymap} rl_binding_keymap
+This variable is set to the keymap (@pxref{Keymaps}) in which the
+last key binding occurred.
+@end deftypevar
+
+@deftypevar {char *} rl_executing_macro
+This variable is set to the text of any currently-executing macro.
+@end deftypevar
+
+@deftypevar int rl_executing_key
+The key that caused the dispatch to the currently-executing Readline function.
+@end deftypevar
+
+@deftypevar {char *} rl_executing_keyseq
+The full key sequence that caused the dispatch to the currently-executing
+Readline function.
+@end deftypevar
+
+@deftypevar int rl_key_sequence_length
+The number of characters in @var{rl_executing_keyseq}.
+@end deftypevar
+
+@deftypevar {int} rl_readline_state
+A variable with bit values that encapsulate the current Readline state.
+A bit is set with the @code{RL_SETSTATE} macro, and unset with the
+@code{RL_UNSETSTATE} macro. Use the @code{RL_ISSTATE} macro to test
+whether a particular state bit is set. Current state bits include:
+
+@table @code
+@item RL_STATE_NONE
+Readline has not yet been called, nor has it begun to initialize.
+@item RL_STATE_INITIALIZING
+Readline is initializing its internal data structures.
+@item RL_STATE_INITIALIZED
+Readline has completed its initialization.
+@item RL_STATE_TERMPREPPED
+Readline has modified the terminal modes to do its own input and redisplay.
+@item RL_STATE_READCMD
+Readline is reading a command from the keyboard.
+@item RL_STATE_METANEXT
+Readline is reading more input after reading the meta-prefix character.
+@item RL_STATE_DISPATCHING
+Readline is dispatching to a command.
+@item RL_STATE_MOREINPUT
+Readline is reading more input while executing an editing command.
+@item RL_STATE_ISEARCH
+Readline is performing an incremental history search.
+@item RL_STATE_NSEARCH
+Readline is performing a non-incremental history search.
+@item RL_STATE_SEARCH
+Readline is searching backward or forward through the history for a string.
+@item RL_STATE_NUMERICARG
+Readline is reading a numeric argument.
+@item RL_STATE_MACROINPUT
+Readline is currently getting its input from a previously-defined keyboard
+macro.
+@item RL_STATE_MACRODEF
+Readline is currently reading characters defining a keyboard macro.
+@item RL_STATE_OVERWRITE
+Readline is in overwrite mode.
+@item RL_STATE_COMPLETING
+Readline is performing word completion.
+@item RL_STATE_SIGHANDLER
+Readline is currently executing the readline signal handler.
+@item RL_STATE_UNDOING
+Readline is performing an undo.
+@item RL_STATE_INPUTPENDING
+Readline has input pending due to a call to @code{rl_execute_next()}.
+@item RL_STATE_TTYCSAVED
+Readline has saved the values of the terminal's special characters.
+@item RL_STATE_CALLBACK
+Readline is currently using the alternate (callback) interface
+(@pxref{Alternate Interface}).
+@item RL_STATE_VIMOTION
+Readline is reading the argument to a vi-mode "motion" command.
+@item RL_STATE_MULTIKEY
+Readline is reading a multiple-keystroke command.
+@item RL_STATE_VICMDONCE
+Readline has entered vi command (movement) mode at least one time during
+the current call to @code{readline()}.
+@item RL_STATE_DONE
+Readline has read a key sequence bound to @code{accept-line}
+and is about to return the line to the caller.
+@item RL_STATE_TIMEOUT
+Readline has timed out (it did not receive a line or specified number of
+characters before the timeout duration specified by @code{rl_set_timeout}
+elapsed) and is returning that status to the caller.
+@item RL_STATE_EOF
+Readline has read an EOF character (e.g., the stty @samp{EOF} character)
+or encountered a read error and is about to return a NULL line to the caller.
+@end table
+
+@end deftypevar
+
+@deftypevar {int} rl_explicit_arg
+Set to a non-zero value if an explicit numeric argument was specified by
+the user. Only valid in a bindable command function.
+@end deftypevar
+
+@deftypevar {int} rl_numeric_arg
+Set to the value of any numeric argument explicitly specified by the user
+before executing the current Readline function. Only valid in a bindable
+command function.
+@end deftypevar
+
+@deftypevar {int} rl_editing_mode
+Set to a value denoting Readline's current editing mode. A value of
+@var{1} means Readline is currently in emacs mode; @var{0}
+means that vi mode is active.
+@end deftypevar
+
+
+@node Readline Convenience Functions
+@section Readline Convenience Functions
+
+@menu
+* Function Naming:: How to give a function you write a name.
+* Keymaps:: Making keymaps.
+* Binding Keys:: Changing Keymaps.
+* Associating Function Names and Bindings:: Translate function names to
+ key sequences.
+* Allowing Undoing:: How to make your functions undoable.
+* Redisplay:: Functions to control line display.
+* Modifying Text:: Functions to modify @code{rl_line_buffer}.
+* Character Input:: Functions to read keyboard input.
+* Terminal Management:: Functions to manage terminal settings.
+* Utility Functions:: Generally useful functions and hooks.
+* Miscellaneous Functions:: Functions that don't fall into any category.
+* Alternate Interface:: Using Readline in a `callback' fashion.
+* A Readline Example:: An example Readline function.
+* Alternate Interface Example:: An example program using the alternate interface.
+@end menu
+
+@node Function Naming
+@subsection Naming a Function
+
+The user can dynamically change the bindings of keys while using
+Readline. This is done by representing the function with a descriptive
+name. The user is able to type the descriptive name when referring to
+the function. Thus, in an init file, one might find
+
+@example
+Meta-Rubout: backward-kill-word
+@end example
+
+This binds the keystroke @key{Meta-Rubout} to the function
+@emph{descriptively} named @code{backward-kill-word}. You, as the
+programmer, should bind the functions you write to descriptive names as
+well. Readline provides a function for doing that:
+
+@deftypefun int rl_add_defun (const char *name, rl_command_func_t *function, int key)
+Add @var{name} to the list of named functions. Make @var{function} be
+the function that gets called. If @var{key} is not -1, then bind it to
+@var{function} using @code{rl_bind_key()}.
+@end deftypefun
+
+Using this function alone is sufficient for most applications.
+It is the recommended way to add a few functions to the default
+functions that Readline has built in.
+If you need to do something other than adding a function to Readline,
+you may need to use the underlying functions described below.
+
+@node Keymaps
+@subsection Selecting a Keymap
+
+Key bindings take place on a @dfn{keymap}. The keymap is the
+association between the keys that the user types and the functions that
+get run. You can make your own keymaps, copy existing keymaps, and tell
+Readline which keymap to use.
+
+@deftypefun Keymap rl_make_bare_keymap (void)
+Returns a new, empty keymap. The space for the keymap is allocated with
+@code{malloc()}; the caller should free it by calling
+@code{rl_free_keymap()} when done.
+@end deftypefun
+
+@deftypefun Keymap rl_copy_keymap (Keymap map)
+Return a new keymap which is a copy of @var{map}.
+@end deftypefun
+
+@deftypefun Keymap rl_make_keymap (void)
+Return a new keymap with the printing characters bound to rl_insert,
+the lowercase Meta characters bound to run their equivalents, and
+the Meta digits bound to produce numeric arguments.
+@end deftypefun
+
+@deftypefun void rl_discard_keymap (Keymap keymap)
+Free the storage associated with the data in @var{keymap}.
+The caller should free @var{keymap}.
+@end deftypefun
+
+@deftypefun void rl_free_keymap (Keymap keymap)
+Free all storage associated with @var{keymap}. This calls
+@code{rl_discard_keymap} to free subordindate keymaps and macros.
+@end deftypefun
+
+@deftypefun int rl_empty_keymap (Keymap keymap)
+Return non-zero if there are no keys bound to functions in @var{keymap};
+zero if there are any keys bound.
+@end deftypefun
+
+Readline has several internal keymaps. These functions allow you to
+change which keymap is active.
+
+@deftypefun Keymap rl_get_keymap (void)
+Returns the currently active keymap.
+@end deftypefun
+
+@deftypefun void rl_set_keymap (Keymap keymap)
+Makes @var{keymap} the currently active keymap.
+@end deftypefun
+
+@deftypefun Keymap rl_get_keymap_by_name (const char *name)
+Return the keymap matching @var{name}. @var{name} is one which would
+be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}).
+@end deftypefun
+
+@deftypefun {char *} rl_get_keymap_name (Keymap keymap)
+Return the name matching @var{keymap}. @var{name} is one which would
+be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}).
+@end deftypefun
+
+@deftypefun int rl_set_keymap_name (const char *name, Keymap keymap)
+Set the name of @var{keymap}. This name will then be "registered" and
+available for use in a @code{set keymap} inputrc directive
+@pxref{Readline Init File}).
+The @var{name} may not be one of Readline's builtin keymap names;
+you may not add a different name for one of Readline's builtin keymaps.
+You may replace the name associated with a given keymap by calling this
+function more than once with the same @var{keymap} argument.
+You may associate a registered @var{name} with a new keymap by calling this
+function more than once with the same @var{name} argument.
+There is no way to remove a named keymap once the name has been
+registered.
+Readline will make a copy of @var{name}.
+The return value is greater than zero unless @var{name} is one of
+Readline's builtin keymap names or @var{keymap} is one of Readline's
+builtin keymaps.
+@end deftypefun
+
+@node Binding Keys
+@subsection Binding Keys
+
+Key sequences are associate with functions through the keymap.
+Readline has several internal keymaps: @code{emacs_standard_keymap},
+@code{emacs_meta_keymap}, @code{emacs_ctlx_keymap},
+@code{vi_movement_keymap}, and @code{vi_insertion_keymap}.
+@code{emacs_standard_keymap} is the default, and the examples in
+this manual assume that.
+
+Since @code{readline()} installs a set of default key bindings the first
+time it is called, there is always the danger that a custom binding
+installed before the first call to @code{readline()} will be overridden.
+An alternate mechanism is to install custom key bindings in an
+initialization function assigned to the @code{rl_startup_hook} variable
+(@pxref{Readline Variables}).
+
+These functions manage key bindings.
+
+@deftypefun int rl_bind_key (int key, rl_command_func_t *function)
+Binds @var{key} to @var{function} in the currently active keymap.
+Returns non-zero in the case of an invalid @var{key}.
+@end deftypefun
+
+@deftypefun int rl_bind_key_in_map (int key, rl_command_func_t *function, Keymap map)
+Bind @var{key} to @var{function} in @var{map}.
+Returns non-zero in the case of an invalid @var{key}.
+@end deftypefun
+
+@deftypefun int rl_bind_key_if_unbound (int key, rl_command_func_t *function)
+Binds @var{key} to @var{function} if it is not already bound in the
+currently active keymap.
+Returns non-zero in the case of an invalid @var{key} or if @var{key} is
+already bound.
+@end deftypefun
+
+@deftypefun int rl_bind_key_if_unbound_in_map (int key, rl_command_func_t *function, Keymap map)
+Binds @var{key} to @var{function} if it is not already bound in @var{map}.
+Returns non-zero in the case of an invalid @var{key} or if @var{key} is
+already bound.
+@end deftypefun
+
+@deftypefun int rl_unbind_key (int key)
+Bind @var{key} to the null function in the currently active keymap.
+Returns non-zero in case of error.
+@end deftypefun
+
+@deftypefun int rl_unbind_key_in_map (int key, Keymap map)
+Bind @var{key} to the null function in @var{map}.
+Returns non-zero in case of error.
+@end deftypefun
+
+@deftypefun int rl_unbind_function_in_map (rl_command_func_t *function, Keymap map)
+Unbind all keys that execute @var{function} in @var{map}.
+@end deftypefun
+
+@deftypefun int rl_unbind_command_in_map (const char *command, Keymap map)
+Unbind all keys that are bound to @var{command} in @var{map}.
+@end deftypefun
+
+@deftypefun int rl_bind_keyseq (const char *keyseq, rl_command_func_t *function)
+Bind the key sequence represented by the string @var{keyseq} to the function
+@var{function}, beginning in the current keymap.
+This makes new keymaps as necessary.
+The return value is non-zero if @var{keyseq} is invalid.
+@end deftypefun
+
+@deftypefun int rl_bind_keyseq_in_map (const char *keyseq, rl_command_func_t *function, Keymap map)
+Bind the key sequence represented by the string @var{keyseq} to the function
+@var{function}. This makes new keymaps as necessary.
+Initial bindings are performed in @var{map}.
+The return value is non-zero if @var{keyseq} is invalid.
+@end deftypefun
+
+@deftypefun int rl_set_key (const char *keyseq, rl_command_func_t *function, Keymap map)
+Equivalent to @code{rl_bind_keyseq_in_map}.
+@end deftypefun
+
+@deftypefun int rl_bind_keyseq_if_unbound (const char *keyseq, rl_command_func_t *function)
+Binds @var{keyseq} to @var{function} if it is not already bound in the
+currently active keymap.
+Returns non-zero in the case of an invalid @var{keyseq} or if @var{keyseq} is
+already bound.
+@end deftypefun
+
+@deftypefun int rl_bind_keyseq_if_unbound_in_map (const char *keyseq, rl_command_func_t *function, Keymap map)
+Binds @var{keyseq} to @var{function} if it is not already bound in @var{map}.
+Returns non-zero in the case of an invalid @var{keyseq} or if @var{keyseq} is
+already bound.
+@end deftypefun
+
+@deftypefun int rl_generic_bind (int type, const char *keyseq, char *data, Keymap map)
+Bind the key sequence represented by the string @var{keyseq} to the arbitrary
+pointer @var{data}. @var{type} says what kind of data is pointed to by
+@var{data}; this can be a function (@code{ISFUNC}), a macro
+(@code{ISMACR}), or a keymap (@code{ISKMAP}). This makes new keymaps as
+necessary. The initial keymap in which to do bindings is @var{map}.
+@end deftypefun
+
+@deftypefun int rl_parse_and_bind (char *line)
+Parse @var{line} as if it had been read from the @code{inputrc} file and
+perform any key bindings and variable assignments found
+(@pxref{Readline Init File}).
+@end deftypefun
+
+@deftypefun int rl_read_init_file (const char *filename)
+Read keybindings and variable assignments from @var{filename}
+(@pxref{Readline Init File}).
+@end deftypefun
+
+@node Associating Function Names and Bindings
+@subsection Associating Function Names and Bindings
+
+These functions allow you to find out what keys invoke named functions
+and the functions invoked by a particular key sequence. You may also
+associate a new function name with an arbitrary function.
+
+@deftypefun {rl_command_func_t *} rl_named_function (const char *name)
+Return the function with name @var{name}.
+@end deftypefun
+
+@deftypefun {rl_command_func_t *} rl_function_of_keyseq (const char *keyseq, Keymap map, int *type)
+Return the function invoked by @var{keyseq} in keymap @var{map}.
+If @var{map} is @code{NULL}, the current keymap is used. If @var{type} is
+not @code{NULL}, the type of the object is returned in the @code{int} variable
+it points to (one of @code{ISFUNC}, @code{ISKMAP}, or @code{ISMACR}).
+It takes a "translated" key sequence and should not be used if the key sequence
+can include NUL.
+@end deftypefun
+
+@deftypefun {rl_command_func_t *} rl_function_of_keyseq_len (const char *keyseq, size_t len, Keymap map, int *type)
+Return the function invoked by @var{keyseq} of length @var{len}
+in keymap @var{map}. Equivalent to @code{rl_function_of_keyseq} with the
+addition of the @var{len} parameter.
+It takes a "translated" key sequence and should be used if the key sequence
+can include NUL.
+@end deftypefun
+
+@deftypefun {int} rl_trim_arg_from_keyseq (const char *keyseq, size_t len, Keymap map)
+If there is a numeric argument at the beginning of @var{keyseq}, possibly
+including digits, return the index of the first character in @var{keyseq}
+following the numeric argument.
+This can be used to skip over the numeric argument (which is available as
+@code{rl_numeric_arg} while traversing the key sequence that invoked the
+current command.
+@end deftypefun
+
+@deftypefun {char **} rl_invoking_keyseqs (rl_command_func_t *function)
+Return an array of strings representing the key sequences used to
+invoke @var{function} in the current keymap.
+@end deftypefun
+
+@deftypefun {char **} rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map)
+Return an array of strings representing the key sequences used to
+invoke @var{function} in the keymap @var{map}.
+@end deftypefun
+
+@deftypefun void rl_function_dumper (int readable)
+Print the Readline function names and the key sequences currently
+bound to them to @code{rl_outstream}. If @var{readable} is non-zero,
+the list is formatted in such a way that it can be made part of an
+@code{inputrc} file and re-read.
+@end deftypefun
+
+@deftypefun void rl_list_funmap_names (void)
+Print the names of all bindable Readline functions to @code{rl_outstream}.
+@end deftypefun
+
+@deftypefun {const char **} rl_funmap_names (void)
+Return a NULL terminated array of known function names. The array is
+sorted. The array itself is allocated, but not the strings inside. You
+should free the array, but not the pointers, using @code{free} or
+@code{rl_free} when you are done.
+@end deftypefun
+
+@deftypefun int rl_add_funmap_entry (const char *name, rl_command_func_t *function)
+Add @var{name} to the list of bindable Readline command names, and make
+@var{function} the function to be called when @var{name} is invoked.
+@end deftypefun
+
+@node Allowing Undoing
+@subsection Allowing Undoing
+
+Supporting the undo command is a painless thing, and makes your
+functions much more useful. It is certainly easy to try
+something if you know you can undo it.
+
+If your function simply inserts text once, or deletes text once, and
+uses @code{rl_insert_text()} or @code{rl_delete_text()} to do it, then
+undoing is already done for you automatically.
+
+If you do multiple insertions or multiple deletions, or any combination
+of these operations, you should group them together into one operation.
+This is done with @code{rl_begin_undo_group()} and
+@code{rl_end_undo_group()}.
+
+The types of events that can be undone are:
+
+@smallexample
+enum undo_code @{ UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END @};
+@end smallexample
+
+Notice that @code{UNDO_DELETE} means to insert some text, and
+@code{UNDO_INSERT} means to delete some text. That is, the undo code
+tells what to undo, not how to undo it. @code{UNDO_BEGIN} and
+@code{UNDO_END} are tags added by @code{rl_begin_undo_group()} and
+@code{rl_end_undo_group()}.
+
+@deftypefun int rl_begin_undo_group (void)
+Begins saving undo information in a group construct. The undo
+information usually comes from calls to @code{rl_insert_text()} and
+@code{rl_delete_text()}, but could be the result of calls to
+@code{rl_add_undo()}.
+@end deftypefun
+
+@deftypefun int rl_end_undo_group (void)
+Closes the current undo group started with @code{rl_begin_undo_group
+()}. There should be one call to @code{rl_end_undo_group()}
+for each call to @code{rl_begin_undo_group()}.
+@end deftypefun
+
+@deftypefun void rl_add_undo (enum undo_code what, int start, int end, char *text)
+Remember how to undo an event (according to @var{what}). The affected
+text runs from @var{start} to @var{end}, and encompasses @var{text}.
+@end deftypefun
+
+@deftypefun void rl_free_undo_list (void)
+Free the existing undo list.
+@end deftypefun
+
+@deftypefun int rl_do_undo (void)
+Undo the first thing on the undo list. Returns @code{0} if there was
+nothing to undo, non-zero if something was undone.
+@end deftypefun
+
+Finally, if you neither insert nor delete text, but directly modify the
+existing text (e.g., change its case), call @code{rl_modifying()}
+once, just before you modify the text. You must supply the indices of
+the text range that you are going to modify.
+
+@deftypefun int rl_modifying (int start, int end)
+Tell Readline to save the text between @var{start} and @var{end} as a
+single undo unit. It is assumed that you will subsequently modify
+that text.
+@end deftypefun
+
+@node Redisplay
+@subsection Redisplay
+
+@deftypefun void rl_redisplay (void)
+Change what's displayed on the screen to reflect the current contents
+of @code{rl_line_buffer}.
+@end deftypefun
+
+@deftypefun int rl_forced_update_display (void)
+Force the line to be updated and redisplayed, whether or not
+Readline thinks the screen display is correct.
+@end deftypefun
+
+@deftypefun int rl_on_new_line (void)
+Tell the update functions that we have moved onto a new (empty) line,
+usually after outputting a newline.
+@end deftypefun
+
+@deftypefun int rl_on_new_line_with_prompt (void)
+Tell the update functions that we have moved onto a new line, with
+@var{rl_prompt} already displayed.
+This could be used by applications that want to output the prompt string
+themselves, but still need Readline to know the prompt string length for
+redisplay.
+It should be used after setting @var{rl_already_prompted}.
+@end deftypefun
+
+@deftypefun int rl_clear_visible_line (void)
+Clear the screen lines corresponding to the current line's contents.
+@end deftypefun
+
+@deftypefun int rl_reset_line_state (void)
+Reset the display state to a clean state and redisplay the current line
+starting on a new line.
+@end deftypefun
+
+@deftypefun int rl_crlf (void)
+Move the cursor to the start of the next screen line.
+@end deftypefun
+
+@deftypefun int rl_show_char (int c)
+Display character @var{c} on @code{rl_outstream}.
+If Readline has not been set to display meta characters directly, this
+will convert meta characters to a meta-prefixed key sequence.
+This is intended for use by applications which wish to do their own
+redisplay.
+@end deftypefun
+
+@deftypefun int rl_message (const char *, @dots{})
+The arguments are a format string as would be supplied to @code{printf},
+possibly containing conversion specifications such as @samp{%d}, and
+any additional arguments necessary to satisfy the conversion specifications.
+The resulting string is displayed in the @dfn{echo area}. The echo area
+is also used to display numeric arguments and search strings.
+You should call @code{rl_save_prompt} to save the prompt information
+before calling this function.
+@end deftypefun
+
+@deftypefun int rl_clear_message (void)
+Clear the message in the echo area. If the prompt was saved with a call to
+@code{rl_save_prompt} before the last call to @code{rl_message},
+call @code{rl_restore_prompt} before calling this function.
+@end deftypefun
+
+@deftypefun void rl_save_prompt (void)
+Save the local Readline prompt display state in preparation for
+displaying a new message in the message area with @code{rl_message()}.
+@end deftypefun
+
+@deftypefun void rl_restore_prompt (void)
+Restore the local Readline prompt display state saved by the most
+recent call to @code{rl_save_prompt}.
+if @code{rl_save_prompt} was called to save the prompt before a call
+to @code{rl_message}, this function should be called before the
+corresponding call to @code{rl_clear_message}.
+@end deftypefun
+
+@deftypefun int rl_expand_prompt (char *prompt)
+Expand any special character sequences in @var{prompt} and set up the
+local Readline prompt redisplay variables.
+This function is called by @code{readline()}. It may also be called to
+expand the primary prompt if the @code{rl_on_new_line_with_prompt()}
+function or @code{rl_already_prompted} variable is used.
+It returns the number of visible characters on the last line of the
+(possibly multi-line) prompt.
+Applications may indicate that the prompt contains characters that take
+up no physical screen space when displayed by bracketing a sequence of
+such characters with the special markers @code{RL_PROMPT_START_IGNORE}
+and @code{RL_PROMPT_END_IGNORE} (declared in @file{readline.h} as
+@samp{\001} and @samp{\002}, respectively).
+This may be used to embed terminal-specific escape sequences in prompts.
+@end deftypefun
+
+@deftypefun int rl_set_prompt (const char *prompt)
+Make Readline use @var{prompt} for subsequent redisplay. This calls
+@code{rl_expand_prompt()} to expand the prompt and sets @code{rl_prompt}
+to the result.
+@end deftypefun
+
+@node Modifying Text
+@subsection Modifying Text
+
+@deftypefun int rl_insert_text (const char *text)
+Insert @var{text} into the line at the current cursor position.
+Returns the number of characters inserted.
+@end deftypefun
+
+@deftypefun int rl_delete_text (int start, int end)
+Delete the text between @var{start} and @var{end} in the current line.
+Returns the number of characters deleted.
+@end deftypefun
+
+@deftypefun {char *} rl_copy_text (int start, int end)
+Return a copy of the text between @var{start} and @var{end} in
+the current line.
+@end deftypefun
+
+@deftypefun int rl_kill_text (int start, int end)
+Copy the text between @var{start} and @var{end} in the current line
+to the kill ring, appending or prepending to the last kill if the
+last command was a kill command. The text is deleted.
+If @var{start} is less than @var{end},
+the text is appended, otherwise prepended. If the last command was
+not a kill, a new kill ring slot is used.
+@end deftypefun
+
+@deftypefun int rl_push_macro_input (char *macro)
+Cause @var{macro} to be inserted into the line, as if it had been invoked
+by a key bound to a macro. Not especially useful; use
+@code{rl_insert_text()} instead.
+@end deftypefun
+
+@node Character Input
+@subsection Character Input
+
+@deftypefun int rl_read_key (void)
+Return the next character available from Readline's current input stream.
+This handles input inserted into
+the input stream via @var{rl_pending_input} (@pxref{Readline Variables})
+and @code{rl_stuff_char()}, macros, and characters read from the keyboard.
+While waiting for input, this function will call any function assigned to
+the @code{rl_event_hook} variable.
+@end deftypefun
+
+@deftypefun int rl_getc (FILE *stream)
+Return the next character available from @var{stream}, which is assumed to
+be the keyboard.
+@end deftypefun
+
+@deftypefun int rl_stuff_char (int c)
+Insert @var{c} into the Readline input stream. It will be "read"
+before Readline attempts to read characters from the terminal with
+@code{rl_read_key()}. Up to 512 characters may be pushed back.
+@code{rl_stuff_char} returns 1 if the character was successfully inserted;
+0 otherwise.
+@end deftypefun
+
+@deftypefun int rl_execute_next (int c)
+Make @var{c} be the next command to be executed when @code{rl_read_key()}
+is called. This sets @var{rl_pending_input}.
+@end deftypefun
+
+@deftypefun int rl_clear_pending_input (void)
+Unset @var{rl_pending_input}, effectively negating the effect of any
+previous call to @code{rl_execute_next()}. This works only if the
+pending input has not already been read with @code{rl_read_key()}.
+@end deftypefun
+
+@deftypefun int rl_set_keyboard_input_timeout (int u)
+While waiting for keyboard input in @code{rl_read_key()}, Readline will
+wait for @var{u} microseconds for input before calling any function
+assigned to @code{rl_event_hook}. @var{u} must be greater than or equal
+to zero (a zero-length timeout is equivalent to a poll).
+The default waiting period is one-tenth of a second.
+Returns the old timeout value.
+@end deftypefun
+
+@deftypefun int rl_set_timeout (unsigned int secs, unsigned int usecs)
+Set a timeout for subsequent calls to @code{readline()}. If Readline does
+not read a complete line, or the number of characters specified by
+@code{rl_num_chars_to_read}, before the duration specified by @var{secs}
+(in seconds) and @var{usecs} (microseconds), it returns and sets
+@code{RL_STATE_TIMEOUT} in @code{rl_readline_state}.
+Passing 0 for @code{secs} and @code{usecs} cancels any previously set
+timeout; the convenience macro @code{rl_clear_timeout()} is shorthand
+for this.
+Returns 0 if the timeout is set successfully.
+@end deftypefun
+
+@deftypefun int rl_timeout_remaining (unsigned int *secs, unsigned int *usecs)
+Return the number of seconds and microseconds remaining in the current
+timeout duration in @var{*secs} and @var{*usecs}, respectively.
+Both @var{*secs} and @var{*usecs} must be non-NULL to return any values.
+The return value is -1 on error or when there is no timeout set,
+0 when the timeout has expired (leaving @var{*secs} and @var{*usecs}
+unchanged),
+and 1 if the timeout has not expired.
+If either of @var{secs} and @var{usecs} is @code{NULL},
+the return value indicates whether the timeout has expired.
+@end deftypefun
+
+@node Terminal Management
+@subsection Terminal Management
+
+@deftypefun void rl_prep_terminal (int meta_flag)
+Modify the terminal settings for Readline's use, so @code{readline()}
+can read a single character at a time from the keyboard.
+The @var{meta_flag} argument should be non-zero if Readline should
+read eight-bit input.
+@end deftypefun
+
+@deftypefun void rl_deprep_terminal (void)
+Undo the effects of @code{rl_prep_terminal()}, leaving the terminal in
+the state in which it was before the most recent call to
+@code{rl_prep_terminal()}.
+@end deftypefun
+
+@deftypefun void rl_tty_set_default_bindings (Keymap kmap)
+Read the operating system's terminal editing characters (as would be
+displayed by @code{stty}) to their Readline equivalents.
+The bindings are performed in @var{kmap}.
+@end deftypefun
+
+@deftypefun void rl_tty_unset_default_bindings (Keymap kmap)
+Reset the bindings manipulated by @code{rl_tty_set_default_bindings} so
+that the terminal editing characters are bound to @code{rl_insert}.
+The bindings are performed in @var{kmap}.
+@end deftypefun
+
+@deftypefun int rl_tty_set_echoing (int value)
+Set Readline's idea of whether or not it is echoing output to its output
+stream (@var{rl_outstream}). If @var{value} is 0, Readline does not display
+output to @var{rl_outstream}; any other value enables output. The initial
+value is set when Readline initializes the terminal settings.
+This function returns the previous value.
+@end deftypefun
+
+@deftypefun int rl_reset_terminal (const char *terminal_name)
+Reinitialize Readline's idea of the terminal settings using
+@var{terminal_name} as the terminal type (e.g., @code{vt100}).
+If @var{terminal_name} is @code{NULL}, the value of the @code{TERM}
+environment variable is used.
+@end deftypefun
+
+@node Utility Functions
+@subsection Utility Functions
+
+@deftypefun int rl_save_state (struct readline_state *sp)
+Save a snapshot of Readline's internal state to @var{sp}.
+The contents of the @var{readline_state} structure are documented
+in @file{readline.h}.
+The caller is responsible for allocating the structure.
+@end deftypefun
+
+@deftypefun int rl_restore_state (struct readline_state *sp)
+Restore Readline's internal state to that stored in @var{sp}, which must
+have been saved by a call to @code{rl_save_state}.
+The contents of the @var{readline_state} structure are documented
+in @file{readline.h}.
+The caller is responsible for freeing the structure.
+@end deftypefun
+
+@deftypefun void rl_free (void *mem)
+Deallocate the memory pointed to by @var{mem}. @var{mem} must have been
+allocated by @code{malloc}.
+@end deftypefun
+
+@deftypefun void rl_replace_line (const char *text, int clear_undo)
+Replace the contents of @code{rl_line_buffer} with @var{text}.
+The point and mark are preserved, if possible.
+If @var{clear_undo} is non-zero, the undo list associated with the
+current line is cleared.
+@end deftypefun
+
+@deftypefun void rl_extend_line_buffer (int len)
+Ensure that @code{rl_line_buffer} has enough space to hold @var{len}
+characters, possibly reallocating it if necessary.
+@end deftypefun
+
+@deftypefun int rl_initialize (void)
+Initialize or re-initialize Readline's internal state.
+It's not strictly necessary to call this; @code{readline()} calls it before
+reading any input.
+@end deftypefun
+
+@deftypefun int rl_ding (void)
+Ring the terminal bell, obeying the setting of @code{bell-style}.
+@end deftypefun
+
+@deftypefun int rl_alphabetic (int c)
+Return 1 if @var{c} is an alphabetic character.
+@end deftypefun
+
+@deftypefun void rl_display_match_list (char **matches, int len, int max)
+A convenience function for displaying a list of strings in
+columnar format on Readline's output stream. @code{matches} is the list
+of strings, in argv format, such as a list of completion matches.
+@code{len} is the number of strings in @code{matches}, and @code{max}
+is the length of the longest string in @code{matches}. This function uses
+the setting of @code{print-completions-horizontally} to select how the
+matches are displayed (@pxref{Readline Init File Syntax}).
+When displaying completions, this function sets the number of columns used
+for display to the value of @code{completion-display-width}, the value of
+the environment variable @env{COLUMNS}, or the screen width, in that order.
+@end deftypefun
+
+The following are implemented as macros, defined in @code{chardefs.h}.
+Applications should refrain from using them.
+
+@deftypefun int _rl_uppercase_p (int c)
+Return 1 if @var{c} is an uppercase alphabetic character.
+@end deftypefun
+
+@deftypefun int _rl_lowercase_p (int c)
+Return 1 if @var{c} is a lowercase alphabetic character.
+@end deftypefun
+
+@deftypefun int _rl_digit_p (int c)
+Return 1 if @var{c} is a numeric character.
+@end deftypefun
+
+@deftypefun int _rl_to_upper (int c)
+If @var{c} is a lowercase alphabetic character, return the corresponding
+uppercase character.
+@end deftypefun
+
+@deftypefun int _rl_to_lower (int c)
+If @var{c} is an uppercase alphabetic character, return the corresponding
+lowercase character.
+@end deftypefun
+
+@deftypefun int _rl_digit_value (int c)
+If @var{c} is a number, return the value it represents.
+@end deftypefun
+
+@node Miscellaneous Functions
+@subsection Miscellaneous Functions
+
+@deftypefun int rl_macro_bind (const char *keyseq, const char *macro, Keymap map)
+Bind the key sequence @var{keyseq} to invoke the macro @var{macro}.
+The binding is performed in @var{map}. When @var{keyseq} is invoked, the
+@var{macro} will be inserted into the line. This function is deprecated;
+use @code{rl_generic_bind()} instead.
+@end deftypefun
+
+@deftypefun void rl_macro_dumper (int readable)
+Print the key sequences bound to macros and their values, using
+the current keymap, to @code{rl_outstream}.
+If @var{readable} is non-zero, the list is formatted in such a way
+that it can be made part of an @code{inputrc} file and re-read.
+@end deftypefun
+
+@deftypefun int rl_variable_bind (const char *variable, const char *value)
+Make the Readline variable @var{variable} have @var{value}.
+This behaves as if the Readline command
+@samp{set @var{variable} @var{value}} had been executed in an @code{inputrc}
+file (@pxref{Readline Init File Syntax}).
+@end deftypefun
+
+@deftypefun {char *} rl_variable_value (const char *variable)
+Return a string representing the value of the Readline variable @var{variable}.
+For boolean variables, this string is either @samp{on} or @samp{off}.
+@end deftypefun
+
+@deftypefun void rl_variable_dumper (int readable)
+Print the Readline variable names and their current values
+to @code{rl_outstream}.
+If @var{readable} is non-zero, the list is formatted in such a way
+that it can be made part of an @code{inputrc} file and re-read.
+@end deftypefun
+
+@deftypefun int rl_set_paren_blink_timeout (int u)
+Set the time interval (in microseconds) that Readline waits when showing
+a balancing character when @code{blink-matching-paren} has been enabled.
+@end deftypefun
+
+@deftypefun {char *} rl_get_termcap (const char *cap)
+Retrieve the string value of the termcap capability @var{cap}.
+Readline fetches the termcap entry for the current terminal name and
+uses those capabilities to move around the screen line and perform other
+terminal-specific operations, like erasing a line. Readline does not
+use all of a terminal's capabilities, and this function will return
+values for only those capabilities Readline uses.
+@end deftypefun
+
+@deftypefun {void} rl_clear_history (void)
+Clear the history list by deleting all of the entries, in the same manner
+as the History library's @code{clear_history()} function.
+This differs from @code{clear_history} because it frees private data
+Readline saves in the history list.
+@end deftypefun
+
+@deftypefun {void} rl_activate_mark (void)
+Enable an @emph{active} mark.
+When this is enabled, the text between point and mark (the @var{region}) is
+displayed in the terminal's standout mode (a @var{face}).
+This is called by various Readline functions that set the mark and insert
+text, and is available for applications to call.
+@end deftypefun
+
+@deftypefun {void} rl_deactivate_mark (void)
+Turn off the active mark.
+@end deftypefun
+
+@deftypefun {void} rl_keep_mark_active (void)
+Indicate that the mark should remain active when the current Readline
+function completes and after redisplay occurs.
+In most cases, the mark remains active for only the duration of a single
+bindable Readline function.
+@end deftypefun
+
+@deftypefun {int} rl_mark_active_p (void)
+Return a non-zero value if the mark is currently active; zero otherwise.
+@end deftypefun
+
+@node Alternate Interface
+@subsection Alternate Interface
+
+An alternate interface is available to plain @code{readline()}. Some
+applications need to interleave keyboard I/O with file, device, or
+window system I/O, typically by using a main loop to @code{select()}
+on various file descriptors. To accommodate this need, Readline can
+also be invoked as a `callback' function from an event loop. There
+are functions available to make this easy.
+
+@deftypefun void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *lhandler)
+Set up the terminal for Readline I/O and display the initial
+expanded value of @var{prompt}. Save the value of @var{lhandler} to
+use as a handler function to call when a complete line of input has been
+entered.
+The handler function receives the text of the line as an argument.
+As with @code{readline()}, the handler function should @code{free} the
+line when it it finished with it.
+@end deftypefun
+
+@deftypefun void rl_callback_read_char (void)
+Whenever an application determines that keyboard input is available, it
+should call @code{rl_callback_read_char()}, which will read the next
+character from the current input source.
+If that character completes the line, @code{rl_callback_read_char} will
+invoke the @var{lhandler} function installed by
+@code{rl_callback_handler_install} to process the line.
+Before calling the @var{lhandler} function, the terminal settings are
+reset to the values they had before calling
+@code{rl_callback_handler_install}.
+If the @var{lhandler} function returns,
+and the line handler remains installed,
+the terminal settings are modified for Readline's use again.
+@code{EOF} is indicated by calling @var{lhandler} with a
+@code{NULL} line.
+@end deftypefun
+
+@deftypefun void rl_callback_sigcleanup (void)
+Clean up any internal state the callback interface uses to maintain state
+between calls to rl_callback_read_char (e.g., the state of any active
+incremental searches). This is intended to be used by applications that
+wish to perform their own signal handling; Readline's internal signal handler
+calls this when appropriate.
+@end deftypefun
+
+@deftypefun void rl_callback_handler_remove (void)
+Restore the terminal to its initial state and remove the line handler.
+You may call this function from within a callback as well as independently.
+If the @var{lhandler} installed by @code{rl_callback_handler_install}
+does not exit the program, either this function or the function referred
+to by the value of @code{rl_deprep_term_function} should be called before
+the program exits to reset the terminal settings.
+@end deftypefun
+
+@node A Readline Example
+@subsection A Readline Example
+
+Here is a function which changes lowercase characters to their uppercase
+equivalents, and uppercase characters to lowercase. If
+this function was bound to @samp{M-c}, then typing @samp{M-c} would
+change the case of the character under point. Typing @samp{M-1 0 M-c}
+would change the case of the following 10 characters, leaving the cursor on
+the last character changed.
+
+@example
+/* Invert the case of the COUNT following characters. */
+int
+invert_case_line (count, key)
+ int count, key;
+@{
+ register int start, end, i;
+
+ start = rl_point;
+
+ if (rl_point >= rl_end)
+ return (0);
+
+ if (count < 0)
+ @{
+ direction = -1;
+ count = -count;
+ @}
+ else
+ direction = 1;
+
+ /* Find the end of the range to modify. */
+ end = start + (count * direction);
+
+ /* Force it to be within range. */
+ if (end > rl_end)
+ end = rl_end;
+ else if (end < 0)
+ end = 0;
+
+ if (start == end)
+ return (0);
+
+ if (start > end)
+ @{
+ int temp = start;
+ start = end;
+ end = temp;
+ @}
+
+ /* Tell readline that we are modifying the line,
+ so it will save the undo information. */
+ rl_modifying (start, end);
+
+ for (i = start; i != end; i++)
+ @{
+ if (_rl_uppercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]);
+ else if (_rl_lowercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]);
+ @}
+ /* Move point to on top of the last character changed. */
+ rl_point = (direction == 1) ? end - 1 : start;
+ return (0);
+@}
+@end example
+
+@node Alternate Interface Example
+@subsection Alternate Interface Example
+
+Here is a complete program that illustrates Readline's alternate interface.
+It reads lines from the terminal and displays them, providing the
+standard history and TAB completion functions.
+It understands the EOF character or "exit" to exit the program.
+
+@example
+/* Standard include files. stdio.h is required. */
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <locale.h>
+
+/* Used for select(2) */
+#include <sys/types.h>
+#include <sys/select.h>
+
+#include <signal.h>
+
+#include <stdio.h>
+
+/* Standard readline include files. */
+#include <readline/readline.h>
+#include <readline/history.h>
+
+static void cb_linehandler (char *);
+static void sighandler (int);
+
+int running;
+int sigwinch_received;
+const char *prompt = "rltest$ ";
+
+/* Handle SIGWINCH and window size changes when readline is not active and
+ reading a character. */
+static void
+sighandler (int sig)
+@{
+ sigwinch_received = 1;
+@}
+
+/* Callback function called for each line when accept-line executed, EOF
+ seen, or EOF character read. This sets a flag and returns; it could
+ also call exit(3). */
+static void
+cb_linehandler (char *line)
+@{
+ /* Can use ^D (stty eof) or `exit' to exit. */
+ if (line == NULL || strcmp (line, "exit") == 0)
+ @{
+ if (line == 0)
+ printf ("\n");
+ printf ("exit\n");
+ /* This function needs to be called to reset the terminal settings,
+ and calling it from the line handler keeps one extra prompt from
+ being displayed. */
+ rl_callback_handler_remove ();
+
+ running = 0;
+ @}
+ else
+ @{
+ if (*line)
+ add_history (line);
+ printf ("input line: %s\n", line);
+ free (line);
+ @}
+@}
+
+int
+main (int c, char **v)
+@{
+ fd_set fds;
+ int r;
+
+ /* Set the default locale values according to environment variables. */
+ setlocale (LC_ALL, "");
+
+ /* Handle window size changes when readline is not active and reading
+ characters. */
+ signal (SIGWINCH, sighandler);
+
+ /* Install the line handler. */
+ rl_callback_handler_install (prompt, cb_linehandler);
+
+ /* Enter a simple event loop. This waits until something is available
+ to read on readline's input stream (defaults to standard input) and
+ calls the builtin character read callback to read it. It does not
+ have to modify the user's terminal settings. */
+ running = 1;
+ while (running)
+ @{
+ FD_ZERO (&fds);
+ FD_SET (fileno (rl_instream), &fds);
+
+ r = select (FD_SETSIZE, &fds, NULL, NULL, NULL);
+ if (r < 0 && errno != EINTR)
+ @{
+ perror ("rltest: select");
+ rl_callback_handler_remove ();
+ break;
+ @}
+ if (sigwinch_received)
+ @{
+ rl_resize_terminal ();
+ sigwinch_received = 0;
+ @}
+ if (r < 0)
+ continue;
+
+ if (FD_ISSET (fileno (rl_instream), &fds))
+ rl_callback_read_char ();
+ @}
+
+ printf ("rltest: Event loop has exited\n");
+ return 0;
+@}
+@end example
+
+@node Readline Signal Handling
+@section Readline Signal Handling
+
+Signals are asynchronous events sent to a process by the Unix kernel,
+sometimes on behalf of another process. They are intended to indicate
+exceptional events, like a user pressing the terminal's interrupt key,
+or a network connection being broken. There is a class of signals that can
+be sent to the process currently reading input from the keyboard. Since
+Readline changes the terminal attributes when it is called, it needs to
+perform special processing when such a signal is received in order to
+restore the terminal to a sane state, or provide application writers with
+functions to do so manually.
+
+Readline contains an internal signal handler that is installed for a
+number of signals (@code{SIGINT}, @code{SIGQUIT}, @code{SIGTERM},
+@code{SIGHUP},
+@code{SIGALRM}, @code{SIGTSTP}, @code{SIGTTIN}, and @code{SIGTTOU}).
+When one of these signals is received, the signal handler
+will reset the terminal attributes to those that were in effect before
+@code{readline()} was called, reset the signal handling to what it was
+before @code{readline()} was called, and resend the signal to the calling
+application.
+If and when the calling application's signal handler returns, Readline
+will reinitialize the terminal and continue to accept input.
+When a @code{SIGINT} is received, the Readline signal handler performs
+some additional work, which will cause any partially-entered line to be
+aborted (see the description of @code{rl_free_line_state()} below).
+
+There is an additional Readline signal handler, for @code{SIGWINCH}, which
+the kernel sends to a process whenever the terminal's size changes (for
+example, if a user resizes an @code{xterm}). The Readline @code{SIGWINCH}
+handler updates Readline's internal screen size information, and then calls
+any @code{SIGWINCH} signal handler the calling application has installed.
+Readline calls the application's @code{SIGWINCH} signal handler without
+resetting the terminal to its original state. If the application's signal
+handler does more than update its idea of the terminal size and return (for
+example, a @code{longjmp} back to a main processing loop), it @emph{must}
+call @code{rl_cleanup_after_signal()} (described below), to restore the
+terminal state.
+
+When an application is using the callback interface
+(@pxref{Alternate Interface}), Readline installs signal handlers only for
+the duration of the call to @code{rl_callback_read_char}. Applications
+using the callback interface should be prepared to clean up Readline's
+state if they wish to handle the signal before the line handler completes
+and restores the terminal state.
+
+If an application using the callback interface wishes to have Readline
+install its signal handlers at the time the application calls
+@code{rl_callback_handler_install} and remove them only when a complete
+line of input has been read, it should set the
+@code{rl_persistent_signal_handlers} variable to a non-zero value.
+This allows an application to defer all of the handling of the signals
+Readline catches to Readline.
+Applications should use this variable with care; it can result in Readline
+catching signals and not acting on them (or allowing the application to react
+to them) until the application calls @code{rl_callback_read_char}. This
+can result in an application becoming less responsive to keyboard signals
+like SIGINT.
+If an application does not want or need to perform any signal handling, or
+does not need to do any processing between calls to @code{rl_callback_read_char},
+setting this variable may be desirable.
+
+Readline provides two variables that allow application writers to
+control whether or not it will catch certain signals and act on them
+when they are received. It is important that applications change the
+values of these variables only when calling @code{readline()}, not in
+a signal handler, so Readline's internal signal state is not corrupted.
+
+@deftypevar int rl_catch_signals
+If this variable is non-zero, Readline will install signal handlers for
+@code{SIGINT}, @code{SIGQUIT}, @code{SIGTERM}, @code{SIGHUP}, @code{SIGALRM},
+@code{SIGTSTP}, @code{SIGTTIN}, and @code{SIGTTOU}.
+
+The default value of @code{rl_catch_signals} is 1.
+@end deftypevar
+
+@deftypevar int rl_catch_sigwinch
+If this variable is set to a non-zero value,
+Readline will install a signal handler for @code{SIGWINCH}.
+
+The default value of @code{rl_catch_sigwinch} is 1.
+@end deftypevar
+
+@deftypevar int rl_persistent_signal_handlers
+If an application using the callback interface wishes Readline's signal
+handlers to be installed and active during the set of calls to
+@code{rl_callback_read_char} that constitutes an entire single line,
+it should set this variable to a non-zero value.
+
+The default value of @code{rl_persistent_signal_handlers} is 0.
+@end deftypevar
+
+@deftypevar int rl_change_environment
+If this variable is set to a non-zero value,
+and Readline is handling @code{SIGWINCH}, Readline will modify the
+@var{LINES} and @var{COLUMNS} environment variables upon receipt of a
+@code{SIGWINCH}
+
+The default value of @code{rl_change_environment} is 1.
+@end deftypevar
+
+If an application does not wish to have Readline catch any signals, or
+to handle signals other than those Readline catches (@code{SIGHUP},
+for example),
+Readline provides convenience functions to do the necessary terminal
+and internal state cleanup upon receipt of a signal.
+
+@deftypefun int rl_pending_signal (void)
+Return the signal number of the most recent signal Readline received but
+has not yet handled, or 0 if there is no pending signal.
+@end deftypefun
+
+@deftypefun void rl_cleanup_after_signal (void)
+This function will reset the state of the terminal to what it was before
+@code{readline()} was called, and remove the Readline signal handlers for
+all signals, depending on the values of @code{rl_catch_signals} and
+@code{rl_catch_sigwinch}.
+@end deftypefun
+
+@deftypefun void rl_free_line_state (void)
+This will free any partial state associated with the current input line
+(undo information, any partial history entry, any partially-entered
+keyboard macro, and any partially-entered numeric argument). This
+should be called before @code{rl_cleanup_after_signal()}. The
+Readline signal handler for @code{SIGINT} calls this to abort the
+current input line.
+@end deftypefun
+
+@deftypefun void rl_reset_after_signal (void)
+This will reinitialize the terminal and reinstall any Readline signal
+handlers, depending on the values of @code{rl_catch_signals} and
+@code{rl_catch_sigwinch}.
+@end deftypefun
+
+If an application wants to force Readline to handle any signals that
+have arrived while it has been executing, @code{rl_check_signals()}
+will call Readline's internal signal handler if there are any pending
+signals. This is primarily intended for those applications that use
+a custom @code{rl_getc_function} (@pxref{Readline Variables}) and wish
+to handle signals received while waiting for input.
+
+@deftypefun void rl_check_signals (void)
+If there are any pending signals, call Readline's internal signal handling
+functions to process them. @code{rl_pending_signal()} can be used independently
+to determine whether or not there are any pending signals.
+@end deftypefun
+
+If an application does not wish Readline to catch @code{SIGWINCH}, it may
+call @code{rl_resize_terminal()} or @code{rl_set_screen_size()} to force
+Readline to update its idea of the terminal size when it receives
+a @code{SIGWINCH}.
+
+@deftypefun void rl_echo_signal_char (int sig)
+If an application wishes to install its own signal handlers, but still
+have Readline display characters that generate signals, calling this
+function with @var{sig} set to @code{SIGINT}, @code{SIGQUIT}, or
+@code{SIGTSTP} will display the character generating that signal.
+@end deftypefun
+
+@deftypefun void rl_resize_terminal (void)
+Update Readline's internal screen size by reading values from the kernel.
+@end deftypefun
+
+@deftypefun void rl_set_screen_size (int rows, int cols)
+Set Readline's idea of the terminal size to @var{rows} rows and
+@var{cols} columns. If either @var{rows} or @var{columns} is less than
+or equal to 0, Readline's idea of that terminal dimension is unchanged.
+This is intended to tell Readline the physical dimensions of the terminal,
+and is used internally to calculate the maximum number of characters that
+may appear on a single line and on the screen.
+@end deftypefun
+
+If an application does not want to install a @code{SIGWINCH} handler, but
+is still interested in the screen dimensions, it may query Readline's idea
+of the screen size.
+
+@deftypefun void rl_get_screen_size (int *rows, int *cols)
+Return Readline's idea of the terminal's size in the
+variables pointed to by the arguments.
+@end deftypefun
+
+@deftypefun void rl_reset_screen_size (void)
+Cause Readline to reobtain the screen size and recalculate its dimensions.
+@end deftypefun
+
+The following functions install and remove Readline's signal handlers.
+
+@deftypefun int rl_set_signals (void)
+Install Readline's signal handler for @code{SIGINT}, @code{SIGQUIT},
+@code{SIGTERM}, @code{SIGHUP}, @code{SIGALRM}, @code{SIGTSTP}, @code{SIGTTIN},
+@code{SIGTTOU}, and @code{SIGWINCH}, depending on the values of
+@code{rl_catch_signals} and @code{rl_catch_sigwinch}.
+@end deftypefun
+
+@deftypefun int rl_clear_signals (void)
+Remove all of the Readline signal handlers installed by
+@code{rl_set_signals()}.
+@end deftypefun
+
+@node Custom Completers
+@section Custom Completers
+@cindex application-specific completion functions
+
+Typically, a program that reads commands from the user has a way of
+disambiguating commands and data. If your program is one of these, then
+it can provide completion for commands, data, or both.
+The following sections describe how your program and Readline
+cooperate to provide this service.
+
+@menu
+* How Completing Works:: The logic used to do completion.
+* Completion Functions:: Functions provided by Readline.
+* Completion Variables:: Variables which control completion.
+* A Short Completion Example:: An example of writing completer subroutines.
+@end menu
+
+@node How Completing Works
+@subsection How Completing Works
+
+In order to complete some text, the full list of possible completions
+must be available. That is, it is not possible to accurately
+expand a partial word without knowing all of the possible words
+which make sense in that context. The Readline library provides
+the user interface to completion, and two of the most common
+completion functions: filename and username. For completing other types
+of text, you must write your own completion function. This section
+describes exactly what such functions must do, and provides an example.
+
+There are three major functions used to perform completion:
+
+@enumerate
+@item
+The user-interface function @code{rl_complete()}. This function is
+called with the same arguments as other bindable Readline functions:
+@var{count} and @var{invoking_key}.
+It isolates the word to be completed and calls
+@code{rl_completion_matches()} to generate a list of possible completions.
+It then either lists the possible completions, inserts the possible
+completions, or actually performs the
+completion, depending on which behavior is desired.
+
+@item
+The internal function @code{rl_completion_matches()} uses an
+application-supplied @dfn{generator} function to generate the list of
+possible matches, and then returns the array of these matches.
+The caller should place the address of its generator function in
+@code{rl_completion_entry_function}.
+
+@item
+The generator function is called repeatedly from
+@code{rl_completion_matches()}, returning a string each time. The
+arguments to the generator function are @var{text} and @var{state}.
+@var{text} is the partial word to be completed. @var{state} is zero the
+first time the function is called, allowing the generator to perform
+any necessary initialization, and a positive non-zero integer for
+each subsequent call. The generator function returns
+@code{(char *)NULL} to inform @code{rl_completion_matches()} that there are
+no more possibilities left. Usually the generator function computes the
+list of possible completions when @var{state} is zero, and returns them
+one at a time on subsequent calls. Each string the generator function
+returns as a match must be allocated with @code{malloc()}; Readline
+frees the strings when it has finished with them.
+Such a generator function is referred to as an
+@dfn{application-specific completion function}.
+
+@end enumerate
+
+@deftypefun int rl_complete (int ignore, int invoking_key)
+Complete the word at or before point. You have supplied the function
+that does the initial simple matching selection algorithm (see
+@code{rl_completion_matches()}). The default is to do filename completion.
+@end deftypefun
+
+@deftypevar {rl_compentry_func_t *} rl_completion_entry_function
+This is a pointer to the generator function for
+@code{rl_completion_matches()}.
+If the value of @code{rl_completion_entry_function} is
+@code{NULL} then the default filename generator
+function, @code{rl_filename_completion_function()}, is used.
+An @dfn{application-specific completion function} is a function whose
+address is assigned to @code{rl_completion_entry_function} and whose
+return values are used to generate possible completions.
+@end deftypevar
+
+@node Completion Functions
+@subsection Completion Functions
+
+Here is the complete list of callable completion functions present in
+Readline.
+
+@deftypefun int rl_complete_internal (int what_to_do)
+Complete the word at or before point. @var{what_to_do} says what to do
+with the completion. A value of @samp{?} means list the possible
+completions. @samp{TAB} means do standard completion. @samp{*} means
+insert all of the possible completions. @samp{!} means to display
+all of the possible completions, if there is more than one, as well as
+performing partial completion. @samp{@@} is similar to @samp{!}, but
+possible completions are not listed if the possible completions share
+a common prefix.
+@end deftypefun
+
+@deftypefun int rl_complete (int ignore, int invoking_key)
+Complete the word at or before point. You have supplied the function
+that does the initial simple matching selection algorithm (see
+@code{rl_completion_matches()} and @code{rl_completion_entry_function}).
+The default is to do filename
+completion. This calls @code{rl_complete_internal()} with an
+argument depending on @var{invoking_key}.
+@end deftypefun
+
+@deftypefun int rl_possible_completions (int count, int invoking_key)
+List the possible completions. See description of @code{rl_complete
+()}. This calls @code{rl_complete_internal()} with an argument of
+@samp{?}.
+@end deftypefun
+
+@deftypefun int rl_insert_completions (int count, int invoking_key)
+Insert the list of possible completions into the line, deleting the
+partially-completed word. See description of @code{rl_complete()}.
+This calls @code{rl_complete_internal()} with an argument of @samp{*}.
+@end deftypefun
+
+@deftypefun int rl_completion_mode (rl_command_func_t *cfunc)
+Returns the appropriate value to pass to @code{rl_complete_internal()}
+depending on whether @var{cfunc} was called twice in succession and
+the values of the @code{show-all-if-ambiguous} and
+@code{show-all-if-unmodified} variables.
+Application-specific completion functions may use this function to present
+the same interface as @code{rl_complete()}.
+@end deftypefun
+
+@deftypefun {char **} rl_completion_matches (const char *text, rl_compentry_func_t *entry_func)
+Returns an array of strings which is a list of completions for
+@var{text}. If there are no completions, returns @code{NULL}.
+The first entry in the returned array is the substitution for @var{text}.
+The remaining entries are the possible completions. The array is
+terminated with a @code{NULL} pointer.
+
+@var{entry_func} is a function of two args, and returns a
+@code{char *}. The first argument is @var{text}. The second is a
+state argument; it is zero on the first call, and non-zero on subsequent
+calls. @var{entry_func} returns a @code{NULL} pointer to the caller
+when there are no more matches.
+@end deftypefun
+
+@deftypefun {char *} rl_filename_completion_function (const char *text, int state)
+A generator function for filename completion in the general case.
+@var{text} is a partial filename.
+The Bash source is a useful reference for writing application-specific
+completion functions (the Bash completion functions call this and other
+Readline functions).
+@end deftypefun
+
+@deftypefun {char *} rl_username_completion_function (const char *text, int state)
+A completion generator for usernames. @var{text} contains a partial
+username preceded by a random character (usually @samp{~}). As with all
+completion generators, @var{state} is zero on the first call and non-zero
+for subsequent calls.
+@end deftypefun
+
+@node Completion Variables
+@subsection Completion Variables
+
+@deftypevar {rl_compentry_func_t *} rl_completion_entry_function
+A pointer to the generator function for @code{rl_completion_matches()}.
+@code{NULL} means to use @code{rl_filename_completion_function()},
+the default filename completer.
+@end deftypevar
+
+@deftypevar {rl_completion_func_t *} rl_attempted_completion_function
+A pointer to an alternative function to create matches.
+The function is called with @var{text}, @var{start}, and @var{end}.
+@var{start} and @var{end} are indices in @code{rl_line_buffer} defining
+the boundaries of @var{text}, which is a character string.
+If this function exists and returns @code{NULL}, or if this variable is
+set to @code{NULL}, then @code{rl_complete()} will call the value of
+@code{rl_completion_entry_function} to generate matches, otherwise the
+array of strings returned will be used.
+If this function sets the @code{rl_attempted_completion_over}
+variable to a non-zero value, Readline will not perform its default
+completion even if this function returns no matches.
+@end deftypevar
+
+@deftypevar {rl_quote_func_t *} rl_filename_quoting_function
+A pointer to a function that will quote a filename in an
+application-specific fashion. This is called if filename completion is being
+attempted and one of the characters in @code{rl_filename_quote_characters}
+appears in a completed filename. The function is called with
+@var{text}, @var{match_type}, and @var{quote_pointer}. The @var{text}
+is the filename to be quoted. The @var{match_type} is either
+@code{SINGLE_MATCH}, if there is only one completion match, or
+@code{MULT_MATCH}. Some functions use this to decide whether or not to
+insert a closing quote character. The @var{quote_pointer} is a pointer
+to any opening quote character the user typed. Some functions choose
+to reset this character.
+@end deftypevar
+
+@deftypevar {rl_dequote_func_t *} rl_filename_dequoting_function
+A pointer to a function that will remove application-specific quoting
+characters from a filename before completion is attempted, so those
+characters do not interfere with matching the text against names in
+the filesystem. It is called with @var{text}, the text of the word
+to be dequoted, and @var{quote_char}, which is the quoting character
+that delimits the filename (usually @samp{'} or @samp{"}). If
+@var{quote_char} is zero, the filename was not in an embedded string.
+@end deftypevar
+
+@deftypevar {rl_linebuf_func_t *} rl_char_is_quoted_p
+A pointer to a function to call that determines whether or not a specific
+character in the line buffer is quoted, according to whatever quoting
+mechanism the program calling Readline uses. The function is called with
+two arguments: @var{text}, the text of the line, and @var{index}, the
+index of the character in the line. It is used to decide whether a
+character found in @code{rl_completer_word_break_characters} should be
+used to break words for the completer.
+@end deftypevar
+
+@deftypevar {rl_compignore_func_t *} rl_ignore_some_completions_function
+This function, if defined, is called by the completer when real filename
+completion is done, after all the matching names have been generated.
+It is passed a @code{NULL} terminated array of matches.
+The first element (@code{matches[0]}) is the
+maximal substring common to all matches. This function can
+re-arrange the list of matches as required, but each element deleted
+from the array must be freed.
+@end deftypevar
+
+@deftypevar {rl_icppfunc_t *} rl_directory_completion_hook
+This function, if defined, is allowed to modify the directory portion
+of filenames Readline completes.
+It could be used to expand symbolic links or shell variables in pathnames.
+It is called with the address of a string (the current directory name) as an
+argument, and may modify that string.
+If the string is replaced with a new string, the old value should be freed.
+Any modified directory name should have a trailing slash.
+The modified value will be used as part of the completion, replacing
+the directory portion of the pathname the user typed.
+At the least, even if no other expansion is performed, this function should
+remove any quote characters from the directory name, because its result will
+be passed directly to @code{opendir()}.
+
+The directory completion hook returns an integer that should be non-zero if
+the function modifies its directory argument.
+The function should not modify the directory argument if it returns 0.
+@end deftypevar
+
+@deftypevar {rl_icppfunc_t *} rl_directory_rewrite_hook;
+If non-zero, this is the address of a function to call when completing
+a directory name. This function takes the address of the directory name
+to be modified as an argument. Unlike @code{rl_directory_completion_hook},
+it only modifies the directory name used in @code{opendir}, not what is
+displayed when the possible completions are printed or inserted. It is
+called before rl_directory_completion_hook.
+At the least, even if no other expansion is performed, this function should
+remove any quote characters from the directory name, because its result will
+be passed directly to @code{opendir()}.
+
+The directory rewrite hook returns an integer that should be non-zero if
+the function modifies its directory argument.
+The function should not modify the directory argument if it returns 0.
+@end deftypevar
+
+@deftypevar {rl_icppfunc_t *} rl_filename_stat_hook
+If non-zero, this is the address of a function for the completer to
+call before deciding which character to append to a completed name.
+This function modifies its filename name argument, and the modified value
+is passed to @code{stat()} to determine the file's type and characteristics.
+This function does not need to remove quote characters from the filename.
+
+The stat hook returns an integer that should be non-zero if
+the function modifies its directory argument.
+The function should not modify the directory argument if it returns 0.
+@end deftypevar
+
+@deftypevar {rl_dequote_func_t *} rl_filename_rewrite_hook
+If non-zero, this is the address of a function called when reading
+directory entries from the filesystem for completion and comparing
+them to the partial word to be completed. The function should
+perform any necessary application or system-specific conversion on
+the filename, such as converting between character sets or converting
+from a filesystem format to a character input format.
+The function takes two arguments: @var{fname}, the filename to be converted,
+and @var{fnlen}, its length in bytes.
+It must either return its first argument (if no conversion takes place)
+or the converted filename in newly-allocated memory. The converted
+form is used to compare against the word to be completed, and, if it
+matches, is added to the list of matches. Readline will free the
+allocated string.
+@end deftypevar
+
+@deftypevar {rl_compdisp_func_t *} rl_completion_display_matches_hook
+If non-zero, then this is the address of a function to call when
+completing a word would normally display the list of possible matches.
+This function is called in lieu of Readline displaying the list.
+It takes three arguments:
+(@code{char **}@var{matches}, @code{int} @var{num_matches}, @code{int} @var{max_length})
+where @var{matches} is the array of matching strings,
+@var{num_matches} is the number of strings in that array, and
+@var{max_length} is the length of the longest string in that array.
+Readline provides a convenience function, @code{rl_display_match_list},
+that takes care of doing the display to Readline's output stream.
+You may call that function from this hook.
+@end deftypevar
+
+@deftypevar {const char *} rl_basic_word_break_characters
+The basic list of characters that signal a break between words for the
+completer routine. The default value of this variable is the characters
+which break words for completion in Bash:
+@code{" \t\n\"\\'`@@$><=;|&@{("}.
+@end deftypevar
+
+@deftypevar {const char *} rl_basic_quote_characters
+A list of quote characters which can cause a word break.
+@end deftypevar
+
+@deftypevar {const char *} rl_completer_word_break_characters
+The list of characters that signal a break between words for
+@code{rl_complete_internal()}. The default list is the value of
+@code{rl_basic_word_break_characters}.
+@end deftypevar
+
+@deftypevar {rl_cpvfunc_t *} rl_completion_word_break_hook
+If non-zero, this is the address of a function to call when Readline is
+deciding where to separate words for word completion. It should return
+a character string like @code{rl_completer_word_break_characters} to be
+used to perform the current completion. The function may choose to set
+@code{rl_completer_word_break_characters} itself. If the function
+returns @code{NULL}, @code{rl_completer_word_break_characters} is used.
+@end deftypevar
+
+@deftypevar {const char *} rl_completer_quote_characters
+A list of characters which can be used to quote a substring of the line.
+Completion occurs on the entire substring, and within the substring
+@code{rl_completer_word_break_characters} are treated as any other character,
+unless they also appear within this list.
+@end deftypevar
+
+@deftypevar {const char *} rl_filename_quote_characters
+A list of characters that cause a filename to be quoted by the completer
+when they appear in a completed filename. The default is the null string.
+@end deftypevar
+
+@deftypevar {const char *} rl_special_prefixes
+The list of characters that are word break characters, but should be
+left in @var{text} when it is passed to the completion function.
+Programs can use this to help determine what kind of completing to do.
+For instance, Bash sets this variable to "$@@" so that it can complete
+shell variables and hostnames.
+@end deftypevar
+
+@deftypevar int rl_completion_query_items
+Up to this many items will be displayed in response to a
+possible-completions call. After that, Readline asks the user for
+confirmation before displaying them.
+The default value is 100. A negative value
+indicates that Readline should never ask for confirmation.
+@end deftypevar
+
+@deftypevar {int} rl_completion_append_character
+When a single completion alternative matches at the end of the command
+line, this character is appended to the inserted completion text. The
+default is a space character (@samp{ }). Setting this to the null
+character (@samp{\0}) prevents anything being appended automatically.
+This can be changed in application-specific completion functions to
+provide the ``most sensible word separator character'' according to
+an application-specific command line syntax specification.
+It is set to the default before any application-specific completion function
+is called, and may only be changed within such a function.
+@end deftypevar
+
+@deftypevar int rl_completion_suppress_append
+If non-zero, @var{rl_completion_append_character} is not appended to
+matches at the end of the command line, as described above.
+It is set to 0 before any application-specific completion function
+is called, and may only be changed within such a function.
+@end deftypevar
+
+@deftypevar int rl_completion_quote_character
+When Readline is completing quoted text, as delimited by one of the
+characters in @var{rl_completer_quote_characters}, it sets this variable
+to the quoting character found.
+This is set before any application-specific completion function is called.
+@end deftypevar
+
+@deftypevar int rl_completion_suppress_quote
+If non-zero, Readline does not append a matching quote character when
+performing completion on a quoted string.
+It is set to 0 before any application-specific completion function
+is called, and may only be changed within such a function.
+@end deftypevar
+
+@deftypevar int rl_completion_found_quote
+When Readline is completing quoted text, it sets this variable
+to a non-zero value if the word being completed contains or is delimited
+by any quoting characters, including backslashes.
+This is set before any application-specific completion function is called.
+@end deftypevar
+
+@deftypevar int rl_completion_mark_symlink_dirs
+If non-zero, a slash will be appended to completed filenames that are
+symbolic links to directory names, subject to the value of the
+user-settable @var{mark-directories} variable.
+This variable exists so that application-specific completion functions
+can override the user's global preference (set via the
+@var{mark-symlinked-directories} Readline variable) if appropriate.
+This variable is set to the user's preference before any
+application-specific completion function is called, so unless that
+function modifies the value, the user's preferences are honored.
+@end deftypevar
+
+@deftypevar int rl_ignore_completion_duplicates
+If non-zero, then duplicates in the matches are removed.
+The default is 1.
+@end deftypevar
+
+@deftypevar int rl_filename_completion_desired
+Non-zero means that the results of the matches are to be treated as
+filenames. This is @emph{always} zero when completion is attempted,
+and can only be changed
+within an application-specific completion function. If it is set to a
+non-zero value by such a function, directory names have a slash appended
+and Readline attempts to quote completed filenames if they contain any
+characters in @code{rl_filename_quote_characters} and
+@code{rl_filename_quoting_desired} is set to a non-zero value.
+@end deftypevar
+
+@deftypevar int rl_filename_quoting_desired
+Non-zero means that the results of the matches are to be quoted using
+double quotes (or an application-specific quoting mechanism) if the
+completed filename contains any characters in
+@code{rl_filename_quote_chars}. This is @emph{always} non-zero
+when completion is attempted, and can only be changed within an
+application-specific completion function.
+The quoting is effected via a call to the function pointed to
+by @code{rl_filename_quoting_function}.
+@end deftypevar
+
+@deftypevar int rl_attempted_completion_over
+If an application-specific completion function assigned to
+@code{rl_attempted_completion_function} sets this variable to a non-zero
+value, Readline will not perform its default filename completion even
+if the application's completion function returns no matches.
+It should be set only by an application's completion function.
+@end deftypevar
+
+@deftypevar int rl_sort_completion_matches
+If an application sets this variable to 0, Readline will not sort the
+list of completions (which implies that it cannot remove any duplicate
+completions). The default value is 1, which means that Readline will
+sort the completions and, depending on the value of
+@code{rl_ignore_completion_duplicates}, will attempt to remove duplicate
+matches.
+@end deftypevar
+
+@deftypevar int rl_completion_type
+Set to a character describing the type of completion Readline is currently
+attempting; see the description of @code{rl_complete_internal()}
+(@pxref{Completion Functions}) for the list of characters.
+This is set to the appropriate value before any application-specific
+completion function is called, allowing such functions to present
+the same interface as @code{rl_complete()}.
+@end deftypevar
+
+@deftypevar int rl_completion_invoking_key
+Set to the final character in the key sequence that invoked one of the
+completion functions that call @code{rl_complete_internal()}. This is
+set to the appropriate value before any application-specific completion
+function is called.
+@end deftypevar
+
+@deftypevar int rl_inhibit_completion
+If this variable is non-zero, completion is inhibited. The completion
+character will be inserted as any other bound to @code{self-insert}.
+@end deftypevar
+
+@node A Short Completion Example
+@subsection A Short Completion Example
+
+Here is a small application demonstrating the use of the GNU Readline
+library. It is called @code{fileman}, and the source code resides in
+@file{examples/fileman.c}. This sample application provides
+completion of command names, line editing features, and access to the
+history list.
+
+@page
+@smallexample
+/* fileman.c -- A tiny application which demonstrates how to use the
+ GNU Readline library. This application interactively allows users
+ to manipulate files and their modes. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_FILE_H
+# include <sys/file.h>
+#endif
+#include <sys/stat.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <locale.h>
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else /* !HAVE_STRING_H */
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+#include <time.h>
+
+#include <readline/readline.h>
+#include <readline/history.h>
+
+extern char *xmalloc PARAMS((size_t));
+
+/* The names of functions that actually do the manipulation. */
+int com_list PARAMS((char *));
+int com_view PARAMS((char *));
+int com_rename PARAMS((char *));
+int com_stat PARAMS((char *));
+int com_pwd PARAMS((char *));
+int com_delete PARAMS((char *));
+int com_help PARAMS((char *));
+int com_cd PARAMS((char *));
+int com_quit PARAMS((char *));
+
+/* A structure which contains information on the commands this program
+ can understand. */
+
+typedef struct @{
+ char *name; /* User printable name of the function. */
+ rl_icpfunc_t *func; /* Function to call to do the job. */
+ char *doc; /* Documentation for this function. */
+@} COMMAND;
+
+COMMAND commands[] = @{
+ @{ "cd", com_cd, "Change to directory DIR" @},
+ @{ "delete", com_delete, "Delete FILE" @},
+ @{ "help", com_help, "Display this text" @},
+ @{ "?", com_help, "Synonym for `help'" @},
+ @{ "list", com_list, "List files in DIR" @},
+ @{ "ls", com_list, "Synonym for `list'" @},
+ @{ "pwd", com_pwd, "Print the current working directory" @},
+ @{ "quit", com_quit, "Quit using Fileman" @},
+ @{ "rename", com_rename, "Rename FILE to NEWNAME" @},
+ @{ "stat", com_stat, "Print out statistics on FILE" @},
+ @{ "view", com_view, "View the contents of FILE" @},
+ @{ (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL @}
+@};
+
+/* Forward declarations. */
+char *stripwhite ();
+COMMAND *find_command ();
+
+/* The name of this program, as taken from argv[0]. */
+char *progname;
+
+/* When non-zero, this global means the user is done using this program. */
+int done;
+
+char *
+dupstr (s)
+ char *s;
+@{
+ char *r;
+
+ r = xmalloc (strlen (s) + 1);
+ strcpy (r, s);
+ return (r);
+@}
+
+main (argc, argv)
+ int argc;
+ char **argv;
+@{
+ char *line, *s;
+
+ setlocale (LC_ALL, "");
+
+ progname = argv[0];
+
+ initialize_readline (); /* Bind our completer. */
+
+ /* Loop reading and executing lines until the user quits. */
+ for ( ; done == 0; )
+ @{
+ line = readline ("FileMan: ");
+
+ if (!line)
+ break;
+
+ /* Remove leading and trailing whitespace from the line.
+ Then, if there is anything left, add it to the history list
+ and execute it. */
+ s = stripwhite (line);
+
+ if (*s)
+ @{
+ add_history (s);
+ execute_line (s);
+ @}
+
+ free (line);
+ @}
+ exit (0);
+@}
+
+/* Execute a command line. */
+int
+execute_line (line)
+ char *line;
+@{
+ register int i;
+ COMMAND *command;
+ char *word;
+
+ /* Isolate the command word. */
+ i = 0;
+ while (line[i] && whitespace (line[i]))
+ i++;
+ word = line + i;
+
+ while (line[i] && !whitespace (line[i]))
+ i++;
+
+ if (line[i])
+ line[i++] = '\0';
+
+ command = find_command (word);
+
+ if (!command)
+ @{
+ fprintf (stderr, "%s: No such command for FileMan.\n", word);
+ return (-1);
+ @}
+
+ /* Get argument to command, if any. */
+ while (whitespace (line[i]))
+ i++;
+
+ word = line + i;
+
+ /* Call the function. */
+ return ((*(command->func)) (word));
+@}
+
+/* Look up NAME as the name of a command, and return a pointer to that
+ command. Return a NULL pointer if NAME isn't a command name. */
+COMMAND *
+find_command (name)
+ char *name;
+@{
+ register int i;
+
+ for (i = 0; commands[i].name; i++)
+ if (strcmp (name, commands[i].name) == 0)
+ return (&commands[i]);
+
+ return ((COMMAND *)NULL);
+@}
+
+/* Strip whitespace from the start and end of STRING. Return a pointer
+ into STRING. */
+char *
+stripwhite (string)
+ char *string;
+@{
+ register char *s, *t;
+
+ for (s = string; whitespace (*s); s++)
+ ;
+
+ if (*s == 0)
+ return (s);
+
+ t = s + strlen (s) - 1;
+ while (t > s && whitespace (*t))
+ t--;
+ *++t = '\0';
+
+ return s;
+@}
+
+/* **************************************************************** */
+/* */
+/* Interface to Readline Completion */
+/* */
+/* **************************************************************** */
+
+char *command_generator PARAMS((const char *, int));
+char **fileman_completion PARAMS((const char *, int, int));
+
+/* Tell the GNU Readline library how to complete. We want to try to complete
+ on command names if this is the first word in the line, or on filenames
+ if not. */
+initialize_readline ()
+@{
+ /* Allow conditional parsing of the ~/.inputrc file. */
+ rl_readline_name = "FileMan";
+
+ /* Tell the completer that we want a crack first. */
+ rl_attempted_completion_function = fileman_completion;
+@}
+
+/* Attempt to complete on the contents of TEXT. START and END bound the
+ region of rl_line_buffer that contains the word to complete. TEXT is
+ the word to complete. We can use the entire contents of rl_line_buffer
+ in case we want to do some simple parsing. Return the array of matches,
+ or NULL if there aren't any. */
+char **
+fileman_completion (text, start, end)
+ const char *text;
+ int start, end;
+@{
+ char **matches;
+
+ matches = (char **)NULL;
+
+ /* If this word is at the start of the line, then it is a command
+ to complete. Otherwise it is the name of a file in the current
+ directory. */
+ if (start == 0)
+ matches = rl_completion_matches (text, command_generator);
+
+ return (matches);
+@}
+
+/* Generator function for command completion. STATE lets us know whether
+ to start from scratch; without any state (i.e. STATE == 0), then we
+ start at the top of the list. */
+char *
+command_generator (text, state)
+ const char *text;
+ int state;
+@{
+ static int list_index, len;
+ char *name;
+
+ /* If this is a new word to complete, initialize now. This includes
+ saving the length of TEXT for efficiency, and initializing the index
+ variable to 0. */
+ if (!state)
+ @{
+ list_index = 0;
+ len = strlen (text);
+ @}
+
+ /* Return the next name which partially matches from the command list. */
+ while (name = commands[list_index].name)
+ @{
+ list_index++;
+
+ if (strncmp (name, text, len) == 0)
+ return (dupstr(name));
+ @}
+
+ /* If no names matched, then return NULL. */
+ return ((char *)NULL);
+@}
+
+/* **************************************************************** */
+/* */
+/* FileMan Commands */
+/* */
+/* **************************************************************** */
+
+/* String to pass to system (). This is for the LIST, VIEW and RENAME
+ commands. */
+static char syscom[1024];
+
+/* List the file(s) named in arg. */
+com_list (arg)
+ char *arg;
+@{
+ if (!arg)
+ arg = "";
+
+ sprintf (syscom, "ls -FClg %s", arg);
+ return (system (syscom));
+@}
+
+com_view (arg)
+ char *arg;
+@{
+ if (!valid_argument ("view", arg))
+ return 1;
+
+#if defined (__MSDOS__)
+ /* more.com doesn't grok slashes in pathnames */
+ sprintf (syscom, "less %s", arg);
+#else
+ sprintf (syscom, "more %s", arg);
+#endif
+ return (system (syscom));
+@}
+
+com_rename (arg)
+ char *arg;
+@{
+ too_dangerous ("rename");
+ return (1);
+@}
+
+com_stat (arg)
+ char *arg;
+@{
+ struct stat finfo;
+
+ if (!valid_argument ("stat", arg))
+ return (1);
+
+ if (stat (arg, &finfo) == -1)
+ @{
+ perror (arg);
+ return (1);
+ @}
+
+ printf ("Statistics for `%s':\n", arg);
+
+ printf ("%s has %d link%s, and is %d byte%s in length.\n",
+ arg,
+ finfo.st_nlink,
+ (finfo.st_nlink == 1) ? "" : "s",
+ finfo.st_size,
+ (finfo.st_size == 1) ? "" : "s");
+ printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime));
+ printf (" Last access at: %s", ctime (&finfo.st_atime));
+ printf (" Last modified at: %s", ctime (&finfo.st_mtime));
+ return (0);
+@}
+
+com_delete (arg)
+ char *arg;
+@{
+ too_dangerous ("delete");
+ return (1);
+@}
+
+/* Print out help for ARG, or for all of the commands if ARG is
+ not present. */
+com_help (arg)
+ char *arg;
+@{
+ register int i;
+ int printed = 0;
+
+ for (i = 0; commands[i].name; i++)
+ @{
+ if (!*arg || (strcmp (arg, commands[i].name) == 0))
+ @{
+ printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+ printed++;
+ @}
+ @}
+
+ if (!printed)
+ @{
+ printf ("No commands match `%s'. Possibilities are:\n", arg);
+
+ for (i = 0; commands[i].name; i++)
+ @{
+ /* Print in six columns. */
+ if (printed == 6)
+ @{
+ printed = 0;
+ printf ("\n");
+ @}
+
+ printf ("%s\t", commands[i].name);
+ printed++;
+ @}
+
+ if (printed)
+ printf ("\n");
+ @}
+ return (0);
+@}
+
+/* Change to the directory ARG. */
+com_cd (arg)
+ char *arg;
+@{
+ if (chdir (arg) == -1)
+ @{
+ perror (arg);
+ return 1;
+ @}
+
+ com_pwd ("");
+ return (0);
+@}
+
+/* Print out the current working directory. */
+com_pwd (ignore)
+ char *ignore;
+@{
+ char dir[1024], *s;
+
+ s = getcwd (dir, sizeof(dir) - 1);
+ if (s == 0)
+ @{
+ printf ("Error getting pwd: %s\n", dir);
+ return 1;
+ @}
+
+ printf ("Current directory is %s\n", dir);
+ return 0;
+@}
+
+/* The user wishes to quit using this program. Just set DONE non-zero. */
+com_quit (arg)
+ char *arg;
+@{
+ done = 1;
+ return (0);
+@}
+
+/* Function which tells you that you can't do this. */
+too_dangerous (caller)
+ char *caller;
+@{
+ fprintf (stderr,
+ "%s: Too dangerous for me to distribute. Write it yourself.\n",
+ caller);
+@}
+
+/* Return non-zero if ARG is a valid argument for CALLER, else print
+ an error message and return zero. */
+int
+valid_argument (caller, arg)
+ char *caller, *arg;
+@{
+ if (!arg || !*arg)
+ @{
+ fprintf (stderr, "%s: Argument required.\n", caller);
+ return (0);
+ @}
+
+ return (1);
+@}
+@end smallexample
diff --git a/doc/rluser.texi b/doc/rluser.texi
new file mode 100644
index 0000000..cbcbb45
--- /dev/null
+++ b/doc/rluser.texi
@@ -0,0 +1,2488 @@
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename rluser.info
+@comment %**end of header (This is for running Texinfo on a region.)
+
+@ignore
+This file documents the end user interface to the GNU command line
+editing features. It is to be an appendix to manuals for programs which
+use these features. There is a document entitled "readline.texinfo"
+which contains both end-user and programmer documentation for the
+GNU Readline Library.
+
+Copyright (C) 1988--2022 Free Software Foundation, Inc.
+
+Authored by Brian Fox and Chet Ramey.
+
+Permission is granted to process this file through Tex and print the
+results, provided the printed document carries copying permission notice
+identical to this one except for the removal of this paragraph (this
+paragraph not being relevant to the printed manual).
+
+Permission is granted to make and distribute verbatim copies of this manual
+provided the copyright notice and this permission notice are preserved on
+all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+GNU Copyright statement is available to the distributee, and provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions.
+@end ignore
+
+@comment If you are including this manual as an appendix, then set the
+@comment variable readline-appendix.
+
+@ifclear BashFeatures
+@defcodeindex bt
+@end ifclear
+
+@node Command Line Editing
+@chapter Command Line Editing
+
+This chapter describes the basic features of the @sc{gnu}
+command line editing interface.
+@ifset BashFeatures
+Command line editing is provided by the Readline library, which is
+used by several different programs, including Bash.
+Command line editing is enabled by default when using an interactive shell,
+unless the @option{--noediting} option is supplied at shell invocation.
+Line editing is also used when using the @option{-e} option to the
+@code{read} builtin command (@pxref{Bash Builtins}).
+By default, the line editing commands are similar to those of Emacs.
+A vi-style line editing interface is also available.
+Line editing can be enabled at any time using the @option{-o emacs} or
+@option{-o vi} options to the @code{set} builtin command
+(@pxref{The Set Builtin}), or disabled using the @option{+o emacs} or
+@option{+o vi} options to @code{set}.
+@end ifset
+
+@menu
+* Introduction and Notation:: Notation used in this text.
+* Readline Interaction:: The minimum set of commands for editing a line.
+* Readline Init File:: Customizing Readline from a user's view.
+* Bindable Readline Commands:: A description of most of the Readline commands
+ available for binding
+* Readline vi Mode:: A short description of how to make Readline
+ behave like the vi editor.
+@ifset BashFeatures
+* Programmable Completion:: How to specify the possible completions for
+ a specific command.
+* Programmable Completion Builtins:: Builtin commands to specify how to
+ complete arguments for a particular command.
+* A Programmable Completion Example:: An example shell function for
+ generating possible completions.
+@end ifset
+@end menu
+
+@node Introduction and Notation
+@section Introduction to Line Editing
+
+The following paragraphs describe the notation used to represent
+keystrokes.
+
+The text @kbd{C-k} is read as `Control-K' and describes the character
+produced when the @key{k} key is pressed while the Control key
+is depressed.
+
+The text @kbd{M-k} is read as `Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the @key{k}
+key is pressed.
+The Meta key is labeled @key{ALT} on many keyboards.
+On keyboards with two keys labeled @key{ALT} (usually to either side of
+the space bar), the @key{ALT} on the left side is generally set to
+work as a Meta key.
+The @key{ALT} key on the right may also be configured to work as a
+Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+
+If you do not have a Meta or @key{ALT} key, or another key working as
+a Meta key, the identical keystroke can be generated by typing @key{ESC}
+@emph{first}, and then typing @key{k}.
+Either process is known as @dfn{metafying} the @key{k} key.
+
+The text @kbd{M-C-k} is read as `Meta-Control-k' and describes the
+character produced by @dfn{metafying} @kbd{C-k}.
+
+In addition, several keys have their own names. Specifically,
+@key{DEL}, @key{ESC}, @key{LFD}, @key{SPC}, @key{RET}, and @key{TAB} all
+stand for themselves when seen in this text, or in an init file
+(@pxref{Readline Init File}).
+If your keyboard lacks a @key{LFD} key, typing @key{C-j} will
+produce the desired character.
+The @key{RET} key may be labeled @key{Return} or @key{Enter} on
+some keyboards.
+
+@node Readline Interaction
+@section Readline Interaction
+@cindex interaction, readline
+
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled. The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line. Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections. Then, when you are satisfied with
+the line, you simply press @key{RET}. You do not have to be at the
+end of the line to press @key{RET}; the entire line is accepted
+regardless of the location of the cursor within the line.
+
+@menu
+* Readline Bare Essentials:: The least you need to know about Readline.
+* Readline Movement Commands:: Moving about the input line.
+* Readline Killing Commands:: How to delete text, and how to get it back!
+* Readline Arguments:: Giving numeric arguments to commands.
+* Searching:: Searching through previous lines.
+@end menu
+
+@node Readline Bare Essentials
+@subsection Readline Bare Essentials
+@cindex notation, readline
+@cindex command editing
+@cindex editing command lines
+
+In order to enter characters into the line, simply type them. The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right. If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+
+Sometimes you may mistype a character, and
+not notice the error until you have typed several other characters. In
+that case, you can type @kbd{C-b} to move the cursor to the left, and then
+correct your mistake. Afterwards, you can move the cursor to the right
+with @kbd{C-f}.
+
+When you add text in the middle of a line, you will notice that characters
+to the right of the cursor are `pushed over' to make room for the text
+that you have inserted. Likewise, when you delete text behind the cursor,
+characters to the right of the cursor are `pulled back' to fill in the
+blank space created by the removal of the text. A list of the bare
+essentials for editing the text of an input line follows.
+
+@table @asis
+@item @kbd{C-b}
+Move back one character.
+@item @kbd{C-f}
+Move forward one character.
+@item @key{DEL} or @key{Backspace}
+Delete the character to the left of the cursor.
+@item @kbd{C-d}
+Delete the character underneath the cursor.
+@item @w{Printing characters}
+Insert the character into the line at the cursor.
+@item @kbd{C-_} or @kbd{C-x C-u}
+Undo the last editing command. You can undo all the way back to an
+empty line.
+@end table
+
+@noindent
+(Depending on your configuration, the @key{Backspace} key might be set to
+delete the character to the left of the cursor and the @key{DEL} key set
+to delete the character underneath the cursor, like @kbd{C-d}, rather
+than the character to the left of the cursor.)
+
+@node Readline Movement Commands
+@subsection Readline Movement Commands
+
+
+The above table describes the most basic keystrokes that you need
+in order to do editing of the input line. For your convenience, many
+other commands have been added in addition to @kbd{C-b}, @kbd{C-f},
+@kbd{C-d}, and @key{DEL}. Here are some commands for moving more rapidly
+about the line.
+
+@table @kbd
+@item C-a
+Move to the start of the line.
+@item C-e
+Move to the end of the line.
+@item M-f
+Move forward a word, where a word is composed of letters and digits.
+@item M-b
+Move backward a word.
+@item C-l
+Clear the screen, reprinting the current line at the top.
+@end table
+
+Notice how @kbd{C-f} moves forward a character, while @kbd{M-f} moves
+forward a word. It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+
+@node Readline Killing Commands
+@subsection Readline Killing Commands
+
+@cindex killing text
+@cindex yanking text
+
+@dfn{Killing} text means to delete the text from the line, but to save
+it away for later use, usually by @dfn{yanking} (re-inserting)
+it back into the line.
+(`Cut' and `paste' are more recent jargon for `kill' and `yank'.)
+
+If the description for a command says that it `kills' text, then you can
+be sure that you can get the text back in a different (or the same)
+place later.
+
+When you use a kill command, the text is saved in a @dfn{kill-ring}.
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all. The kill
+ring is not line specific; the text that you killed on a previously
+typed line is available to be yanked back later, when you are typing
+another line.
+@cindex kill ring
+
+Here is the list of commands for killing text.
+
+@table @kbd
+@item C-k
+Kill the text from the current cursor position to the end of the line.
+
+@item M-d
+Kill from the cursor to the end of the current word, or, if between
+words, to the end of the next word.
+Word boundaries are the same as those used by @kbd{M-f}.
+
+@item M-@key{DEL}
+Kill from the cursor to the start of the current word, or, if between
+words, to the start of the previous word.
+Word boundaries are the same as those used by @kbd{M-b}.
+
+@item C-w
+Kill from the cursor to the previous whitespace. This is different than
+@kbd{M-@key{DEL}} because the word boundaries differ.
+
+@end table
+
+Here is how to @dfn{yank} the text back into the line. Yanking
+means to copy the most-recently-killed text from the kill buffer.
+
+@table @kbd
+@item C-y
+Yank the most recently killed text back into the buffer at the cursor.
+
+@item M-y
+Rotate the kill-ring, and yank the new top. You can only do this if
+the prior command is @kbd{C-y} or @kbd{M-y}.
+@end table
+
+@node Readline Arguments
+@subsection Readline Arguments
+
+You can pass numeric arguments to Readline commands. Sometimes the
+argument acts as a repeat count, other times it is the @i{sign} of the
+argument that is significant. If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction. For example, to kill text back to the
+start of the line, you might type @samp{M-- C-k}.
+
+The general way to pass numeric arguments to a command is to type meta
+digits before the command. If the first `digit' typed is a minus
+sign (@samp{-}), then the sign of the argument will be negative. Once
+you have typed one meta digit to get the argument started, you can type
+the remainder of the digits, and then the command. For example, to give
+the @kbd{C-d} command an argument of 10, you could type @samp{M-1 0 C-d},
+which will delete the next ten characters on the input line.
+
+@node Searching
+@subsection Searching for Commands in the History
+
+Readline provides commands for searching through the command history
+@ifset BashFeatures
+(@pxref{Bash History Facilities})
+@end ifset
+for lines containing a specified string.
+There are two search modes: @dfn{incremental} and @dfn{non-incremental}.
+
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, Readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+To search backward in the history for a particular string, type
+@kbd{C-r}. Typing @kbd{C-s} searches forward through the history.
+The characters present in the value of the @code{isearch-terminators} variable
+are used to terminate an incremental search.
+If that variable has not been assigned a value, the @key{ESC} and
+@kbd{C-J} characters will terminate an incremental search.
+@kbd{C-g} will abort an incremental search and restore the original line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+
+To find other matching entries in the history list, type @kbd{C-r} or
+@kbd{C-s} as appropriate.
+This will search backward or forward in the history for the next
+entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate
+the search and execute that command.
+For instance, a @key{RET} will terminate the search and accept
+the line, thereby executing the command from the history list.
+A movement command will terminate the search, make the last line found
+the current line, and begin editing.
+
+Readline remembers the last incremental search string. If two
+@kbd{C-r}s are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+
+Non-incremental searches read the entire search string before starting
+to search for matching history lines. The search string may be
+typed by the user or be part of the contents of the current line.
+
+@node Readline Init File
+@section Readline Init File
+@cindex initialization file, readline
+
+Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.
+Any user can customize programs that use Readline by putting
+commands in an @dfn{inputrc} file,
+conventionally in their home directory.
+The name of this
+@ifset BashFeatures
+file is taken from the value of the shell variable @env{INPUTRC}. If
+@end ifset
+@ifclear BashFeatures
+file is taken from the value of the environment variable @env{INPUTRC}. If
+@end ifclear
+that variable is unset, the default is @file{~/.inputrc}. If that
+file does not exist or cannot be read, the ultimate default is
+@file{/etc/inputrc}.
+@ifset BashFeatures
+The @w{@code{bind}} builtin command can also be used to set Readline
+keybindings and variables.
+@xref{Bash Builtins}.
+@end ifset
+
+When a program which uses the Readline library starts up, the
+init file is read, and the key bindings are set.
+
+In addition, the @code{C-x C-r} command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+
+@menu
+* Readline Init File Syntax:: Syntax for the commands in the inputrc file.
+
+* Conditional Init Constructs:: Conditional key bindings in the inputrc file.
+
+* Sample Init File:: An example inputrc file.
+@end menu
+
+@node Readline Init File Syntax
+@subsection Readline Init File Syntax
+
+There are only a few basic constructs allowed in the
+Readline init file. Blank lines are ignored.
+Lines beginning with a @samp{#} are comments.
+Lines beginning with a @samp{$} indicate conditional
+constructs (@pxref{Conditional Init Constructs}). Other lines
+denote variable settings and key bindings.
+
+@table @asis
+@item Variable Settings
+You can modify the run-time behavior of Readline by
+altering the values of variables in Readline
+using the @code{set} command within the init file.
+The syntax is simple:
+
+@example
+set @var{variable} @var{value}
+@end example
+
+@noindent
+Here, for example, is how to
+change from the default Emacs-like key binding to use
+@code{vi} line editing commands:
+
+@example
+set editing-mode vi
+@end example
+
+Variable names and values, where appropriate, are recognized without regard
+to case. Unrecognized variable names are ignored.
+
+Boolean variables (those that can be set to on or off) are set to on if
+the value is null or empty, @var{on} (case-insensitive), or 1. Any other
+value results in the variable being set to off.
+
+@ifset BashFeatures
+The @w{@code{bind -V}} command lists the current Readline variable names
+and values. @xref{Bash Builtins}.
+@end ifset
+
+A great deal of run-time behavior is changeable with the following
+variables.
+
+@cindex variables, readline
+@table @code
+
+@item active-region-start-color
+@vindex active-region-start-color
+A string variable that controls the text color and background when displaying
+the text in the active region (see the description of
+@code{enable-active-region} below).
+This string must not take up any physical character positions on the display,
+so it should consist only of terminal escape sequences.
+It is output to the terminal before displaying the text in the active region.
+This variable is reset to the default value whenever the terminal type changes.
+The default value is the string that puts the terminal in standout mode,
+as obtained from the terminal's terminfo description.
+A sample value might be @samp{\e[01;33m}.
+
+@item active-region-end-color
+@vindex active-region-end-color
+A string variable that "undoes" the effects of @code{active-region-start-color}
+and restores "normal" terminal display appearance after displaying text
+in the active region.
+This string must not take up any physical character positions on the display,
+so it should consist only of terminal escape sequences.
+It is output to the terminal after displaying the text in the active region.
+This variable is reset to the default value whenever the terminal type changes.
+The default value is the string that restores the terminal from standout mode,
+as obtained from the terminal's terminfo description.
+A sample value might be @samp{\e[0m}.
+
+@item bell-style
+@vindex bell-style
+Controls what happens when Readline wants to ring the terminal bell.
+If set to @samp{none}, Readline never rings the bell. If set to
+@samp{visible}, Readline uses a visible bell if one is available.
+If set to @samp{audible} (the default), Readline attempts to ring
+the terminal's bell.
+
+@item bind-tty-special-chars
+@vindex bind-tty-special-chars
+If set to @samp{on} (the default), Readline attempts to bind the control
+characters treated specially by the kernel's terminal driver to their
+Readline equivalents.
+
+@item blink-matching-paren
+@vindex blink-matching-paren
+If set to @samp{on}, Readline attempts to briefly move the cursor to an
+opening parenthesis when a closing parenthesis is inserted. The default
+is @samp{off}.
+
+@item colored-completion-prefix
+@vindex colored-completion-prefix
+If set to @samp{on}, when listing completions, Readline displays the
+common prefix of the set of possible completions using a different color.
+The color definitions are taken from the value of the @env{LS_COLORS}
+environment variable.
+If there is a color definition in @env{LS_COLORS} for the custom suffix
+@samp{readline-colored-completion-prefix}, Readline uses this color for
+the common prefix instead of its default.
+The default is @samp{off}.
+
+@item colored-stats
+@vindex colored-stats
+If set to @samp{on}, Readline displays possible completions using different
+colors to indicate their file type.
+The color definitions are taken from the value of the @env{LS_COLORS}
+environment variable.
+The default is @samp{off}.
+
+@item comment-begin
+@vindex comment-begin
+The string to insert at the beginning of the line when the
+@code{insert-comment} command is executed. The default value
+is @code{"#"}.
+
+@item completion-display-width
+@vindex completion-display-width
+The number of screen columns used to display possible matches
+when performing completion.
+The value is ignored if it is less than 0 or greater than the terminal
+screen width.
+A value of 0 will cause matches to be displayed one per line.
+The default value is -1.
+
+@item completion-ignore-case
+@vindex completion-ignore-case
+If set to @samp{on}, Readline performs filename matching and completion
+in a case-insensitive fashion.
+The default value is @samp{off}.
+
+@item completion-map-case
+@vindex completion-map-case
+If set to @samp{on}, and @var{completion-ignore-case} is enabled, Readline
+treats hyphens (@samp{-}) and underscores (@samp{_}) as equivalent when
+performing case-insensitive filename matching and completion.
+The default value is @samp{off}.
+
+@item completion-prefix-display-length
+@vindex completion-prefix-display-length
+The length in characters of the common prefix of a list of possible
+completions that is displayed without modification. When set to a
+value greater than zero, common prefixes longer than this value are
+replaced with an ellipsis when displaying possible completions.
+
+@item completion-query-items
+@vindex completion-query-items
+The number of possible completions that determines when the user is
+asked whether the list of possibilities should be displayed.
+If the number of possible completions is greater than or equal to this value,
+Readline will ask whether or not the user wishes to view them;
+otherwise, they are simply listed.
+This variable must be set to an integer value greater than or equal to zero.
+A zero value means Readline should never ask; negative values are
+treated as zero.
+The default limit is @code{100}.
+
+@item convert-meta
+@vindex convert-meta
+If set to @samp{on}, Readline will convert characters with the
+eighth bit set to an @sc{ascii} key sequence by stripping the eighth
+bit and prefixing an @key{ESC} character, converting them to a
+meta-prefixed key sequence.
+The default value is @samp{on}, but
+will be set to @samp{off} if the locale is one that contains
+eight-bit characters.
+This variable is dependent on the @code{LC_CTYPE} locale category, and
+may change if the locale is changed.
+
+@item disable-completion
+@vindex disable-completion
+If set to @samp{On}, Readline will inhibit word completion.
+Completion characters will be inserted into the line as if they had
+been mapped to @code{self-insert}. The default is @samp{off}.
+
+@item echo-control-characters
+@vindex echo-control-characters
+When set to @samp{on}, on operating systems that indicate they support it,
+Readline echoes a character corresponding to a signal generated from the
+keyboard. The default is @samp{on}.
+
+@item editing-mode
+@vindex editing-mode
+The @code{editing-mode} variable controls which default set of
+key bindings is used. By default, Readline starts up in Emacs editing
+mode, where the keystrokes are most similar to Emacs. This variable can be
+set to either @samp{emacs} or @samp{vi}.
+
+@item emacs-mode-string
+@vindex emacs-mode-string
+If the @var{show-mode-in-prompt} variable is enabled,
+this string is displayed immediately before the last line of the primary
+prompt when emacs editing mode is active. The value is expanded like a
+key binding, so the standard set of meta- and control prefixes and
+backslash escape sequences is available.
+Use the @samp{\1} and @samp{\2} escapes to begin and end sequences of
+non-printing characters, which can be used to embed a terminal control
+sequence into the mode string.
+The default is @samp{@@}.
+
+@item enable-active-region
+@vindex enable-active-region
+The @dfn{point} is the current cursor position, and @dfn{mark} refers
+to a saved cursor position (@pxref{Commands For Moving}).
+The text between the point and mark is referred to as the @dfn{region}.
+When this variable is set to @samp{On}, Readline allows certain commands
+to designate the region as @dfn{active}.
+When the region is active, Readline highlights the text in the region using
+the value of the @code{active-region-start-color}, which defaults to the
+string that enables
+the terminal's standout mode.
+The active region shows the text inserted by bracketed-paste and any
+matching text found by incremental and non-incremental history searches.
+The default is @samp{On}.
+
+@item enable-bracketed-paste
+@vindex enable-bracketed-paste
+When set to @samp{On}, Readline configures the terminal to insert each
+paste into the editing buffer as a single string of characters, instead
+of treating each character as if it had been read from the keyboard.
+This is called putting the terminal into @dfn{bracketed paste mode};
+it prevents Readline from executing any editing commands bound to key
+sequences appearing in the pasted text.
+The default is @samp{On}.
+
+@item enable-keypad
+@vindex enable-keypad
+When set to @samp{on}, Readline will try to enable the application
+keypad when it is called. Some systems need this to enable the
+arrow keys. The default is @samp{off}.
+
+@item enable-meta-key
+When set to @samp{on}, Readline will try to enable any meta modifier
+key the terminal claims to support when it is called. On many terminals,
+the meta key is used to send eight-bit characters.
+The default is @samp{on}.
+
+@item expand-tilde
+@vindex expand-tilde
+If set to @samp{on}, tilde expansion is performed when Readline
+attempts word completion. The default is @samp{off}.
+
+@item history-preserve-point
+@vindex history-preserve-point
+If set to @samp{on}, the history code attempts to place the point (the
+current cursor position) at the
+same location on each history line retrieved with @code{previous-history}
+or @code{next-history}. The default is @samp{off}.
+
+@item history-size
+@vindex history-size
+Set the maximum number of history entries saved in the history list.
+If set to zero, any existing history entries are deleted and no new entries
+are saved.
+If set to a value less than zero, the number of history entries is not
+limited.
+By default, the number of history entries is not limited.
+If an attempt is made to set @var{history-size} to a non-numeric value,
+the maximum number of history entries will be set to 500.
+
+@item horizontal-scroll-mode
+@vindex horizontal-scroll-mode
+This variable can be set to either @samp{on} or @samp{off}. Setting it
+to @samp{on} means that the text of the lines being edited will scroll
+horizontally on a single screen line when they are longer than the width
+of the screen, instead of wrapping onto a new screen line.
+This variable is automatically set to @samp{on} for terminals of height 1.
+By default, this variable is set to @samp{off}.
+
+@item input-meta
+@vindex input-meta
+@vindex meta-flag
+If set to @samp{on}, Readline will enable eight-bit input (it
+will not clear the eighth bit in the characters it reads),
+regardless of what the terminal claims it can support. The
+default value is @samp{off}, but Readline will set it to @samp{on} if the
+locale contains eight-bit characters.
+The name @code{meta-flag} is a synonym for this variable.
+This variable is dependent on the @code{LC_CTYPE} locale category, and
+may change if the locale is changed.
+
+@item isearch-terminators
+@vindex isearch-terminators
+The string of characters that should terminate an incremental search without
+subsequently executing the character as a command (@pxref{Searching}).
+If this variable has not been given a value, the characters @key{ESC} and
+@kbd{C-J} will terminate an incremental search.
+
+@item keymap
+@vindex keymap
+Sets Readline's idea of the current keymap for key binding commands.
+Built-in @code{keymap} names are
+@code{emacs},
+@code{emacs-standard},
+@code{emacs-meta},
+@code{emacs-ctlx},
+@code{vi},
+@code{vi-move},
+@code{vi-command}, and
+@code{vi-insert}.
+@code{vi} is equivalent to @code{vi-command} (@code{vi-move} is also a
+synonym); @code{emacs} is equivalent to @code{emacs-standard}.
+Applications may add additional names.
+The default value is @code{emacs}.
+The value of the @code{editing-mode} variable also affects the
+default keymap.
+
+@item keyseq-timeout
+Specifies the duration Readline will wait for a character when reading an
+ambiguous key sequence (one that can form a complete key sequence using
+the input read so far, or can take additional input to complete a longer
+key sequence).
+If no input is received within the timeout, Readline will use the shorter
+but complete key sequence.
+Readline uses this value to determine whether or not input is
+available on the current input source (@code{rl_instream} by default).
+The value is specified in milliseconds, so a value of 1000 means that
+Readline will wait one second for additional input.
+If this variable is set to a value less than or equal to zero, or to a
+non-numeric value, Readline will wait until another key is pressed to
+decide which key sequence to complete.
+The default value is @code{500}.
+
+@item mark-directories
+If set to @samp{on}, completed directory names have a slash
+appended. The default is @samp{on}.
+
+@item mark-modified-lines
+@vindex mark-modified-lines
+This variable, when set to @samp{on}, causes Readline to display an
+asterisk (@samp{*}) at the start of history lines which have been modified.
+This variable is @samp{off} by default.
+
+@item mark-symlinked-directories
+@vindex mark-symlinked-directories
+If set to @samp{on}, completed names which are symbolic links
+to directories have a slash appended (subject to the value of
+@code{mark-directories}).
+The default is @samp{off}.
+
+@item match-hidden-files
+@vindex match-hidden-files
+This variable, when set to @samp{on}, causes Readline to match files whose
+names begin with a @samp{.} (hidden files) when performing filename
+completion.
+If set to @samp{off}, the leading @samp{.} must be
+supplied by the user in the filename to be completed.
+This variable is @samp{on} by default.
+
+@item menu-complete-display-prefix
+@vindex menu-complete-display-prefix
+If set to @samp{on}, menu completion displays the common prefix of the
+list of possible completions (which may be empty) before cycling through
+the list. The default is @samp{off}.
+
+@item output-meta
+@vindex output-meta
+If set to @samp{on}, Readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.
+The default is @samp{off}, but Readline will set it to @samp{on} if the
+locale contains eight-bit characters.
+This variable is dependent on the @code{LC_CTYPE} locale category, and
+may change if the locale is changed.
+
+@item page-completions
+@vindex page-completions
+If set to @samp{on}, Readline uses an internal @code{more}-like pager
+to display a screenful of possible completions at a time.
+This variable is @samp{on} by default.
+
+@item print-completions-horizontally
+If set to @samp{on}, Readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+The default is @samp{off}.
+
+@item revert-all-at-newline
+@vindex revert-all-at-newline
+If set to @samp{on}, Readline will undo all changes to history lines
+before returning when @code{accept-line} is executed. By default,
+history lines may be modified and retain individual undo lists across
+calls to @code{readline()}. The default is @samp{off}.
+
+@item show-all-if-ambiguous
+@vindex show-all-if-ambiguous
+This alters the default behavior of the completion functions. If
+set to @samp{on},
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+The default value is @samp{off}.
+
+@item show-all-if-unmodified
+@vindex show-all-if-unmodified
+This alters the default behavior of the completion functions in
+a fashion similar to @var{show-all-if-ambiguous}.
+If set to @samp{on},
+words which have more than one possible completion without any
+possible partial completion (the possible completions don't share
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+The default value is @samp{off}.
+
+@item show-mode-in-prompt
+@vindex show-mode-in-prompt
+If set to @samp{on}, add a string to the beginning of the prompt
+indicating the editing mode: emacs, vi command, or vi insertion.
+The mode strings are user-settable (e.g., @var{emacs-mode-string}).
+The default value is @samp{off}.
+
+@item skip-completed-text
+@vindex skip-completed-text
+If set to @samp{on}, this alters the default completion behavior when
+inserting a single match into the line. It's only active when
+performing completion in the middle of a word. If enabled, Readline
+does not insert characters from the completion that match characters
+after point in the word being completed, so portions of the word
+following the cursor are not duplicated.
+For instance, if this is enabled, attempting completion when the cursor
+is after the @samp{e} in @samp{Makefile} will result in @samp{Makefile}
+rather than @samp{Makefilefile}, assuming there is a single possible
+completion.
+The default value is @samp{off}.
+
+@item vi-cmd-mode-string
+@vindex vi-cmd-mode-string
+If the @var{show-mode-in-prompt} variable is enabled,
+this string is displayed immediately before the last line of the primary
+prompt when vi editing mode is active and in command mode.
+The value is expanded like a
+key binding, so the standard set of meta- and control prefixes and
+backslash escape sequences is available.
+Use the @samp{\1} and @samp{\2} escapes to begin and end sequences of
+non-printing characters, which can be used to embed a terminal control
+sequence into the mode string.
+The default is @samp{(cmd)}.
+
+@item vi-ins-mode-string
+@vindex vi-ins-mode-string
+If the @var{show-mode-in-prompt} variable is enabled,
+this string is displayed immediately before the last line of the primary
+prompt when vi editing mode is active and in insertion mode.
+The value is expanded like a
+key binding, so the standard set of meta- and control prefixes and
+backslash escape sequences is available.
+Use the @samp{\1} and @samp{\2} escapes to begin and end sequences of
+non-printing characters, which can be used to embed a terminal control
+sequence into the mode string.
+The default is @samp{(ins)}.
+
+@item visible-stats
+@vindex visible-stats
+If set to @samp{on}, a character denoting a file's type
+is appended to the filename when listing possible
+completions. The default is @samp{off}.
+
+@end table
+
+@item Key Bindings
+The syntax for controlling key bindings in the init file is
+simple. First you need to find the name of the command that you
+want to change. The following sections contain tables of the command
+name, the default keybinding, if any, and a short description of what
+the command does.
+
+Once you know the name of the command, simply place on a line
+in the init file the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command.
+There can be no space between the key name and the colon -- that will be
+interpreted as part of the key name.
+The name of the key can be expressed in different ways, depending on
+what you find most comfortable.
+
+In addition to command names, Readline allows keys to be bound
+to a string that is inserted when the key is pressed (a @var{macro}).
+
+@ifset BashFeatures
+The @w{@code{bind -p}} command displays Readline function names and
+bindings in a format that can be put directly into an initialization file.
+@xref{Bash Builtins}.
+@end ifset
+
+@table @asis
+@item @w{@var{keyname}: @var{function-name} or @var{macro}}
+@var{keyname} is the name of a key spelled out in English. For example:
+@example
+Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: "> output"
+@end example
+
+In the example above, @kbd{C-u} is bound to the function
+@code{universal-argument},
+@kbd{M-DEL} is bound to the function @code{backward-kill-word}, and
+@kbd{C-o} is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+@samp{> output} into the line).
+
+A number of symbolic character names are recognized while
+processing this key binding syntax:
+@var{DEL},
+@var{ESC},
+@var{ESCAPE},
+@var{LFD},
+@var{NEWLINE},
+@var{RET},
+@var{RETURN},
+@var{RUBOUT},
+@var{SPACE},
+@var{SPC},
+and
+@var{TAB}.
+
+@item @w{"@var{keyseq}": @var{function-name} or @var{macro}}
+@var{keyseq} differs from @var{keyname} above in that strings
+denoting an entire key sequence can be specified, by placing
+the key sequence in double quotes. Some @sc{gnu} Emacs style key
+escapes can be used, as in the following example, but the
+special character names are not recognized.
+
+@example
+"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+@end example
+
+In the above example, @kbd{C-u} is again bound to the function
+@code{universal-argument} (just as it was in the first example),
+@samp{@kbd{C-x} @kbd{C-r}} is bound to the function @code{re-read-init-file},
+and @samp{@key{ESC} @key{[} @key{1} @key{1} @key{~}} is bound to insert
+the text @samp{Function Key 1}.
+
+@end table
+
+The following @sc{gnu} Emacs style escape sequences are available when
+specifying key sequences:
+
+@table @code
+@item @kbd{\C-}
+control prefix
+@item @kbd{\M-}
+meta prefix
+@item @kbd{\e}
+an escape character
+@item @kbd{\\}
+backslash
+@item @kbd{\"}
+@key{"}, a double quotation mark
+@item @kbd{\'}
+@key{'}, a single quote or apostrophe
+@end table
+
+In addition to the @sc{gnu} Emacs style escape sequences, a second
+set of backslash escapes is available:
+
+@table @code
+@item \a
+alert (bell)
+@item \b
+backspace
+@item \d
+delete
+@item \f
+form feed
+@item \n
+newline
+@item \r
+carriage return
+@item \t
+horizontal tab
+@item \v
+vertical tab
+@item \@var{nnn}
+the eight-bit character whose value is the octal value @var{nnn}
+(one to three digits)
+@item \x@var{HH}
+the eight-bit character whose value is the hexadecimal value @var{HH}
+(one or two hex digits)
+@end table
+
+When entering the text of a macro, single or double quotes must
+be used to indicate a macro definition.
+Unquoted text is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including @samp{"} and @samp{'}.
+For example, the following binding will make @samp{@kbd{C-x} \}
+insert a single @samp{\} into the line:
+@example
+"\C-x\\": "\\"
+@end example
+
+@end table
+
+@node Conditional Init Constructs
+@subsection Conditional Init Constructs
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests. There are four parser directives used.
+
+@table @code
+@item $if
+The @code{$if} construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+Readline. The text of the test, after any comparison operator,
+extends to the end of the line;
+unless otherwise noted, no characters are required to isolate it.
+
+@table @code
+@item mode
+The @code{mode=} form of the @code{$if} directive is used to test
+whether Readline is in @code{emacs} or @code{vi} mode.
+This may be used in conjunction
+with the @samp{set keymap} command, for instance, to set bindings in
+the @code{emacs-standard} and @code{emacs-ctlx} keymaps only if
+Readline is starting out in @code{emacs} mode.
+
+@item term
+The @code{term=} form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys. The word on the right side of the
+@samp{=} is tested against both the full name of the terminal and
+the portion of the terminal name before the first @samp{-}. This
+allows @code{sun} to match both @code{sun} and @code{sun-cmd},
+for instance.
+
+@item version
+The @code{version} test may be used to perform comparisons against
+specific Readline versions.
+The @code{version} expands to the current Readline version.
+The set of comparison operators includes
+@samp{=} (and @samp{==}), @samp{!=}, @samp{<=}, @samp{>=}, @samp{<},
+and @samp{>}.
+The version number supplied on the right side of the operator consists
+of a major version number, an optional decimal point, and an optional
+minor version (e.g., @samp{7.1}). If the minor version is omitted, it
+is assumed to be @samp{0}.
+The operator may be separated from the string @code{version} and
+from the version number argument by whitespace.
+The following example sets a variable if the Readline version being used
+is 7.0 or newer:
+@example
+$if version >= 7.0
+set show-mode-in-prompt on
+$endif
+@end example
+
+@item application
+The @var{application} construct is used to include
+application-specific settings. Each program using the Readline
+library sets the @var{application name}, and you can test for
+a particular value.
+This could be used to bind key sequences to functions useful for
+a specific program. For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+@example
+$if Bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+@end example
+
+@item variable
+The @var{variable} construct provides simple equality tests for Readline
+variables and values.
+The permitted comparison operators are @samp{=}, @samp{==}, and @samp{!=}.
+The variable name must be separated from the comparison operator by
+whitespace; the operator may be separated from the value on the right hand
+side by whitespace.
+Both string and boolean variables may be tested. Boolean variables must be
+tested against the values @var{on} and @var{off}.
+The following example is equivalent to the @code{mode=emacs} test described
+above:
+@example
+$if editing-mode == emacs
+set show-mode-in-prompt on
+$endif
+@end example
+@end table
+
+@item $endif
+This command, as seen in the previous example, terminates an
+@code{$if} command.
+
+@item $else
+Commands in this branch of the @code{$if} directive are executed if
+the test fails.
+
+@item $include
+This directive takes a single filename as an argument and reads commands
+and bindings from that file.
+For example, the following directive reads from @file{/etc/inputrc}:
+@example
+$include /etc/inputrc
+@end example
+@end table
+
+@node Sample Init File
+@subsection Sample Init File
+
+Here is an example of an @var{inputrc} file. This illustrates key
+binding, variable assignment, and conditional syntax.
+
+@example
+@page
+# This file controls the behaviour of line input editing for
+# programs that use the GNU Readline library. Existing
+# programs include FTP, Bash, and GDB.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# First, include any system-wide bindings and variable
+# assignments from /etc/Inputrc
+$include /etc/Inputrc
+
+#
+# Set various bindings for emacs mode.
+
+set editing-mode emacs
+
+$if mode=emacs
+
+Meta-Control-h: backward-kill-word Text after the function name is ignored
+
+#
+# Arrow keys in keypad mode
+#
+#"\M-OD": backward-char
+#"\M-OC": forward-char
+#"\M-OA": previous-history
+#"\M-OB": next-history
+#
+# Arrow keys in ANSI mode
+#
+"\M-[D": backward-char
+"\M-[C": forward-char
+"\M-[A": previous-history
+"\M-[B": next-history
+#
+# Arrow keys in 8 bit keypad mode
+#
+#"\M-\C-OD": backward-char
+#"\M-\C-OC": forward-char
+#"\M-\C-OA": previous-history
+#"\M-\C-OB": next-history
+#
+# Arrow keys in 8 bit ANSI mode
+#
+#"\M-\C-[D": backward-char
+#"\M-\C-[C": forward-char
+#"\M-\C-[A": previous-history
+#"\M-\C-[B": next-history
+
+C-q: quoted-insert
+
+$endif
+
+# An old-style binding. This happens to be the default.
+TAB: complete
+
+# Macros that are convenient for shell interaction
+$if Bash
+# edit the path
+"\C-xp": "PATH=$@{PATH@}\e\C-e\C-a\ef\C-f"
+# prepare to type a quoted word --
+# insert open and close double quotes
+# and move to just after the open quote
+"\C-x\"": "\"\"\C-b"
+# insert a backslash (testing backslash escapes
+# in sequences and macros)
+"\C-x\\": "\\"
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+# Add a binding to refresh the line, which is unbound
+"\C-xr": redraw-current-line
+# Edit variable on current line.
+"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+$endif
+
+# use a visible bell if one is available
+set bell-style visible
+
+# don't strip characters to 7 bits when reading
+set input-meta on
+
+# allow iso-latin1 characters to be inserted rather
+# than converted to prefix-meta sequences
+set convert-meta off
+
+# display characters with the eighth bit set directly
+# rather than as meta-prefixed characters
+set output-meta on
+
+# if there are 150 or more possible completions for a word,
+# ask whether or not the user wants to see all of them
+set completion-query-items 150
+
+# For FTP
+$if Ftp
+"\C-xg": "get \M-?"
+"\C-xt": "put \M-?"
+"\M-.": yank-last-arg
+$endif
+@end example
+
+@node Bindable Readline Commands
+@section Bindable Readline Commands
+
+@menu
+* Commands For Moving:: Moving about the line.
+* Commands For History:: Getting at previous lines.
+* Commands For Text:: Commands for changing text.
+* Commands For Killing:: Commands for killing and yanking.
+* Numeric Arguments:: Specifying numeric arguments, repeat counts.
+* Commands For Completion:: Getting Readline to do the typing for you.
+* Keyboard Macros:: Saving and re-executing typed characters
+* Miscellaneous Commands:: Other miscellaneous commands.
+@end menu
+
+This section describes Readline commands that may be bound to key
+sequences.
+@ifset BashFeatures
+You can list your key bindings by executing
+@w{@code{bind -P}} or, for a more terse format, suitable for an
+@var{inputrc} file, @w{@code{bind -p}}. (@xref{Bash Builtins}.)
+@end ifset
+Command names without an accompanying key sequence are unbound by default.
+
+In the following descriptions, @dfn{point} refers to the current cursor
+position, and @dfn{mark} refers to a cursor position saved by the
+@code{set-mark} command.
+The text between the point and mark is referred to as the @dfn{region}.
+
+@node Commands For Moving
+@subsection Commands For Moving
+@ftable @code
+@item beginning-of-line (C-a)
+Move to the start of the current line.
+
+@item end-of-line (C-e)
+Move to the end of the line.
+
+@item forward-char (C-f)
+Move forward a character.
+
+@item backward-char (C-b)
+Move back a character.
+
+@item forward-word (M-f)
+Move forward to the end of the next word.
+Words are composed of letters and digits.
+
+@item backward-word (M-b)
+Move back to the start of the current or previous word.
+Words are composed of letters and digits.
+
+@ifset BashFeatures
+@item shell-forward-word (M-C-f)
+Move forward to the end of the next word.
+Words are delimited by non-quoted shell metacharacters.
+
+@item shell-backward-word (M-C-b)
+Move back to the start of the current or previous word.
+Words are delimited by non-quoted shell metacharacters.
+@end ifset
+
+@item previous-screen-line ()
+Attempt to move point to the same physical screen column on the previous
+physical screen line. This will not have the desired effect if the current
+Readline line does not take up more than one physical line or if point is not
+greater than the length of the prompt plus the screen width.
+
+@item next-screen-line ()
+Attempt to move point to the same physical screen column on the next
+physical screen line. This will not have the desired effect if the current
+Readline line does not take up more than one physical line or if the length
+of the current Readline line is not greater than the length of the prompt
+plus the screen width.
+
+@item clear-display (M-C-l)
+Clear the screen and, if possible, the terminal's scrollback buffer,
+then redraw the current line,
+leaving the current line at the top of the screen.
+
+@item clear-screen (C-l)
+Clear the screen,
+then redraw the current line,
+leaving the current line at the top of the screen.
+
+@item redraw-current-line ()
+Refresh the current line. By default, this is unbound.
+
+@end ftable
+
+@node Commands For History
+@subsection Commands For Manipulating The History
+
+@ftable @code
+@item accept-line (Newline or Return)
+@ifset BashFeatures
+Accept the line regardless of where the cursor is.
+If this line is
+non-empty, add it to the history list according to the setting of
+the @env{HISTCONTROL} and @env{HISTIGNORE} variables.
+If this line is a modified history line, then restore the history line
+to its original state.
+@end ifset
+@ifclear BashFeatures
+Accept the line regardless of where the cursor is.
+If this line is
+non-empty, it may be added to the history list for future recall with
+@code{add_history()}.
+If this line is a modified history line, the history line is restored
+to its original state.
+@end ifclear
+
+@item previous-history (C-p)
+Move `back' through the history list, fetching the previous command.
+
+@item next-history (C-n)
+Move `forward' through the history list, fetching the next command.
+
+@item beginning-of-history (M-<)
+Move to the first line in the history.
+
+@item end-of-history (M->)
+Move to the end of the input history, i.e., the line currently
+being entered.
+
+@item reverse-search-history (C-r)
+Search backward starting at the current line and moving `up' through
+the history as necessary. This is an incremental search.
+This command sets the region to the matched text and activates the mark.
+
+@item forward-search-history (C-s)
+Search forward starting at the current line and moving `down' through
+the history as necessary. This is an incremental search.
+This command sets the region to the matched text and activates the mark.
+
+@item non-incremental-reverse-search-history (M-p)
+Search backward starting at the current line and moving `up'
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+The search string may match anywhere in a history line.
+
+@item non-incremental-forward-search-history (M-n)
+Search forward starting at the current line and moving `down'
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+The search string may match anywhere in a history line.
+
+@item history-search-forward ()
+Search forward through the history for the string of characters
+between the start of the current line and the point.
+The search string must match at the beginning of a history line.
+This is a non-incremental search.
+By default, this command is unbound.
+
+@item history-search-backward ()
+Search backward through the history for the string of characters
+between the start of the current line and the point.
+The search string must match at the beginning of a history line.
+This is a non-incremental search.
+By default, this command is unbound.
+
+@item history-substring-search-forward ()
+Search forward through the history for the string of characters
+between the start of the current line and the point.
+The search string may match anywhere in a history line.
+This is a non-incremental search.
+By default, this command is unbound.
+
+@item history-substring-search-backward ()
+Search backward through the history for the string of characters
+between the start of the current line and the point.
+The search string may match anywhere in a history line.
+This is a non-incremental search.
+By default, this command is unbound.
+
+@item yank-nth-arg (M-C-y)
+Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument @var{n},
+insert the @var{n}th word from the previous command (the words
+in the previous command begin with word 0). A negative argument
+inserts the @var{n}th word from the end of the previous command.
+Once the argument @var{n} is computed, the argument is extracted
+as if the @samp{!@var{n}} history expansion had been specified.
+
+@item yank-last-arg (M-. or M-_)
+Insert last argument to the previous command (the last word of the
+previous history entry).
+With a numeric argument, behave exactly like @code{yank-nth-arg}.
+Successive calls to @code{yank-last-arg} move back through the history
+list, inserting the last word (or the word specified by the argument to
+the first call) of each line in turn.
+Any numeric argument supplied to these successive calls determines
+the direction to move through the history. A negative argument switches
+the direction through the history (back or forward).
+The history expansion facilities are used to extract the last argument,
+as if the @samp{!$} history expansion had been specified.
+
+@item operate-and-get-next (C-o)
+Accept the current line for return to the calling application as if a
+newline had been entered,
+and fetch the next line relative to the current line from the history
+for editing.
+A numeric argument, if supplied, specifies the history entry to use instead
+of the current line.
+
+@item fetch-history ()
+With a numeric argument, fetch that entry from the history list
+and make it the current line.
+Without an argument, move back to the first entry in the history list.
+
+@end ftable
+
+@node Commands For Text
+@subsection Commands For Changing Text
+
+@ftable @code
+
+@item @i{end-of-file} (usually C-d)
+The character indicating end-of-file as set, for example, by
+@code{stty}. If this character is read when there are no characters
+on the line, and point is at the beginning of the line, Readline
+interprets it as the end of input and returns @sc{eof}.
+
+@item delete-char (C-d)
+Delete the character at point. If this function is bound to the
+same character as the tty @sc{eof} character, as @kbd{C-d}
+commonly is, see above for the effects.
+
+@item backward-delete-char (Rubout)
+Delete the character behind the cursor. A numeric argument means
+to kill the characters instead of deleting them.
+
+@item forward-backward-delete-char ()
+Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted. By default, this is not bound to a key.
+
+@item quoted-insert (C-q or C-v)
+Add the next character typed to the line verbatim. This is
+how to insert key sequences like @kbd{C-q}, for example.
+
+@ifclear BashFeatures
+@item tab-insert (M-@key{TAB})
+Insert a tab character.
+@end ifclear
+
+@item self-insert (a, b, A, 1, !, @dots{})
+Insert yourself.
+
+@item bracketed-paste-begin ()
+This function is intended to be bound to the "bracketed paste" escape
+sequence sent by some terminals, and such a binding is assigned by default.
+It allows Readline to insert the pasted text as a single unit without treating
+each character as if it had been read from the keyboard. The characters
+are inserted as if each one was bound to @code{self-insert} instead of
+executing any editing commands.
+
+Bracketed paste sets the region (the characters between point and the mark)
+to the inserted text. It uses the concept of an @emph{active mark}: when the
+mark is active, Readline redisplay uses the terminal's standout mode to
+denote the region.
+
+@item transpose-chars (C-t)
+Drag the character before the cursor forward over
+the character at the cursor, moving the
+cursor forward as well. If the insertion point
+is at the end of the line, then this
+transposes the last two characters of the line.
+Negative arguments have no effect.
+
+@item transpose-words (M-t)
+Drag the word before point past the word after point,
+moving point past that word as well.
+If the insertion point is at the end of the line, this transposes
+the last two words on the line.
+
+@item upcase-word (M-u)
+Uppercase the current (or following) word. With a negative argument,
+uppercase the previous word, but do not move the cursor.
+
+@item downcase-word (M-l)
+Lowercase the current (or following) word. With a negative argument,
+lowercase the previous word, but do not move the cursor.
+
+@item capitalize-word (M-c)
+Capitalize the current (or following) word. With a negative argument,
+capitalize the previous word, but do not move the cursor.
+
+@item overwrite-mode ()
+Toggle overwrite mode. With an explicit positive numeric argument,
+switches to overwrite mode. With an explicit non-positive numeric
+argument, switches to insert mode. This command affects only
+@code{emacs} mode; @code{vi} mode does overwrite differently.
+Each call to @code{readline()} starts in insert mode.
+
+In overwrite mode, characters bound to @code{self-insert} replace
+the text at point rather than pushing the text to the right.
+Characters bound to @code{backward-delete-char} replace the character
+before point with a space.
+
+By default, this command is unbound.
+
+@end ftable
+
+@node Commands For Killing
+@subsection Killing And Yanking
+
+@ftable @code
+
+@item kill-line (C-k)
+Kill the text from point to the end of the line.
+With a negative numeric argument, kill backward from the cursor to the
+beginning of the current line.
+
+@item backward-kill-line (C-x Rubout)
+Kill backward from the cursor to the beginning of the current line.
+With a negative numeric argument, kill forward from the cursor to the
+end of the current line.
+
+@item unix-line-discard (C-u)
+Kill backward from the cursor to the beginning of the current line.
+
+@item kill-whole-line ()
+Kill all characters on the current line, no matter where point is.
+By default, this is unbound.
+
+@item kill-word (M-d)
+Kill from point to the end of the current word, or if between
+words, to the end of the next word.
+Word boundaries are the same as @code{forward-word}.
+
+@item backward-kill-word (M-@key{DEL})
+Kill the word behind point.
+Word boundaries are the same as @code{backward-word}.
+
+@ifset BashFeatures
+@item shell-kill-word (M-C-d)
+Kill from point to the end of the current word, or if between
+words, to the end of the next word.
+Word boundaries are the same as @code{shell-forward-word}.
+
+@item shell-backward-kill-word ()
+Kill the word behind point.
+Word boundaries are the same as @code{shell-backward-word}.
+@end ifset
+
+@item shell-transpose-words (M-C-t)
+Drag the word before point past the word after point,
+moving point past that word as well.
+If the insertion point is at the end of the line, this transposes
+the last two words on the line.
+Word boundaries are the same as @code{shell-forward-word} and
+@code{shell-backward-word}.
+
+@item unix-word-rubout (C-w)
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+
+@item unix-filename-rubout ()
+Kill the word behind point, using white space and the slash character
+as the word boundaries.
+The killed text is saved on the kill-ring.
+
+@item delete-horizontal-space ()
+Delete all spaces and tabs around point. By default, this is unbound.
+
+@item kill-region ()
+Kill the text in the current region.
+By default, this command is unbound.
+
+@item copy-region-as-kill ()
+Copy the text in the region to the kill buffer, so it can be yanked
+right away. By default, this command is unbound.
+
+@item copy-backward-word ()
+Copy the word before point to the kill buffer.
+The word boundaries are the same as @code{backward-word}.
+By default, this command is unbound.
+
+@item copy-forward-word ()
+Copy the word following point to the kill buffer.
+The word boundaries are the same as @code{forward-word}.
+By default, this command is unbound.
+
+@item yank (C-y)
+Yank the top of the kill ring into the buffer at point.
+
+@item yank-pop (M-y)
+Rotate the kill-ring, and yank the new top. You can only do this if
+the prior command is @code{yank} or @code{yank-pop}.
+@end ftable
+
+@node Numeric Arguments
+@subsection Specifying Numeric Arguments
+@ftable @code
+
+@item digit-argument (@kbd{M-0}, @kbd{M-1}, @dots{} @kbd{M--})
+Add this digit to the argument already accumulating, or start a new
+argument. @kbd{M--} starts a negative argument.
+
+@item universal-argument ()
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing @code{universal-argument}
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit nor minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+By default, this is not bound to a key.
+@end ftable
+
+@node Commands For Completion
+@subsection Letting Readline Type For You
+
+@ftable @code
+@item complete (@key{TAB})
+Attempt to perform completion on the text before point.
+The actual completion performed is application-specific.
+@ifset BashFeatures
+Bash attempts completion treating the text as a variable (if the
+text begins with @samp{$}), username (if the text begins with
+@samp{~}), hostname (if the text begins with @samp{@@}), or
+command (including aliases and functions) in turn. If none
+of these produces a match, filename completion is attempted.
+@end ifset
+@ifclear BashFeatures
+The default is filename completion.
+@end ifclear
+
+@item possible-completions (M-?)
+List the possible completions of the text before point.
+When displaying completions, Readline sets the number of columns used
+for display to the value of @code{completion-display-width}, the value of
+the environment variable @env{COLUMNS}, or the screen width, in that order.
+
+@item insert-completions (M-*)
+Insert all completions of the text before point that would have
+been generated by @code{possible-completions}.
+
+@item menu-complete ()
+Similar to @code{complete}, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of @code{menu-complete} steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of @code{bell-style})
+and the original text is restored.
+An argument of @var{n} moves @var{n} positions forward in the list
+of matches; a negative argument may be used to move backward
+through the list.
+This command is intended to be bound to @key{TAB}, but is unbound
+by default.
+
+@item menu-complete-backward ()
+Identical to @code{menu-complete}, but moves backward through the list
+of possible completions, as if @code{menu-complete} had been given a
+negative argument.
+
+@item delete-char-or-list ()
+Deletes the character under the cursor if not at the beginning or
+end of the line (like @code{delete-char}).
+If at the end of the line, behaves identically to
+@code{possible-completions}.
+This command is unbound by default.
+
+@ifset BashFeatures
+@item complete-filename (M-/)
+Attempt filename completion on the text before point.
+
+@item possible-filename-completions (C-x /)
+List the possible completions of the text before point,
+treating it as a filename.
+
+@item complete-username (M-~)
+Attempt completion on the text before point, treating
+it as a username.
+
+@item possible-username-completions (C-x ~)
+List the possible completions of the text before point,
+treating it as a username.
+
+@item complete-variable (M-$)
+Attempt completion on the text before point, treating
+it as a shell variable.
+
+@item possible-variable-completions (C-x $)
+List the possible completions of the text before point,
+treating it as a shell variable.
+
+@item complete-hostname (M-@@)
+Attempt completion on the text before point, treating
+it as a hostname.
+
+@item possible-hostname-completions (C-x @@)
+List the possible completions of the text before point,
+treating it as a hostname.
+
+@item complete-command (M-!)
+Attempt completion on the text before point, treating
+it as a command name. Command completion attempts to
+match the text against aliases, reserved words, shell
+functions, shell builtins, and finally executable filenames,
+in that order.
+
+@item possible-command-completions (C-x !)
+List the possible completions of the text before point,
+treating it as a command name.
+
+@item dynamic-complete-history (M-@key{TAB})
+Attempt completion on the text before point, comparing
+the text against lines from the history list for possible
+completion matches.
+
+@item dabbrev-expand ()
+Attempt menu completion on the text before point, comparing
+the text against lines from the history list for possible
+completion matches.
+
+@item complete-into-braces (M-@{)
+Perform filename completion and insert the list of possible completions
+enclosed within braces so the list is available to the shell
+(@pxref{Brace Expansion}).
+
+@end ifset
+@end ftable
+
+@node Keyboard Macros
+@subsection Keyboard Macros
+@ftable @code
+
+@item start-kbd-macro (C-x ()
+Begin saving the characters typed into the current keyboard macro.
+
+@item end-kbd-macro (C-x ))
+Stop saving the characters typed into the current keyboard macro
+and save the definition.
+
+@item call-last-kbd-macro (C-x e)
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+
+@item print-last-kbd-macro ()
+Print the last keyboard macro defined in a format suitable for the
+@var{inputrc} file.
+
+@end ftable
+
+@node Miscellaneous Commands
+@subsection Some Miscellaneous Commands
+@ftable @code
+
+@item re-read-init-file (C-x C-r)
+Read in the contents of the @var{inputrc} file, and incorporate
+any bindings or variable assignments found there.
+
+@item abort (C-g)
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+@code{bell-style}).
+
+@item do-lowercase-version (M-A, M-B, M-@var{x}, @dots{})
+If the metafied character @var{x} is upper case, run the command
+that is bound to the corresponding metafied lower case character.
+The behavior is undefined if @var{x} is already lower case.
+
+@item prefix-meta (@key{ESC})
+Metafy the next character typed. This is for keyboards
+without a meta key. Typing @samp{@key{ESC} f} is equivalent to typing
+@kbd{M-f}.
+
+@item undo (C-_ or C-x C-u)
+Incremental undo, separately remembered for each line.
+
+@item revert-line (M-r)
+Undo all changes made to this line. This is like executing the @code{undo}
+command enough times to get back to the beginning.
+
+@ifset BashFeatures
+@item tilde-expand (M-&)
+@end ifset
+@ifclear BashFeatures
+@item tilde-expand (M-~)
+@end ifclear
+Perform tilde expansion on the current word.
+
+@item set-mark (C-@@)
+Set the mark to the point. If a
+numeric argument is supplied, the mark is set to that position.
+
+@item exchange-point-and-mark (C-x C-x)
+Swap the point with the mark. The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+
+@item character-search (C-])
+A character is read and point is moved to the next occurrence of that
+character. A negative argument searches for previous occurrences.
+
+@item character-search-backward (M-C-])
+A character is read and point is moved to the previous occurrence
+of that character. A negative argument searches for subsequent
+occurrences.
+
+@item skip-csi-sequence ()
+Read enough characters to consume a multi-key sequence such as those
+defined for keys like Home and End. Such sequences begin with a
+Control Sequence Indicator (CSI), usually ESC-[. If this sequence is
+bound to "\e[", keys producing such sequences will have no effect
+unless explicitly bound to a Readline command, instead of inserting
+stray characters into the editing buffer. This is unbound by default,
+but usually bound to ESC-[.
+
+@item insert-comment (M-#)
+Without a numeric argument, the value of the @code{comment-begin}
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle: if
+the characters at the beginning of the line do not match the value
+of @code{comment-begin}, the value is inserted, otherwise
+the characters in @code{comment-begin} are deleted from the beginning of
+the line.
+In either case, the line is accepted as if a newline had been typed.
+@ifset BashFeatures
+The default value of @code{comment-begin} causes this command
+to make the current line a shell comment.
+If a numeric argument causes the comment character to be removed, the line
+will be executed by the shell.
+@end ifset
+
+@item dump-functions ()
+Print all of the functions and their key bindings to the
+Readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an @var{inputrc} file. This command is unbound by default.
+
+@item dump-variables ()
+Print all of the settable variables and their values to the
+Readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an @var{inputrc} file. This command is unbound by default.
+
+@item dump-macros ()
+Print all of the Readline key sequences bound to macros and the
+strings they output. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an @var{inputrc} file. This command is unbound by default.
+
+@ifset BashFeatures
+@item spell-correct-word (C-x s)
+Perform spelling correction on the current word, treating it as a directory
+or filename, in the same way as the @code{cdspell} shell option.
+Word boundaries are the same as those used by @code{shell-forward-word}.
+
+@item glob-complete-word (M-g)
+The word before point is treated as a pattern for pathname expansion,
+with an asterisk implicitly appended. This pattern is used to
+generate a list of matching file names for possible completions.
+
+@item glob-expand-word (C-x *)
+The word before point is treated as a pattern for pathname expansion,
+and the list of matching file names is inserted, replacing the word.
+If a numeric argument is supplied, a @samp{*} is appended before
+pathname expansion.
+
+@item glob-list-expansions (C-x g)
+The list of expansions that would have been generated by
+@code{glob-expand-word} is displayed, and the line is redrawn.
+If a numeric argument is supplied, a @samp{*} is appended before
+pathname expansion.
+
+@item display-shell-version (C-x C-v)
+Display version information about the current instance of Bash.
+
+@item shell-expand-line (M-C-e)
+Expand the line as the shell does.
+This performs alias and history expansion as well as all of the shell
+word expansions (@pxref{Shell Expansions}).
+
+@item history-expand-line (M-^)
+Perform history expansion on the current line.
+
+@item magic-space ()
+Perform history expansion on the current line and insert a space
+(@pxref{History Interaction}).
+
+@item alias-expand-line ()
+Perform alias expansion on the current line (@pxref{Aliases}).
+
+@item history-and-alias-expand-line ()
+Perform history and alias expansion on the current line.
+
+@item insert-last-argument (M-. or M-_)
+A synonym for @code{yank-last-arg}.
+
+@item edit-and-execute-command (C-x C-e)
+Invoke an editor on the current command line, and execute the result as shell
+commands.
+Bash attempts to invoke
+@code{$VISUAL}, @code{$EDITOR}, and @code{emacs}
+as the editor, in that order.
+
+@end ifset
+
+@ifclear BashFeatures
+@item emacs-editing-mode (C-e)
+When in @code{vi} command mode, this causes a switch to @code{emacs}
+editing mode.
+
+@item vi-editing-mode (M-C-j)
+When in @code{emacs} editing mode, this causes a switch to @code{vi}
+editing mode.
+
+@end ifclear
+
+@end ftable
+
+@node Readline vi Mode
+@section Readline vi Mode
+
+While the Readline library does not have a full set of @code{vi}
+editing functions, it does contain enough to allow simple editing
+of the line. The Readline @code{vi} mode behaves as specified in
+the @sc{posix} standard.
+
+@ifset BashFeatures
+In order to switch interactively between @code{emacs} and @code{vi}
+editing modes, use the @samp{set -o emacs} and @samp{set -o vi}
+commands (@pxref{The Set Builtin}).
+@end ifset
+@ifclear BashFeatures
+In order to switch interactively between @code{emacs} and @code{vi}
+editing modes, use the command @kbd{M-C-j} (bound to emacs-editing-mode
+when in @code{vi} mode and to vi-editing-mode in @code{emacs} mode).
+@end ifclear
+The Readline default is @code{emacs} mode.
+
+When you enter a line in @code{vi} mode, you are already placed in
+`insertion' mode, as if you had typed an @samp{i}. Pressing @key{ESC}
+switches you into `command' mode, where you can edit the text of the
+line with the standard @code{vi} movement keys, move to previous
+history lines with @samp{k} and subsequent lines with @samp{j}, and
+so forth.
+
+@ifset BashFeatures
+@node Programmable Completion
+@section Programmable Completion
+@cindex programmable completion
+
+When word completion is attempted for an argument to a command for
+which a completion specification (a @var{compspec}) has been defined
+using the @code{complete} builtin (@pxref{Programmable Completion Builtins}),
+the programmable completion facilities are invoked.
+
+First, the command name is identified.
+If a compspec has been defined for that command, the
+compspec is used to generate the list of possible completions for the word.
+If the command word is the empty string (completion attempted at the
+beginning of an empty line), any compspec defined with
+the @option{-E} option to @code{complete} is used.
+If the command word is a full pathname, a compspec for the full
+pathname is searched for first.
+If no compspec is found for the full pathname, an attempt is made to
+find a compspec for the portion following the final slash.
+If those searches do not result in a compspec, any compspec defined with
+the @option{-D} option to @code{complete} is used as the default.
+If there is no default compspec, Bash attempts alias expansion
+on the command word as a final resort, and attempts to find a compspec
+for the command word from any successful expansion
+
+Once a compspec has been found, it is used to generate the list of
+matching words.
+If a compspec is not found, the default Bash completion
+described above (@pxref{Commands For Completion}) is performed.
+
+First, the actions specified by the compspec are used.
+Only matches which are prefixed by the word being completed are
+returned.
+When the @option{-f} or @option{-d} option is used for filename or
+directory name completion, the shell variable @env{FIGNORE} is
+used to filter the matches.
+@xref{Bash Variables}, for a description of @env{FIGNORE}.
+
+Any completions specified by a filename expansion pattern to the
+@option{-G} option are generated next.
+The words generated by the pattern need not match the word being completed.
+The @env{GLOBIGNORE} shell variable is not used to filter the matches,
+but the @env{FIGNORE} shell variable is used.
+
+Next, the string specified as the argument to the @option{-W} option
+is considered.
+The string is first split using the characters in the @env{IFS}
+special variable as delimiters.
+Shell quoting is honored within the string, in order to provide a
+mechanism for the words to contain shell metacharacters or characters
+in the value of @env{IFS}.
+Each word is then expanded using
+brace expansion, tilde expansion, parameter and variable expansion,
+command substitution, and arithmetic expansion,
+as described above (@pxref{Shell Expansions}).
+The results are split using the rules described above
+(@pxref{Word Splitting}).
+The results of the expansion are prefix-matched against the word being
+completed, and the matching words become the possible completions.
+
+After these matches have been generated, any shell function or command
+specified with the @option{-F} and @option{-C} options is invoked.
+When the command or function is invoked, the @env{COMP_LINE},
+@env{COMP_POINT}, @env{COMP_KEY}, and @env{COMP_TYPE} variables are
+assigned values as described above (@pxref{Bash Variables}).
+If a shell function is being invoked, the @env{COMP_WORDS} and
+@env{COMP_CWORD} variables are also set.
+When the function or command is invoked, the first argument ($1) is the
+name of the command whose arguments are being completed, the
+second argument ($2) is the word being completed, and the third argument
+($3) is the word preceding the word being completed on the current command
+line.
+No filtering of the generated completions against the word being completed
+is performed; the function or command has complete freedom in generating
+the matches.
+
+Any function specified with @option{-F} is invoked first.
+The function may use any of the shell facilities, including the
+@code{compgen} and @code{compopt} builtins described below
+(@pxref{Programmable Completion Builtins}), to generate the matches.
+It must put the possible completions in the @env{COMPREPLY} array
+variable, one per array element.
+
+Next, any command specified with the @option{-C} option is invoked
+in an environment equivalent to command substitution.
+It should print a list of completions, one per line, to
+the standard output.
+Backslash may be used to escape a newline, if necessary.
+
+After all of the possible completions are generated, any filter
+specified with the @option{-X} option is applied to the list.
+The filter is a pattern as used for pathname expansion; a @samp{&}
+in the pattern is replaced with the text of the word being completed.
+A literal @samp{&} may be escaped with a backslash; the backslash
+is removed before attempting a match.
+Any completion that matches the pattern will be removed from the list.
+A leading @samp{!} negates the pattern; in this case any completion
+not matching the pattern will be removed.
+If the @code{nocasematch} shell option
+(see the description of @code{shopt} in @ref{The Shopt Builtin})
+is enabled, the match is performed without regard to the case
+of alphabetic characters.
+
+Finally, any prefix and suffix specified with the @option{-P} and @option{-S}
+options are added to each member of the completion list, and the result is
+returned to the Readline completion code as the list of possible
+completions.
+
+If the previously-applied actions do not generate any matches, and the
+@option{-o dirnames} option was supplied to @code{complete} when the
+compspec was defined, directory name completion is attempted.
+
+If the @option{-o plusdirs} option was supplied to @code{complete} when
+the compspec was defined, directory name completion is attempted and any
+matches are added to the results of the other actions.
+
+By default, if a compspec is found, whatever it generates is returned to
+the completion code as the full set of possible completions.
+The default Bash completions are not attempted, and the Readline default
+of filename completion is disabled.
+If the @option{-o bashdefault} option was supplied to @code{complete} when
+the compspec was defined, the default Bash completions are attempted
+if the compspec generates no matches.
+If the @option{-o default} option was supplied to @code{complete} when the
+compspec was defined, Readline's default completion will be performed
+if the compspec (and, if attempted, the default Bash completions)
+generate no matches.
+
+When a compspec indicates that directory name completion is desired,
+the programmable completion functions force Readline to append a slash
+to completed names which are symbolic links to directories, subject to
+the value of the @var{mark-directories} Readline variable, regardless
+of the setting of the @var{mark-symlinked-directories} Readline variable.
+
+There is some support for dynamically modifying completions. This is
+most useful when used in combination with a default completion specified
+with @option{-D}. It's possible for shell functions executed as completion
+handlers to indicate that completion should be retried by returning an
+exit status of 124. If a shell function returns 124, and changes
+the compspec associated with the command on which completion is being
+attempted (supplied as the first argument when the function is executed),
+programmable completion restarts from the beginning, with an
+attempt to find a new compspec for that command. This allows a set of
+completions to be built dynamically as completion is attempted, rather than
+being loaded all at once.
+
+For instance, assuming that there is a library of compspecs, each kept in a
+file corresponding to the name of the command, the following default
+completion function would load completions dynamically:
+
+@example
+_completion_loader()
+@{
+ . "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124
+@}
+complete -D -F _completion_loader -o bashdefault -o default
+@end example
+
+@node Programmable Completion Builtins
+@section Programmable Completion Builtins
+@cindex completion builtins
+
+Three builtin commands are available to manipulate the programmable completion
+facilities: one to specify how the arguments to a particular command are to
+be completed, and two to modify the completion as it is happening.
+
+@table @code
+@item compgen
+@btindex compgen
+@example
+@code{compgen [@var{option}] [@var{word}]}
+@end example
+
+Generate possible completion matches for @var{word} according to
+the @var{option}s, which may be any option accepted by the
+@code{complete}
+builtin with the exception of @option{-p} and @option{-r}, and write
+the matches to the standard output.
+When using the @option{-F} or @option{-C} options, the various shell variables
+set by the programmable completion facilities, while available, will not
+have useful values.
+
+The matches will be generated in the same way as if the programmable
+completion code had generated them directly from a completion specification
+with the same flags.
+If @var{word} is specified, only those completions matching @var{word}
+will be displayed.
+
+The return value is true unless an invalid option is supplied, or no
+matches were generated.
+
+@item complete
+@btindex complete
+@example
+@code{complete [-abcdefgjksuv] [-o @var{comp-option}] [-DEI] [-A @var{action}] [-G @var{globpat}]
+[-W @var{wordlist}] [-F @var{function}] [-C @var{command}] [-X @var{filterpat}]
+[-P @var{prefix}] [-S @var{suffix}] @var{name} [@var{name} @dots{}]}
+@code{complete -pr [-DEI] [@var{name} @dots{}]}
+@end example
+
+Specify how arguments to each @var{name} should be completed.
+If the @option{-p} option is supplied, or if no options are supplied, existing
+completion specifications are printed in a way that allows them to be
+reused as input.
+The @option{-r} option removes a completion specification for
+each @var{name}, or, if no @var{name}s are supplied, all
+completion specifications.
+The @option{-D} option indicates that other supplied options and actions should
+apply to the ``default'' command completion; that is, completion attempted
+on a command for which no completion has previously been defined.
+The @option{-E} option indicates that other supplied options and actions should
+apply to ``empty'' command completion; that is, completion attempted on a
+blank line.
+The @option{-I} option indicates that other supplied options and actions should
+apply to completion on the initial non-assignment word on the line, or after a
+command delimiter such as @samp{;} or @samp{|}, which is usually command
+name completion.
+If multiple options are supplied, the @option{-D} option takes precedence
+over @option{-E}, and both take precedence over @option{-I}.
+If any of @option{-D}, @option{-E}, or @option{-I} are supplied, any other
+@var{name} arguments are ignored; these completions only apply to the case
+specified by the option.
+
+The process of applying these completion specifications when word completion
+is attempted is described above (@pxref{Programmable Completion}).
+
+Other options, if specified, have the following meanings.
+The arguments to the @option{-G}, @option{-W}, and @option{-X} options
+(and, if necessary, the @option{-P} and @option{-S} options)
+should be quoted to protect them from expansion before the
+@code{complete} builtin is invoked.
+
+
+@table @code
+@item -o @var{comp-option}
+The @var{comp-option} controls several aspects of the compspec's behavior
+beyond the simple generation of completions.
+@var{comp-option} may be one of:
+
+@table @code
+
+@item bashdefault
+Perform the rest of the default Bash completions if the compspec
+generates no matches.
+
+@item default
+Use Readline's default filename completion if the compspec generates
+no matches.
+
+@item dirnames
+Perform directory name completion if the compspec generates no matches.
+
+@item filenames
+Tell Readline that the compspec generates filenames, so it can perform any
+filename-specific processing (like adding a slash to directory names,
+quoting special characters, or suppressing trailing spaces).
+This option is intended to be used with shell functions specified
+with @option{-F}.
+
+@item noquote
+Tell Readline not to quote the completed words if they are filenames
+(quoting filenames is the default).
+
+@item nosort
+Tell Readline not to sort the list of possible completions alphabetically.
+
+@item nospace
+Tell Readline not to append a space (the default) to words completed at
+the end of the line.
+
+@item plusdirs
+After any matches defined by the compspec are generated,
+directory name completion is attempted and any
+matches are added to the results of the other actions.
+
+@end table
+
+@item -A @var{action}
+The @var{action} may be one of the following to generate a list of possible
+completions:
+
+@table @code
+@item alias
+Alias names. May also be specified as @option{-a}.
+
+@item arrayvar
+Array variable names.
+
+@item binding
+Readline key binding names (@pxref{Bindable Readline Commands}).
+
+@item builtin
+Names of shell builtin commands. May also be specified as @option{-b}.
+
+@item command
+Command names. May also be specified as @option{-c}.
+
+@item directory
+Directory names. May also be specified as @option{-d}.
+
+@item disabled
+Names of disabled shell builtins.
+
+@item enabled
+Names of enabled shell builtins.
+
+@item export
+Names of exported shell variables. May also be specified as @option{-e}.
+
+@item file
+File names. May also be specified as @option{-f}.
+
+@item function
+Names of shell functions.
+
+@item group
+Group names. May also be specified as @option{-g}.
+
+@item helptopic
+Help topics as accepted by the @code{help} builtin (@pxref{Bash Builtins}).
+
+@item hostname
+Hostnames, as taken from the file specified by the
+@env{HOSTFILE} shell variable (@pxref{Bash Variables}).
+
+@item job
+Job names, if job control is active. May also be specified as @option{-j}.
+
+@item keyword
+Shell reserved words. May also be specified as @option{-k}.
+
+@item running
+Names of running jobs, if job control is active.
+
+@item service
+Service names. May also be specified as @option{-s}.
+
+@item setopt
+Valid arguments for the @option{-o} option to the @code{set} builtin
+(@pxref{The Set Builtin}).
+
+@item shopt
+Shell option names as accepted by the @code{shopt} builtin
+(@pxref{Bash Builtins}).
+
+@item signal
+Signal names.
+
+@item stopped
+Names of stopped jobs, if job control is active.
+
+@item user
+User names. May also be specified as @option{-u}.
+
+@item variable
+Names of all shell variables. May also be specified as @option{-v}.
+@end table
+
+@item -C @var{command}
+@var{command} is executed in a subshell environment, and its output is
+used as the possible completions.
+Arguments are passed as with the @option{-F} option.
+
+@item -F @var{function}
+The shell function @var{function} is executed in the current shell
+environment.
+When it is executed, $1 is the name of the command whose arguments are
+being completed, $2 is the word being completed, and $3 is the word
+preceding the word being completed, as described above
+(@pxref{Programmable Completion}).
+When it finishes, the possible completions are retrieved from the value
+of the @env{COMPREPLY} array variable.
+
+@item -G @var{globpat}
+The filename expansion pattern @var{globpat} is expanded to generate
+the possible completions.
+
+@item -P @var{prefix}
+@var{prefix} is added at the beginning of each possible completion
+after all other options have been applied.
+
+@item -S @var{suffix}
+@var{suffix} is appended to each possible completion
+after all other options have been applied.
+
+@item -W @var{wordlist}
+The @var{wordlist} is split using the characters in the
+@env{IFS} special variable as delimiters, and each resultant word
+is expanded.
+The possible completions are the members of the resultant list which
+match the word being completed.
+
+@item -X @var{filterpat}
+@var{filterpat} is a pattern as used for filename expansion.
+It is applied to the list of possible completions generated by the
+preceding options and arguments, and each completion matching
+@var{filterpat} is removed from the list.
+A leading @samp{!} in @var{filterpat} negates the pattern; in this
+case, any completion not matching @var{filterpat} is removed.
+@end table
+
+The return value is true unless an invalid option is supplied, an option
+other than @option{-p} or @option{-r} is supplied without a @var{name}
+argument, an attempt is made to remove a completion specification for
+a @var{name} for which no specification exists, or
+an error occurs adding a completion specification.
+
+@item compopt
+@btindex compopt
+@example
+@code{compopt} [-o @var{option}] [-DEI] [+o @var{option}] [@var{name}]
+@end example
+Modify completion options for each @var{name} according to the
+@var{option}s, or for the currently-executing completion if no @var{name}s
+are supplied.
+If no @var{option}s are given, display the completion options for each
+@var{name} or the current completion.
+The possible values of @var{option} are those valid for the @code{complete}
+builtin described above.
+The @option{-D} option indicates that other supplied options should
+apply to the ``default'' command completion; that is, completion attempted
+on a command for which no completion has previously been defined.
+The @option{-E} option indicates that other supplied options should
+apply to ``empty'' command completion; that is, completion attempted on a
+blank line.
+The @option{-I} option indicates that other supplied options should
+apply to completion on the initial non-assignment word on the line, or after a
+command delimiter such as @samp{;} or @samp{|}, which is usually command
+name completion.
+
+If multiple options are supplied, the @option{-D} option takes precedence
+over @option{-E}, and both take precedence over @option{-I}
+
+The return value is true unless an invalid option is supplied, an attempt
+is made to modify the options for a @var{name} for which no completion
+specification exists, or an output error occurs.
+
+@end table
+
+@node A Programmable Completion Example
+@section A Programmable Completion Example
+
+The most common way to obtain additional completion functionality beyond
+the default actions @code{complete} and @code{compgen} provide is to use
+a shell function and bind it to a particular command using @code{complete -F}.
+
+The following function provides completions for the @code{cd} builtin.
+It is a reasonably good example of what shell functions must do when
+used for completion. This function uses the word passed as @code{$2}
+to determine the directory name to complete. You can also use the
+@code{COMP_WORDS} array variable; the current word is indexed by the
+@code{COMP_CWORD} variable.
+
+The function relies on the @code{complete} and @code{compgen} builtins
+to do much of the work, adding only the things that the Bash @code{cd}
+does beyond accepting basic directory names:
+tilde expansion (@pxref{Tilde Expansion}),
+searching directories in @var{$CDPATH}, which is described above
+(@pxref{Bourne Shell Builtins}),
+and basic support for the @code{cdable_vars} shell option
+(@pxref{The Shopt Builtin}).
+@code{_comp_cd} modifies the value of @var{IFS} so that it contains only
+a newline to accommodate file names containing spaces and tabs --
+@code{compgen} prints the possible completions it generates one per line.
+
+Possible completions go into the @var{COMPREPLY} array variable, one
+completion per array element. The programmable completion system retrieves
+the completions from there when the function returns.
+
+@example
+# A completion function for the cd builtin
+# based on the cd completion function from the bash_completion package
+_comp_cd()
+@{
+ local IFS=$' \t\n' # normalize IFS
+ local cur _skipdot _cdpath
+ local i j k
+
+ # Tilde expansion, which also expands tilde to full pathname
+ case "$2" in
+ \~*) eval cur="$2" ;;
+ *) cur=$2 ;;
+ esac
+
+ # no cdpath or absolute pathname -- straight directory completion
+ if [[ -z "$@{CDPATH:-@}" ]] || [[ "$cur" == @@(./*|../*|/*) ]]; then
+ # compgen prints paths one per line; could also use while loop
+ IFS=$'\n'
+ COMPREPLY=( $(compgen -d -- "$cur") )
+ IFS=$' \t\n'
+ # CDPATH+directories in the current directory if not in CDPATH
+ else
+ IFS=$'\n'
+ _skipdot=false
+ # preprocess CDPATH to convert null directory names to .
+ _cdpath=$@{CDPATH/#:/.:@}
+ _cdpath=$@{_cdpath//::/:.:@}
+ _cdpath=$@{_cdpath/%:/:.@}
+ for i in $@{_cdpath//:/$'\n'@}; do
+ if [[ $i -ef . ]]; then _skipdot=true; fi
+ k="$@{#COMPREPLY[@@]@}"
+ for j in $( compgen -d -- "$i/$cur" ); do
+ COMPREPLY[k++]=$@{j#$i/@} # cut off directory
+ done
+ done
+ $_skipdot || COMPREPLY+=( $(compgen -d -- "$cur") )
+ IFS=$' \t\n'
+ fi
+
+ # variable names if appropriate shell option set and no completions
+ if shopt -q cdable_vars && [[ $@{#COMPREPLY[@@]@} -eq 0 ]]; then
+ COMPREPLY=( $(compgen -v -- "$cur") )
+ fi
+
+ return 0
+@}
+@end example
+
+We install the completion function using the @option{-F} option to
+@code{complete}:
+
+@example
+# Tell readline to quote appropriate and append slashes to directories;
+# use the bash default completion for other arguments
+complete -o filenames -o nospace -o bashdefault -F _comp_cd cd
+@end example
+
+@noindent
+Since we'd like Bash and Readline to take care of some
+of the other details for us, we use several other options to tell Bash
+and Readline what to do. The @option{-o filenames} option tells Readline
+that the possible completions should be treated as filenames, and quoted
+appropriately. That option will also cause Readline to append a slash to
+filenames it can determine are directories (which is why we might want to
+extend @code{_comp_cd} to append a slash if we're using directories found
+via @var{CDPATH}: Readline can't tell those completions are directories).
+The @option{-o nospace} option tells Readline to not append a space
+character to the directory name, in case we want to append to it.
+The @option{-o bashdefault} option brings in the rest of the "Bash default"
+completions -- possible completions that Bash adds to the default Readline
+set. These include things like command name completion, variable completion
+for words beginning with @samp{$} or @samp{$@{}, completions containing pathname
+expansion patterns (@pxref{Filename Expansion}), and so on.
+
+Once installed using @code{complete}, @code{_comp_cd} will be called every
+time we attempt word completion for a @code{cd} command.
+
+Many more examples -- an extensive collection of completions for most of
+the common GNU, Unix, and Linux commands -- are available as part of the
+bash_completion project. This is installed by default on many GNU/Linux
+distributions. Originally written by Ian Macdonald, the project now lives
+at @url{https://github.com/scop/bash-completion/}. There are ports for
+other systems such as Solaris and Mac OS X.
+
+An older version of the bash_completion package is distributed with bash
+in the @file{examples/complete} subdirectory.
+
+@end ifset
diff --git a/doc/rluserman.dvi b/doc/rluserman.dvi
new file mode 100644
index 0000000..e9c9e54
--- /dev/null
+++ b/doc/rluserman.dvi
Binary files differ
diff --git a/doc/rluserman.html b/doc/rluserman.html
new file mode 100644
index 0000000..b594615
--- /dev/null
+++ b/doc/rluserman.html
@@ -0,0 +1,2529 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!-- Created by GNU Texinfo 6.8, https://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<!-- This manual describes the end user interface of the GNU Readline Library
+(version 8.2, 19 September 2022), a library which aids in the
+consistency of user interface across discrete programs which provide
+a command line interface.
+
+Copyright (C) 1988-2022 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+"GNU Free Documentation License".
+ -->
+<title>GNU Readline Library</title>
+
+<meta name="description" content="GNU Readline Library">
+<meta name="keywords" content="GNU Readline Library">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="#Top" rel="start" title="Top">
+<link href="#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="#Command-Line-Editing" rel="next" title="Command Line Editing">
+<style type="text/css">
+<!--
+a.copiable-anchor {visibility: hidden; text-decoration: none; line-height: 0em}
+a.summary-letter {text-decoration: none}
+blockquote.indentedblock {margin-right: 0em}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+kbd {font-style: oblique}
+pre.display {font-family: inherit}
+pre.format {font-family: inherit}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+span.nolinebreak {white-space: nowrap}
+span.roman {font-family: initial; font-weight: normal}
+span.sansserif {font-family: sans-serif; font-weight: normal}
+span:hover a.copiable-anchor {visibility: visible}
+ul.no-bullet {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<h1 class="settitle" align="center">GNU Readline Library</h1>
+
+
+
+
+
+
+
+
+
+<div class="top" id="Top">
+<div class="header">
+<p>
+Next: <a href="#Command-Line-Editing" accesskey="n" rel="next">Command Line Editing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="GNU-Readline-Library"></span><h1 class="top">GNU Readline Library</h1>
+
+<p>This document describes the end user interface of the GNU Readline Library,
+a utility which aids in the consistency of user interface across discrete
+programs which provide a command line interface.
+The Readline home page is <a href="http://www.gnu.org/software/readline/">http://www.gnu.org/software/readline/</a>.
+</p>
+
+
+
+
+
+<div class="Contents_element" id="SEC_Contents">
+<h2 class="contents-heading">Table of Contents</h2>
+
+<div class="contents">
+
+<ul class="no-bullet">
+ <li><a id="toc-Command-Line-Editing-1" href="#Command-Line-Editing">1 Command Line Editing</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Introduction-to-Line-Editing" href="#Introduction-and-Notation">1.1 Introduction to Line Editing</a></li>
+ <li><a id="toc-Readline-Interaction-1" href="#Readline-Interaction">1.2 Readline Interaction</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Readline-Bare-Essentials-1" href="#Readline-Bare-Essentials">1.2.1 Readline Bare Essentials</a></li>
+ <li><a id="toc-Readline-Movement-Commands-1" href="#Readline-Movement-Commands">1.2.2 Readline Movement Commands</a></li>
+ <li><a id="toc-Readline-Killing-Commands-1" href="#Readline-Killing-Commands">1.2.3 Readline Killing Commands</a></li>
+ <li><a id="toc-Readline-Arguments-1" href="#Readline-Arguments">1.2.4 Readline Arguments</a></li>
+ <li><a id="toc-Searching-for-Commands-in-the-History" href="#Searching">1.2.5 Searching for Commands in the History</a></li>
+ </ul></li>
+ <li><a id="toc-Readline-Init-File-1" href="#Readline-Init-File">1.3 Readline Init File</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Readline-Init-File-Syntax-1" href="#Readline-Init-File-Syntax">1.3.1 Readline Init File Syntax</a></li>
+ <li><a id="toc-Conditional-Init-Constructs-1" href="#Conditional-Init-Constructs">1.3.2 Conditional Init Constructs</a></li>
+ <li><a id="toc-Sample-Init-File-1" href="#Sample-Init-File">1.3.3 Sample Init File</a></li>
+ </ul></li>
+ <li><a id="toc-Bindable-Readline-Commands-1" href="#Bindable-Readline-Commands">1.4 Bindable Readline Commands</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Commands-For-Moving-1" href="#Commands-For-Moving">1.4.1 Commands For Moving</a></li>
+ <li><a id="toc-Commands-For-Manipulating-The-History" href="#Commands-For-History">1.4.2 Commands For Manipulating The History</a></li>
+ <li><a id="toc-Commands-For-Changing-Text" href="#Commands-For-Text">1.4.3 Commands For Changing Text</a></li>
+ <li><a id="toc-Killing-And-Yanking" href="#Commands-For-Killing">1.4.4 Killing And Yanking</a></li>
+ <li><a id="toc-Specifying-Numeric-Arguments" href="#Numeric-Arguments">1.4.5 Specifying Numeric Arguments</a></li>
+ <li><a id="toc-Letting-Readline-Type-For-You" href="#Commands-For-Completion">1.4.6 Letting Readline Type For You</a></li>
+ <li><a id="toc-Keyboard-Macros-1" href="#Keyboard-Macros">1.4.7 Keyboard Macros</a></li>
+ <li><a id="toc-Some-Miscellaneous-Commands" href="#Miscellaneous-Commands">1.4.8 Some Miscellaneous Commands</a></li>
+ </ul></li>
+ <li><a id="toc-Readline-vi-Mode-1" href="#Readline-vi-Mode">1.5 Readline vi Mode</a></li>
+ </ul></li>
+ <li><a id="toc-GNU-Free-Documentation-License-1" href="#GNU-Free-Documentation-License">Appendix A GNU Free Documentation License</a></li>
+</ul>
+</div>
+</div>
+<hr>
+<div class="chapter" id="Command-Line-Editing">
+<div class="header">
+<p>
+Next: <a href="#GNU-Free-Documentation-License" accesskey="n" rel="next">GNU Free Documentation License</a>, Previous: <a href="#Top" accesskey="p" rel="prev">GNU Readline Library</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU Readline Library</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Command-Line-Editing-1"></span><h2 class="chapter">1 Command Line Editing</h2>
+
+<p>This chapter describes the basic features of the <small>GNU</small>
+command line editing interface.
+</p>
+
+<ul class="section-toc">
+<li><a href="#Introduction-and-Notation" accesskey="1">Introduction to Line Editing</a></li>
+<li><a href="#Readline-Interaction" accesskey="2">Readline Interaction</a></li>
+<li><a href="#Readline-Init-File" accesskey="3">Readline Init File</a></li>
+<li><a href="#Bindable-Readline-Commands" accesskey="4">Bindable Readline Commands</a></li>
+<li><a href="#Readline-vi-Mode" accesskey="5">Readline vi Mode</a></li>
+</ul>
+<hr>
+<div class="section" id="Introduction-and-Notation">
+<div class="header">
+<p>
+Next: <a href="#Readline-Interaction" accesskey="n" rel="next">Readline Interaction</a>, Up: <a href="#Command-Line-Editing" accesskey="u" rel="up">Command Line Editing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Introduction-to-Line-Editing"></span><h3 class="section">1.1 Introduction to Line Editing</h3>
+
+<p>The following paragraphs describe the notation used to represent
+keystrokes.
+</p>
+<p>The text <kbd>C-k</kbd> is read as &lsquo;Control-K&rsquo; and describes the character
+produced when the <tt class="key">k</tt> key is pressed while the Control key
+is depressed.
+</p>
+<p>The text <kbd>M-k</kbd> is read as &lsquo;Meta-K&rsquo; and describes the character
+produced when the Meta key (if you have one) is depressed, and the <tt class="key">k</tt>
+key is pressed.
+The Meta key is labeled <tt class="key">ALT</tt> on many keyboards.
+On keyboards with two keys labeled <tt class="key">ALT</tt> (usually to either side of
+the space bar), the <tt class="key">ALT</tt> on the left side is generally set to
+work as a Meta key.
+The <tt class="key">ALT</tt> key on the right may also be configured to work as a
+Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+</p>
+<p>If you do not have a Meta or <tt class="key">ALT</tt> key, or another key working as
+a Meta key, the identical keystroke can be generated by typing <tt class="key">ESC</tt>
+<em>first</em>, and then typing <tt class="key">k</tt>.
+Either process is known as <em>metafying</em> the <tt class="key">k</tt> key.
+</p>
+<p>The text <kbd>M-C-k</kbd> is read as &lsquo;Meta-Control-k&rsquo; and describes the
+character produced by <em>metafying</em> <kbd>C-k</kbd>.
+</p>
+<p>In addition, several keys have their own names. Specifically,
+<tt class="key">DEL</tt>, <tt class="key">ESC</tt>, <tt class="key">LFD</tt>, <tt class="key">SPC</tt>, <tt class="key">RET</tt>, and <tt class="key">TAB</tt> all
+stand for themselves when seen in this text, or in an init file
+(see <a href="#Readline-Init-File">Readline Init File</a>).
+If your keyboard lacks a <tt class="key">LFD</tt> key, typing <tt class="key">C-j</tt> will
+produce the desired character.
+The <tt class="key">RET</tt> key may be labeled <tt class="key">Return</tt> or <tt class="key">Enter</tt> on
+some keyboards.
+</p>
+<hr>
+</div>
+<div class="section" id="Readline-Interaction">
+<div class="header">
+<p>
+Next: <a href="#Readline-Init-File" accesskey="n" rel="next">Readline Init File</a>, Previous: <a href="#Introduction-and-Notation" accesskey="p" rel="prev">Introduction to Line Editing</a>, Up: <a href="#Command-Line-Editing" accesskey="u" rel="up">Command Line Editing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Readline-Interaction-1"></span><h3 class="section">1.2 Readline Interaction</h3>
+<span id="index-interaction_002c-readline"></span>
+
+<p>Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled. The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line. Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections. Then, when you are satisfied with
+the line, you simply press <tt class="key">RET</tt>. You do not have to be at the
+end of the line to press <tt class="key">RET</tt>; the entire line is accepted
+regardless of the location of the cursor within the line.
+</p>
+
+<ul class="section-toc">
+<li><a href="#Readline-Bare-Essentials" accesskey="1">Readline Bare Essentials</a></li>
+<li><a href="#Readline-Movement-Commands" accesskey="2">Readline Movement Commands</a></li>
+<li><a href="#Readline-Killing-Commands" accesskey="3">Readline Killing Commands</a></li>
+<li><a href="#Readline-Arguments" accesskey="4">Readline Arguments</a></li>
+<li><a href="#Searching" accesskey="5">Searching for Commands in the History</a></li>
+</ul>
+<hr>
+<div class="subsection" id="Readline-Bare-Essentials">
+<div class="header">
+<p>
+Next: <a href="#Readline-Movement-Commands" accesskey="n" rel="next">Readline Movement Commands</a>, Up: <a href="#Readline-Interaction" accesskey="u" rel="up">Readline Interaction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Readline-Bare-Essentials-1"></span><h4 class="subsection">1.2.1 Readline Bare Essentials</h4>
+<span id="index-notation_002c-readline"></span>
+<span id="index-command-editing"></span>
+<span id="index-editing-command-lines"></span>
+
+<p>In order to enter characters into the line, simply type them. The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right. If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+</p>
+<p>Sometimes you may mistype a character, and
+not notice the error until you have typed several other characters. In
+that case, you can type <kbd>C-b</kbd> to move the cursor to the left, and then
+correct your mistake. Afterwards, you can move the cursor to the right
+with <kbd>C-f</kbd>.
+</p>
+<p>When you add text in the middle of a line, you will notice that characters
+to the right of the cursor are &lsquo;pushed over&rsquo; to make room for the text
+that you have inserted. Likewise, when you delete text behind the cursor,
+characters to the right of the cursor are &lsquo;pulled back&rsquo; to fill in the
+blank space created by the removal of the text. A list of the bare
+essentials for editing the text of an input line follows.
+</p>
+<dl compact="compact">
+<dt><span><kbd>C-b</kbd></span></dt>
+<dd><p>Move back one character.
+</p></dd>
+<dt><span><kbd>C-f</kbd></span></dt>
+<dd><p>Move forward one character.
+</p></dd>
+<dt><span><tt class="key">DEL</tt> or <tt class="key">Backspace</tt></span></dt>
+<dd><p>Delete the character to the left of the cursor.
+</p></dd>
+<dt><span><kbd>C-d</kbd></span></dt>
+<dd><p>Delete the character underneath the cursor.
+</p></dd>
+<dt><span>Printing&nbsp;characters<!-- /@w --></span></dt>
+<dd><p>Insert the character into the line at the cursor.
+</p></dd>
+<dt><span><kbd>C-_</kbd> or <kbd>C-x C-u</kbd></span></dt>
+<dd><p>Undo the last editing command. You can undo all the way back to an
+empty line.
+</p></dd>
+</dl>
+
+<p>(Depending on your configuration, the <tt class="key">Backspace</tt> key might be set to
+delete the character to the left of the cursor and the <tt class="key">DEL</tt> key set
+to delete the character underneath the cursor, like <kbd>C-d</kbd>, rather
+than the character to the left of the cursor.)
+</p>
+<hr>
+</div>
+<div class="subsection" id="Readline-Movement-Commands">
+<div class="header">
+<p>
+Next: <a href="#Readline-Killing-Commands" accesskey="n" rel="next">Readline Killing Commands</a>, Previous: <a href="#Readline-Bare-Essentials" accesskey="p" rel="prev">Readline Bare Essentials</a>, Up: <a href="#Readline-Interaction" accesskey="u" rel="up">Readline Interaction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Readline-Movement-Commands-1"></span><h4 class="subsection">1.2.2 Readline Movement Commands</h4>
+
+
+<p>The above table describes the most basic keystrokes that you need
+in order to do editing of the input line. For your convenience, many
+other commands have been added in addition to <kbd>C-b</kbd>, <kbd>C-f</kbd>,
+<kbd>C-d</kbd>, and <tt class="key">DEL</tt>. Here are some commands for moving more rapidly
+about the line.
+</p>
+<dl compact="compact">
+<dt><span><kbd>C-a</kbd></span></dt>
+<dd><p>Move to the start of the line.
+</p></dd>
+<dt><span><kbd>C-e</kbd></span></dt>
+<dd><p>Move to the end of the line.
+</p></dd>
+<dt><span><kbd>M-f</kbd></span></dt>
+<dd><p>Move forward a word, where a word is composed of letters and digits.
+</p></dd>
+<dt><span><kbd>M-b</kbd></span></dt>
+<dd><p>Move backward a word.
+</p></dd>
+<dt><span><kbd>C-l</kbd></span></dt>
+<dd><p>Clear the screen, reprinting the current line at the top.
+</p></dd>
+</dl>
+
+<p>Notice how <kbd>C-f</kbd> moves forward a character, while <kbd>M-f</kbd> moves
+forward a word. It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+</p>
+<hr>
+</div>
+<div class="subsection" id="Readline-Killing-Commands">
+<div class="header">
+<p>
+Next: <a href="#Readline-Arguments" accesskey="n" rel="next">Readline Arguments</a>, Previous: <a href="#Readline-Movement-Commands" accesskey="p" rel="prev">Readline Movement Commands</a>, Up: <a href="#Readline-Interaction" accesskey="u" rel="up">Readline Interaction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Readline-Killing-Commands-1"></span><h4 class="subsection">1.2.3 Readline Killing Commands</h4>
+
+<span id="index-killing-text"></span>
+<span id="index-yanking-text"></span>
+
+<p><em>Killing</em> text means to delete the text from the line, but to save
+it away for later use, usually by <em>yanking</em> (re-inserting)
+it back into the line.
+(&lsquo;Cut&rsquo; and &lsquo;paste&rsquo; are more recent jargon for &lsquo;kill&rsquo; and &lsquo;yank&rsquo;.)
+</p>
+<p>If the description for a command says that it &lsquo;kills&rsquo; text, then you can
+be sure that you can get the text back in a different (or the same)
+place later.
+</p>
+<p>When you use a kill command, the text is saved in a <em>kill-ring</em>.
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all. The kill
+ring is not line specific; the text that you killed on a previously
+typed line is available to be yanked back later, when you are typing
+another line.
+<span id="index-kill-ring"></span>
+</p>
+<p>Here is the list of commands for killing text.
+</p>
+<dl compact="compact">
+<dt><span><kbd>C-k</kbd></span></dt>
+<dd><p>Kill the text from the current cursor position to the end of the line.
+</p>
+</dd>
+<dt><span><kbd>M-d</kbd></span></dt>
+<dd><p>Kill from the cursor to the end of the current word, or, if between
+words, to the end of the next word.
+Word boundaries are the same as those used by <kbd>M-f</kbd>.
+</p>
+</dd>
+<dt><span><kbd>M-<span class="key">DEL</span></kbd></span></dt>
+<dd><p>Kill from the cursor to the start of the current word, or, if between
+words, to the start of the previous word.
+Word boundaries are the same as those used by <kbd>M-b</kbd>.
+</p>
+</dd>
+<dt><span><kbd>C-w</kbd></span></dt>
+<dd><p>Kill from the cursor to the previous whitespace. This is different than
+<kbd>M-<span class="key">DEL</span></kbd> because the word boundaries differ.
+</p>
+</dd>
+</dl>
+
+<p>Here is how to <em>yank</em> the text back into the line. Yanking
+means to copy the most-recently-killed text from the kill buffer.
+</p>
+<dl compact="compact">
+<dt><span><kbd>C-y</kbd></span></dt>
+<dd><p>Yank the most recently killed text back into the buffer at the cursor.
+</p>
+</dd>
+<dt><span><kbd>M-y</kbd></span></dt>
+<dd><p>Rotate the kill-ring, and yank the new top. You can only do this if
+the prior command is <kbd>C-y</kbd> or <kbd>M-y</kbd>.
+</p></dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Readline-Arguments">
+<div class="header">
+<p>
+Next: <a href="#Searching" accesskey="n" rel="next">Searching for Commands in the History</a>, Previous: <a href="#Readline-Killing-Commands" accesskey="p" rel="prev">Readline Killing Commands</a>, Up: <a href="#Readline-Interaction" accesskey="u" rel="up">Readline Interaction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Readline-Arguments-1"></span><h4 class="subsection">1.2.4 Readline Arguments</h4>
+
+<p>You can pass numeric arguments to Readline commands. Sometimes the
+argument acts as a repeat count, other times it is the <i>sign</i> of the
+argument that is significant. If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction. For example, to kill text back to the
+start of the line, you might type &lsquo;<samp>M-- C-k</samp>&rsquo;.
+</p>
+<p>The general way to pass numeric arguments to a command is to type meta
+digits before the command. If the first &lsquo;digit&rsquo; typed is a minus
+sign (&lsquo;<samp>-</samp>&rsquo;), then the sign of the argument will be negative. Once
+you have typed one meta digit to get the argument started, you can type
+the remainder of the digits, and then the command. For example, to give
+the <kbd>C-d</kbd> command an argument of 10, you could type &lsquo;<samp>M-1 0 C-d</samp>&rsquo;,
+which will delete the next ten characters on the input line.
+</p>
+<hr>
+</div>
+<div class="subsection" id="Searching">
+<div class="header">
+<p>
+Previous: <a href="#Readline-Arguments" accesskey="p" rel="prev">Readline Arguments</a>, Up: <a href="#Readline-Interaction" accesskey="u" rel="up">Readline Interaction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Searching-for-Commands-in-the-History"></span><h4 class="subsection">1.2.5 Searching for Commands in the History</h4>
+
+<p>Readline provides commands for searching through the command history
+for lines containing a specified string.
+There are two search modes: <em>incremental</em> and <em>non-incremental</em>.
+</p>
+<p>Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, Readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+To search backward in the history for a particular string, type
+<kbd>C-r</kbd>. Typing <kbd>C-s</kbd> searches forward through the history.
+The characters present in the value of the <code>isearch-terminators</code> variable
+are used to terminate an incremental search.
+If that variable has not been assigned a value, the <tt class="key">ESC</tt> and
+<kbd>C-J</kbd> characters will terminate an incremental search.
+<kbd>C-g</kbd> will abort an incremental search and restore the original line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+</p>
+<p>To find other matching entries in the history list, type <kbd>C-r</kbd> or
+<kbd>C-s</kbd> as appropriate.
+This will search backward or forward in the history for the next
+entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate
+the search and execute that command.
+For instance, a <tt class="key">RET</tt> will terminate the search and accept
+the line, thereby executing the command from the history list.
+A movement command will terminate the search, make the last line found
+the current line, and begin editing.
+</p>
+<p>Readline remembers the last incremental search string. If two
+<kbd>C-r</kbd>s are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+</p>
+<p>Non-incremental searches read the entire search string before starting
+to search for matching history lines. The search string may be
+typed by the user or be part of the contents of the current line.
+</p>
+<hr>
+</div>
+</div>
+<div class="section" id="Readline-Init-File">
+<div class="header">
+<p>
+Next: <a href="#Bindable-Readline-Commands" accesskey="n" rel="next">Bindable Readline Commands</a>, Previous: <a href="#Readline-Interaction" accesskey="p" rel="prev">Readline Interaction</a>, Up: <a href="#Command-Line-Editing" accesskey="u" rel="up">Command Line Editing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Readline-Init-File-1"></span><h3 class="section">1.3 Readline Init File</h3>
+<span id="index-initialization-file_002c-readline"></span>
+
+<p>Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.
+Any user can customize programs that use Readline by putting
+commands in an <em>inputrc</em> file,
+conventionally in their home directory.
+The name of this
+file is taken from the value of the environment variable <code>INPUTRC</code>. If
+that variable is unset, the default is <samp>~/.inputrc</samp>. If that
+file does not exist or cannot be read, the ultimate default is
+<samp>/etc/inputrc</samp>.
+</p>
+<p>When a program which uses the Readline library starts up, the
+init file is read, and the key bindings are set.
+</p>
+<p>In addition, the <code>C-x C-r</code> command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+</p>
+
+<ul class="section-toc">
+<li><a href="#Readline-Init-File-Syntax" accesskey="1">Readline Init File Syntax</a></li>
+<li><a href="#Conditional-Init-Constructs" accesskey="2">Conditional Init Constructs</a></li>
+<li><a href="#Sample-Init-File" accesskey="3">Sample Init File</a></li>
+</ul>
+<hr>
+<div class="subsection" id="Readline-Init-File-Syntax">
+<div class="header">
+<p>
+Next: <a href="#Conditional-Init-Constructs" accesskey="n" rel="next">Conditional Init Constructs</a>, Up: <a href="#Readline-Init-File" accesskey="u" rel="up">Readline Init File</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Readline-Init-File-Syntax-1"></span><h4 class="subsection">1.3.1 Readline Init File Syntax</h4>
+
+<p>There are only a few basic constructs allowed in the
+Readline init file. Blank lines are ignored.
+Lines beginning with a &lsquo;<samp>#</samp>&rsquo; are comments.
+Lines beginning with a &lsquo;<samp>$</samp>&rsquo; indicate conditional
+constructs (see <a href="#Conditional-Init-Constructs">Conditional Init Constructs</a>). Other lines
+denote variable settings and key bindings.
+</p>
+<dl compact="compact">
+<dt><span>Variable Settings</span></dt>
+<dd><p>You can modify the run-time behavior of Readline by
+altering the values of variables in Readline
+using the <code>set</code> command within the init file.
+The syntax is simple:
+</p>
+<div class="example">
+<pre class="example">set <var>variable</var> <var>value</var>
+</pre></div>
+
+<p>Here, for example, is how to
+change from the default Emacs-like key binding to use
+<code>vi</code> line editing commands:
+</p>
+<div class="example">
+<pre class="example">set editing-mode vi
+</pre></div>
+
+<p>Variable names and values, where appropriate, are recognized without regard
+to case. Unrecognized variable names are ignored.
+</p>
+<p>Boolean variables (those that can be set to on or off) are set to on if
+the value is null or empty, <var>on</var> (case-insensitive), or 1. Any other
+value results in the variable being set to off.
+</p>
+
+<p>A great deal of run-time behavior is changeable with the following
+variables.
+</p>
+<span id="index-variables_002c-readline"></span>
+<dl compact="compact">
+<dt id='index-active_002dregion_002dstart_002dcolor'><span><code>active-region-start-color</code><a href='#index-active_002dregion_002dstart_002dcolor' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A string variable that controls the text color and background when displaying
+the text in the active region (see the description of
+<code>enable-active-region</code> below).
+This string must not take up any physical character positions on the display,
+so it should consist only of terminal escape sequences.
+It is output to the terminal before displaying the text in the active region.
+This variable is reset to the default value whenever the terminal type changes.
+The default value is the string that puts the terminal in standout mode,
+as obtained from the terminal&rsquo;s terminfo description.
+A sample value might be &lsquo;<samp>\e[01;33m</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-active_002dregion_002dend_002dcolor'><span><code>active-region-end-color</code><a href='#index-active_002dregion_002dend_002dcolor' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A string variable that &quot;undoes&quot; the effects of <code>active-region-start-color</code>
+and restores &quot;normal&quot; terminal display appearance after displaying text
+in the active region.
+This string must not take up any physical character positions on the display,
+so it should consist only of terminal escape sequences.
+It is output to the terminal after displaying the text in the active region.
+This variable is reset to the default value whenever the terminal type changes.
+The default value is the string that restores the terminal from standout mode,
+as obtained from the terminal&rsquo;s terminfo description.
+A sample value might be &lsquo;<samp>\e[0m</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-bell_002dstyle'><span><code>bell-style</code><a href='#index-bell_002dstyle' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Controls what happens when Readline wants to ring the terminal bell.
+If set to &lsquo;<samp>none</samp>&rsquo;, Readline never rings the bell. If set to
+&lsquo;<samp>visible</samp>&rsquo;, Readline uses a visible bell if one is available.
+If set to &lsquo;<samp>audible</samp>&rsquo; (the default), Readline attempts to ring
+the terminal&rsquo;s bell.
+</p>
+</dd>
+<dt id='index-bind_002dtty_002dspecial_002dchars'><span><code>bind-tty-special-chars</code><a href='#index-bind_002dtty_002dspecial_002dchars' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo; (the default), Readline attempts to bind the control
+characters treated specially by the kernel&rsquo;s terminal driver to their
+Readline equivalents.
+</p>
+</dd>
+<dt id='index-blink_002dmatching_002dparen'><span><code>blink-matching-paren</code><a href='#index-blink_002dmatching_002dparen' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline attempts to briefly move the cursor to an
+opening parenthesis when a closing parenthesis is inserted. The default
+is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-colored_002dcompletion_002dprefix'><span><code>colored-completion-prefix</code><a href='#index-colored_002dcompletion_002dprefix' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, when listing completions, Readline displays the
+common prefix of the set of possible completions using a different color.
+The color definitions are taken from the value of the <code>LS_COLORS</code>
+environment variable.
+If there is a color definition in <code>LS_COLORS</code> for the custom suffix
+&lsquo;<samp>readline-colored-completion-prefix</samp>&rsquo;, Readline uses this color for
+the common prefix instead of its default.
+The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-colored_002dstats'><span><code>colored-stats</code><a href='#index-colored_002dstats' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline displays possible completions using different
+colors to indicate their file type.
+The color definitions are taken from the value of the <code>LS_COLORS</code>
+environment variable.
+The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-comment_002dbegin'><span><code>comment-begin</code><a href='#index-comment_002dbegin' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The string to insert at the beginning of the line when the
+<code>insert-comment</code> command is executed. The default value
+is <code>&quot;#&quot;</code>.
+</p>
+</dd>
+<dt id='index-completion_002ddisplay_002dwidth'><span><code>completion-display-width</code><a href='#index-completion_002ddisplay_002dwidth' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The number of screen columns used to display possible matches
+when performing completion.
+The value is ignored if it is less than 0 or greater than the terminal
+screen width.
+A value of 0 will cause matches to be displayed one per line.
+The default value is -1.
+</p>
+</dd>
+<dt id='index-completion_002dignore_002dcase'><span><code>completion-ignore-case</code><a href='#index-completion_002dignore_002dcase' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline performs filename matching and completion
+in a case-insensitive fashion.
+The default value is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-completion_002dmap_002dcase'><span><code>completion-map-case</code><a href='#index-completion_002dmap_002dcase' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, and <var>completion-ignore-case</var> is enabled, Readline
+treats hyphens (&lsquo;<samp>-</samp>&rsquo;) and underscores (&lsquo;<samp>_</samp>&rsquo;) as equivalent when
+performing case-insensitive filename matching and completion.
+The default value is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-completion_002dprefix_002ddisplay_002dlength'><span><code>completion-prefix-display-length</code><a href='#index-completion_002dprefix_002ddisplay_002dlength' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The length in characters of the common prefix of a list of possible
+completions that is displayed without modification. When set to a
+value greater than zero, common prefixes longer than this value are
+replaced with an ellipsis when displaying possible completions.
+</p>
+</dd>
+<dt id='index-completion_002dquery_002ditems'><span><code>completion-query-items</code><a href='#index-completion_002dquery_002ditems' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The number of possible completions that determines when the user is
+asked whether the list of possibilities should be displayed.
+If the number of possible completions is greater than or equal to this value,
+Readline will ask whether or not the user wishes to view them;
+otherwise, they are simply listed.
+This variable must be set to an integer value greater than or equal to zero.
+A zero value means Readline should never ask; negative values are
+treated as zero.
+The default limit is <code>100</code>.
+</p>
+</dd>
+<dt id='index-convert_002dmeta'><span><code>convert-meta</code><a href='#index-convert_002dmeta' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline will convert characters with the
+eighth bit set to an <small>ASCII</small> key sequence by stripping the eighth
+bit and prefixing an <tt class="key">ESC</tt> character, converting them to a
+meta-prefixed key sequence.
+The default value is &lsquo;<samp>on</samp>&rsquo;, but
+will be set to &lsquo;<samp>off</samp>&rsquo; if the locale is one that contains
+eight-bit characters.
+This variable is dependent on the <code>LC_CTYPE</code> locale category, and
+may change if the locale is changed.
+</p>
+</dd>
+<dt id='index-disable_002dcompletion'><span><code>disable-completion</code><a href='#index-disable_002dcompletion' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>On</samp>&rsquo;, Readline will inhibit word completion.
+Completion characters will be inserted into the line as if they had
+been mapped to <code>self-insert</code>. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-echo_002dcontrol_002dcharacters'><span><code>echo-control-characters</code><a href='#index-echo_002dcontrol_002dcharacters' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When set to &lsquo;<samp>on</samp>&rsquo;, on operating systems that indicate they support it,
+Readline echoes a character corresponding to a signal generated from the
+keyboard. The default is &lsquo;<samp>on</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-editing_002dmode'><span><code>editing-mode</code><a href='#index-editing_002dmode' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The <code>editing-mode</code> variable controls which default set of
+key bindings is used. By default, Readline starts up in Emacs editing
+mode, where the keystrokes are most similar to Emacs. This variable can be
+set to either &lsquo;<samp>emacs</samp>&rsquo; or &lsquo;<samp>vi</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-emacs_002dmode_002dstring'><span><code>emacs-mode-string</code><a href='#index-emacs_002dmode_002dstring' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If the <var>show-mode-in-prompt</var> variable is enabled,
+this string is displayed immediately before the last line of the primary
+prompt when emacs editing mode is active. The value is expanded like a
+key binding, so the standard set of meta- and control prefixes and
+backslash escape sequences is available.
+Use the &lsquo;<samp>\1</samp>&rsquo; and &lsquo;<samp>\2</samp>&rsquo; escapes to begin and end sequences of
+non-printing characters, which can be used to embed a terminal control
+sequence into the mode string.
+The default is &lsquo;<samp>@</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-enable_002dactive_002dregion'><span><code>enable-active-region</code><a href='#index-enable_002dactive_002dregion' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The <em>point</em> is the current cursor position, and <em>mark</em> refers
+to a saved cursor position (see <a href="#Commands-For-Moving">Commands For Moving</a>).
+The text between the point and mark is referred to as the <em>region</em>.
+When this variable is set to &lsquo;<samp>On</samp>&rsquo;, Readline allows certain commands
+to designate the region as <em>active</em>.
+When the region is active, Readline highlights the text in the region using
+the value of the <code>active-region-start-color</code>, which defaults to the
+string that enables
+the terminal&rsquo;s standout mode.
+The active region shows the text inserted by bracketed-paste and any
+matching text found by incremental and non-incremental history searches.
+The default is &lsquo;<samp>On</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-enable_002dbracketed_002dpaste'><span><code>enable-bracketed-paste</code><a href='#index-enable_002dbracketed_002dpaste' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When set to &lsquo;<samp>On</samp>&rsquo;, Readline configures the terminal to insert each
+paste into the editing buffer as a single string of characters, instead
+of treating each character as if it had been read from the keyboard.
+This is called putting the terminal into <em>bracketed paste mode</em>;
+it prevents Readline from executing any editing commands bound to key
+sequences appearing in the pasted text.
+The default is &lsquo;<samp>On</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-enable_002dkeypad'><span><code>enable-keypad</code><a href='#index-enable_002dkeypad' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When set to &lsquo;<samp>on</samp>&rsquo;, Readline will try to enable the application
+keypad when it is called. Some systems need this to enable the
+arrow keys. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt><span><code>enable-meta-key</code></span></dt>
+<dd><p>When set to &lsquo;<samp>on</samp>&rsquo;, Readline will try to enable any meta modifier
+key the terminal claims to support when it is called. On many terminals,
+the meta key is used to send eight-bit characters.
+The default is &lsquo;<samp>on</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-expand_002dtilde'><span><code>expand-tilde</code><a href='#index-expand_002dtilde' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, tilde expansion is performed when Readline
+attempts word completion. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-history_002dpreserve_002dpoint'><span><code>history-preserve-point</code><a href='#index-history_002dpreserve_002dpoint' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, the history code attempts to place the point (the
+current cursor position) at the
+same location on each history line retrieved with <code>previous-history</code>
+or <code>next-history</code>. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-history_002dsize'><span><code>history-size</code><a href='#index-history_002dsize' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set the maximum number of history entries saved in the history list.
+If set to zero, any existing history entries are deleted and no new entries
+are saved.
+If set to a value less than zero, the number of history entries is not
+limited.
+By default, the number of history entries is not limited.
+If an attempt is made to set <var>history-size</var> to a non-numeric value,
+the maximum number of history entries will be set to 500.
+</p>
+</dd>
+<dt id='index-horizontal_002dscroll_002dmode'><span><code>horizontal-scroll-mode</code><a href='#index-horizontal_002dscroll_002dmode' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This variable can be set to either &lsquo;<samp>on</samp>&rsquo; or &lsquo;<samp>off</samp>&rsquo;. Setting it
+to &lsquo;<samp>on</samp>&rsquo; means that the text of the lines being edited will scroll
+horizontally on a single screen line when they are longer than the width
+of the screen, instead of wrapping onto a new screen line.
+This variable is automatically set to &lsquo;<samp>on</samp>&rsquo; for terminals of height 1.
+By default, this variable is set to &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-input_002dmeta'><span><code>input-meta</code><a href='#index-input_002dmeta' class='copiable-anchor'> &para;</a></span></dt>
+<dd><span id="index-meta_002dflag"></span>
+<p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline will enable eight-bit input (it
+will not clear the eighth bit in the characters it reads),
+regardless of what the terminal claims it can support. The
+default value is &lsquo;<samp>off</samp>&rsquo;, but Readline will set it to &lsquo;<samp>on</samp>&rsquo; if the
+locale contains eight-bit characters.
+The name <code>meta-flag</code> is a synonym for this variable.
+This variable is dependent on the <code>LC_CTYPE</code> locale category, and
+may change if the locale is changed.
+</p>
+</dd>
+<dt id='index-isearch_002dterminators'><span><code>isearch-terminators</code><a href='#index-isearch_002dterminators' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The string of characters that should terminate an incremental search without
+subsequently executing the character as a command (see <a href="#Searching">Searching for Commands in the History</a>).
+If this variable has not been given a value, the characters <tt class="key">ESC</tt> and
+<kbd>C-J</kbd> will terminate an incremental search.
+</p>
+</dd>
+<dt id='index-keymap'><span><code>keymap</code><a href='#index-keymap' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Sets Readline&rsquo;s idea of the current keymap for key binding commands.
+Built-in <code>keymap</code> names are
+<code>emacs</code>,
+<code>emacs-standard</code>,
+<code>emacs-meta</code>,
+<code>emacs-ctlx</code>,
+<code>vi</code>,
+<code>vi-move</code>,
+<code>vi-command</code>, and
+<code>vi-insert</code>.
+<code>vi</code> is equivalent to <code>vi-command</code> (<code>vi-move</code> is also a
+synonym); <code>emacs</code> is equivalent to <code>emacs-standard</code>.
+Applications may add additional names.
+The default value is <code>emacs</code>.
+The value of the <code>editing-mode</code> variable also affects the
+default keymap.
+</p>
+</dd>
+<dt><span><code>keyseq-timeout</code></span></dt>
+<dd><p>Specifies the duration Readline will wait for a character when reading an
+ambiguous key sequence (one that can form a complete key sequence using
+the input read so far, or can take additional input to complete a longer
+key sequence).
+If no input is received within the timeout, Readline will use the shorter
+but complete key sequence.
+Readline uses this value to determine whether or not input is
+available on the current input source (<code>rl_instream</code> by default).
+The value is specified in milliseconds, so a value of 1000 means that
+Readline will wait one second for additional input.
+If this variable is set to a value less than or equal to zero, or to a
+non-numeric value, Readline will wait until another key is pressed to
+decide which key sequence to complete.
+The default value is <code>500</code>.
+</p>
+</dd>
+<dt><span><code>mark-directories</code></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, completed directory names have a slash
+appended. The default is &lsquo;<samp>on</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-mark_002dmodified_002dlines'><span><code>mark-modified-lines</code><a href='#index-mark_002dmodified_002dlines' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This variable, when set to &lsquo;<samp>on</samp>&rsquo;, causes Readline to display an
+asterisk (&lsquo;<samp>*</samp>&rsquo;) at the start of history lines which have been modified.
+This variable is &lsquo;<samp>off</samp>&rsquo; by default.
+</p>
+</dd>
+<dt id='index-mark_002dsymlinked_002ddirectories'><span><code>mark-symlinked-directories</code><a href='#index-mark_002dsymlinked_002ddirectories' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, completed names which are symbolic links
+to directories have a slash appended (subject to the value of
+<code>mark-directories</code>).
+The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-match_002dhidden_002dfiles'><span><code>match-hidden-files</code><a href='#index-match_002dhidden_002dfiles' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This variable, when set to &lsquo;<samp>on</samp>&rsquo;, causes Readline to match files whose
+names begin with a &lsquo;<samp>.</samp>&rsquo; (hidden files) when performing filename
+completion.
+If set to &lsquo;<samp>off</samp>&rsquo;, the leading &lsquo;<samp>.</samp>&rsquo; must be
+supplied by the user in the filename to be completed.
+This variable is &lsquo;<samp>on</samp>&rsquo; by default.
+</p>
+</dd>
+<dt id='index-menu_002dcomplete_002ddisplay_002dprefix'><span><code>menu-complete-display-prefix</code><a href='#index-menu_002dcomplete_002ddisplay_002dprefix' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, menu completion displays the common prefix of the
+list of possible completions (which may be empty) before cycling through
+the list. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-output_002dmeta'><span><code>output-meta</code><a href='#index-output_002dmeta' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.
+The default is &lsquo;<samp>off</samp>&rsquo;, but Readline will set it to &lsquo;<samp>on</samp>&rsquo; if the
+locale contains eight-bit characters.
+This variable is dependent on the <code>LC_CTYPE</code> locale category, and
+may change if the locale is changed.
+</p>
+</dd>
+<dt id='index-page_002dcompletions'><span><code>page-completions</code><a href='#index-page_002dcompletions' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline uses an internal <code>more</code>-like pager
+to display a screenful of possible completions at a time.
+This variable is &lsquo;<samp>on</samp>&rsquo; by default.
+</p>
+</dd>
+<dt><span><code>print-completions-horizontally</code></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-revert_002dall_002dat_002dnewline'><span><code>revert-all-at-newline</code><a href='#index-revert_002dall_002dat_002dnewline' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, Readline will undo all changes to history lines
+before returning when <code>accept-line</code> is executed. By default,
+history lines may be modified and retain individual undo lists across
+calls to <code>readline()</code>. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-show_002dall_002dif_002dambiguous'><span><code>show-all-if-ambiguous</code><a href='#index-show_002dall_002dif_002dambiguous' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This alters the default behavior of the completion functions. If
+set to &lsquo;<samp>on</samp>&rsquo;,
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+The default value is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-show_002dall_002dif_002dunmodified'><span><code>show-all-if-unmodified</code><a href='#index-show_002dall_002dif_002dunmodified' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This alters the default behavior of the completion functions in
+a fashion similar to <var>show-all-if-ambiguous</var>.
+If set to &lsquo;<samp>on</samp>&rsquo;,
+words which have more than one possible completion without any
+possible partial completion (the possible completions don&rsquo;t share
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+The default value is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-show_002dmode_002din_002dprompt'><span><code>show-mode-in-prompt</code><a href='#index-show_002dmode_002din_002dprompt' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, add a string to the beginning of the prompt
+indicating the editing mode: emacs, vi command, or vi insertion.
+The mode strings are user-settable (e.g., <var>emacs-mode-string</var>).
+The default value is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-skip_002dcompleted_002dtext'><span><code>skip-completed-text</code><a href='#index-skip_002dcompleted_002dtext' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, this alters the default completion behavior when
+inserting a single match into the line. It&rsquo;s only active when
+performing completion in the middle of a word. If enabled, Readline
+does not insert characters from the completion that match characters
+after point in the word being completed, so portions of the word
+following the cursor are not duplicated.
+For instance, if this is enabled, attempting completion when the cursor
+is after the &lsquo;<samp>e</samp>&rsquo; in &lsquo;<samp>Makefile</samp>&rsquo; will result in &lsquo;<samp>Makefile</samp>&rsquo;
+rather than &lsquo;<samp>Makefilefile</samp>&rsquo;, assuming there is a single possible
+completion.
+The default value is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-vi_002dcmd_002dmode_002dstring'><span><code>vi-cmd-mode-string</code><a href='#index-vi_002dcmd_002dmode_002dstring' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If the <var>show-mode-in-prompt</var> variable is enabled,
+this string is displayed immediately before the last line of the primary
+prompt when vi editing mode is active and in command mode.
+The value is expanded like a
+key binding, so the standard set of meta- and control prefixes and
+backslash escape sequences is available.
+Use the &lsquo;<samp>\1</samp>&rsquo; and &lsquo;<samp>\2</samp>&rsquo; escapes to begin and end sequences of
+non-printing characters, which can be used to embed a terminal control
+sequence into the mode string.
+The default is &lsquo;<samp>(cmd)</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-vi_002dins_002dmode_002dstring'><span><code>vi-ins-mode-string</code><a href='#index-vi_002dins_002dmode_002dstring' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If the <var>show-mode-in-prompt</var> variable is enabled,
+this string is displayed immediately before the last line of the primary
+prompt when vi editing mode is active and in insertion mode.
+The value is expanded like a
+key binding, so the standard set of meta- and control prefixes and
+backslash escape sequences is available.
+Use the &lsquo;<samp>\1</samp>&rsquo; and &lsquo;<samp>\2</samp>&rsquo; escapes to begin and end sequences of
+non-printing characters, which can be used to embed a terminal control
+sequence into the mode string.
+The default is &lsquo;<samp>(ins)</samp>&rsquo;.
+</p>
+</dd>
+<dt id='index-visible_002dstats'><span><code>visible-stats</code><a href='#index-visible_002dstats' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If set to &lsquo;<samp>on</samp>&rsquo;, a character denoting a file&rsquo;s type
+is appended to the filename when listing possible
+completions. The default is &lsquo;<samp>off</samp>&rsquo;.
+</p>
+</dd>
+</dl>
+
+</dd>
+<dt><span>Key Bindings</span></dt>
+<dd><p>The syntax for controlling key bindings in the init file is
+simple. First you need to find the name of the command that you
+want to change. The following sections contain tables of the command
+name, the default keybinding, if any, and a short description of what
+the command does.
+</p>
+<p>Once you know the name of the command, simply place on a line
+in the init file the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command.
+There can be no space between the key name and the colon &ndash; that will be
+interpreted as part of the key name.
+The name of the key can be expressed in different ways, depending on
+what you find most comfortable.
+</p>
+<p>In addition to command names, Readline allows keys to be bound
+to a string that is inserted when the key is pressed (a <var>macro</var>).
+</p>
+
+<dl compact="compact">
+<dt><span><var>keyname</var>:&nbsp;<var><span class="nolinebreak">function-name</span></var>&nbsp;or&nbsp;<var>macro</var><!-- /@w --></span></dt>
+<dd><p><var>keyname</var> is the name of a key spelled out in English. For example:
+</p><div class="example">
+<pre class="example">Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: &quot;&gt; output&quot;
+</pre></div>
+
+<p>In the example above, <kbd>C-u</kbd> is bound to the function
+<code>universal-argument</code>,
+<kbd>M-DEL</kbd> is bound to the function <code>backward-kill-word</code>, and
+<kbd>C-o</kbd> is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+&lsquo;<samp>&gt; output</samp>&rsquo; into the line).
+</p>
+<p>A number of symbolic character names are recognized while
+processing this key binding syntax:
+<var>DEL</var>,
+<var>ESC</var>,
+<var>ESCAPE</var>,
+<var>LFD</var>,
+<var>NEWLINE</var>,
+<var>RET</var>,
+<var>RETURN</var>,
+<var>RUBOUT</var>,
+<var>SPACE</var>,
+<var>SPC</var>,
+and
+<var>TAB</var>.
+</p>
+</dd>
+<dt><span>&quot;<var>keyseq</var>&quot;:&nbsp;<var><span class="nolinebreak">function-name</span></var>&nbsp;or&nbsp;<var>macro</var><!-- /@w --></span></dt>
+<dd><p><var>keyseq</var> differs from <var>keyname</var> above in that strings
+denoting an entire key sequence can be specified, by placing
+the key sequence in double quotes. Some <small>GNU</small> Emacs style key
+escapes can be used, as in the following example, but the
+special character names are not recognized.
+</p>
+<div class="example">
+<pre class="example">&quot;\C-u&quot;: universal-argument
+&quot;\C-x\C-r&quot;: re-read-init-file
+&quot;\e[11~&quot;: &quot;Function Key 1&quot;
+</pre></div>
+
+<p>In the above example, <kbd>C-u</kbd> is again bound to the function
+<code>universal-argument</code> (just as it was in the first example),
+&lsquo;<samp><kbd>C-x</kbd> <kbd>C-r</kbd></samp>&rsquo; is bound to the function <code>re-read-init-file</code>,
+and &lsquo;<samp><span class="key">ESC</span> <span class="key">[</span> <span class="key">1</span> <span class="key">1</span> <span class="key">~</span></samp>&rsquo; is bound to insert
+the text &lsquo;<samp>Function Key 1</samp>&rsquo;.
+</p>
+</dd>
+</dl>
+
+<p>The following <small>GNU</small> Emacs style escape sequences are available when
+specifying key sequences:
+</p>
+<dl compact="compact">
+<dt><span><code><kbd>\C-</kbd></code></span></dt>
+<dd><p>control prefix
+</p></dd>
+<dt><span><code><kbd>\M-</kbd></code></span></dt>
+<dd><p>meta prefix
+</p></dd>
+<dt><span><code><kbd>\e</kbd></code></span></dt>
+<dd><p>an escape character
+</p></dd>
+<dt><span><code><kbd>\\</kbd></code></span></dt>
+<dd><p>backslash
+</p></dd>
+<dt><span><code><kbd>\&quot;</kbd></code></span></dt>
+<dd><p><tt class="key">&quot;</tt>, a double quotation mark
+</p></dd>
+<dt><span><code><kbd>\'</kbd></code></span></dt>
+<dd><p><tt class="key">'</tt>, a single quote or apostrophe
+</p></dd>
+</dl>
+
+<p>In addition to the <small>GNU</small> Emacs style escape sequences, a second
+set of backslash escapes is available:
+</p>
+<dl compact="compact">
+<dt><span><code>\a</code></span></dt>
+<dd><p>alert (bell)
+</p></dd>
+<dt><span><code>\b</code></span></dt>
+<dd><p>backspace
+</p></dd>
+<dt><span><code>\d</code></span></dt>
+<dd><p>delete
+</p></dd>
+<dt><span><code>\f</code></span></dt>
+<dd><p>form feed
+</p></dd>
+<dt><span><code>\n</code></span></dt>
+<dd><p>newline
+</p></dd>
+<dt><span><code>\r</code></span></dt>
+<dd><p>carriage return
+</p></dd>
+<dt><span><code>\t</code></span></dt>
+<dd><p>horizontal tab
+</p></dd>
+<dt><span><code>\v</code></span></dt>
+<dd><p>vertical tab
+</p></dd>
+<dt><span><code>\<var>nnn</var></code></span></dt>
+<dd><p>the eight-bit character whose value is the octal value <var>nnn</var>
+(one to three digits)
+</p></dd>
+<dt><span><code>\x<var>HH</var></code></span></dt>
+<dd><p>the eight-bit character whose value is the hexadecimal value <var>HH</var>
+(one or two hex digits)
+</p></dd>
+</dl>
+
+<p>When entering the text of a macro, single or double quotes must
+be used to indicate a macro definition.
+Unquoted text is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including &lsquo;<samp>&quot;</samp>&rsquo; and &lsquo;<samp>'</samp>&rsquo;.
+For example, the following binding will make &lsquo;<samp><kbd>C-x</kbd> \</samp>&rsquo;
+insert a single &lsquo;<samp>\</samp>&rsquo; into the line:
+</p><div class="example">
+<pre class="example">&quot;\C-x\\&quot;: &quot;\\&quot;
+</pre></div>
+
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Conditional-Init-Constructs">
+<div class="header">
+<p>
+Next: <a href="#Sample-Init-File" accesskey="n" rel="next">Sample Init File</a>, Previous: <a href="#Readline-Init-File-Syntax" accesskey="p" rel="prev">Readline Init File Syntax</a>, Up: <a href="#Readline-Init-File" accesskey="u" rel="up">Readline Init File</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Conditional-Init-Constructs-1"></span><h4 class="subsection">1.3.2 Conditional Init Constructs</h4>
+
+<p>Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests. There are four parser directives used.
+</p>
+<dl compact="compact">
+<dt><span><code>$if</code></span></dt>
+<dd><p>The <code>$if</code> construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+Readline. The text of the test, after any comparison operator,
+extends to the end of the line;
+unless otherwise noted, no characters are required to isolate it.
+</p>
+<dl compact="compact">
+<dt><span><code>mode</code></span></dt>
+<dd><p>The <code>mode=</code> form of the <code>$if</code> directive is used to test
+whether Readline is in <code>emacs</code> or <code>vi</code> mode.
+This may be used in conjunction
+with the &lsquo;<samp>set keymap</samp>&rsquo; command, for instance, to set bindings in
+the <code>emacs-standard</code> and <code>emacs-ctlx</code> keymaps only if
+Readline is starting out in <code>emacs</code> mode.
+</p>
+</dd>
+<dt><span><code>term</code></span></dt>
+<dd><p>The <code>term=</code> form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal&rsquo;s function keys. The word on the right side of the
+&lsquo;<samp>=</samp>&rsquo; is tested against both the full name of the terminal and
+the portion of the terminal name before the first &lsquo;<samp>-</samp>&rsquo;. This
+allows <code>sun</code> to match both <code>sun</code> and <code>sun-cmd</code>,
+for instance.
+</p>
+</dd>
+<dt><span><code>version</code></span></dt>
+<dd><p>The <code>version</code> test may be used to perform comparisons against
+specific Readline versions.
+The <code>version</code> expands to the current Readline version.
+The set of comparison operators includes
+&lsquo;<samp>=</samp>&rsquo; (and &lsquo;<samp>==</samp>&rsquo;), &lsquo;<samp>!=</samp>&rsquo;, &lsquo;<samp>&lt;=</samp>&rsquo;, &lsquo;<samp>&gt;=</samp>&rsquo;, &lsquo;<samp>&lt;</samp>&rsquo;,
+and &lsquo;<samp>&gt;</samp>&rsquo;.
+The version number supplied on the right side of the operator consists
+of a major version number, an optional decimal point, and an optional
+minor version (e.g., &lsquo;<samp>7.1</samp>&rsquo;). If the minor version is omitted, it
+is assumed to be &lsquo;<samp>0</samp>&rsquo;.
+The operator may be separated from the string <code>version</code> and
+from the version number argument by whitespace.
+The following example sets a variable if the Readline version being used
+is 7.0 or newer:
+</p><div class="example">
+<pre class="example">$if version &gt;= 7.0
+set show-mode-in-prompt on
+$endif
+</pre></div>
+
+</dd>
+<dt><span><code>application</code></span></dt>
+<dd><p>The <var>application</var> construct is used to include
+application-specific settings. Each program using the Readline
+library sets the <var>application name</var>, and you can test for
+a particular value.
+This could be used to bind key sequences to functions useful for
+a specific program. For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+</p><div class="example">
+<pre class="example">$if Bash
+# Quote the current or previous word
+&quot;\C-xq&quot;: &quot;\eb\&quot;\ef\&quot;&quot;
+$endif
+</pre></div>
+
+</dd>
+<dt><span><code>variable</code></span></dt>
+<dd><p>The <var>variable</var> construct provides simple equality tests for Readline
+variables and values.
+The permitted comparison operators are &lsquo;<samp>=</samp>&rsquo;, &lsquo;<samp>==</samp>&rsquo;, and &lsquo;<samp>!=</samp>&rsquo;.
+The variable name must be separated from the comparison operator by
+whitespace; the operator may be separated from the value on the right hand
+side by whitespace.
+Both string and boolean variables may be tested. Boolean variables must be
+tested against the values <var>on</var> and <var>off</var>.
+The following example is equivalent to the <code>mode=emacs</code> test described
+above:
+</p><div class="example">
+<pre class="example">$if editing-mode == emacs
+set show-mode-in-prompt on
+$endif
+</pre></div>
+</dd>
+</dl>
+
+</dd>
+<dt><span><code>$endif</code></span></dt>
+<dd><p>This command, as seen in the previous example, terminates an
+<code>$if</code> command.
+</p>
+</dd>
+<dt><span><code>$else</code></span></dt>
+<dd><p>Commands in this branch of the <code>$if</code> directive are executed if
+the test fails.
+</p>
+</dd>
+<dt><span><code>$include</code></span></dt>
+<dd><p>This directive takes a single filename as an argument and reads commands
+and bindings from that file.
+For example, the following directive reads from <samp>/etc/inputrc</samp>:
+</p><div class="example">
+<pre class="example">$include /etc/inputrc
+</pre></div>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Sample-Init-File">
+<div class="header">
+<p>
+Previous: <a href="#Conditional-Init-Constructs" accesskey="p" rel="prev">Conditional Init Constructs</a>, Up: <a href="#Readline-Init-File" accesskey="u" rel="up">Readline Init File</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Sample-Init-File-1"></span><h4 class="subsection">1.3.3 Sample Init File</h4>
+
+<p>Here is an example of an <var>inputrc</var> file. This illustrates key
+binding, variable assignment, and conditional syntax.
+</p>
+<div class="example">
+<pre class="example"># This file controls the behaviour of line input editing for
+# programs that use the GNU Readline library. Existing
+# programs include FTP, Bash, and GDB.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# First, include any system-wide bindings and variable
+# assignments from /etc/Inputrc
+$include /etc/Inputrc
+
+#
+# Set various bindings for emacs mode.
+
+set editing-mode emacs
+
+$if mode=emacs
+
+Meta-Control-h: backward-kill-word Text after the function name is ignored
+
+#
+# Arrow keys in keypad mode
+#
+#&quot;\M-OD&quot;: backward-char
+#&quot;\M-OC&quot;: forward-char
+#&quot;\M-OA&quot;: previous-history
+#&quot;\M-OB&quot;: next-history
+#
+# Arrow keys in ANSI mode
+#
+&quot;\M-[D&quot;: backward-char
+&quot;\M-[C&quot;: forward-char
+&quot;\M-[A&quot;: previous-history
+&quot;\M-[B&quot;: next-history
+#
+# Arrow keys in 8 bit keypad mode
+#
+#&quot;\M-\C-OD&quot;: backward-char
+#&quot;\M-\C-OC&quot;: forward-char
+#&quot;\M-\C-OA&quot;: previous-history
+#&quot;\M-\C-OB&quot;: next-history
+#
+# Arrow keys in 8 bit ANSI mode
+#
+#&quot;\M-\C-[D&quot;: backward-char
+#&quot;\M-\C-[C&quot;: forward-char
+#&quot;\M-\C-[A&quot;: previous-history
+#&quot;\M-\C-[B&quot;: next-history
+
+C-q: quoted-insert
+
+$endif
+
+# An old-style binding. This happens to be the default.
+TAB: complete
+
+# Macros that are convenient for shell interaction
+$if Bash
+# edit the path
+&quot;\C-xp&quot;: &quot;PATH=${PATH}\e\C-e\C-a\ef\C-f&quot;
+# prepare to type a quoted word --
+# insert open and close double quotes
+# and move to just after the open quote
+&quot;\C-x\&quot;&quot;: &quot;\&quot;\&quot;\C-b&quot;
+# insert a backslash (testing backslash escapes
+# in sequences and macros)
+&quot;\C-x\\&quot;: &quot;\\&quot;
+# Quote the current or previous word
+&quot;\C-xq&quot;: &quot;\eb\&quot;\ef\&quot;&quot;
+# Add a binding to refresh the line, which is unbound
+&quot;\C-xr&quot;: redraw-current-line
+# Edit variable on current line.
+&quot;\M-\C-v&quot;: &quot;\C-a\C-k$\C-y\M-\C-e\C-a\C-y=&quot;
+$endif
+
+# use a visible bell if one is available
+set bell-style visible
+
+# don't strip characters to 7 bits when reading
+set input-meta on
+
+# allow iso-latin1 characters to be inserted rather
+# than converted to prefix-meta sequences
+set convert-meta off
+
+# display characters with the eighth bit set directly
+# rather than as meta-prefixed characters
+set output-meta on
+
+# if there are 150 or more possible completions for a word,
+# ask whether or not the user wants to see all of them
+set completion-query-items 150
+
+# For FTP
+$if Ftp
+&quot;\C-xg&quot;: &quot;get \M-?&quot;
+&quot;\C-xt&quot;: &quot;put \M-?&quot;
+&quot;\M-.&quot;: yank-last-arg
+$endif
+</pre></div>
+
+<hr>
+</div>
+</div>
+<div class="section" id="Bindable-Readline-Commands">
+<div class="header">
+<p>
+Next: <a href="#Readline-vi-Mode" accesskey="n" rel="next">Readline vi Mode</a>, Previous: <a href="#Readline-Init-File" accesskey="p" rel="prev">Readline Init File</a>, Up: <a href="#Command-Line-Editing" accesskey="u" rel="up">Command Line Editing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Bindable-Readline-Commands-1"></span><h3 class="section">1.4 Bindable Readline Commands</h3>
+
+
+<p>This section describes Readline commands that may be bound to key
+sequences.
+Command names without an accompanying key sequence are unbound by default.
+</p>
+<p>In the following descriptions, <em>point</em> refers to the current cursor
+position, and <em>mark</em> refers to a cursor position saved by the
+<code>set-mark</code> command.
+The text between the point and mark is referred to as the <em>region</em>.
+</p>
+<ul class="section-toc">
+<li><a href="#Commands-For-Moving" accesskey="1">Commands For Moving</a></li>
+<li><a href="#Commands-For-History" accesskey="2">Commands For Manipulating The History</a></li>
+<li><a href="#Commands-For-Text" accesskey="3">Commands For Changing Text</a></li>
+<li><a href="#Commands-For-Killing" accesskey="4">Killing And Yanking</a></li>
+<li><a href="#Numeric-Arguments" accesskey="5">Specifying Numeric Arguments</a></li>
+<li><a href="#Commands-For-Completion" accesskey="6">Letting Readline Type For You</a></li>
+<li><a href="#Keyboard-Macros" accesskey="7">Keyboard Macros</a></li>
+<li><a href="#Miscellaneous-Commands" accesskey="8">Some Miscellaneous Commands</a></li>
+</ul>
+<hr>
+<div class="subsection" id="Commands-For-Moving">
+<div class="header">
+<p>
+Next: <a href="#Commands-For-History" accesskey="n" rel="next">Commands For Manipulating The History</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Commands-For-Moving-1"></span><h4 class="subsection">1.4.1 Commands For Moving</h4>
+<dl compact="compact">
+<dt id='index-beginning_002dof_002dline-_0028C_002da_0029'><span><code>beginning-of-line (C-a)</code><a href='#index-beginning_002dof_002dline-_0028C_002da_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move to the start of the current line.
+</p>
+</dd>
+<dt id='index-end_002dof_002dline-_0028C_002de_0029'><span><code>end-of-line (C-e)</code><a href='#index-end_002dof_002dline-_0028C_002de_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move to the end of the line.
+</p>
+</dd>
+<dt id='index-forward_002dchar-_0028C_002df_0029'><span><code>forward-char (C-f)</code><a href='#index-forward_002dchar-_0028C_002df_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move forward a character.
+</p>
+</dd>
+<dt id='index-backward_002dchar-_0028C_002db_0029'><span><code>backward-char (C-b)</code><a href='#index-backward_002dchar-_0028C_002db_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move back a character.
+</p>
+</dd>
+<dt id='index-forward_002dword-_0028M_002df_0029'><span><code>forward-word (M-f)</code><a href='#index-forward_002dword-_0028M_002df_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move forward to the end of the next word.
+Words are composed of letters and digits.
+</p>
+</dd>
+<dt id='index-backward_002dword-_0028M_002db_0029'><span><code>backward-word (M-b)</code><a href='#index-backward_002dword-_0028M_002db_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move back to the start of the current or previous word.
+Words are composed of letters and digits.
+</p>
+
+</dd>
+<dt id='index-previous_002dscreen_002dline-_0028_0029'><span><code>previous-screen-line ()</code><a href='#index-previous_002dscreen_002dline-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Attempt to move point to the same physical screen column on the previous
+physical screen line. This will not have the desired effect if the current
+Readline line does not take up more than one physical line or if point is not
+greater than the length of the prompt plus the screen width.
+</p>
+</dd>
+<dt id='index-next_002dscreen_002dline-_0028_0029'><span><code>next-screen-line ()</code><a href='#index-next_002dscreen_002dline-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Attempt to move point to the same physical screen column on the next
+physical screen line. This will not have the desired effect if the current
+Readline line does not take up more than one physical line or if the length
+of the current Readline line is not greater than the length of the prompt
+plus the screen width.
+</p>
+</dd>
+<dt id='index-clear_002ddisplay-_0028M_002dC_002dl_0029'><span><code>clear-display (M-C-l)</code><a href='#index-clear_002ddisplay-_0028M_002dC_002dl_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Clear the screen and, if possible, the terminal&rsquo;s scrollback buffer,
+then redraw the current line,
+leaving the current line at the top of the screen.
+</p>
+</dd>
+<dt id='index-clear_002dscreen-_0028C_002dl_0029'><span><code>clear-screen (C-l)</code><a href='#index-clear_002dscreen-_0028C_002dl_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Clear the screen,
+then redraw the current line,
+leaving the current line at the top of the screen.
+</p>
+</dd>
+<dt id='index-redraw_002dcurrent_002dline-_0028_0029'><span><code>redraw-current-line ()</code><a href='#index-redraw_002dcurrent_002dline-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Refresh the current line. By default, this is unbound.
+</p>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Commands-For-History">
+<div class="header">
+<p>
+Next: <a href="#Commands-For-Text" accesskey="n" rel="next">Commands For Changing Text</a>, Previous: <a href="#Commands-For-Moving" accesskey="p" rel="prev">Commands For Moving</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Commands-For-Manipulating-The-History"></span><h4 class="subsection">1.4.2 Commands For Manipulating The History</h4>
+
+<dl compact="compact">
+<dt id='index-accept_002dline-_0028Newline-or-Return_0029'><span><code>accept-line (Newline or Return)</code><a href='#index-accept_002dline-_0028Newline-or-Return_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Accept the line regardless of where the cursor is.
+If this line is
+non-empty, it may be added to the history list for future recall with
+<code>add_history()</code>.
+If this line is a modified history line, the history line is restored
+to its original state.
+</p>
+</dd>
+<dt id='index-previous_002dhistory-_0028C_002dp_0029'><span><code>previous-history (C-p)</code><a href='#index-previous_002dhistory-_0028C_002dp_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move &lsquo;back&rsquo; through the history list, fetching the previous command.
+</p>
+</dd>
+<dt id='index-next_002dhistory-_0028C_002dn_0029'><span><code>next-history (C-n)</code><a href='#index-next_002dhistory-_0028C_002dn_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move &lsquo;forward&rsquo; through the history list, fetching the next command.
+</p>
+</dd>
+<dt id='index-beginning_002dof_002dhistory-_0028M_002d_003c_0029'><span><code>beginning-of-history (M-&lt;)</code><a href='#index-beginning_002dof_002dhistory-_0028M_002d_003c_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move to the first line in the history.
+</p>
+</dd>
+<dt id='index-end_002dof_002dhistory-_0028M_002d_003e_0029'><span><code>end-of-history (M-&gt;)</code><a href='#index-end_002dof_002dhistory-_0028M_002d_003e_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Move to the end of the input history, i.e., the line currently
+being entered.
+</p>
+</dd>
+<dt id='index-reverse_002dsearch_002dhistory-_0028C_002dr_0029'><span><code>reverse-search-history (C-r)</code><a href='#index-reverse_002dsearch_002dhistory-_0028C_002dr_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search backward starting at the current line and moving &lsquo;up&rsquo; through
+the history as necessary. This is an incremental search.
+This command sets the region to the matched text and activates the mark.
+</p>
+</dd>
+<dt id='index-forward_002dsearch_002dhistory-_0028C_002ds_0029'><span><code>forward-search-history (C-s)</code><a href='#index-forward_002dsearch_002dhistory-_0028C_002ds_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search forward starting at the current line and moving &lsquo;down&rsquo; through
+the history as necessary. This is an incremental search.
+This command sets the region to the matched text and activates the mark.
+</p>
+</dd>
+<dt id='index-non_002dincremental_002dreverse_002dsearch_002dhistory-_0028M_002dp_0029'><span><code>non-incremental-reverse-search-history (M-p)</code><a href='#index-non_002dincremental_002dreverse_002dsearch_002dhistory-_0028M_002dp_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search backward starting at the current line and moving &lsquo;up&rsquo;
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+The search string may match anywhere in a history line.
+</p>
+</dd>
+<dt id='index-non_002dincremental_002dforward_002dsearch_002dhistory-_0028M_002dn_0029'><span><code>non-incremental-forward-search-history (M-n)</code><a href='#index-non_002dincremental_002dforward_002dsearch_002dhistory-_0028M_002dn_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search forward starting at the current line and moving &lsquo;down&rsquo;
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+The search string may match anywhere in a history line.
+</p>
+</dd>
+<dt id='index-history_002dsearch_002dforward-_0028_0029'><span><code>history-search-forward ()</code><a href='#index-history_002dsearch_002dforward-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search forward through the history for the string of characters
+between the start of the current line and the point.
+The search string must match at the beginning of a history line.
+This is a non-incremental search.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-history_002dsearch_002dbackward-_0028_0029'><span><code>history-search-backward ()</code><a href='#index-history_002dsearch_002dbackward-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search backward through the history for the string of characters
+between the start of the current line and the point.
+The search string must match at the beginning of a history line.
+This is a non-incremental search.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-history_002dsubstring_002dsearch_002dforward-_0028_0029'><span><code>history-substring-search-forward ()</code><a href='#index-history_002dsubstring_002dsearch_002dforward-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search forward through the history for the string of characters
+between the start of the current line and the point.
+The search string may match anywhere in a history line.
+This is a non-incremental search.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-history_002dsubstring_002dsearch_002dbackward-_0028_0029'><span><code>history-substring-search-backward ()</code><a href='#index-history_002dsubstring_002dsearch_002dbackward-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Search backward through the history for the string of characters
+between the start of the current line and the point.
+The search string may match anywhere in a history line.
+This is a non-incremental search.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-yank_002dnth_002darg-_0028M_002dC_002dy_0029'><span><code>yank-nth-arg (M-C-y)</code><a href='#index-yank_002dnth_002darg-_0028M_002dC_002dy_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument <var>n</var>,
+insert the <var>n</var>th word from the previous command (the words
+in the previous command begin with word 0). A negative argument
+inserts the <var>n</var>th word from the end of the previous command.
+Once the argument <var>n</var> is computed, the argument is extracted
+as if the &lsquo;<samp>!<var>n</var></samp>&rsquo; history expansion had been specified.
+</p>
+</dd>
+<dt id='index-yank_002dlast_002darg-_0028M_002d_002e-or-M_002d_005f_0029'><span><code>yank-last-arg (M-. or M-_)</code><a href='#index-yank_002dlast_002darg-_0028M_002d_002e-or-M_002d_005f_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert last argument to the previous command (the last word of the
+previous history entry).
+With a numeric argument, behave exactly like <code>yank-nth-arg</code>.
+Successive calls to <code>yank-last-arg</code> move back through the history
+list, inserting the last word (or the word specified by the argument to
+the first call) of each line in turn.
+Any numeric argument supplied to these successive calls determines
+the direction to move through the history. A negative argument switches
+the direction through the history (back or forward).
+The history expansion facilities are used to extract the last argument,
+as if the &lsquo;<samp>!$</samp>&rsquo; history expansion had been specified.
+</p>
+</dd>
+<dt id='index-operate_002dand_002dget_002dnext-_0028C_002do_0029'><span><code>operate-and-get-next (C-o)</code><a href='#index-operate_002dand_002dget_002dnext-_0028C_002do_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Accept the current line for return to the calling application as if a
+newline had been entered,
+and fetch the next line relative to the current line from the history
+for editing.
+A numeric argument, if supplied, specifies the history entry to use instead
+of the current line.
+</p>
+</dd>
+<dt id='index-fetch_002dhistory-_0028_0029'><span><code>fetch-history ()</code><a href='#index-fetch_002dhistory-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>With a numeric argument, fetch that entry from the history list
+and make it the current line.
+Without an argument, move back to the first entry in the history list.
+</p>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Commands-For-Text">
+<div class="header">
+<p>
+Next: <a href="#Commands-For-Killing" accesskey="n" rel="next">Killing And Yanking</a>, Previous: <a href="#Commands-For-History" accesskey="p" rel="prev">Commands For Manipulating The History</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Commands-For-Changing-Text"></span><h4 class="subsection">1.4.3 Commands For Changing Text</h4>
+
+<dl compact="compact">
+<dt id='index-end_002dof_002dfile-_0028usually-C_002dd_0029'><span><code><i>end-of-file</i> (usually C-d)</code><a href='#index-end_002dof_002dfile-_0028usually-C_002dd_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>The character indicating end-of-file as set, for example, by
+<code>stty</code>. If this character is read when there are no characters
+on the line, and point is at the beginning of the line, Readline
+interprets it as the end of input and returns <small>EOF</small>.
+</p>
+</dd>
+<dt id='index-delete_002dchar-_0028C_002dd_0029'><span><code>delete-char (C-d)</code><a href='#index-delete_002dchar-_0028C_002dd_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Delete the character at point. If this function is bound to the
+same character as the tty <small>EOF</small> character, as <kbd>C-d</kbd>
+commonly is, see above for the effects.
+</p>
+</dd>
+<dt id='index-backward_002ddelete_002dchar-_0028Rubout_0029'><span><code>backward-delete-char (Rubout)</code><a href='#index-backward_002ddelete_002dchar-_0028Rubout_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Delete the character behind the cursor. A numeric argument means
+to kill the characters instead of deleting them.
+</p>
+</dd>
+<dt id='index-forward_002dbackward_002ddelete_002dchar-_0028_0029'><span><code>forward-backward-delete-char ()</code><a href='#index-forward_002dbackward_002ddelete_002dchar-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted. By default, this is not bound to a key.
+</p>
+</dd>
+<dt id='index-quoted_002dinsert-_0028C_002dq-or-C_002dv_0029'><span><code>quoted-insert (C-q or C-v)</code><a href='#index-quoted_002dinsert-_0028C_002dq-or-C_002dv_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Add the next character typed to the line verbatim. This is
+how to insert key sequences like <kbd>C-q</kbd>, for example.
+</p>
+</dd>
+<dt id='index-tab_002dinsert-_0028M_002dTAB_0029'><span><code>tab-insert (M-<span class="key">TAB</span>)</code><a href='#index-tab_002dinsert-_0028M_002dTAB_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert a tab character.
+</p>
+</dd>
+<dt id='index-self_002dinsert-_0028a_002c-b_002c-A_002c-1_002c-_0021_002c-_2026_0029'><span><code>self-insert (a, b, A, 1, !, &hellip;)</code><a href='#index-self_002dinsert-_0028a_002c-b_002c-A_002c-1_002c-_0021_002c-_2026_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert yourself.
+</p>
+</dd>
+<dt id='index-bracketed_002dpaste_002dbegin-_0028_0029'><span><code>bracketed-paste-begin ()</code><a href='#index-bracketed_002dpaste_002dbegin-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This function is intended to be bound to the &quot;bracketed paste&quot; escape
+sequence sent by some terminals, and such a binding is assigned by default.
+It allows Readline to insert the pasted text as a single unit without treating
+each character as if it had been read from the keyboard. The characters
+are inserted as if each one was bound to <code>self-insert</code> instead of
+executing any editing commands.
+</p>
+<p>Bracketed paste sets the region (the characters between point and the mark)
+to the inserted text. It uses the concept of an <em>active mark</em>: when the
+mark is active, Readline redisplay uses the terminal&rsquo;s standout mode to
+denote the region.
+</p>
+</dd>
+<dt id='index-transpose_002dchars-_0028C_002dt_0029'><span><code>transpose-chars (C-t)</code><a href='#index-transpose_002dchars-_0028C_002dt_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Drag the character before the cursor forward over
+the character at the cursor, moving the
+cursor forward as well. If the insertion point
+is at the end of the line, then this
+transposes the last two characters of the line.
+Negative arguments have no effect.
+</p>
+</dd>
+<dt id='index-transpose_002dwords-_0028M_002dt_0029'><span><code>transpose-words (M-t)</code><a href='#index-transpose_002dwords-_0028M_002dt_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Drag the word before point past the word after point,
+moving point past that word as well.
+If the insertion point is at the end of the line, this transposes
+the last two words on the line.
+</p>
+</dd>
+<dt id='index-upcase_002dword-_0028M_002du_0029'><span><code>upcase-word (M-u)</code><a href='#index-upcase_002dword-_0028M_002du_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Uppercase the current (or following) word. With a negative argument,
+uppercase the previous word, but do not move the cursor.
+</p>
+</dd>
+<dt id='index-downcase_002dword-_0028M_002dl_0029'><span><code>downcase-word (M-l)</code><a href='#index-downcase_002dword-_0028M_002dl_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Lowercase the current (or following) word. With a negative argument,
+lowercase the previous word, but do not move the cursor.
+</p>
+</dd>
+<dt id='index-capitalize_002dword-_0028M_002dc_0029'><span><code>capitalize-word (M-c)</code><a href='#index-capitalize_002dword-_0028M_002dc_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Capitalize the current (or following) word. With a negative argument,
+capitalize the previous word, but do not move the cursor.
+</p>
+</dd>
+<dt id='index-overwrite_002dmode-_0028_0029'><span><code>overwrite-mode ()</code><a href='#index-overwrite_002dmode-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Toggle overwrite mode. With an explicit positive numeric argument,
+switches to overwrite mode. With an explicit non-positive numeric
+argument, switches to insert mode. This command affects only
+<code>emacs</code> mode; <code>vi</code> mode does overwrite differently.
+Each call to <code>readline()</code> starts in insert mode.
+</p>
+<p>In overwrite mode, characters bound to <code>self-insert</code> replace
+the text at point rather than pushing the text to the right.
+Characters bound to <code>backward-delete-char</code> replace the character
+before point with a space.
+</p>
+<p>By default, this command is unbound.
+</p>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Commands-For-Killing">
+<div class="header">
+<p>
+Next: <a href="#Numeric-Arguments" accesskey="n" rel="next">Specifying Numeric Arguments</a>, Previous: <a href="#Commands-For-Text" accesskey="p" rel="prev">Commands For Changing Text</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Killing-And-Yanking"></span><h4 class="subsection">1.4.4 Killing And Yanking</h4>
+
+<dl compact="compact">
+<dt id='index-kill_002dline-_0028C_002dk_0029'><span><code>kill-line (C-k)</code><a href='#index-kill_002dline-_0028C_002dk_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill the text from point to the end of the line.
+With a negative numeric argument, kill backward from the cursor to the
+beginning of the current line.
+</p>
+</dd>
+<dt id='index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029'><span><code>backward-kill-line (C-x Rubout)</code><a href='#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill backward from the cursor to the beginning of the current line.
+With a negative numeric argument, kill forward from the cursor to the
+end of the current line.
+</p>
+</dd>
+<dt id='index-unix_002dline_002ddiscard-_0028C_002du_0029'><span><code>unix-line-discard (C-u)</code><a href='#index-unix_002dline_002ddiscard-_0028C_002du_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill backward from the cursor to the beginning of the current line.
+</p>
+</dd>
+<dt id='index-kill_002dwhole_002dline-_0028_0029'><span><code>kill-whole-line ()</code><a href='#index-kill_002dwhole_002dline-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill all characters on the current line, no matter where point is.
+By default, this is unbound.
+</p>
+</dd>
+<dt id='index-kill_002dword-_0028M_002dd_0029'><span><code>kill-word (M-d)</code><a href='#index-kill_002dword-_0028M_002dd_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill from point to the end of the current word, or if between
+words, to the end of the next word.
+Word boundaries are the same as <code>forward-word</code>.
+</p>
+</dd>
+<dt id='index-backward_002dkill_002dword-_0028M_002dDEL_0029'><span><code>backward-kill-word (M-<span class="key">DEL</span>)</code><a href='#index-backward_002dkill_002dword-_0028M_002dDEL_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill the word behind point.
+Word boundaries are the same as <code>backward-word</code>.
+</p>
+
+</dd>
+<dt id='index-shell_002dtranspose_002dwords-_0028M_002dC_002dt_0029'><span><code>shell-transpose-words (M-C-t)</code><a href='#index-shell_002dtranspose_002dwords-_0028M_002dC_002dt_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Drag the word before point past the word after point,
+moving point past that word as well.
+If the insertion point is at the end of the line, this transposes
+the last two words on the line.
+Word boundaries are the same as <code>shell-forward-word</code> and
+<code>shell-backward-word</code>.
+</p>
+</dd>
+<dt id='index-unix_002dword_002drubout-_0028C_002dw_0029'><span><code>unix-word-rubout (C-w)</code><a href='#index-unix_002dword_002drubout-_0028C_002dw_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+</p>
+</dd>
+<dt id='index-unix_002dfilename_002drubout-_0028_0029'><span><code>unix-filename-rubout ()</code><a href='#index-unix_002dfilename_002drubout-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill the word behind point, using white space and the slash character
+as the word boundaries.
+The killed text is saved on the kill-ring.
+</p>
+</dd>
+<dt id='index-delete_002dhorizontal_002dspace-_0028_0029'><span><code>delete-horizontal-space ()</code><a href='#index-delete_002dhorizontal_002dspace-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Delete all spaces and tabs around point. By default, this is unbound.
+</p>
+</dd>
+<dt id='index-kill_002dregion-_0028_0029'><span><code>kill-region ()</code><a href='#index-kill_002dregion-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Kill the text in the current region.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-copy_002dregion_002das_002dkill-_0028_0029'><span><code>copy-region-as-kill ()</code><a href='#index-copy_002dregion_002das_002dkill-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Copy the text in the region to the kill buffer, so it can be yanked
+right away. By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-copy_002dbackward_002dword-_0028_0029'><span><code>copy-backward-word ()</code><a href='#index-copy_002dbackward_002dword-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Copy the word before point to the kill buffer.
+The word boundaries are the same as <code>backward-word</code>.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-copy_002dforward_002dword-_0028_0029'><span><code>copy-forward-word ()</code><a href='#index-copy_002dforward_002dword-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Copy the word following point to the kill buffer.
+The word boundaries are the same as <code>forward-word</code>.
+By default, this command is unbound.
+</p>
+</dd>
+<dt id='index-yank-_0028C_002dy_0029'><span><code>yank (C-y)</code><a href='#index-yank-_0028C_002dy_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Yank the top of the kill ring into the buffer at point.
+</p>
+</dd>
+<dt id='index-yank_002dpop-_0028M_002dy_0029'><span><code>yank-pop (M-y)</code><a href='#index-yank_002dpop-_0028M_002dy_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Rotate the kill-ring, and yank the new top. You can only do this if
+the prior command is <code>yank</code> or <code>yank-pop</code>.
+</p></dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Numeric-Arguments">
+<div class="header">
+<p>
+Next: <a href="#Commands-For-Completion" accesskey="n" rel="next">Letting Readline Type For You</a>, Previous: <a href="#Commands-For-Killing" accesskey="p" rel="prev">Killing And Yanking</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Specifying-Numeric-Arguments"></span><h4 class="subsection">1.4.5 Specifying Numeric Arguments</h4>
+<dl compact="compact">
+<dt id='index-digit_002dargument-_0028M_002d0_002c-M_002d1_002c-_2026-M_002d_002d_0029'><span><code>digit-argument (<kbd>M-0</kbd>, <kbd>M-1</kbd>, &hellip; <kbd>M--</kbd>)</code><a href='#index-digit_002dargument-_0028M_002d0_002c-M_002d1_002c-_2026-M_002d_002d_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Add this digit to the argument already accumulating, or start a new
+argument. <kbd>M--</kbd> starts a negative argument.
+</p>
+</dd>
+<dt id='index-universal_002dargument-_0028_0029'><span><code>universal-argument ()</code><a href='#index-universal_002dargument-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing <code>universal-argument</code>
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit nor minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+By default, this is not bound to a key.
+</p></dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Commands-For-Completion">
+<div class="header">
+<p>
+Next: <a href="#Keyboard-Macros" accesskey="n" rel="next">Keyboard Macros</a>, Previous: <a href="#Numeric-Arguments" accesskey="p" rel="prev">Specifying Numeric Arguments</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Letting-Readline-Type-For-You"></span><h4 class="subsection">1.4.6 Letting Readline Type For You</h4>
+
+<dl compact="compact">
+<dt id='index-complete-_0028TAB_0029'><span><code>complete (<span class="key">TAB</span>)</code><a href='#index-complete-_0028TAB_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Attempt to perform completion on the text before point.
+The actual completion performed is application-specific.
+The default is filename completion.
+</p>
+</dd>
+<dt id='index-possible_002dcompletions-_0028M_002d_003f_0029'><span><code>possible-completions (M-?)</code><a href='#index-possible_002dcompletions-_0028M_002d_003f_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>List the possible completions of the text before point.
+When displaying completions, Readline sets the number of columns used
+for display to the value of <code>completion-display-width</code>, the value of
+the environment variable <code>COLUMNS</code>, or the screen width, in that order.
+</p>
+</dd>
+<dt id='index-insert_002dcompletions-_0028M_002d_002a_0029'><span><code>insert-completions (M-*)</code><a href='#index-insert_002dcompletions-_0028M_002d_002a_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Insert all completions of the text before point that would have
+been generated by <code>possible-completions</code>.
+</p>
+</dd>
+<dt id='index-menu_002dcomplete-_0028_0029'><span><code>menu-complete ()</code><a href='#index-menu_002dcomplete-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Similar to <code>complete</code>, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of <code>menu-complete</code> steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of <code>bell-style</code>)
+and the original text is restored.
+An argument of <var>n</var> moves <var>n</var> positions forward in the list
+of matches; a negative argument may be used to move backward
+through the list.
+This command is intended to be bound to <tt class="key">TAB</tt>, but is unbound
+by default.
+</p>
+</dd>
+<dt id='index-menu_002dcomplete_002dbackward-_0028_0029'><span><code>menu-complete-backward ()</code><a href='#index-menu_002dcomplete_002dbackward-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Identical to <code>menu-complete</code>, but moves backward through the list
+of possible completions, as if <code>menu-complete</code> had been given a
+negative argument.
+</p>
+</dd>
+<dt id='index-delete_002dchar_002dor_002dlist-_0028_0029'><span><code>delete-char-or-list ()</code><a href='#index-delete_002dchar_002dor_002dlist-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Deletes the character under the cursor if not at the beginning or
+end of the line (like <code>delete-char</code>).
+If at the end of the line, behaves identically to
+<code>possible-completions</code>.
+This command is unbound by default.
+</p>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Keyboard-Macros">
+<div class="header">
+<p>
+Next: <a href="#Miscellaneous-Commands" accesskey="n" rel="next">Some Miscellaneous Commands</a>, Previous: <a href="#Commands-For-Completion" accesskey="p" rel="prev">Letting Readline Type For You</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Keyboard-Macros-1"></span><h4 class="subsection">1.4.7 Keyboard Macros</h4>
+<dl compact="compact">
+<dt id='index-start_002dkbd_002dmacro-_0028C_002dx-_0028_0029'><span><code>start-kbd-macro (C-x ()</code><a href='#index-start_002dkbd_002dmacro-_0028C_002dx-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Begin saving the characters typed into the current keyboard macro.
+</p>
+</dd>
+<dt id='index-end_002dkbd_002dmacro-_0028C_002dx-_0029_0029'><span><code>end-kbd-macro (C-x ))</code><a href='#index-end_002dkbd_002dmacro-_0028C_002dx-_0029_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Stop saving the characters typed into the current keyboard macro
+and save the definition.
+</p>
+</dd>
+<dt id='index-call_002dlast_002dkbd_002dmacro-_0028C_002dx-e_0029'><span><code>call-last-kbd-macro (C-x e)</code><a href='#index-call_002dlast_002dkbd_002dmacro-_0028C_002dx-e_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+</p>
+</dd>
+<dt id='index-print_002dlast_002dkbd_002dmacro-_0028_0029'><span><code>print-last-kbd-macro ()</code><a href='#index-print_002dlast_002dkbd_002dmacro-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Print the last keyboard macro defined in a format suitable for the
+<var>inputrc</var> file.
+</p>
+</dd>
+</dl>
+
+<hr>
+</div>
+<div class="subsection" id="Miscellaneous-Commands">
+<div class="header">
+<p>
+Previous: <a href="#Keyboard-Macros" accesskey="p" rel="prev">Keyboard Macros</a>, Up: <a href="#Bindable-Readline-Commands" accesskey="u" rel="up">Bindable Readline Commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Some-Miscellaneous-Commands"></span><h4 class="subsection">1.4.8 Some Miscellaneous Commands</h4>
+<dl compact="compact">
+<dt id='index-re_002dread_002dinit_002dfile-_0028C_002dx-C_002dr_0029'><span><code>re-read-init-file (C-x C-r)</code><a href='#index-re_002dread_002dinit_002dfile-_0028C_002dx-C_002dr_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Read in the contents of the <var>inputrc</var> file, and incorporate
+any bindings or variable assignments found there.
+</p>
+</dd>
+<dt id='index-abort-_0028C_002dg_0029'><span><code>abort (C-g)</code><a href='#index-abort-_0028C_002dg_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Abort the current editing command and
+ring the terminal&rsquo;s bell (subject to the setting of
+<code>bell-style</code>).
+</p>
+</dd>
+<dt id='index-do_002dlowercase_002dversion-_0028M_002dA_002c-M_002dB_002c-M_002dx_002c-_2026_0029'><span><code>do-lowercase-version (M-A, M-B, M-<var>x</var>, &hellip;)</code><a href='#index-do_002dlowercase_002dversion-_0028M_002dA_002c-M_002dB_002c-M_002dx_002c-_2026_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>If the metafied character <var>x</var> is upper case, run the command
+that is bound to the corresponding metafied lower case character.
+The behavior is undefined if <var>x</var> is already lower case.
+</p>
+</dd>
+<dt id='index-prefix_002dmeta-_0028ESC_0029'><span><code>prefix-meta (<span class="key">ESC</span>)</code><a href='#index-prefix_002dmeta-_0028ESC_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Metafy the next character typed. This is for keyboards
+without a meta key. Typing &lsquo;<samp><span class="key">ESC</span> f</samp>&rsquo; is equivalent to typing
+<kbd>M-f</kbd>.
+</p>
+</dd>
+<dt id='index-undo-_0028C_002d_005f-or-C_002dx-C_002du_0029'><span><code>undo (C-_ or C-x C-u)</code><a href='#index-undo-_0028C_002d_005f-or-C_002dx-C_002du_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Incremental undo, separately remembered for each line.
+</p>
+</dd>
+<dt id='index-revert_002dline-_0028M_002dr_0029'><span><code>revert-line (M-r)</code><a href='#index-revert_002dline-_0028M_002dr_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Undo all changes made to this line. This is like executing the <code>undo</code>
+command enough times to get back to the beginning.
+</p>
+</dd>
+<dt id='index-tilde_002dexpand-_0028M_002d_007e_0029'><span><code>tilde-expand (M-~)</code><a href='#index-tilde_002dexpand-_0028M_002d_007e_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Perform tilde expansion on the current word.
+</p>
+</dd>
+<dt id='index-set_002dmark-_0028C_002d_0040_0029'><span><code>set-mark (C-@)</code><a href='#index-set_002dmark-_0028C_002d_0040_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Set the mark to the point. If a
+numeric argument is supplied, the mark is set to that position.
+</p>
+</dd>
+<dt id='index-exchange_002dpoint_002dand_002dmark-_0028C_002dx-C_002dx_0029'><span><code>exchange-point-and-mark (C-x C-x)</code><a href='#index-exchange_002dpoint_002dand_002dmark-_0028C_002dx-C_002dx_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Swap the point with the mark. The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+</p>
+</dd>
+<dt id='index-character_002dsearch-_0028C_002d_005d_0029'><span><code>character-search (C-])</code><a href='#index-character_002dsearch-_0028C_002d_005d_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A character is read and point is moved to the next occurrence of that
+character. A negative argument searches for previous occurrences.
+</p>
+</dd>
+<dt id='index-character_002dsearch_002dbackward-_0028M_002dC_002d_005d_0029'><span><code>character-search-backward (M-C-])</code><a href='#index-character_002dsearch_002dbackward-_0028M_002dC_002d_005d_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>A character is read and point is moved to the previous occurrence
+of that character. A negative argument searches for subsequent
+occurrences.
+</p>
+</dd>
+<dt id='index-skip_002dcsi_002dsequence-_0028_0029'><span><code>skip-csi-sequence ()</code><a href='#index-skip_002dcsi_002dsequence-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Read enough characters to consume a multi-key sequence such as those
+defined for keys like Home and End. Such sequences begin with a
+Control Sequence Indicator (CSI), usually ESC-[. If this sequence is
+bound to &quot;\e[&quot;, keys producing such sequences will have no effect
+unless explicitly bound to a Readline command, instead of inserting
+stray characters into the editing buffer. This is unbound by default,
+but usually bound to ESC-[.
+</p>
+</dd>
+<dt id='index-insert_002dcomment-_0028M_002d_0023_0029'><span><code>insert-comment (M-#)</code><a href='#index-insert_002dcomment-_0028M_002d_0023_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Without a numeric argument, the value of the <code>comment-begin</code>
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle: if
+the characters at the beginning of the line do not match the value
+of <code>comment-begin</code>, the value is inserted, otherwise
+the characters in <code>comment-begin</code> are deleted from the beginning of
+the line.
+In either case, the line is accepted as if a newline had been typed.
+</p>
+</dd>
+<dt id='index-dump_002dfunctions-_0028_0029'><span><code>dump-functions ()</code><a href='#index-dump_002dfunctions-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Print all of the functions and their key bindings to the
+Readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <var>inputrc</var> file. This command is unbound by default.
+</p>
+</dd>
+<dt id='index-dump_002dvariables-_0028_0029'><span><code>dump-variables ()</code><a href='#index-dump_002dvariables-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Print all of the settable variables and their values to the
+Readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <var>inputrc</var> file. This command is unbound by default.
+</p>
+</dd>
+<dt id='index-dump_002dmacros-_0028_0029'><span><code>dump-macros ()</code><a href='#index-dump_002dmacros-_0028_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>Print all of the Readline key sequences bound to macros and the
+strings they output. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <var>inputrc</var> file. This command is unbound by default.
+</p>
+
+</dd>
+<dt id='index-emacs_002dediting_002dmode-_0028C_002de_0029'><span><code>emacs-editing-mode (C-e)</code><a href='#index-emacs_002dediting_002dmode-_0028C_002de_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When in <code>vi</code> command mode, this causes a switch to <code>emacs</code>
+editing mode.
+</p>
+</dd>
+<dt id='index-vi_002dediting_002dmode-_0028M_002dC_002dj_0029'><span><code>vi-editing-mode (M-C-j)</code><a href='#index-vi_002dediting_002dmode-_0028M_002dC_002dj_0029' class='copiable-anchor'> &para;</a></span></dt>
+<dd><p>When in <code>emacs</code> editing mode, this causes a switch to <code>vi</code>
+editing mode.
+</p>
+
+</dd>
+</dl>
+
+<hr>
+</div>
+</div>
+<div class="section" id="Readline-vi-Mode">
+<div class="header">
+<p>
+Previous: <a href="#Bindable-Readline-Commands" accesskey="p" rel="prev">Bindable Readline Commands</a>, Up: <a href="#Command-Line-Editing" accesskey="u" rel="up">Command Line Editing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="Readline-vi-Mode-1"></span><h3 class="section">1.5 Readline vi Mode</h3>
+
+<p>While the Readline library does not have a full set of <code>vi</code>
+editing functions, it does contain enough to allow simple editing
+of the line. The Readline <code>vi</code> mode behaves as specified in
+the <small>POSIX</small> standard.
+</p>
+<p>In order to switch interactively between <code>emacs</code> and <code>vi</code>
+editing modes, use the command <kbd>M-C-j</kbd> (bound to emacs-editing-mode
+when in <code>vi</code> mode and to vi-editing-mode in <code>emacs</code> mode).
+The Readline default is <code>emacs</code> mode.
+</p>
+<p>When you enter a line in <code>vi</code> mode, you are already placed in
+&lsquo;insertion&rsquo; mode, as if you had typed an &lsquo;<samp>i</samp>&rsquo;. Pressing <tt class="key">ESC</tt>
+switches you into &lsquo;command&rsquo; mode, where you can edit the text of the
+line with the standard <code>vi</code> movement keys, move to previous
+history lines with &lsquo;<samp>k</samp>&rsquo; and subsequent lines with &lsquo;<samp>j</samp>&rsquo;, and
+so forth.
+</p>
+
+<hr>
+</div>
+</div>
+<div class="appendix" id="GNU-Free-Documentation-License">
+<div class="header">
+<p>
+Previous: <a href="#Command-Line-Editing" accesskey="p" rel="prev">Command Line Editing</a>, Up: <a href="#Top" accesskey="u" rel="up">GNU Readline Library</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>]</p>
+</div>
+<span id="GNU-Free-Documentation-License-1"></span><h2 class="appendix">Appendix A GNU Free Documentation License</h2>
+
+<div align="center">Version 1.3, 3 November 2008
+</div>
+
+<div class="display">
+<pre class="display">Copyright &copy; 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+<a href="http://fsf.org/">http://fsf.org/</a>
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></div>
+
+<ol start="0">
+<li> PREAMBLE
+
+<p>The purpose of this License is to make a manual, textbook, or other
+functional and useful document <em>free</em> in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+</p>
+<p>This License is a kind of &ldquo;copyleft&rdquo;, which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+</p>
+<p>We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+</p>
+</li><li> APPLICABILITY AND DEFINITIONS
+
+<p>This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The &ldquo;Document&rdquo;, below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as &ldquo;you&rdquo;. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</p>
+<p>A &ldquo;Modified Version&rdquo; of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+</p>
+<p>A &ldquo;Secondary Section&rdquo; is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document&rsquo;s overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+</p>
+<p>The &ldquo;Invariant Sections&rdquo; are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+</p>
+<p>The &ldquo;Cover Texts&rdquo; are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+</p>
+<p>A &ldquo;Transparent&rdquo; copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not &ldquo;Transparent&rdquo; is called &ldquo;Opaque&rdquo;.
+</p>
+<p>Examples of suitable formats for Transparent copies include plain
+<small>ASCII</small> without markup, Texinfo input format, LaTeX input
+format, <acronym>SGML</acronym> or <acronym>XML</acronym> using a publicly available
+<acronym>DTD</acronym>, and standard-conforming simple <acronym>HTML</acronym>,
+PostScript or <acronym>PDF</acronym> designed for human modification. Examples
+of transparent image formats include <acronym>PNG</acronym>, <acronym>XCF</acronym> and
+<acronym>JPG</acronym>. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, <acronym>SGML</acronym> or
+<acronym>XML</acronym> for which the <acronym>DTD</acronym> and/or processing tools are
+not generally available, and the machine-generated <acronym>HTML</acronym>,
+PostScript or <acronym>PDF</acronym> produced by some word processors for
+output purposes only.
+</p>
+<p>The &ldquo;Title Page&rdquo; means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, &ldquo;Title Page&rdquo; means
+the text near the most prominent appearance of the work&rsquo;s title,
+preceding the beginning of the body of the text.
+</p>
+<p>The &ldquo;publisher&rdquo; means any person or entity that distributes copies
+of the Document to the public.
+</p>
+<p>A section &ldquo;Entitled XYZ&rdquo; means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as &ldquo;Acknowledgements&rdquo;,
+&ldquo;Dedications&rdquo;, &ldquo;Endorsements&rdquo;, or &ldquo;History&rdquo;.) To &ldquo;Preserve the Title&rdquo;
+of such a section when you modify the Document means that it remains a
+section &ldquo;Entitled XYZ&rdquo; according to this definition.
+</p>
+<p>The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+</p>
+</li><li> VERBATIM COPYING
+
+<p>You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+</p>
+<p>You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</p>
+</li><li> COPYING IN QUANTITY
+
+<p>If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document&rsquo;s license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+</p>
+<p>If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+</p>
+<p>If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+</p>
+<p>It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+</p>
+</li><li> MODIFICATIONS
+
+<p>You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+</p>
+<ol type="A" start="1">
+<li> Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+</li><li> List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+</li><li> State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+</li><li> Preserve all the copyright notices of the Document.
+
+</li><li> Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+</li><li> Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+</li><li> Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document&rsquo;s license notice.
+
+</li><li> Include an unaltered copy of this License.
+
+</li><li> Preserve the section Entitled &ldquo;History&rdquo;, Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled &ldquo;History&rdquo; in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+</li><li> Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the &ldquo;History&rdquo; section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+</li><li> For any section Entitled &ldquo;Acknowledgements&rdquo; or &ldquo;Dedications&rdquo;, Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+</li><li> Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+</li><li> Delete any section Entitled &ldquo;Endorsements&rdquo;. Such a section
+may not be included in the Modified Version.
+
+</li><li> Do not retitle any existing section to be Entitled &ldquo;Endorsements&rdquo; or
+to conflict in title with any Invariant Section.
+
+</li><li> Preserve any Warranty Disclaimers.
+</li></ol>
+
+<p>If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version&rsquo;s license notice.
+These titles must be distinct from any other section titles.
+</p>
+<p>You may add a section Entitled &ldquo;Endorsements&rdquo;, provided it contains
+nothing but endorsements of your Modified Version by various
+parties&mdash;for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</p>
+<p>You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+</p>
+<p>The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+</p>
+</li><li> COMBINING DOCUMENTS
+
+<p>You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+</p>
+<p>The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+</p>
+<p>In the combination, you must combine any sections Entitled &ldquo;History&rdquo;
+in the various original documents, forming one section Entitled
+&ldquo;History&rdquo;; likewise combine any sections Entitled &ldquo;Acknowledgements&rdquo;,
+and any sections Entitled &ldquo;Dedications&rdquo;. You must delete all
+sections Entitled &ldquo;Endorsements.&rdquo;
+</p>
+</li><li> COLLECTIONS OF DOCUMENTS
+
+<p>You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+</p>
+<p>You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+</p>
+</li><li> AGGREGATION WITH INDEPENDENT WORKS
+
+<p>A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an &ldquo;aggregate&rdquo; if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation&rsquo;s users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+</p>
+<p>If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document&rsquo;s Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+</p>
+</li><li> TRANSLATION
+
+<p>Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+</p>
+<p>If a section in the Document is Entitled &ldquo;Acknowledgements&rdquo;,
+&ldquo;Dedications&rdquo;, or &ldquo;History&rdquo;, the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</p>
+</li><li> TERMINATION
+
+<p>You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+</p>
+<p>However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+</p>
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+</p>
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+</p>
+</li><li> FUTURE REVISIONS OF THIS LICENSE
+
+<p>The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+<a href="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</a>.
+</p>
+<p>Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License &ldquo;or any later version&rdquo; applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy&rsquo;s public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+</p>
+</li><li> RELICENSING
+
+<p>&ldquo;Massive Multiauthor Collaboration Site&rdquo; (or &ldquo;MMC Site&rdquo;) means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+&ldquo;Massive Multiauthor Collaboration&rdquo; (or &ldquo;MMC&rdquo;) contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+</p>
+<p>&ldquo;CC-BY-SA&rdquo; means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+</p>
+<p>&ldquo;Incorporate&rdquo; means to publish or republish a Document, in whole or
+in part, as part of another Document.
+</p>
+<p>An MMC is &ldquo;eligible for relicensing&rdquo; if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+</p>
+<p>The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+</p>
+</li></ol>
+
+<span id="ADDENDUM_003a-How-to-use-this-License-for-your-documents"></span><h3 class="heading">ADDENDUM: How to use this License for your documents</h3>
+
+<p>To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+</p>
+<div class="example">
+<pre class="example"> Copyright (C) <var>year</var> <var>your name</var>.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+</pre></div>
+
+<p>If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the &ldquo;with&hellip;Texts.&rdquo; line with this:
+</p>
+<div class="example">
+<pre class="example"> with the Invariant Sections being <var>list their titles</var>, with
+ the Front-Cover Texts being <var>list</var>, and with the Back-Cover Texts
+ being <var>list</var>.
+</pre></div>
+
+<p>If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</p>
+<p>If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+</p>
+
+
+</div>
+</div>
+
+
+
+</body>
+</html>
diff --git a/doc/rluserman.info b/doc/rluserman.info
new file mode 100644
index 0000000..6bf1b4f
--- /dev/null
+++ b/doc/rluserman.info
@@ -0,0 +1,2087 @@
+This is rluserman.info, produced by makeinfo version 6.8 from
+rluserman.texi.
+
+This manual describes the end user interface of the GNU Readline Library
+(version 8.2, 19 September 2022), a library which aids in the
+consistency of user interface across discrete programs which provide a
+command line interface.
+
+ Copyright (C) 1988-2022 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.3 or any later version published by the Free Software
+ Foundation; with no Invariant Sections, no Front-Cover Texts, and
+ no Back-Cover Texts. A copy of the license is included in the
+ section entitled "GNU Free Documentation License".
+
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* RLuserman: (rluserman). The GNU readline library User's Manual.
+END-INFO-DIR-ENTRY
+
+
+File: rluserman.info, Node: Top, Next: Command Line Editing, Up: (dir)
+
+GNU Readline Library
+********************
+
+This document describes the end user interface of the GNU Readline
+Library, a utility which aids in the consistency of user interface
+across discrete programs which provide a command line interface. The
+Readline home page is <http://www.gnu.org/software/readline/>.
+
+* Menu:
+
+* Command Line Editing:: GNU Readline User's Manual.
+* GNU Free Documentation License:: License for copying this manual.
+
+
+File: rluserman.info, Node: Command Line Editing, Next: GNU Free Documentation License, Prev: Top, Up: Top
+
+1 Command Line Editing
+**********************
+
+This chapter describes the basic features of the GNU command line
+editing interface.
+
+* Menu:
+
+* Introduction and Notation:: Notation used in this text.
+* Readline Interaction:: The minimum set of commands for editing a line.
+* Readline Init File:: Customizing Readline from a user's view.
+* Bindable Readline Commands:: A description of most of the Readline commands
+ available for binding
+* Readline vi Mode:: A short description of how to make Readline
+ behave like the vi editor.
+
+
+File: rluserman.info, Node: Introduction and Notation, Next: Readline Interaction, Up: Command Line Editing
+
+1.1 Introduction to Line Editing
+================================
+
+The following paragraphs describe the notation used to represent
+keystrokes.
+
+ The text 'C-k' is read as 'Control-K' and describes the character
+produced when the <k> key is pressed while the Control key is depressed.
+
+ The text 'M-k' is read as 'Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the <k>
+key is pressed. The Meta key is labeled <ALT> on many keyboards. On
+keyboards with two keys labeled <ALT> (usually to either side of the
+space bar), the <ALT> on the left side is generally set to work as a
+Meta key. The <ALT> key on the right may also be configured to work as
+a Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+
+ If you do not have a Meta or <ALT> key, or another key working as a
+Meta key, the identical keystroke can be generated by typing <ESC>
+_first_, and then typing <k>. Either process is known as "metafying"
+the <k> key.
+
+ The text 'M-C-k' is read as 'Meta-Control-k' and describes the
+character produced by "metafying" 'C-k'.
+
+ In addition, several keys have their own names. Specifically, <DEL>,
+<ESC>, <LFD>, <SPC>, <RET>, and <TAB> all stand for themselves when seen
+in this text, or in an init file (*note Readline Init File::). If your
+keyboard lacks a <LFD> key, typing <C-j> will produce the desired
+character. The <RET> key may be labeled <Return> or <Enter> on some
+keyboards.
+
+
+File: rluserman.info, Node: Readline Interaction, Next: Readline Init File, Prev: Introduction and Notation, Up: Command Line Editing
+
+1.2 Readline Interaction
+========================
+
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled. The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line. Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections. Then, when you are satisfied with
+the line, you simply press <RET>. You do not have to be at the end of
+the line to press <RET>; the entire line is accepted regardless of the
+location of the cursor within the line.
+
+* Menu:
+
+* Readline Bare Essentials:: The least you need to know about Readline.
+* Readline Movement Commands:: Moving about the input line.
+* Readline Killing Commands:: How to delete text, and how to get it back!
+* Readline Arguments:: Giving numeric arguments to commands.
+* Searching:: Searching through previous lines.
+
+
+File: rluserman.info, Node: Readline Bare Essentials, Next: Readline Movement Commands, Up: Readline Interaction
+
+1.2.1 Readline Bare Essentials
+------------------------------
+
+In order to enter characters into the line, simply type them. The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right. If you mistype a character, you can use your erase
+character to back up and delete the mistyped character.
+
+ Sometimes you may mistype a character, and not notice the error until
+you have typed several other characters. In that case, you can type
+'C-b' to move the cursor to the left, and then correct your mistake.
+Afterwards, you can move the cursor to the right with 'C-f'.
+
+ When you add text in the middle of a line, you will notice that
+characters to the right of the cursor are 'pushed over' to make room for
+the text that you have inserted. Likewise, when you delete text behind
+the cursor, characters to the right of the cursor are 'pulled back' to
+fill in the blank space created by the removal of the text. A list of
+the bare essentials for editing the text of an input line follows.
+
+'C-b'
+ Move back one character.
+'C-f'
+ Move forward one character.
+<DEL> or <Backspace>
+ Delete the character to the left of the cursor.
+'C-d'
+ Delete the character underneath the cursor.
+Printing characters
+ Insert the character into the line at the cursor.
+'C-_' or 'C-x C-u'
+ Undo the last editing command. You can undo all the way back to an
+ empty line.
+
+(Depending on your configuration, the <Backspace> key might be set to
+delete the character to the left of the cursor and the <DEL> key set to
+delete the character underneath the cursor, like 'C-d', rather than the
+character to the left of the cursor.)
+
+
+File: rluserman.info, Node: Readline Movement Commands, Next: Readline Killing Commands, Prev: Readline Bare Essentials, Up: Readline Interaction
+
+1.2.2 Readline Movement Commands
+--------------------------------
+
+The above table describes the most basic keystrokes that you need in
+order to do editing of the input line. For your convenience, many other
+commands have been added in addition to 'C-b', 'C-f', 'C-d', and <DEL>.
+Here are some commands for moving more rapidly about the line.
+
+'C-a'
+ Move to the start of the line.
+'C-e'
+ Move to the end of the line.
+'M-f'
+ Move forward a word, where a word is composed of letters and
+ digits.
+'M-b'
+ Move backward a word.
+'C-l'
+ Clear the screen, reprinting the current line at the top.
+
+ Notice how 'C-f' moves forward a character, while 'M-f' moves forward
+a word. It is a loose convention that control keystrokes operate on
+characters while meta keystrokes operate on words.
+
+
+File: rluserman.info, Node: Readline Killing Commands, Next: Readline Arguments, Prev: Readline Movement Commands, Up: Readline Interaction
+
+1.2.3 Readline Killing Commands
+-------------------------------
+
+"Killing" text means to delete the text from the line, but to save it
+away for later use, usually by "yanking" (re-inserting) it back into the
+line. ('Cut' and 'paste' are more recent jargon for 'kill' and 'yank'.)
+
+ If the description for a command says that it 'kills' text, then you
+can be sure that you can get the text back in a different (or the same)
+place later.
+
+ When you use a kill command, the text is saved in a "kill-ring". Any
+number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all. The kill ring is not line
+specific; the text that you killed on a previously typed line is
+available to be yanked back later, when you are typing another line.
+
+ Here is the list of commands for killing text.
+
+'C-k'
+ Kill the text from the current cursor position to the end of the
+ line.
+
+'M-d'
+ Kill from the cursor to the end of the current word, or, if between
+ words, to the end of the next word. Word boundaries are the same
+ as those used by 'M-f'.
+
+'M-<DEL>'
+ Kill from the cursor to the start of the current word, or, if
+ between words, to the start of the previous word. Word boundaries
+ are the same as those used by 'M-b'.
+
+'C-w'
+ Kill from the cursor to the previous whitespace. This is different
+ than 'M-<DEL>' because the word boundaries differ.
+
+ Here is how to "yank" the text back into the line. Yanking means to
+copy the most-recently-killed text from the kill buffer.
+
+'C-y'
+ Yank the most recently killed text back into the buffer at the
+ cursor.
+
+'M-y'
+ Rotate the kill-ring, and yank the new top. You can only do this
+ if the prior command is 'C-y' or 'M-y'.
+
+
+File: rluserman.info, Node: Readline Arguments, Next: Searching, Prev: Readline Killing Commands, Up: Readline Interaction
+
+1.2.4 Readline Arguments
+------------------------
+
+You can pass numeric arguments to Readline commands. Sometimes the
+argument acts as a repeat count, other times it is the sign of the
+argument that is significant. If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction. For example, to kill text back to the
+start of the line, you might type 'M-- C-k'.
+
+ The general way to pass numeric arguments to a command is to type
+meta digits before the command. If the first 'digit' typed is a minus
+sign ('-'), then the sign of the argument will be negative. Once you
+have typed one meta digit to get the argument started, you can type the
+remainder of the digits, and then the command. For example, to give the
+'C-d' command an argument of 10, you could type 'M-1 0 C-d', which will
+delete the next ten characters on the input line.
+
+
+File: rluserman.info, Node: Searching, Prev: Readline Arguments, Up: Readline Interaction
+
+1.2.5 Searching for Commands in the History
+-------------------------------------------
+
+Readline provides commands for searching through the command history for
+lines containing a specified string. There are two search modes:
+"incremental" and "non-incremental".
+
+ Incremental searches begin before the user has finished typing the
+search string. As each character of the search string is typed,
+Readline displays the next entry from the history matching the string
+typed so far. An incremental search requires only as many characters as
+needed to find the desired history entry. To search backward in the
+history for a particular string, type 'C-r'. Typing 'C-s' searches
+forward through the history. The characters present in the value of the
+'isearch-terminators' variable are used to terminate an incremental
+search. If that variable has not been assigned a value, the <ESC> and
+'C-J' characters will terminate an incremental search. 'C-g' will abort
+an incremental search and restore the original line. When the search is
+terminated, the history entry containing the search string becomes the
+current line.
+
+ To find other matching entries in the history list, type 'C-r' or
+'C-s' as appropriate. This will search backward or forward in the
+history for the next entry matching the search string typed so far. Any
+other key sequence bound to a Readline command will terminate the search
+and execute that command. For instance, a <RET> will terminate the
+search and accept the line, thereby executing the command from the
+history list. A movement command will terminate the search, make the
+last line found the current line, and begin editing.
+
+ Readline remembers the last incremental search string. If two 'C-r's
+are typed without any intervening characters defining a new search
+string, any remembered search string is used.
+
+ Non-incremental searches read the entire search string before
+starting to search for matching history lines. The search string may be
+typed by the user or be part of the contents of the current line.
+
+
+File: rluserman.info, Node: Readline Init File, Next: Bindable Readline Commands, Prev: Readline Interaction, Up: Command Line Editing
+
+1.3 Readline Init File
+======================
+
+Although the Readline library comes with a set of Emacs-like keybindings
+installed by default, it is possible to use a different set of
+keybindings. Any user can customize programs that use Readline by
+putting commands in an "inputrc" file, conventionally in their home
+directory. The name of this file is taken from the value of the
+environment variable 'INPUTRC'. If that variable is unset, the default
+is '~/.inputrc'. If that file does not exist or cannot be read, the
+ultimate default is '/etc/inputrc'.
+
+ When a program which uses the Readline library starts up, the init
+file is read, and the key bindings are set.
+
+ In addition, the 'C-x C-r' command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+
+* Menu:
+
+* Readline Init File Syntax:: Syntax for the commands in the inputrc file.
+
+* Conditional Init Constructs:: Conditional key bindings in the inputrc file.
+
+* Sample Init File:: An example inputrc file.
+
+
+File: rluserman.info, Node: Readline Init File Syntax, Next: Conditional Init Constructs, Up: Readline Init File
+
+1.3.1 Readline Init File Syntax
+-------------------------------
+
+There are only a few basic constructs allowed in the Readline init file.
+Blank lines are ignored. Lines beginning with a '#' are comments.
+Lines beginning with a '$' indicate conditional constructs (*note
+Conditional Init Constructs::). Other lines denote variable settings
+and key bindings.
+
+Variable Settings
+ You can modify the run-time behavior of Readline by altering the
+ values of variables in Readline using the 'set' command within the
+ init file. The syntax is simple:
+
+ set VARIABLE VALUE
+
+ Here, for example, is how to change from the default Emacs-like key
+ binding to use 'vi' line editing commands:
+
+ set editing-mode vi
+
+ Variable names and values, where appropriate, are recognized
+ without regard to case. Unrecognized variable names are ignored.
+
+ Boolean variables (those that can be set to on or off) are set to
+ on if the value is null or empty, ON (case-insensitive), or 1. Any
+ other value results in the variable being set to off.
+
+ A great deal of run-time behavior is changeable with the following
+ variables.
+
+ 'active-region-start-color'
+ A string variable that controls the text color and background
+ when displaying the text in the active region (see the
+ description of 'enable-active-region' below). This string
+ must not take up any physical character positions on the
+ display, so it should consist only of terminal escape
+ sequences. It is output to the terminal before displaying the
+ text in the active region. This variable is reset to the
+ default value whenever the terminal type changes. The default
+ value is the string that puts the terminal in standout mode,
+ as obtained from the terminal's terminfo description. A
+ sample value might be '\e[01;33m'.
+
+ 'active-region-end-color'
+ A string variable that "undoes" the effects of
+ 'active-region-start-color' and restores "normal" terminal
+ display appearance after displaying text in the active region.
+ This string must not take up any physical character positions
+ on the display, so it should consist only of terminal escape
+ sequences. It is output to the terminal after displaying the
+ text in the active region. This variable is reset to the
+ default value whenever the terminal type changes. The default
+ value is the string that restores the terminal from standout
+ mode, as obtained from the terminal's terminfo description. A
+ sample value might be '\e[0m'.
+
+ 'bell-style'
+ Controls what happens when Readline wants to ring the terminal
+ bell. If set to 'none', Readline never rings the bell. If
+ set to 'visible', Readline uses a visible bell if one is
+ available. If set to 'audible' (the default), Readline
+ attempts to ring the terminal's bell.
+
+ 'bind-tty-special-chars'
+ If set to 'on' (the default), Readline attempts to bind the
+ control characters treated specially by the kernel's terminal
+ driver to their Readline equivalents.
+
+ 'blink-matching-paren'
+ If set to 'on', Readline attempts to briefly move the cursor
+ to an opening parenthesis when a closing parenthesis is
+ inserted. The default is 'off'.
+
+ 'colored-completion-prefix'
+ If set to 'on', when listing completions, Readline displays
+ the common prefix of the set of possible completions using a
+ different color. The color definitions are taken from the
+ value of the 'LS_COLORS' environment variable. If there is a
+ color definition in 'LS_COLORS' for the custom suffix
+ 'readline-colored-completion-prefix', Readline uses this color
+ for the common prefix instead of its default. The default is
+ 'off'.
+
+ 'colored-stats'
+ If set to 'on', Readline displays possible completions using
+ different colors to indicate their file type. The color
+ definitions are taken from the value of the 'LS_COLORS'
+ environment variable. The default is 'off'.
+
+ 'comment-begin'
+ The string to insert at the beginning of the line when the
+ 'insert-comment' command is executed. The default value is
+ '"#"'.
+
+ 'completion-display-width'
+ The number of screen columns used to display possible matches
+ when performing completion. The value is ignored if it is
+ less than 0 or greater than the terminal screen width. A
+ value of 0 will cause matches to be displayed one per line.
+ The default value is -1.
+
+ 'completion-ignore-case'
+ If set to 'on', Readline performs filename matching and
+ completion in a case-insensitive fashion. The default value
+ is 'off'.
+
+ 'completion-map-case'
+ If set to 'on', and COMPLETION-IGNORE-CASE is enabled,
+ Readline treats hyphens ('-') and underscores ('_') as
+ equivalent when performing case-insensitive filename matching
+ and completion. The default value is 'off'.
+
+ 'completion-prefix-display-length'
+ The length in characters of the common prefix of a list of
+ possible completions that is displayed without modification.
+ When set to a value greater than zero, common prefixes longer
+ than this value are replaced with an ellipsis when displaying
+ possible completions.
+
+ 'completion-query-items'
+ The number of possible completions that determines when the
+ user is asked whether the list of possibilities should be
+ displayed. If the number of possible completions is greater
+ than or equal to this value, Readline will ask whether or not
+ the user wishes to view them; otherwise, they are simply
+ listed. This variable must be set to an integer value greater
+ than or equal to zero. A zero value means Readline should
+ never ask; negative values are treated as zero. The default
+ limit is '100'.
+
+ 'convert-meta'
+ If set to 'on', Readline will convert characters with the
+ eighth bit set to an ASCII key sequence by stripping the
+ eighth bit and prefixing an <ESC> character, converting them
+ to a meta-prefixed key sequence. The default value is 'on',
+ but will be set to 'off' if the locale is one that contains
+ eight-bit characters. This variable is dependent on the
+ 'LC_CTYPE' locale category, and may change if the locale is
+ changed.
+
+ 'disable-completion'
+ If set to 'On', Readline will inhibit word completion.
+ Completion characters will be inserted into the line as if
+ they had been mapped to 'self-insert'. The default is 'off'.
+
+ 'echo-control-characters'
+ When set to 'on', on operating systems that indicate they
+ support it, Readline echoes a character corresponding to a
+ signal generated from the keyboard. The default is 'on'.
+
+ 'editing-mode'
+ The 'editing-mode' variable controls which default set of key
+ bindings is used. By default, Readline starts up in Emacs
+ editing mode, where the keystrokes are most similar to Emacs.
+ This variable can be set to either 'emacs' or 'vi'.
+
+ 'emacs-mode-string'
+ If the SHOW-MODE-IN-PROMPT variable is enabled, this string is
+ displayed immediately before the last line of the primary
+ prompt when emacs editing mode is active. The value is
+ expanded like a key binding, so the standard set of meta- and
+ control prefixes and backslash escape sequences is available.
+ Use the '\1' and '\2' escapes to begin and end sequences of
+ non-printing characters, which can be used to embed a terminal
+ control sequence into the mode string. The default is '@'.
+
+ 'enable-active-region'
+ The "point" is the current cursor position, and "mark" refers
+ to a saved cursor position (*note Commands For Moving::). The
+ text between the point and mark is referred to as the
+ "region". When this variable is set to 'On', Readline allows
+ certain commands to designate the region as "active". When
+ the region is active, Readline highlights the text in the
+ region using the value of the 'active-region-start-color',
+ which defaults to the string that enables the terminal's
+ standout mode. The active region shows the text inserted by
+ bracketed-paste and any matching text found by incremental and
+ non-incremental history searches. The default is 'On'.
+
+ 'enable-bracketed-paste'
+ When set to 'On', Readline configures the terminal to insert
+ each paste into the editing buffer as a single string of
+ characters, instead of treating each character as if it had
+ been read from the keyboard. This is called putting the
+ terminal into "bracketed paste mode"; it prevents Readline
+ from executing any editing commands bound to key sequences
+ appearing in the pasted text. The default is 'On'.
+
+ 'enable-keypad'
+ When set to 'on', Readline will try to enable the application
+ keypad when it is called. Some systems need this to enable
+ the arrow keys. The default is 'off'.
+
+ 'enable-meta-key'
+ When set to 'on', Readline will try to enable any meta
+ modifier key the terminal claims to support when it is called.
+ On many terminals, the meta key is used to send eight-bit
+ characters. The default is 'on'.
+
+ 'expand-tilde'
+ If set to 'on', tilde expansion is performed when Readline
+ attempts word completion. The default is 'off'.
+
+ 'history-preserve-point'
+ If set to 'on', the history code attempts to place the point
+ (the current cursor position) at the same location on each
+ history line retrieved with 'previous-history' or
+ 'next-history'. The default is 'off'.
+
+ 'history-size'
+ Set the maximum number of history entries saved in the history
+ list. If set to zero, any existing history entries are
+ deleted and no new entries are saved. If set to a value less
+ than zero, the number of history entries is not limited. By
+ default, the number of history entries is not limited. If an
+ attempt is made to set HISTORY-SIZE to a non-numeric value,
+ the maximum number of history entries will be set to 500.
+
+ 'horizontal-scroll-mode'
+ This variable can be set to either 'on' or 'off'. Setting it
+ to 'on' means that the text of the lines being edited will
+ scroll horizontally on a single screen line when they are
+ longer than the width of the screen, instead of wrapping onto
+ a new screen line. This variable is automatically set to 'on'
+ for terminals of height 1. By default, this variable is set
+ to 'off'.
+
+ 'input-meta'
+ If set to 'on', Readline will enable eight-bit input (it will
+ not clear the eighth bit in the characters it reads),
+ regardless of what the terminal claims it can support. The
+ default value is 'off', but Readline will set it to 'on' if
+ the locale contains eight-bit characters. The name
+ 'meta-flag' is a synonym for this variable. This variable is
+ dependent on the 'LC_CTYPE' locale category, and may change if
+ the locale is changed.
+
+ 'isearch-terminators'
+ The string of characters that should terminate an incremental
+ search without subsequently executing the character as a
+ command (*note Searching::). If this variable has not been
+ given a value, the characters <ESC> and 'C-J' will terminate
+ an incremental search.
+
+ 'keymap'
+ Sets Readline's idea of the current keymap for key binding
+ commands. Built-in 'keymap' names are 'emacs',
+ 'emacs-standard', 'emacs-meta', 'emacs-ctlx', 'vi', 'vi-move',
+ 'vi-command', and 'vi-insert'. 'vi' is equivalent to
+ 'vi-command' ('vi-move' is also a synonym); 'emacs' is
+ equivalent to 'emacs-standard'. Applications may add
+ additional names. The default value is 'emacs'. The value of
+ the 'editing-mode' variable also affects the default keymap.
+
+ 'keyseq-timeout'
+ Specifies the duration Readline will wait for a character when
+ reading an ambiguous key sequence (one that can form a
+ complete key sequence using the input read so far, or can take
+ additional input to complete a longer key sequence). If no
+ input is received within the timeout, Readline will use the
+ shorter but complete key sequence. Readline uses this value
+ to determine whether or not input is available on the current
+ input source ('rl_instream' by default). The value is
+ specified in milliseconds, so a value of 1000 means that
+ Readline will wait one second for additional input. If this
+ variable is set to a value less than or equal to zero, or to a
+ non-numeric value, Readline will wait until another key is
+ pressed to decide which key sequence to complete. The default
+ value is '500'.
+
+ 'mark-directories'
+ If set to 'on', completed directory names have a slash
+ appended. The default is 'on'.
+
+ 'mark-modified-lines'
+ This variable, when set to 'on', causes Readline to display an
+ asterisk ('*') at the start of history lines which have been
+ modified. This variable is 'off' by default.
+
+ 'mark-symlinked-directories'
+ If set to 'on', completed names which are symbolic links to
+ directories have a slash appended (subject to the value of
+ 'mark-directories'). The default is 'off'.
+
+ 'match-hidden-files'
+ This variable, when set to 'on', causes Readline to match
+ files whose names begin with a '.' (hidden files) when
+ performing filename completion. If set to 'off', the leading
+ '.' must be supplied by the user in the filename to be
+ completed. This variable is 'on' by default.
+
+ 'menu-complete-display-prefix'
+ If set to 'on', menu completion displays the common prefix of
+ the list of possible completions (which may be empty) before
+ cycling through the list. The default is 'off'.
+
+ 'output-meta'
+ If set to 'on', Readline will display characters with the
+ eighth bit set directly rather than as a meta-prefixed escape
+ sequence. The default is 'off', but Readline will set it to
+ 'on' if the locale contains eight-bit characters. This
+ variable is dependent on the 'LC_CTYPE' locale category, and
+ may change if the locale is changed.
+
+ 'page-completions'
+ If set to 'on', Readline uses an internal 'more'-like pager to
+ display a screenful of possible completions at a time. This
+ variable is 'on' by default.
+
+ 'print-completions-horizontally'
+ If set to 'on', Readline will display completions with matches
+ sorted horizontally in alphabetical order, rather than down
+ the screen. The default is 'off'.
+
+ 'revert-all-at-newline'
+ If set to 'on', Readline will undo all changes to history
+ lines before returning when 'accept-line' is executed. By
+ default, history lines may be modified and retain individual
+ undo lists across calls to 'readline()'. The default is
+ 'off'.
+
+ 'show-all-if-ambiguous'
+ This alters the default behavior of the completion functions.
+ If set to 'on', words which have more than one possible
+ completion cause the matches to be listed immediately instead
+ of ringing the bell. The default value is 'off'.
+
+ 'show-all-if-unmodified'
+ This alters the default behavior of the completion functions
+ in a fashion similar to SHOW-ALL-IF-AMBIGUOUS. If set to
+ 'on', words which have more than one possible completion
+ without any possible partial completion (the possible
+ completions don't share a common prefix) cause the matches to
+ be listed immediately instead of ringing the bell. The
+ default value is 'off'.
+
+ 'show-mode-in-prompt'
+ If set to 'on', add a string to the beginning of the prompt
+ indicating the editing mode: emacs, vi command, or vi
+ insertion. The mode strings are user-settable (e.g.,
+ EMACS-MODE-STRING). The default value is 'off'.
+
+ 'skip-completed-text'
+ If set to 'on', this alters the default completion behavior
+ when inserting a single match into the line. It's only active
+ when performing completion in the middle of a word. If
+ enabled, Readline does not insert characters from the
+ completion that match characters after point in the word being
+ completed, so portions of the word following the cursor are
+ not duplicated. For instance, if this is enabled, attempting
+ completion when the cursor is after the 'e' in 'Makefile' will
+ result in 'Makefile' rather than 'Makefilefile', assuming
+ there is a single possible completion. The default value is
+ 'off'.
+
+ 'vi-cmd-mode-string'
+ If the SHOW-MODE-IN-PROMPT variable is enabled, this string is
+ displayed immediately before the last line of the primary
+ prompt when vi editing mode is active and in command mode.
+ The value is expanded like a key binding, so the standard set
+ of meta- and control prefixes and backslash escape sequences
+ is available. Use the '\1' and '\2' escapes to begin and end
+ sequences of non-printing characters, which can be used to
+ embed a terminal control sequence into the mode string. The
+ default is '(cmd)'.
+
+ 'vi-ins-mode-string'
+ If the SHOW-MODE-IN-PROMPT variable is enabled, this string is
+ displayed immediately before the last line of the primary
+ prompt when vi editing mode is active and in insertion mode.
+ The value is expanded like a key binding, so the standard set
+ of meta- and control prefixes and backslash escape sequences
+ is available. Use the '\1' and '\2' escapes to begin and end
+ sequences of non-printing characters, which can be used to
+ embed a terminal control sequence into the mode string. The
+ default is '(ins)'.
+
+ 'visible-stats'
+ If set to 'on', a character denoting a file's type is appended
+ to the filename when listing possible completions. The
+ default is 'off'.
+
+Key Bindings
+ The syntax for controlling key bindings in the init file is simple.
+ First you need to find the name of the command that you want to
+ change. The following sections contain tables of the command name,
+ the default keybinding, if any, and a short description of what the
+ command does.
+
+ Once you know the name of the command, simply place on a line in
+ the init file the name of the key you wish to bind the command to,
+ a colon, and then the name of the command. There can be no space
+ between the key name and the colon - that will be interpreted as
+ part of the key name. The name of the key can be expressed in
+ different ways, depending on what you find most comfortable.
+
+ In addition to command names, Readline allows keys to be bound to a
+ string that is inserted when the key is pressed (a MACRO).
+
+ KEYNAME: FUNCTION-NAME or MACRO
+ KEYNAME is the name of a key spelled out in English. For
+ example:
+ Control-u: universal-argument
+ Meta-Rubout: backward-kill-word
+ Control-o: "> output"
+
+ In the example above, 'C-u' is bound to the function
+ 'universal-argument', 'M-DEL' is bound to the function
+ 'backward-kill-word', and 'C-o' is bound to run the macro
+ expressed on the right hand side (that is, to insert the text
+ '> output' into the line).
+
+ A number of symbolic character names are recognized while
+ processing this key binding syntax: DEL, ESC, ESCAPE, LFD,
+ NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB.
+
+ "KEYSEQ": FUNCTION-NAME or MACRO
+ KEYSEQ differs from KEYNAME above in that strings denoting an
+ entire key sequence can be specified, by placing the key
+ sequence in double quotes. Some GNU Emacs style key escapes
+ can be used, as in the following example, but the special
+ character names are not recognized.
+
+ "\C-u": universal-argument
+ "\C-x\C-r": re-read-init-file
+ "\e[11~": "Function Key 1"
+
+ In the above example, 'C-u' is again bound to the function
+ 'universal-argument' (just as it was in the first example),
+ ''C-x' 'C-r'' is bound to the function 're-read-init-file',
+ and '<ESC> <[> <1> <1> <~>' is bound to insert the text
+ 'Function Key 1'.
+
+ The following GNU Emacs style escape sequences are available when
+ specifying key sequences:
+
+ '\C-'
+ control prefix
+ '\M-'
+ meta prefix
+ '\e'
+ an escape character
+ '\\'
+ backslash
+ '\"'
+ <">, a double quotation mark
+ '\''
+ <'>, a single quote or apostrophe
+
+ In addition to the GNU Emacs style escape sequences, a second set
+ of backslash escapes is available:
+
+ '\a'
+ alert (bell)
+ '\b'
+ backspace
+ '\d'
+ delete
+ '\f'
+ form feed
+ '\n'
+ newline
+ '\r'
+ carriage return
+ '\t'
+ horizontal tab
+ '\v'
+ vertical tab
+ '\NNN'
+ the eight-bit character whose value is the octal value NNN
+ (one to three digits)
+ '\xHH'
+ the eight-bit character whose value is the hexadecimal value
+ HH (one or two hex digits)
+
+ When entering the text of a macro, single or double quotes must be
+ used to indicate a macro definition. Unquoted text is assumed to
+ be a function name. In the macro body, the backslash escapes
+ described above are expanded. Backslash will quote any other
+ character in the macro text, including '"' and '''. For example,
+ the following binding will make ''C-x' \' insert a single '\' into
+ the line:
+ "\C-x\\": "\\"
+
+
+File: rluserman.info, Node: Conditional Init Constructs, Next: Sample Init File, Prev: Readline Init File Syntax, Up: Readline Init File
+
+1.3.2 Conditional Init Constructs
+---------------------------------
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key bindings and
+variable settings to be performed as the result of tests. There are
+four parser directives used.
+
+'$if'
+ The '$if' construct allows bindings to be made based on the editing
+ mode, the terminal being used, or the application using Readline.
+ The text of the test, after any comparison operator, extends to the
+ end of the line; unless otherwise noted, no characters are required
+ to isolate it.
+
+ 'mode'
+ The 'mode=' form of the '$if' directive is used to test
+ whether Readline is in 'emacs' or 'vi' mode. This may be used
+ in conjunction with the 'set keymap' command, for instance, to
+ set bindings in the 'emacs-standard' and 'emacs-ctlx' keymaps
+ only if Readline is starting out in 'emacs' mode.
+
+ 'term'
+ The 'term=' form may be used to include terminal-specific key
+ bindings, perhaps to bind the key sequences output by the
+ terminal's function keys. The word on the right side of the
+ '=' is tested against both the full name of the terminal and
+ the portion of the terminal name before the first '-'. This
+ allows 'sun' to match both 'sun' and 'sun-cmd', for instance.
+
+ 'version'
+ The 'version' test may be used to perform comparisons against
+ specific Readline versions. The 'version' expands to the
+ current Readline version. The set of comparison operators
+ includes '=' (and '=='), '!=', '<=', '>=', '<', and '>'. The
+ version number supplied on the right side of the operator
+ consists of a major version number, an optional decimal point,
+ and an optional minor version (e.g., '7.1'). If the minor
+ version is omitted, it is assumed to be '0'. The operator may
+ be separated from the string 'version' and from the version
+ number argument by whitespace. The following example sets a
+ variable if the Readline version being used is 7.0 or newer:
+ $if version >= 7.0
+ set show-mode-in-prompt on
+ $endif
+
+ 'application'
+ The APPLICATION construct is used to include
+ application-specific settings. Each program using the
+ Readline library sets the APPLICATION NAME, and you can test
+ for a particular value. This could be used to bind key
+ sequences to functions useful for a specific program. For
+ instance, the following command adds a key sequence that
+ quotes the current or previous word in Bash:
+ $if Bash
+ # Quote the current or previous word
+ "\C-xq": "\eb\"\ef\""
+ $endif
+
+ 'variable'
+ The VARIABLE construct provides simple equality tests for
+ Readline variables and values. The permitted comparison
+ operators are '=', '==', and '!='. The variable name must be
+ separated from the comparison operator by whitespace; the
+ operator may be separated from the value on the right hand
+ side by whitespace. Both string and boolean variables may be
+ tested. Boolean variables must be tested against the values
+ ON and OFF. The following example is equivalent to the
+ 'mode=emacs' test described above:
+ $if editing-mode == emacs
+ set show-mode-in-prompt on
+ $endif
+
+'$endif'
+ This command, as seen in the previous example, terminates an '$if'
+ command.
+
+'$else'
+ Commands in this branch of the '$if' directive are executed if the
+ test fails.
+
+'$include'
+ This directive takes a single filename as an argument and reads
+ commands and bindings from that file. For example, the following
+ directive reads from '/etc/inputrc':
+ $include /etc/inputrc
+
+
+File: rluserman.info, Node: Sample Init File, Prev: Conditional Init Constructs, Up: Readline Init File
+
+1.3.3 Sample Init File
+----------------------
+
+Here is an example of an INPUTRC file. This illustrates key binding,
+variable assignment, and conditional syntax.
+
+ # This file controls the behaviour of line input editing for
+ # programs that use the GNU Readline library. Existing
+ # programs include FTP, Bash, and GDB.
+ #
+ # You can re-read the inputrc file with C-x C-r.
+ # Lines beginning with '#' are comments.
+ #
+ # First, include any system-wide bindings and variable
+ # assignments from /etc/Inputrc
+ $include /etc/Inputrc
+
+ #
+ # Set various bindings for emacs mode.
+
+ set editing-mode emacs
+
+ $if mode=emacs
+
+ Meta-Control-h: backward-kill-word Text after the function name is ignored
+
+ #
+ # Arrow keys in keypad mode
+ #
+ #"\M-OD": backward-char
+ #"\M-OC": forward-char
+ #"\M-OA": previous-history
+ #"\M-OB": next-history
+ #
+ # Arrow keys in ANSI mode
+ #
+ "\M-[D": backward-char
+ "\M-[C": forward-char
+ "\M-[A": previous-history
+ "\M-[B": next-history
+ #
+ # Arrow keys in 8 bit keypad mode
+ #
+ #"\M-\C-OD": backward-char
+ #"\M-\C-OC": forward-char
+ #"\M-\C-OA": previous-history
+ #"\M-\C-OB": next-history
+ #
+ # Arrow keys in 8 bit ANSI mode
+ #
+ #"\M-\C-[D": backward-char
+ #"\M-\C-[C": forward-char
+ #"\M-\C-[A": previous-history
+ #"\M-\C-[B": next-history
+
+ C-q: quoted-insert
+
+ $endif
+
+ # An old-style binding. This happens to be the default.
+ TAB: complete
+
+ # Macros that are convenient for shell interaction
+ $if Bash
+ # edit the path
+ "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+ # prepare to type a quoted word --
+ # insert open and close double quotes
+ # and move to just after the open quote
+ "\C-x\"": "\"\"\C-b"
+ # insert a backslash (testing backslash escapes
+ # in sequences and macros)
+ "\C-x\\": "\\"
+ # Quote the current or previous word
+ "\C-xq": "\eb\"\ef\""
+ # Add a binding to refresh the line, which is unbound
+ "\C-xr": redraw-current-line
+ # Edit variable on current line.
+ "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+ $endif
+
+ # use a visible bell if one is available
+ set bell-style visible
+
+ # don't strip characters to 7 bits when reading
+ set input-meta on
+
+ # allow iso-latin1 characters to be inserted rather
+ # than converted to prefix-meta sequences
+ set convert-meta off
+
+ # display characters with the eighth bit set directly
+ # rather than as meta-prefixed characters
+ set output-meta on
+
+ # if there are 150 or more possible completions for a word,
+ # ask whether or not the user wants to see all of them
+ set completion-query-items 150
+
+ # For FTP
+ $if Ftp
+ "\C-xg": "get \M-?"
+ "\C-xt": "put \M-?"
+ "\M-.": yank-last-arg
+ $endif
+
+
+File: rluserman.info, Node: Bindable Readline Commands, Next: Readline vi Mode, Prev: Readline Init File, Up: Command Line Editing
+
+1.4 Bindable Readline Commands
+==============================
+
+* Menu:
+
+* Commands For Moving:: Moving about the line.
+* Commands For History:: Getting at previous lines.
+* Commands For Text:: Commands for changing text.
+* Commands For Killing:: Commands for killing and yanking.
+* Numeric Arguments:: Specifying numeric arguments, repeat counts.
+* Commands For Completion:: Getting Readline to do the typing for you.
+* Keyboard Macros:: Saving and re-executing typed characters
+* Miscellaneous Commands:: Other miscellaneous commands.
+
+This section describes Readline commands that may be bound to key
+sequences. Command names without an accompanying key sequence are
+unbound by default.
+
+ In the following descriptions, "point" refers to the current cursor
+position, and "mark" refers to a cursor position saved by the 'set-mark'
+command. The text between the point and mark is referred to as the
+"region".
+
+
+File: rluserman.info, Node: Commands For Moving, Next: Commands For History, Up: Bindable Readline Commands
+
+1.4.1 Commands For Moving
+-------------------------
+
+'beginning-of-line (C-a)'
+ Move to the start of the current line.
+
+'end-of-line (C-e)'
+ Move to the end of the line.
+
+'forward-char (C-f)'
+ Move forward a character.
+
+'backward-char (C-b)'
+ Move back a character.
+
+'forward-word (M-f)'
+ Move forward to the end of the next word. Words are composed of
+ letters and digits.
+
+'backward-word (M-b)'
+ Move back to the start of the current or previous word. Words are
+ composed of letters and digits.
+
+'previous-screen-line ()'
+ Attempt to move point to the same physical screen column on the
+ previous physical screen line. This will not have the desired
+ effect if the current Readline line does not take up more than one
+ physical line or if point is not greater than the length of the
+ prompt plus the screen width.
+
+'next-screen-line ()'
+ Attempt to move point to the same physical screen column on the
+ next physical screen line. This will not have the desired effect
+ if the current Readline line does not take up more than one
+ physical line or if the length of the current Readline line is not
+ greater than the length of the prompt plus the screen width.
+
+'clear-display (M-C-l)'
+ Clear the screen and, if possible, the terminal's scrollback
+ buffer, then redraw the current line, leaving the current line at
+ the top of the screen.
+
+'clear-screen (C-l)'
+ Clear the screen, then redraw the current line, leaving the current
+ line at the top of the screen.
+
+'redraw-current-line ()'
+ Refresh the current line. By default, this is unbound.
+
+
+File: rluserman.info, Node: Commands For History, Next: Commands For Text, Prev: Commands For Moving, Up: Bindable Readline Commands
+
+1.4.2 Commands For Manipulating The History
+-------------------------------------------
+
+'accept-line (Newline or Return)'
+ Accept the line regardless of where the cursor is. If this line is
+ non-empty, it may be added to the history list for future recall
+ with 'add_history()'. If this line is a modified history line, the
+ history line is restored to its original state.
+
+'previous-history (C-p)'
+ Move 'back' through the history list, fetching the previous
+ command.
+
+'next-history (C-n)'
+ Move 'forward' through the history list, fetching the next command.
+
+'beginning-of-history (M-<)'
+ Move to the first line in the history.
+
+'end-of-history (M->)'
+ Move to the end of the input history, i.e., the line currently
+ being entered.
+
+'reverse-search-history (C-r)'
+ Search backward starting at the current line and moving 'up'
+ through the history as necessary. This is an incremental search.
+ This command sets the region to the matched text and activates the
+ mark.
+
+'forward-search-history (C-s)'
+ Search forward starting at the current line and moving 'down'
+ through the history as necessary. This is an incremental search.
+ This command sets the region to the matched text and activates the
+ mark.
+
+'non-incremental-reverse-search-history (M-p)'
+ Search backward starting at the current line and moving 'up'
+ through the history as necessary using a non-incremental search for
+ a string supplied by the user. The search string may match
+ anywhere in a history line.
+
+'non-incremental-forward-search-history (M-n)'
+ Search forward starting at the current line and moving 'down'
+ through the history as necessary using a non-incremental search for
+ a string supplied by the user. The search string may match
+ anywhere in a history line.
+
+'history-search-forward ()'
+ Search forward through the history for the string of characters
+ between the start of the current line and the point. The search
+ string must match at the beginning of a history line. This is a
+ non-incremental search. By default, this command is unbound.
+
+'history-search-backward ()'
+ Search backward through the history for the string of characters
+ between the start of the current line and the point. The search
+ string must match at the beginning of a history line. This is a
+ non-incremental search. By default, this command is unbound.
+
+'history-substring-search-forward ()'
+ Search forward through the history for the string of characters
+ between the start of the current line and the point. The search
+ string may match anywhere in a history line. This is a
+ non-incremental search. By default, this command is unbound.
+
+'history-substring-search-backward ()'
+ Search backward through the history for the string of characters
+ between the start of the current line and the point. The search
+ string may match anywhere in a history line. This is a
+ non-incremental search. By default, this command is unbound.
+
+'yank-nth-arg (M-C-y)'
+ Insert the first argument to the previous command (usually the
+ second word on the previous line) at point. With an argument N,
+ insert the Nth word from the previous command (the words in the
+ previous command begin with word 0). A negative argument inserts
+ the Nth word from the end of the previous command. Once the
+ argument N is computed, the argument is extracted as if the '!N'
+ history expansion had been specified.
+
+'yank-last-arg (M-. or M-_)'
+ Insert last argument to the previous command (the last word of the
+ previous history entry). With a numeric argument, behave exactly
+ like 'yank-nth-arg'. Successive calls to 'yank-last-arg' move back
+ through the history list, inserting the last word (or the word
+ specified by the argument to the first call) of each line in turn.
+ Any numeric argument supplied to these successive calls determines
+ the direction to move through the history. A negative argument
+ switches the direction through the history (back or forward). The
+ history expansion facilities are used to extract the last argument,
+ as if the '!$' history expansion had been specified.
+
+'operate-and-get-next (C-o)'
+ Accept the current line for return to the calling application as if
+ a newline had been entered, and fetch the next line relative to the
+ current line from the history for editing. A numeric argument, if
+ supplied, specifies the history entry to use instead of the current
+ line.
+
+'fetch-history ()'
+ With a numeric argument, fetch that entry from the history list and
+ make it the current line. Without an argument, move back to the
+ first entry in the history list.
+
+
+File: rluserman.info, Node: Commands For Text, Next: Commands For Killing, Prev: Commands For History, Up: Bindable Readline Commands
+
+1.4.3 Commands For Changing Text
+--------------------------------
+
+'end-of-file (usually C-d)'
+ The character indicating end-of-file as set, for example, by
+ 'stty'. If this character is read when there are no characters on
+ the line, and point is at the beginning of the line, Readline
+ interprets it as the end of input and returns EOF.
+
+'delete-char (C-d)'
+ Delete the character at point. If this function is bound to the
+ same character as the tty EOF character, as 'C-d' commonly is, see
+ above for the effects.
+
+'backward-delete-char (Rubout)'
+ Delete the character behind the cursor. A numeric argument means
+ to kill the characters instead of deleting them.
+
+'forward-backward-delete-char ()'
+ Delete the character under the cursor, unless the cursor is at the
+ end of the line, in which case the character behind the cursor is
+ deleted. By default, this is not bound to a key.
+
+'quoted-insert (C-q or C-v)'
+ Add the next character typed to the line verbatim. This is how to
+ insert key sequences like 'C-q', for example.
+
+'tab-insert (M-<TAB>)'
+ Insert a tab character.
+
+'self-insert (a, b, A, 1, !, ...)'
+ Insert yourself.
+
+'bracketed-paste-begin ()'
+ This function is intended to be bound to the "bracketed paste"
+ escape sequence sent by some terminals, and such a binding is
+ assigned by default. It allows Readline to insert the pasted text
+ as a single unit without treating each character as if it had been
+ read from the keyboard. The characters are inserted as if each one
+ was bound to 'self-insert' instead of executing any editing
+ commands.
+
+ Bracketed paste sets the region (the characters between point and
+ the mark) to the inserted text. It uses the concept of an _active
+ mark_: when the mark is active, Readline redisplay uses the
+ terminal's standout mode to denote the region.
+
+'transpose-chars (C-t)'
+ Drag the character before the cursor forward over the character at
+ the cursor, moving the cursor forward as well. If the insertion
+ point is at the end of the line, then this transposes the last two
+ characters of the line. Negative arguments have no effect.
+
+'transpose-words (M-t)'
+ Drag the word before point past the word after point, moving point
+ past that word as well. If the insertion point is at the end of
+ the line, this transposes the last two words on the line.
+
+'upcase-word (M-u)'
+ Uppercase the current (or following) word. With a negative
+ argument, uppercase the previous word, but do not move the cursor.
+
+'downcase-word (M-l)'
+ Lowercase the current (or following) word. With a negative
+ argument, lowercase the previous word, but do not move the cursor.
+
+'capitalize-word (M-c)'
+ Capitalize the current (or following) word. With a negative
+ argument, capitalize the previous word, but do not move the cursor.
+
+'overwrite-mode ()'
+ Toggle overwrite mode. With an explicit positive numeric argument,
+ switches to overwrite mode. With an explicit non-positive numeric
+ argument, switches to insert mode. This command affects only
+ 'emacs' mode; 'vi' mode does overwrite differently. Each call to
+ 'readline()' starts in insert mode.
+
+ In overwrite mode, characters bound to 'self-insert' replace the
+ text at point rather than pushing the text to the right.
+ Characters bound to 'backward-delete-char' replace the character
+ before point with a space.
+
+ By default, this command is unbound.
+
+
+File: rluserman.info, Node: Commands For Killing, Next: Numeric Arguments, Prev: Commands For Text, Up: Bindable Readline Commands
+
+1.4.4 Killing And Yanking
+-------------------------
+
+'kill-line (C-k)'
+ Kill the text from point to the end of the line. With a negative
+ numeric argument, kill backward from the cursor to the beginning of
+ the current line.
+
+'backward-kill-line (C-x Rubout)'
+ Kill backward from the cursor to the beginning of the current line.
+ With a negative numeric argument, kill forward from the cursor to
+ the end of the current line.
+
+'unix-line-discard (C-u)'
+ Kill backward from the cursor to the beginning of the current line.
+
+'kill-whole-line ()'
+ Kill all characters on the current line, no matter where point is.
+ By default, this is unbound.
+
+'kill-word (M-d)'
+ Kill from point to the end of the current word, or if between
+ words, to the end of the next word. Word boundaries are the same
+ as 'forward-word'.
+
+'backward-kill-word (M-<DEL>)'
+ Kill the word behind point. Word boundaries are the same as
+ 'backward-word'.
+
+'shell-transpose-words (M-C-t)'
+ Drag the word before point past the word after point, moving point
+ past that word as well. If the insertion point is at the end of
+ the line, this transposes the last two words on the line. Word
+ boundaries are the same as 'shell-forward-word' and
+ 'shell-backward-word'.
+
+'unix-word-rubout (C-w)'
+ Kill the word behind point, using white space as a word boundary.
+ The killed text is saved on the kill-ring.
+
+'unix-filename-rubout ()'
+ Kill the word behind point, using white space and the slash
+ character as the word boundaries. The killed text is saved on the
+ kill-ring.
+
+'delete-horizontal-space ()'
+ Delete all spaces and tabs around point. By default, this is
+ unbound.
+
+'kill-region ()'
+ Kill the text in the current region. By default, this command is
+ unbound.
+
+'copy-region-as-kill ()'
+ Copy the text in the region to the kill buffer, so it can be yanked
+ right away. By default, this command is unbound.
+
+'copy-backward-word ()'
+ Copy the word before point to the kill buffer. The word boundaries
+ are the same as 'backward-word'. By default, this command is
+ unbound.
+
+'copy-forward-word ()'
+ Copy the word following point to the kill buffer. The word
+ boundaries are the same as 'forward-word'. By default, this
+ command is unbound.
+
+'yank (C-y)'
+ Yank the top of the kill ring into the buffer at point.
+
+'yank-pop (M-y)'
+ Rotate the kill-ring, and yank the new top. You can only do this
+ if the prior command is 'yank' or 'yank-pop'.
+
+
+File: rluserman.info, Node: Numeric Arguments, Next: Commands For Completion, Prev: Commands For Killing, Up: Bindable Readline Commands
+
+1.4.5 Specifying Numeric Arguments
+----------------------------------
+
+'digit-argument (M-0, M-1, ... M--)'
+ Add this digit to the argument already accumulating, or start a new
+ argument. 'M--' starts a negative argument.
+
+'universal-argument ()'
+ This is another way to specify an argument. If this command is
+ followed by one or more digits, optionally with a leading minus
+ sign, those digits define the argument. If the command is followed
+ by digits, executing 'universal-argument' again ends the numeric
+ argument, but is otherwise ignored. As a special case, if this
+ command is immediately followed by a character that is neither a
+ digit nor minus sign, the argument count for the next command is
+ multiplied by four. The argument count is initially one, so
+ executing this function the first time makes the argument count
+ four, a second time makes the argument count sixteen, and so on.
+ By default, this is not bound to a key.
+
+
+File: rluserman.info, Node: Commands For Completion, Next: Keyboard Macros, Prev: Numeric Arguments, Up: Bindable Readline Commands
+
+1.4.6 Letting Readline Type For You
+-----------------------------------
+
+'complete (<TAB>)'
+ Attempt to perform completion on the text before point. The actual
+ completion performed is application-specific. The default is
+ filename completion.
+
+'possible-completions (M-?)'
+ List the possible completions of the text before point. When
+ displaying completions, Readline sets the number of columns used
+ for display to the value of 'completion-display-width', the value
+ of the environment variable 'COLUMNS', or the screen width, in that
+ order.
+
+'insert-completions (M-*)'
+ Insert all completions of the text before point that would have
+ been generated by 'possible-completions'.
+
+'menu-complete ()'
+ Similar to 'complete', but replaces the word to be completed with a
+ single match from the list of possible completions. Repeated
+ execution of 'menu-complete' steps through the list of possible
+ completions, inserting each match in turn. At the end of the list
+ of completions, the bell is rung (subject to the setting of
+ 'bell-style') and the original text is restored. An argument of N
+ moves N positions forward in the list of matches; a negative
+ argument may be used to move backward through the list. This
+ command is intended to be bound to <TAB>, but is unbound by
+ default.
+
+'menu-complete-backward ()'
+ Identical to 'menu-complete', but moves backward through the list
+ of possible completions, as if 'menu-complete' had been given a
+ negative argument.
+
+'delete-char-or-list ()'
+ Deletes the character under the cursor if not at the beginning or
+ end of the line (like 'delete-char'). If at the end of the line,
+ behaves identically to 'possible-completions'. This command is
+ unbound by default.
+
+
+File: rluserman.info, Node: Keyboard Macros, Next: Miscellaneous Commands, Prev: Commands For Completion, Up: Bindable Readline Commands
+
+1.4.7 Keyboard Macros
+---------------------
+
+'start-kbd-macro (C-x ()'
+ Begin saving the characters typed into the current keyboard macro.
+
+'end-kbd-macro (C-x ))'
+ Stop saving the characters typed into the current keyboard macro
+ and save the definition.
+
+'call-last-kbd-macro (C-x e)'
+ Re-execute the last keyboard macro defined, by making the
+ characters in the macro appear as if typed at the keyboard.
+
+'print-last-kbd-macro ()'
+ Print the last keyboard macro defined in a format suitable for the
+ INPUTRC file.
+
+
+File: rluserman.info, Node: Miscellaneous Commands, Prev: Keyboard Macros, Up: Bindable Readline Commands
+
+1.4.8 Some Miscellaneous Commands
+---------------------------------
+
+'re-read-init-file (C-x C-r)'
+ Read in the contents of the INPUTRC file, and incorporate any
+ bindings or variable assignments found there.
+
+'abort (C-g)'
+ Abort the current editing command and ring the terminal's bell
+ (subject to the setting of 'bell-style').
+
+'do-lowercase-version (M-A, M-B, M-X, ...)'
+ If the metafied character X is upper case, run the command that is
+ bound to the corresponding metafied lower case character. The
+ behavior is undefined if X is already lower case.
+
+'prefix-meta (<ESC>)'
+ Metafy the next character typed. This is for keyboards without a
+ meta key. Typing '<ESC> f' is equivalent to typing 'M-f'.
+
+'undo (C-_ or C-x C-u)'
+ Incremental undo, separately remembered for each line.
+
+'revert-line (M-r)'
+ Undo all changes made to this line. This is like executing the
+ 'undo' command enough times to get back to the beginning.
+
+'tilde-expand (M-~)'
+ Perform tilde expansion on the current word.
+
+'set-mark (C-@)'
+ Set the mark to the point. If a numeric argument is supplied, the
+ mark is set to that position.
+
+'exchange-point-and-mark (C-x C-x)'
+ Swap the point with the mark. The current cursor position is set
+ to the saved position, and the old cursor position is saved as the
+ mark.
+
+'character-search (C-])'
+ A character is read and point is moved to the next occurrence of
+ that character. A negative argument searches for previous
+ occurrences.
+
+'character-search-backward (M-C-])'
+ A character is read and point is moved to the previous occurrence
+ of that character. A negative argument searches for subsequent
+ occurrences.
+
+'skip-csi-sequence ()'
+ Read enough characters to consume a multi-key sequence such as
+ those defined for keys like Home and End. Such sequences begin
+ with a Control Sequence Indicator (CSI), usually ESC-[. If this
+ sequence is bound to "\e[", keys producing such sequences will have
+ no effect unless explicitly bound to a Readline command, instead of
+ inserting stray characters into the editing buffer. This is
+ unbound by default, but usually bound to ESC-[.
+
+'insert-comment (M-#)'
+ Without a numeric argument, the value of the 'comment-begin'
+ variable is inserted at the beginning of the current line. If a
+ numeric argument is supplied, this command acts as a toggle: if the
+ characters at the beginning of the line do not match the value of
+ 'comment-begin', the value is inserted, otherwise the characters in
+ 'comment-begin' are deleted from the beginning of the line. In
+ either case, the line is accepted as if a newline had been typed.
+
+'dump-functions ()'
+ Print all of the functions and their key bindings to the Readline
+ output stream. If a numeric argument is supplied, the output is
+ formatted in such a way that it can be made part of an INPUTRC
+ file. This command is unbound by default.
+
+'dump-variables ()'
+ Print all of the settable variables and their values to the
+ Readline output stream. If a numeric argument is supplied, the
+ output is formatted in such a way that it can be made part of an
+ INPUTRC file. This command is unbound by default.
+
+'dump-macros ()'
+ Print all of the Readline key sequences bound to macros and the
+ strings they output. If a numeric argument is supplied, the output
+ is formatted in such a way that it can be made part of an INPUTRC
+ file. This command is unbound by default.
+
+'emacs-editing-mode (C-e)'
+ When in 'vi' command mode, this causes a switch to 'emacs' editing
+ mode.
+
+'vi-editing-mode (M-C-j)'
+ When in 'emacs' editing mode, this causes a switch to 'vi' editing
+ mode.
+
+
+File: rluserman.info, Node: Readline vi Mode, Prev: Bindable Readline Commands, Up: Command Line Editing
+
+1.5 Readline vi Mode
+====================
+
+While the Readline library does not have a full set of 'vi' editing
+functions, it does contain enough to allow simple editing of the line.
+The Readline 'vi' mode behaves as specified in the POSIX standard.
+
+ In order to switch interactively between 'emacs' and 'vi' editing
+modes, use the command 'M-C-j' (bound to emacs-editing-mode when in 'vi'
+mode and to vi-editing-mode in 'emacs' mode). The Readline default is
+'emacs' mode.
+
+ When you enter a line in 'vi' mode, you are already placed in
+'insertion' mode, as if you had typed an 'i'. Pressing <ESC> switches
+you into 'command' mode, where you can edit the text of the line with
+the standard 'vi' movement keys, move to previous history lines with 'k'
+and subsequent lines with 'j', and so forth.
+
+
+File: rluserman.info, Node: GNU Free Documentation License, Prev: Command Line Editing, Up: Top
+
+Appendix A GNU Free Documentation License
+*****************************************
+
+ Version 1.3, 3 November 2008
+
+ Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+ <http://fsf.org/>
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document "free" in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book. We
+ recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it can
+ be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You accept
+ the license if you copy, modify or distribute the work in a way
+ requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in the
+ notice that says that the Document is released under this License.
+ If a section does not fit the above definition of Secondary then it
+ is not allowed to be designated as Invariant. The Document may
+ contain zero Invariant Sections. If the Document does not identify
+ any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images composed
+ of pixels) generic paint programs or (for drawings) some widely
+ available drawing editor, and that is suitable for input to text
+ formatters or for automatic translation to a variety of formats
+ suitable for input to text formatters. A copy made in an otherwise
+ Transparent file format whose markup, or absence of markup, has
+ been arranged to thwart or discourage subsequent modification by
+ readers is not Transparent. An image format is not Transparent if
+ used for any substantial amount of text. A copy that is not
+ "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and standard-conforming
+ simple HTML, PostScript or PDF designed for human modification.
+ Examples of transparent image formats include PNG, XCF and JPG.
+ Opaque formats include proprietary formats that can be read and
+ edited only by proprietary word processors, SGML or XML for which
+ the DTD and/or processing tools are not generally available, and
+ the machine-generated HTML, PostScript or PDF produced by some word
+ processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ The "publisher" means any person or entity that distributes copies
+ of the Document to the public.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow the
+ conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the title
+ equally prominent and visible. You may add other material on the
+ covers in addition. Copying with changes limited to the covers, as
+ long as they preserve the title of the Document and satisfy these
+ conditions, can be treated as verbatim copying in other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a machine-readable
+ Transparent copy along with each Opaque copy, or state in or with
+ each Opaque copy a computer-network location from which the general
+ network-using public has access to download using public-standard
+ network protocols a complete Transparent copy of the Document, free
+ of added material. If you use the latter option, you must take
+ reasonably prudent steps, when you begin distribution of Opaque
+ copies in quantity, to ensure that this Transparent copy will
+ remain thus accessible at the stated location until at least one
+ year after the last time you distribute an Opaque copy (directly or
+ through your agents or retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of copies,
+ to give them a chance to provide you with an updated version of the
+ Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with the
+ Modified Version filling the role of the Document, thus licensing
+ distribution and modification of the Modified Version to whoever
+ possesses a copy of it. In addition, you must do these things in
+ the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of previous
+ versions (which should, if there were any, be listed in the
+ History section of the Document). You may use the same title
+ as a previous version if the original publisher of that
+ version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on the
+ Title Page. If there is no section Entitled "History" in the
+ Document, create one stating the title, year, authors, and
+ publisher of the Document as given on its Title Page, then add
+ an item describing the Modified Version as stated in the
+ previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in the
+ "History" section. You may omit a network location for a work
+ that was published at least four years before the Document
+ itself, or if the original publisher of the version it refers
+ to gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section
+ all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document, unaltered
+ in their text and in their titles. Section numbers or the
+ equivalent are not considered part of the section titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option designate
+ some or all of these sections as invariant. To do this, add their
+ titles to the list of Invariant Sections in the Modified Version's
+ license notice. These titles must be distinct from any other
+ section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end of
+ the list of Cover Texts in the Modified Version. Only one passage
+ of Front-Cover Text and one of Back-Cover Text may be added by (or
+ through arrangements made by) any one entity. If the Document
+ already includes a cover text for the same cover, previously added
+ by you or by arrangement made by the same entity you are acting on
+ behalf of, you may not add another; but you may replace the old
+ one, on explicit permission from the previous publisher that added
+ the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination all
+ of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the documents
+ in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow this
+ License in all other respects regarding verbatim copying of that
+ document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of a
+ storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly and
+ finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from you
+ under this License. If your rights have been terminated and not
+ permanently reinstated, receipt of a copy of some or all of the
+ same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ <http://www.gnu.org/copyleft/>.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If the
+ Document does not specify a version number of this License, you may
+ choose any version ever published (not as a draft) by the Free
+ Software Foundation. If the Document specifies that a proxy can
+ decide which future versions of this License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+ "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ "Incorporate" means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is "eligible for relicensing" if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with
+ the Front-Cover Texts being LIST, and with the Back-Cover Texts
+ being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of free
+software license, such as the GNU General Public License, to permit
+their use in free software.
+
+
+
+Tag Table:
+Node: Top909
+Node: Command Line Editing1431
+Node: Introduction and Notation2085
+Node: Readline Interaction3710
+Node: Readline Bare Essentials4903
+Node: Readline Movement Commands6694
+Node: Readline Killing Commands7656
+Node: Readline Arguments9579
+Node: Searching10625
+Node: Readline Init File12779
+Node: Readline Init File Syntax13936
+Node: Conditional Init Constructs37240
+Node: Sample Init File41438
+Node: Bindable Readline Commands44564
+Node: Commands For Moving45620
+Node: Commands For History47380
+Node: Commands For Text52345
+Node: Commands For Killing56049
+Node: Numeric Arguments58764
+Node: Commands For Completion59905
+Node: Keyboard Macros61875
+Node: Miscellaneous Commands62565
+Node: Readline vi Mode66494
+Node: GNU Free Documentation License67408
+
+End Tag Table
+
+
+Local Variables:
+coding: utf-8
+End:
diff --git a/doc/rluserman.pdf b/doc/rluserman.pdf
new file mode 100644
index 0000000..3d2ae7e
--- /dev/null
+++ b/doc/rluserman.pdf
Binary files differ
diff --git a/doc/rluserman.ps b/doc/rluserman.ps
new file mode 100644
index 0000000..db4f27b
--- /dev/null
+++ b/doc/rluserman.ps
@@ -0,0 +1,7574 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 2022.1 (TeX Live 2022) Copyright 2022 Radical Eye Software
+%%Title: rluserman.dvi
+%%CreationDate: Tue Sep 20 14:17:06 2022
+%%Pages: 36
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: CMBX12 CMR10 CMTT10 CMSY10 CMMI12 CMMI10 CMCSC10
+%%+ CMSLTT10 CMTI10 CMSL10 CMTT9
+%%DocumentPaperSizes: Letter
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 600 -t letter -o rluserman.ps rluserman.dvi
+%DVIPSParameters: dpi=600
+%DVIPSSource: TeX output 2022.09.20:1017
+%%BeginProcSet: tex.pro 0 0
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S
+/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy
+setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask
+restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3
+def}B/p{dir 2 eq{-90 rotate show 90 rotate}{dir 3 eq{-90 rotate show 90
+rotate}{show}ifelse}ifelse}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0
+N/Ry 0 N/V{}B/RV/v{/Ry X/Rx X V}B statusdict begin/product where{pop
+false[(Display)(NeXT)(LaserWriter 16/600)]{A length product length le{A
+length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}
+forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{
+BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat
+{BDot}imagemask grestore}}ifelse B/QV{gsave newpath transform round exch
+round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0
+rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B
+/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}
+B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p
+-3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{
+0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+%%BeginProcSet: texps.pro 0 0
+%!
+TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
+index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0
+ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{
+pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get
+div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type
+/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end
+definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup
+sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll
+mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[
+exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if}
+forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def
+end
+
+%%EndProcSet
+%%BeginFont: CMSLTT10
+%!PS-AdobeFont-1.0: CMSLTT10 003.002
+%%Title: CMSLTT10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSLTT10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMSLTT10 known{/CMSLTT10 findfont dup/UniqueID known{dup
+/UniqueID get 5000800 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMSLTT10 def
+/FontBBox {-20 -233 617 696 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSLTT10.) readonly def
+/FullName (CMSLTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch true def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 39 /quoteright put
+dup 45 /hyphen put
+dup 48 /zero put
+dup 49 /one put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 72 /H put
+dup 74 /J put
+dup 76 /L put
+dup 77 /M put
+dup 92 /backslash put
+dup 95 /underscore put
+dup 97 /a put
+dup 98 /b put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE33C33655F6FF751F340A8D6C01E3
+2E02C24E186BA91B34A1F538959D4450CB683EAE5B034D030186901B458D3777
+6B3942BD2E07121385120248891AEC2EB33C4E3A0CF00828D0F130C31A918C18
+979FE94379C648EF21ABF659253E43CD1253866F157F1DF85AE7E8714F061B1E
+ABA3AD094FE8D6293916FA82EE4F486C7E513A06D4C9BE44306A8287970B4ABF
+B6D1F9274A5A0BB6ECF713ADBD1260D5D6C4420D357FD486470A74B2F0621B59
+A9373ABECDBF32FA68AABB66FAB0C970A3354A335FEDDA1C288245E6C890B8DA
+3D0EB953283ABFE372221EEB1586B0167F634E3F29CADCAB484B81A243CE1E3F
+D5106AD6BDB1AEC91123377F816711CB9D5140120FEA84B8205B79D1569509FC
+6B671211985CEF51691C45A168740BD826464B2CB0ABC575E7D453161328F80F
+3AF1C99EC219010EC6C95E0A8D1909719CF18BE424967E90DF67537220E60C3C
+4345B154D08F9EA684710E659DFFB0BA1B7FDDCD519305900A5E1CDA219A6C90
+DF8BD712A3686DAB90344E8784C7A9AF3318550285039B701B9FA1D3A3C3B6C2
+753F1E794A3463A173C99A9EC0E2AB5737134CEC2C97CD6A37E38692ADB4B131
+54697B7BBBB23680C72CE96066D8007B90AF0FC5958232AB4F21826691E9874D
+107F47DAC1026298D787989BD77CB43A09FC95F6997DB00D8483AE9C2716CBD3
+7CDF02DA34FDA2F0754ED0968270E118DDD8BAAAA65C41D699E2BCC2556AA231
+328187D2F50FD518CF458B0BA1F7DBAF4B231CFD61D5DC56335B53C3013BCCC9
+85690E19E992ACE55EEF2BA7A75DEE6DC33933C226FC1494269B7CA4CBAE987C
+2C787386400172AE3F44AE47115F4117EED866713BDDCA4A7AF658C49F913CB7
+308635000043F63BA210410A66E192289592882C477B2EEA0B2A339F0E7CF450
+CA0EF79D3A6C28598825CA03FD688DA60C95EF707C6E67CB7E57DE7A80545195
+739ACBDF27069F34C9E0216C3D17CFE7A652B910FCC9B9AECC2E646809C22D93
+FAFAD465DE794755AFF5BEC17160C9563B5C51D07022E2D3A256FB5CACE131D6
+F4B30F591A0419D957D8F0DCAA0A8D65A8D83422AD7C2613FF13A302E152B312
+3F1ABB45E42084EAC894FE335C07324849C9736D00C872C4551997DB889AF17A
+A52C5AA77DEB548B0103B77F65717F70B90C1BBAEA7BCB4959F32851A9882A3F
+55673F24103D6BF7FB3AD3EC3CC50FD8FBB4A6B13C3D278174320713A7B327CC
+A71F01E50840B33D0FC3F5F6A6F2B0F2D0E38494B1C73096A430510F927235FB
+69E931DA8CE5415EE88D0248565E3347353621A48F7948AC9EAB5F5057541B50
+82BA955D90BBC82E582FD71904445A59186022FB928015235B60830DA59813D0
+8DA3FC306C43FF8BB2CB6772B1F7BA3C1AA4B2343E7DA7E065EA53A4E5E28DC8
+0790F2D5CFB203CB135A08DCC9702B59A63290444F202756E55B9FB053F773D6
+0F69C63E74DE593E49186FF4304E8FA76C3E3006358DE549E946DB69431981E8
+1261C9C9A884E4EC708F69E6AF5D22C5BAC49F2AE85903E3D48D03B7B97054F1
+D2937A0C685D912D6D20A75A77712164DCBF8FE4D5460DACE139C5A934EEA09F
+B94DBF168A4BC03A9D689936D833018FF43837DF9519AD10F357F00BC068E737
+170FC9FC6715165F733A0B6FADB9ABB48B845167DBE6D771C916577FC2132863
+767DC6E3D460E779254194AA690983184D934F5E858C1176B3862B69B42EBE7D
+EC9AC4E020085D474093F7694C8A8C2025D4B0163E29320C384D62A9F3FBCB1F
+AB5A374EF3DBA48AC2147A207AEFE8B78BECEBC55C97B538F3A0FF4589D171E3
+826342C8A5186224FEE54E4C6AD5EB02BCB4088B132FA1A48362824BEF161235
+8E661DCFDFD8429C65CCEF63902D0E07C2FEC1DC2756D942F13FECCB7E8A8048
+345338F24B7808E46A04A915C111F939E2669A12FAC0BA4F74B832EAC83EABEE
+67E2817C058E69C2010F2572FDD15194CD8DF0FE9F827D349C0444A18D1A86FD
+802BC120A5114FA3523C221242C7E767B0AAF6AD15DA1561CE8EB18A2401D71E
+20481FA5F1E247CB5288F47795A6A3A3BB186E89EAAC4A54AC91405427136127
+5B151203426830F7CADABDB3FF63B40CA29CF8E667E71615869978E99E6F3F07
+0170EACDE3DC62DC05681D7680E2E96C30002AE34A4E5EAEDF88577601A82C36
+22D625A03B0451D7BBAAAE0C396711500E94A482EA787495073F16A76D1657DC
+4EA7C7B83BC30CE7F145B65B6E2ADC207D192CE3B5FEF7031F4BD64F57E1BEFF
+CCFFE06F1E4ECA48B442DF413766A70DA626359183A9B24C70419487423C816B
+4BCB067E661E47E172563090D6328BD738D2B0FE41A0C1D7A47576A79BAFC880
+0473229D134F998909898301CEF50A82B627A9A06DF59D0B9C530EC5D877F1E5
+220D3A1ABD2ACBFDF1933F92B3137B22B9F95A961D93B729307749A50D8A6403
+7AD0F9C40743E39B8D198CFCF7C033D99440D46D821D97545B930EF92E7AE005
+27F2FC766FDD4790FD1913C7A13328E73E587618ABD9008022C5C6C23935CEFE
+B5ECA2CEBA1D25DD846B48423F7186E03B1F61C8F1D5AC95CE03C83B2F221300
+7A761D6CB5F7F9251D3F9A7F4B25B99EE7A1347ED3059A811A82A35A033E9B07
+A4FB2A95009576F48665605C478E5F6C1B135016FEB4AE6A6BE4B4359836E04D
+45AA11366992162973FB6266547C2E570B8F56F6D992D2C0F63950A16839FE10
+F56E59D93A37573E3268C5892C9F3358753D1FAD6379E82BE740FA17236E96F7
+C53A2FF785FAB86AD17EB1DE8A6AA9C69B91C9D9B43B5188E51F6939FEC21B65
+AF17DCE95DD3BA4F1DD51F0BD5E5869A1ECA7398B6E664EB0D189181E9C23012
+DC1E54C146842A90909DBEC03B79B58909205F2CB2A7F83C66B437D7F7DB9781
+FF0C67F004E979C95B706D8D85255CCD827CF6196D847DB380B56980109E96CA
+997157BE78A4F758CE59D78158A854EF2C20099438F74777D3B0298D45BA86D4
+3C0AC30C984718FD62ABA0567AF0A70C1DD41953E3E7212D5C562085177E650A
+2ACD49940551E3F7619B4CC31DBF67AC15D938619B95DBF66E6D1300B1BB8605
+31C4011379FB5388CA49E4A9BD6C921560CB8D513F8716A0733D2A7D77E62D22
+A69B54E9048CA168D210816E613CF6357706EF6B118A1263B858B7E19AA98891
+43BD675B06C893579957BAB97199ACB82C080593ECB8B66A7334779CC16E4D0D
+4AF365CA6AF9727AE29417B61A5FD52452873B1D666044F8E7C1F6C6AA3397B5
+94A5780F4005FB5E41698FADD1594B505A58253D68D2AE3320E22165D198050E
+425820CC0A43FF1D61F168D87CDD30C14D387610B6CDB63BAA39B3EC9B3CA616
+FF1CC679227749DED3DDEA26B4D97C633090DCB8D8A6E5E07E3579E4A99BF1D5
+51E43D1D7F139C9CB1D76D8F693A3F23A74EFBE79F01E0B850BC6B6C7F62C2E9
+859469A144853434895D73DA6BD2B348A48BA80E79327ABD96539F2EA2209852
+E1BF6B0B819D7C68A9A1D0F6F39416E3EC4AC21DCD3C51D3B5B8D417EFAE165F
+2A7E0B76E558AC9F685A76FEC7E3C73CD607D9025DE6113BE5D0401887A53910
+82A813B026A502B51D484797D9D7E79A25B6624940AEDB4A15F2C73CA1AF60FA
+22D15BFBF268EB044FAE17822511AC6580D1D74DBA3C3335217780B29FEE792D
+200B00B8CD888A8BFF15D938FC758BB5CD9B3E08E1AC6CD1669E663BE86711A5
+892684DFCAF70C11E803164994BDAD89128AAD6461D4558AC2ECA3E05EB56D32
+0290AB16A6DF7133DDCBDEAE89C6CD83552792E23CBF567D57E46548EEB0A140
+437492B53C14419B6FE7E64AC23923A9E85F56A9DF209DC4E6BCAF1E045F9CA3
+BB904BFA150F4083C18B0CB5580450CDB657EA768E71222C71DA911A722AB9D9
+E18B6847F417125C40EA8A0CA1F551A4548712D098209C78DF9C3F78605E5402
+DA2DBE2218E49B819296D5AC88D17DDBA982E171733D1E9E295B3157C9B90BF1
+CE68CB185947D1E3D7544155B741296D14B064BEFD3E6AF25C74006CF6800551
+80FCAAEE6FC9105E1674EDFE68C45617D8D3E2264CD395EE94EDD017EB85884F
+FDF530EDF4F3F14750CA066F149E688FAF8EF4B5FE6AB515CD298E8D170346CA
+9B32BAD1D86DC147BD12EBEDF6CE1E749C5B48314F512470A568C172C35CFA41
+031E34586A89404CB5372D7B2C7A6D96F420D4D7C2D4C08184F4AF86B4536A90
+9367598424112A7B05D7107B23695CBCD569002290599E0FF4EC5C852C31F5F3
+9BD56BB840DC17DEEA579E7A7A9F764788D4E3774BD523D21267869224D68891
+4523070E80A123B58F7B579866332FC38A41A5915EC06F2D14FBE4A6CAF59AEB
+57E98D661637EBB885AA5D74AD429CCFF64E5149815E7350118E6385F4C74E0B
+2EB474A6DED021D429F01C9B0634A09250C40E22B3BFE1B7246D18116D585F39
+0E06E9B5F27A6CB77C8E9462189CB900CFEF08F798CAE15FBD94587F33816EE9
+03FB2DA6826EB69D8C284AB9F7B00630D0420EB6E35E0E288BA25F5C2345C067
+22412633898AF99C2FB232D1469025BF262B567F29A05F4816FE8EEF5F02BD79
+06202F6A1E3E5D4B3C91BA8D5FF53D5136BF70E5FAEF441A7310CA83721711FC
+39EE48BFB2FF287234B1A6102AF146B10A632A53AF97E11FFAC3A2A86BBAE3BD
+E0459ECF0305366078066F2CC628A3918E775E4236651B3D817AF1684B07A163
+A0142D16F55D2FB5F2255A8813B8E54EF3E801E95A4A226AB8C0476AC5EDCAD6
+9258ACB6F7C0CBDD298A0B816560622A1871FBE2FAEBFE697A8216A0D8FE30C6
+B1BA6C3E975F78182743842E7F851064037394142AC91B2530FB1D511EB20F3F
+79EDD8B7E1579D35F6E7B2883C47A46B6C1A458BECD6BE58AAFD834A7D82A553
+2FE4E66878E4699856DEDE964F454638F768AEDB595A883E380408F558015FB5
+8720954ECE2704AFAD4D62E8BB2657C4FA920D72248B3F762B2F12D125B796AA
+1C4BD6B42D766EC1C9B2C7AA4B6A3474BF753742DE8AB76D0AB0DD9A20EE2DCA
+0F34CB25995ED3183759CA83ABC32B8BDF0B06EF169252587971F7D37463BFA2
+BE36B2E45559DD73DE7CBE29DE92B9BE6B9F8093F934BA311D81E18A8DA92FC3
+312E3FAB43C53E803975981F0076EBB8F257C123908450661B6FA79E7ECE98F3
+B0A94E0DE3A4DCC8E0FEC106CDEDAA297A75BF1E40F3C2419BF72A644F452E2F
+9A8793810319885EB3AB23B1E80E8B62A889311355C73722C18E62711A7E6A16
+A5B923408444B13F6522FECA9A60B067EE332B83E1A69CD835C9D69B5D8859D6
+91F9276863D2E2E8193641E4239F4ED15E2C482C735BF5434BAA454EC2830C1F
+7CF766DAC9E924F17F03093132627673BA3D99DC2DBFC89E5BA032C16D3C1C8D
+78B3C464081044DB53C7A29E925F4157EEEE928C8E28EDA5F0A4BB6E0042D8AC
+7595C350645118172D04FBF06B2C9A9F3603A54B57999E2960C993724CCD6A09
+766BDF73F66E07FCA9BD09079CE8010E6CFECBE2E5DE1EA4E280AB78D5184C11
+016385007CB5AC0BC95955A1E88EA1A1D8EFEA886007708BA063F556D9284D4D
+C764E75CECA51BEE3D35DFCEBF6175953D30FDAC00F23B1721A1DD577945B5E3
+8176A21A649D907B5F63C71718ECF32ECCF1B26BF15AF694F1045CF98FC75278
+E9782ACD3D83CBDBEE690D29B3176E745AAE436382D258CB22F3DEDD02E441FC
+6A9931AC2F61156DE258DAAD5EDAD41E6C0DFC902173168BB4F51DFA7EA615C8
+B0F92FDB118378CBAC3D56B6B9BB0883C0C14EAA67396AAA7987222A132B7959
+44FC1E9D6DB6D549DFBEF8D2DD8C53DD3B66935FC239E74E2C440CCA13C068EB
+C4A3B69F499F573D076E2C92E24F2C69B806591B0807CD903E078683854963EE
+5125C3640860CEF37BE186DB781475554BFE6C528A9633AD5772BD53244E24AB
+42CA2D1123AF45FA257940CE611D83014DF04E60220E9AF27CB2A2247BBB004A
+F5722A5EF058FDC7DC2B6ED1406649DBAA58DF2ED3A91483D60F11C4A39BAF57
+CB1E320A987B790672CDD3E3BEF4A67032244DED2FF4588B2072CDABFEB36009
+9F4BCBEE16F811A44CEC77F8AE873C90C0F4C975E51014ECBD45A56A63F034C2
+82212977023A132E5C88AAA826D841FDE9CBCE7A01E4B6F0EBDDB9A69EFEBD72
+0B41EDA807CEDB791084047624BC11CE10B7A0A311272EFC9E013FA374D97EA5
+F7998FD908748CA72D8CABFD0F01220C2114D3B462B22FB71A23B284B1CBC7D9
+EA20BE71F8ACCED21F096009A14A7C7B51450BA51514707EB46B9FAAB31CFBEA
+E1DDA6F5D9AF0B6E7D05A1EEEEECD606427B0F2363D1B882B50140466B9D3CBD
+D00DB06DDD1BD4681E367DAA4B7C405C6281B67FFF794041738FC6A01D261CDD
+F6E0A330985F2CA782CBCC02B6F4EE5993434F656B91A51CC03B1D73FFA6629F
+14F6075EBFD83B702D8844A96CFB5C14051595BC7DB2218156A6DEDA5C98CAD8
+BEB5284D9D9F86406A8C1AE85857185991C360E5F44DEF352A1F301207BE94C2
+9A3A11BA468FACB3FA2D683419C44EFDD7C8F1079659F3ABD89D7F168B1591E5
+6105F9B3FA481BA953CD34CCFE73E427D3AFC46E5C58C2981198BA284DB8B37A
+6647BEAA561799877DD6858FCA71CA6003F2961FAA529906673EA94D82D78116
+4DAC81011FD175DA707C1E15D4B6FF19F8720A4E05E6E103E2DE880FA9C192BE
+C5ABE7C311C2ECCBCE8F9713DBA74AEC37A61C8F21F271B35F0F7C88B182525B
+A4183377597ACDA9A6E2F181725D427795B975BC4168A408D292CAA484BD1B8C
+9DC62E737ABC805C8FCB7E96454DA032B601345570EAE0379BDA84BB6D15D780
+42FA1E068A7D62F152B43B788513E13724666FAB4E2B4F04B0448194E46582CE
+7389BAF0D1DD4435BAA6B82AC305C04686B89FD51197C721D941BD2893596024
+1598E6C2BD84527EDA6FAB782033E4BB4F964FBACD96CAEC3F3CF89CBABF6B4D
+4D3AD14A03D4BE931632BB03BC2B92842FAD51A19A756892D5B978DB695D0540
+CC9D030C612E2B201D60D09F56332DD0BA1351EE62816C21A35C33DC11B37BE4
+D2F164ACD836A5CA1553CBC733E3B159860454B17064B4E22D3764FF6293BC81
+CFA3B2325C8E072857F6FF4ADAA8818247D431A28D3C5FDFBFB24A6CAA327AC1
+0B3630C84ED9F0D33B8255A3CAA9C5A0C79F7BF6BA3B9801C3BD0B30AEF7CCA9
+92F25E332EA97A7CC653C93D1497992D6B76363885B92ADE34C2A33E30A3B1A0
+57E9C16D8CEC189565808D3FAC92973C71CDE74DE9D8781CCAF88747758014C4
+5B62667D4D2CC5EBEBE77C5AD00C6A69D1819F5A786964501E077EB3BBEA52A4
+57729AEDF35253F7E1D31F2DD1587BC15CCFC1B0CA930DA83E2031B099A38158
+8D1849E7145AC74777A3C7136DEABB0C787E5A218309A65EC7D128147EDE3AE0
+C0AC039B56F767A22555CFCC12DCBC7F5A5A3B4E86EF5A69EEA93DF0BAF2A3F3
+7504F5C6A7A67388D2F9045BD755BEB7DFBC2EED679497EBEC808BE20FDCB5C7
+B586463BBB898DECCCF7249E9047DA943FAF0718A2050FCFDF8A4C2029FBA674
+EA64003AC03A847185936FC375CC67B3006EA681F61F640C3640A78D0C7FF521
+D477981E23E5956BAF42252463FDBEC49BB560A9428D248B0C5250CFA2A49CD9
+DBCEF73123C13BA382D3CF6A7B8A8CA3191D379A659F0E2C6E9CAFE9DA2AC074
+F622E397A2F7C73347364AE249B11AE2C34AA7F0D27B5F35D548D5AD1228597D
+D16A478C901D3A34D870BA39F770885B7DE62298F0114752435050E99EA4E5E0
+56B965EA185E8DF96B9FE97EE23DD45AADBFE02B427222B9FC99DA94FB2648B8
+46BD30F881BAD3820DCA4D8093BA0FE70E03482CC063B751439125623FA7AE40
+52DB2A380D89D5E37BF264CC73DA9A1540031587F481A0F146C6ED6F3F2957FA
+19477F075ACF608CD94CE466C1FC3EDAEA3ED25C96FE89A7CBFE528A33C4E84D
+465FE6FB031B48D904C5120D428D6B51F3232847CB0B7521E5CEA887FFC56F02
+0882B3BB7F5B0B954E7078DE3E31D8AE65F9EA55F4C169DB7C35DB9645617AFE
+078E03BF9A1BCE4E489AC9495A1E6CC7D1FFDCC03CEC1A32490186FE8B53B09B
+DBA7F0E23C8F5E5270D039B409D504203A458EEF12C035039A8AA12C719C0339
+F766BE6275511D585F82E9D4AC9B5424312755C4B74383FD094BBB24817D6525
+EE62456392E5DCAD0A0157A4A033E440AA014D5682606312F72248E13C43EC3F
+BBC9B4A2CF19A4AC6ED7F561EB13C3AB22FB3F3EF644B5B47DACE807262DE5C9
+50578464845B950140ADD91D72D28470A5A5FB134EC52F4DBBB9C50A7523592B
+C5BAA056E46F8C004062298BEA010C1CF9F49DEAB58C4D2012E04E630F54C985
+328DB2B6FEAC584308D71A9F5FD945A37EA13F3DEB1748320870057A362E70CD
+50C269D32993CE9CD1E8CB35BC6F69E7574F37032219C6E1C960F36932A8A2DB
+BAD87DCC271657EDF942834AD01C0C35437042331634D36C594CCBD796BB1562
+C5AEFD595E35264ABB2ABFEC7A2E066A7A454659804F6CD9DC64DE1112D95B55
+72AE34B6153425A5D15D9F944A3DB6D580C2A01E308E2CDB032F99617A73866D
+F2F2FB6E8617873AC82D4E2224049BC2FEBFE49527DAD70C079B92F08DC30095
+AE63E3E2FA213D52A347347371724EF08B39D7383D27131F75C2211F82C35CDF
+B78708DE910A5ABCA3075D985AB2E2EAEC2BB6159094F0C0C775C25AFF4F507B
+20070C4FB570D5CBCF40C7DE889378A9EE7E38175ABC3D5B047D1DD925990A04
+76EE4083F3CAEB8F1FF3D8FB0210C93738D68EE884FF86416A2EEF2356DB80C8
+39749F31D1D3751E91D84246B56D759969A6D52832891375DC26E92B7DC756A1
+A02F951C898CF665AB0C2C6D5B455FCA6D20E7F998D2523112A08E8EFE1B5DBE
+940EEB362AEE4EF83237348F7F0C08B490D125BD90107A035A8F5330F0F296F3
+DF4579D7B4A947CA1EC8975B1F6B7E3B077A75F2F42DE456E0D540CDFDECC95D
+F5B3FBB43590ED54FD98CBFD3A20C42C5B6B5ED2A5F0D4F06414757F992487C9
+83CCE2B4BA91825D14090D1EFC53596F92757BE8DCCB7EFA24C3A3D52DB61312
+C04533EE4424F37EE45DC6BDB79519A62454194332562388F3BF0246B40E9108
+7B64FC57054131DA8A4699CF65BFBB862D05519755E207BD0C5E4FF56AC2BAEA
+5D4FC6443069F6314E124BC02D210B8726D3ADF2EDB35E7CB1F92BB412C2AF7D
+547A1E309A63114B38B352702F7E48B931550F79C2487152A5A5CBD19C429BF1
+747D88BF1EC932CBC93F006EC34F9197CB9FD486F42A0D5D72AFBF21B9BD131A
+C89A979FA65013B3CDDA5D164DE3BB762BBB7A4D0DC3ABF3CF906549E2F76C17
+DF8BDB44689AA9140ABCF001781B8906C2B020EB95FE36B8978FA04BEC5E4D82
+B4A537520BDA62736EA2CD9B1EE4A126D7A76BE51C96AC556AE5BFF978C1598B
+6CA42A76139448EA4C8AC849AA3AD204D158854FAC6D7D43BE038F022460A50C
+1DC2B6932CC3DBCBC1C27390E29A474712004A5EA3E0A3E62786C2487EFA767F
+BCDEEAA4875ECA8A9A7C6F2FD1EB9DB79B7489FA8249D33E38599B948CBB7328
+430476A7489C004F1411BA1D5FCD64D478424920EF72530F3C4CCA9EE495ECCD
+125E4E2BB37BD4D4175950422517021F8EC140BC3B11BAA9E513F3DAB63CD245
+27A0A6F69A964E9BFAF575B5E36556A15B2F2FF787DFCC1EE704994A52F2E726
+958538808EE9BCC31BD5E126F848FFE5CDA11FD3F0377D9B814F515750374452
+D7A4BEE6B14BF4C1A75B2BA8083ED62E61155F1B396D960066D0A35D7CF19A5E
+C7856AEA2C505E68C8A0736CC1675F740A662AA8BFFFFE507465E7ECF934DB6F
+75004934154AA82EA699EABE6318E7E5B51DE3387AEBF11E41A413D986947FD8
+23ACB99110C93391DA8FD87341F337F1FBDAFD306B4B08FC69EFF21A6F581420
+893E94073A20778ACCDB074613F7FD68999BCA1F03A0E298CCE83D3D8C25E1DD
+8C25F57C440C5580C87C67C8F391C900F6615ECBA0AA505333A0E00F229F03B8
+69EF147556CCBD10694CB23EEA74CCEE50CA5E8F3DCC8225B950B51C7F0AA44B
+C1200E688A8A7CCB8CD763390992ECCE85F4855DA86ECFD21F57F12CEC09A5A0
+0A50B388C378EEB1C4BBC2BC19ADE95C3CE8A6CD901EEAA8DC6F62BD33A18368
+1B0C445FF57CAA3F690D872D42FE746D3AC94DC889F4AA191E824D66E8ADC3ED
+D7F7507F1DFD560D3D339C528714AEC12609448660243A1C24C8A31FEAA55E96
+5512E63BFF9CB87AA8805D066E71C70DC175FA3449879A44A1A6343561CBBF33
+B6465433C3C99BD06F2FB6A0CB4AE950A3F2F428AA2E5E344439E77B623E959C
+27CBD22A9B092B2604EE92524DF014DAD590A4F474484C2BA41343306A620019
+15B96AF752C312187FF3C1555B5142354F2E947391A96E64DFEEA65D99FCD2B6
+3BC07AB8D7709033C83DE8C9E18BF1490BCCF65D3E1CCD62FC09F7DCBD0A31EF
+70F21BC631CF5F4C112B64B4CA88662103C4343B55FDA36B0F78B6BE583E3134
+464FA2B9C8A2C5BA01338C0A0AEA7DC2CCD0D0E7A02C835C1072830582825BCC
+E7F31BD6C7A20413F5D21C054CD6389DE00C846AE1B558EAFF7E85D07C73C4D9
+CD9A1F33E0328C3B9340DC87FE981D655905D4E2341966C80787F35EAB88792A
+B2F35D91BDAE613DECD5DA192ED10FF454B0A754A14A565DCF8AC760007A333E
+413B53F179AFB886747C2460AADF6FD1DC09012A2ADFFA6FE5228177535E91DE
+71F9C9D82F84CA13A2F55E9EA931B1E89213EE9817DBB433A7EF0316E0624C1D
+45965146A28962980436F050A1E7EB35D18BB8BF8B82F97D64C827F68374CFC0
+E4DB0FFF944DDC0279F2E02108815F40E04EFC82368D19B89F357138F65EF9CA
+878AC45EF423580843F481F1394D5DEE995E0DDB18E2B5E2D04A463672BFFE79
+BB6D9957D3C2BA22DB79CD75DF28B99E6473FC222C6722B9C877D097BFB29C6D
+E5444CFD34880261E7008A372F128BE5CEE9D057486C1AD98E7AE24292D12231
+CCFE1B54DB8623BF68DBECAEC105E446891BF4473765DCCA7EFDA9FE6DF8E6D4
+90C70A79B1AF7AFE9AC5CBA07D0B839AAC2EA62842FEC9117959B10530C8A76E
+85F59E6BF476A0660025900EFD8D714A018AB06240808CFFE5A3766818603531
+AF3FA35AD28CA2C9BA31A2F42FB80BC1ECE71EFE2CD184B4FDC5F76AC2F549FF
+33AC81C11411C47D4857E5E6DB9204AEA0F7545ADAEA22BE42CC3BA7EA3F8B90
+C5FEC359641487D93C52D78CE25535A2A686DD4764C072FA8A56B982A3A7787A
+F124475DD5C2754430C7EC3527D81C272FB7AFEDC6F79E1988AF9401F2B989A8
+CFE1BD96B21D817BBC93BF77B99C8E008E7CC2E34F0AAF20AE88FFC0BC6C3721
+485DD1F25103245E854AB2B60226693E0AFA3EAE85CA52BD938BF31ABFEBEC6F
+4079449F99B5EF0A46E77B6254D4FAAE33FF8B2AA3469F0F0DD625BC4FFD004E
+E6C301A8052043E22ED0FA663364CC9200ACE4CDADCFBD28B721FB43EA7A3B6B
+F6112C35C224543482A7564D62A4A8F15FE329BBF3934DF9345320561E88CBDA
+1C0BF61D400C1539818D2BE38165B6439EA9B45CD0A686C7CF1310604309DE5B
+22987BC91A8E913F6EBAF74C65E8A546D876E46A50BB9A3420D5BE001E0CB34A
+A143776196BF8167006A1052A54001134D539870CECFFD45B6E37D5EF5A9878D
+2A2BB28710DD767C746767498AB23FBDD80706727CF0F556DF7A47A90DE30E5C
+A81522D5EC8C478BB58ACD1D1F0139D4C3561DB574AA8B1FBF0AB0A001FF78E3
+2A646659407760996E97CE00295CDA398DC0E8374B6A13C3EB2BE4226F01E76B
+A932DDAFD90D0FB739B9EDFB9A2472D6424A45D1A698D70766469EBFD9957CF1
+511F6BC41FB43B9517AADD5DF7997A4A8A8F3A5103BF6730B81845F20D160DC0
+E5AD923D9E24AA7DC293E45FBF7422B952A91A97139B15235D29CC52C5084F01
+DE89D2F11E7283A60E4688B54191DDC1159998D10215FE53FD89C87CE9D19041
+1F1E73F063436E786959943B496172A1C497DC002E00B29A4F752CA28BAC5434
+A98F9438064838B0D6252A05052EC8871CEF9FEF05A07B1E401E49324D463E41
+6B7DEBD3B405C9DC5953B93E48162D93438237F11ABE83189F9C1FE70E1A56A4
+CF539F7E9BA6B2B35BEB1586F59897F6E64340B88CA079DFDD1E987198604D2C
+3EB5C8178AAEB19B8D2840F0EF36CCEC7D25080CD1E0BD2B3317603E86FFDC4B
+A453AE086CE8AFB093D57733AA40977E9C8D33E3C87DE2D4C0522C40AF2C01C5
+2A7B86C2571F9B67AD85B35EC83224029832D2ADCE65E37748CE08A600641E03
+6BFCF2F024ECDB4AC2C4AFC4987D01C8F8E74715567F7116597A4318331A35E0
+7BB15E134CD721CBF49210AC06D161E7FE9146D43CB1181F464C7D3BB0BB40EA
+D19E1C33D6D9924AB13EE6C31428D6CDD9AEEBAE6510CDA14F23159CCD725A3E
+1F97ED8DCB17A10783B8CDC9315FC86703FAB6A70DF55E0AB8B4C24862CDCF11
+5F10FAA5E4E54660EA5EA05EAE168E36CA5255DAA0ADF9461176EDC9E3989A84
+0D8D7EAA08F4C766E1A078C3B7D091B9E22A9247A655CE4190A0217ECAF88495
+5DE38DD317E459AC61336D6E403CF8DD2ADD2946F933E1A72C18DFA96EF7C0E4
+0A2D84D3414F3DB23EE3BB5049B174431F4EEA10415D25E41C2094CC2D37C669
+2C46EA4568BB0BC49D1806B98607B8C12AB897E6AF402C6126D4484EB7D9CF81
+B603EECFD92EE41FEBA5F38A93DD24A239BA253BE3776F2368E1664142FF2A53
+5B40B694B20818A2A43226871AF1F7A5A68113CC55AABEAFEEE21E0F4E7641FE
+BB5403E96064650AE2703E43DF01A1594C8FE8646A44323D78E7A5A7CE2C2FAE
+F98F7D9A2CF888DD195FAEBFD1BBB05CE078C6003F9438205F8A3C2977C1827B
+906386BD4B483966FD903432A3A9A54AB0C4E7826CBB97C6808B5B529D5E24CE
+8C76A35EB073FD65944F54D1733FF75FD7F78F524F81CE0D92328FC171AC3DBF
+DB81784F11106137B72B473AB91F40F73B0B410547F5CF6613EEFDBF0F05092C
+3688C3C208E1C9FBF51B505FA0B5F906C5B0A05277772FF9EC806702F0E346BE
+83A535578789733FA68FAD54992C16F3F5F1B7560A729226FDADE4FB96AC09A6
+4C5D79CB60D85AACBCC89C04068803B47CF0FAB92F4267438A2E7CF7CD5C1796
+B07071D9F5A6DB95514B1B60EFE74DD9A028CBCBE850052EC2EFF81C411348E3
+F1ABDF1A4CBBFD7EBECC48F89B18E159DC1CFA0606C3BECE071E4C1759BE2716
+0705460FA9E022BDA1CFB2324C8B51B4E297838F07A5FE8E05FD99600F9E79D5
+490C251772EA34DA6649D421A872CF78A9B55BC0FA47E056A6CA9491ED65E181
+58E2A5EDC038C9BD89B3E975837FDBE2A9AD81F700BD263C25C85873E08DBCE9
+7CC2FBD904038CE72A110493B7ACCA882FD48F54B4E0109B095838F30D80917E
+5C81948F74E7F0D41652480CAB3B24E90570BF861EE2E3A5E1735636C7849C1D
+60FDFAB5386526F7312481A5146C18321F425EC74ED0D778926854C5CA875A57
+9205076C19AB866F5FD0439154484DA165A7CB69746199399E66E662EC2AAF66
+501B6706BA1ACA001546B753B0785AC885A5F13BFB4F76F05AEADA1D290708A8
+22A24FFEEAAAF3C70F89CB52EB655774832296C1FB440B4DC4957C7C32588435
+4FA6775C4BB9070641EB6CB74857A346B38E0F441D61D27489CB0230A23AB63B
+052C8453C969BA44B2B6E700D6286084AFD49A79DA416803200F715CFD9B42A8
+D53BC397262BB8F94C7D0A2D83E1249563098645D0E82959B76E1B05BEB19430
+4080218E58354FAE323F4CB4A3E20B21FF9FB791391956336DF8A6FB49A2DD6F
+A1F06C8C02464E67CDCB9013A4F8229E5A4F136A11AA204001D16C213691EBA2
+2789C03C9122FF21B891569D4D26C2487401AF4C9B310CADE991ADA6D091248F
+30D40520D46944AFEEE4B71D005191AD057AAF2BDCC166F084F29EBF3868C433
+5552509FC469A57DE66010A0538D2CEB7692D1A54B5139D2FC7FCE96C4E1A82F
+578703BE28B82622297BB08F76DB9D8E2A7C4B38C7A819372F72900506CBAD7A
+4B0014B7A9DA2E9AE84B24A83E0BD86D3BD8E0F37F9F0E56D6102C0CAA768E4E
+9BFCDB116780773E04554E67AFA899C9B8AE526257FBD25125EB7644E1AB35FA
+E9D6D716877D2A5E17130740CEFF27133D6A38BD2B2BB7BD17E04C21802EF184
+0AD5C85EDFF4234DE6B89B40F7489B4CD79F54B9B8683E611E372768C55FD93E
+3BFDDBA88B1B60240AC09A05960F9134700A97DE7E6031F5644F83B5A10264D9
+6118C440225E4864A2AFC406BE4A8AF3F6AF8F3B48AF8EEAB503BF7A66C840F9
+825D9D44DEDCD92A11EA70FE597AD39C0CA0F1C6AFD5750D6BCA09D230024DAF
+09F807B23F356891C031E0DAB363DADC371166D728755CA4C375A846C46E7B37
+695A8C66F99132593D066D0757C3E92F64AFF193D211B41405A3E528172C2592
+30A0E1E147E95C002F2BE67E1FAC9C062FBF5182A0726E21CB87BC80E15FA68D
+9E8FEB1888C4717BAA97A135EC4B5234135A64DE68833D1FB55EA7A327C5A9A9
+78312C6B32D66B57A4834D6004D83FDDAB7905D94E0AD3DFAB8A4D5D081F2FD1
+4CEDB8C3D8A344C3596A6E033DB4CC4A2BCA9A86D8858830DD5006D7C7D91F53
+560F76B6B4BAAF3DCEC3704E922E3F32C3A450BCCC92E359265201F07B99BD2C
+24377943614ED7A97E19D988476569CD51B0E85672F4AE6D6D46382A73DA624C
+5188F727DACE6E5BC2F33411206A566B6F830EBE79CC97F295A269141FA8E565
+496EBED5EBDA3E6C7DD9ACDC9AA9864C7F26227F68DAD420BF8AFA428D66F3ED
+3919E517437B7BE7C9550B250E90F7E004B3C3D30D9872B84376C84B913D0032
+9B2280354630E263E101EB02C92FD77A76BAA8CB1C5B5C555C81F6ED6A31B3EC
+356BDF27A16C319DE965D8BE1D654A6E1980C8FC535B72BD951FBED2C6A9FC82
+FA152728191760F9C54E52D900675AE8A88F7867E0A5E5465FC2ABB868B3D227
+8A0DABCA6264CE647623418DC7850FCA18C34AE8532AF543E46B585E20BD1E9A
+E210B1DB301C81537F068B42BDB1B93FB4618B618B34E7D42251DFDF3491472B
+62EE41B9F4C2F1EE43C29AD841A1264285FA4DDFDC07323A24F00EC12627CDCE
+2DB8592A29424150DC72611D88D29267B1F98F386053BD9188CC91FD52876731
+1DE8DF9085F0F49CA5B14089B55E2E9386D59DFA0116C800A5204F6BC0032F6B
+BF15CC4A142729DC002844F5A418C164C1AF0F69353121E4E680199C752AFFF7
+C961E4AD7F5E48212297A346A6FD1E7CA0B7A51670631878D69A60639FB9A150
+30446595791BB1F97919D034BFC08998AE74431E65800A11648D8E5ED18C95C6
+F3F033B3F3E4F7077216D316CA981B5B4EF0C33A7DDB14BF11F496D754D93C6A
+BACDE5D2B6EC1126A0531B61B38E73F377CFED681C9DD5A804BC1B7FD78F6ABD
+1EDAD16A0D3E4BCE8A12291230D94AC0E0CB7D258E46B5D1CEC91B0CE18B1412
+56AF3A04F80C1655C6DB8A9105D611819D4BB6B920F975D0A19104D8239448E6
+B8F4804F6088435C6C2750932C56753D14C5921DC9D871AE804AAE6D2AE9A3E7
+192DAA0D6F9E1E7C22BD2A0E80216723E09213905F4F291D2540F24798CCE9A6
+B6E9E7866CF589DC2CAE23A7945B52E862975F0578F7D8866DA6DF2ABAB1AB11
+12FB5B9AE7C3DF18F726BC7B51C57BF184D42944FCCB796ABE1869AC8F5BDA42
+0EBCA3366E46D6A9030B2EFA1767BD295731CD1DB7FFA74288CD586CE553CA71
+C69BF555CE828D291172D22DF6B1FF97833BCF7BF569CD79C67A65B8D32AE176
+0F8EF4CDFC09F35100D23ABFD911931C51F71EB0D37157CB9C9984A6F107C365
+48AFAD53E3B33EDF970F19D59CD6D5C1D7962CEA24F4AE9C45425589124A7578
+D40D09FB8BE3B386682B9919756D4EF4AFC2450C6A298450DE1A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMTT9
+%!PS-AdobeFont-1.0: CMTT9 003.002
+%%Title: CMTT9
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMTT9.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMTT9 known{/CMTT9 findfont dup/UniqueID known{dup
+/UniqueID get 5000831 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMTT9 def
+/FontBBox {-6 -233 542 698 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMTT9.) readonly def
+/FullName (CMTT9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 49 /one put
+dup 51 /three put
+dup 59 /semicolon put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 70 /F put
+dup 71 /G put
+dup 73 /I put
+dup 76 /L put
+dup 78 /N put
+dup 80 /P put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E6BABDA4215500A0
+42D1A3D0D02C0C98BB1D6ED0B7791274C38B038FC7921FF1FB8FAE7258C09259
+4B8E1BD9EDCEDE9ADAD9BD9598EEA9691589649A9A21539161E374075BEE3457
+689F308A4A7AC9F2FE4B301A6C36B0442FB92E3B002623493DC087800B5A0521
+0DB96A23175AC584DE166F59142779F26FEE9783E28DE49FC3A8D6583EE63FBA
+610DA773CA18ACE6F64A4867A1A7817120ABF9DE4D17782866E6CB6B65A9F6D8
+3667C8D3E61E5356E35343FDD4C6436DF73934470916CB5F0ECEA6BFF092E735
+C7C355B56189D1DD5715EC97E50145FFC17BB1497315A9585D713A7A6DFC7933
+995468EFD0F59E3C15865B87925A3F2930E20D5A35970E2C44F1629FA16E00EE
+EE21EFC50D49F5BC02300D0A7BB85E649CB4E2E828C8B1C5469463013E71D723
+2CB11BCBAC191AC751A2AF7FC228395CE9472DC1809052012AEC2CD66695DAF0
+4CA04234F0187F4116C93F59A7F1F8123DE87F111853B785A20CA8B49B3B0CEC
+B11AD345E1A11578D2EFEB0536D125237086CC8CD9F34A5137AC5DDFD8746014
+D74AAE8239B81ACF65F379CF2153B06A238A2D767F294CAE0D79228F0B7D45CE
+510AC9657A1776202FEF42F96D476E7DF407786AEA12DEA0013D3B4C5D0640F5
+BC5BB72C34066270399CE595827175B23B25072723BD24E07F6BCD9EF0175DEF
+93714BAA53960F81103CFB731CED4A267B53727BCA3C97B0BA5004055D4EF0EC
+F725658E53AC86E4061B489AD4154915C3981B3B703E1E2A8D390CCECCA99385
+45EBE35441B062D7D12DAB2B31569387187D74A4043FD71F1C6D352EAE0F6757
+4345FBFB6DB15CAE47CAC4BAE47AECAE5FF5EC19057DCEFA1B23F47364ABDF47
+088A7C6A2AE26B10459B6D41CB69182FD1472F326CE3A15B59255D1DE3B616D8
+9D1F12561038839781E657C896B8C58A32DF5AEA23732A0966D96C68C988ED7A
+09B7E2C8F9F3D0D56879764781566299A4EDD3588BDF70E3D924D25074F30988
+E35BDD827AE4D0B4A06F55A9976BF0DB3C0B1D09CD08E8CB168B50617691638C
+0EC1A791C228177D4FFB021EC3DF5082CA3487AD2EFC8DE9466A690ADDB4C52A
+FE2A6DB4CC275CD33D9136E735279FBB2008D59E667905EBB04326EC33C98B2C
+94744B7F540D86E90DED64572ECF1EAD3A58EC101642B245A9C7232DC8FB8741
+03F97883BB32FB955C22F878FA0FD114451A3B3859B0B5537AFAB73AEC7DB2BF
+409E1FB41D473714F6BEA73CB085139879FA31710E01915C2938C37BAD6D7D71
+45B897E00857D3931A489EAC7B42BCE4E65F73F67FE027CE482DC47598ABCB95
+39E98DA8ECA3E23F0799D5963ABA6E2984DEACBE7B46B40ADC6213E0F4D08971
+58F68C946C748E4B4217CBA2391BE2086C9758F4E32C9B6413E48D84D33A6E85
+84747029C0A9C9B92841D217A902BA8EB333999D62FDA9F82BFC8ED11F67988A
+0CAE42182E414A9766AFFF4B046A09D476F8E3F15A8C7829BEE982D8350BDF5F
+F215F2BBBF68D4B567BAB798B9604C79306C475926E9FEC0F07A99F43473C6FD
+B15AC29C3D07FEBAD1BAFF75AAF2FBE94F104F1DBF838044FAD94B661B06AECD
+D9AEBD02B60CA4546DD6B5B5C1A3833ED07845671CEFCA8955CE0DE5DB8FC93B
+3306683CBFB8E5B79A863DE78D455DE9D592043C2686F88A43140F8B9F3B553B
+7047420E93E753829F8D47AC7621CFE3626F271E31F0019CC02D0B57F67BB47D
+8CFB63E902EA3231C00EC66EEC0D30FE8394558BD3535C888C4CEFC6EB72E737
+712ADC6300162D5D79BEE0CA1F6E4127A0BC90656C01692F6D82C85550AFC97E
+C2693E379160FDB9636FA41AE9C75B7F6643B05971C6D67CE30971D590FC07B3
+E0B36B4D1C7F25110B5DA2130D574FA292B47322975A2BADBDB39AAE69BDDBDA
+A880F9AAB580117708C79204DFFDC08BF4A48919B5C22228845CE8C3109E93AC
+2479E523B8A1C12A6E541118F121DC6B4EAED83491A03192D5C3A2A45D1A2467
+757E7B377C635CF5CAE11A7CB49D49F3A1BB2286090B5F0E4F89869D1771D50C
+54B5C5E091E3048A2C194F0ED00DD64FB95BAC6FA9D61ECD093ED416DA3A4981
+DB07CFF17C4F55C62DF628EBFF06FAC3F3D3F91C30EBB34052BE1A08F5EDA4B9
+08977197950A282B84E21D43C64BE3AE4BCE22C70E7D392DE09D89B7F23351AD
+6AD37225C12BA79EC9951F5DA1E505DB26200190ADE0E549305B7530CB86EFD2
+A896F13A97E51754F70B609CB4511CEFC38BA579C071E9510A49982389980DC5
+336D6C4A2DB100DFEC4055C7AA9C55880F94FBEA9EB280BEF66CB8E1E38A359D
+E5AFB12B540CD599085ADDA7FC2C72E7C873015773FFEECA2C596B75BC39A3EB
+3C43FA2E53C0D7993042F3D652BCC483E48B7F6C94C3FF6D38E276086A6AE67A
+E5A571B9C72E0D7824E0BC2ADF51A393B9E334649F786EC1923C854382B89627
+1B9E701AE5A6C42E672B2C6A33C8BBCA8F69B9061E787D6B92183F20CF4C3903
+FF5417427B84798C82BE28D2C81624E3920CA61EC9EADB364B5A6E50E49A1A72
+A9A090A1FCD84814B8B2708AD787D2B5015DA1305874F58C5EB62F843685FCB6
+465FCA80176CAB2B2FE65E0A270BCE1E3DB97564BEDFAE5CA44395A8DF4505C0
+3E103CC3B914359B2870DA6CD30382EAE8949131CFE31E9E75C3E47A3834BB32
+CF183D4A8B9001710D0A11390C9DAD116196568591D38C2AF4ADD852F31494EF
+573462759A35415900360882739789D6B89ACEFA251C5ED90ED704DD7C3C80CA
+9F6CDED69537D201D520C99E69EEAD5D3C0EB84C166660B3C190166D93EDFE6D
+15BCB6DC5CDCA825E48D33845CC2FB15291AAB823F25CF8BB0A1EAED8BEC524D
+D9CA016027141FAC9D35B64FB9C224552F29EF6B32497254E319090E698FD8A5
+15491CDFE1B988C79A0E3B9D01E12FF084E9FA86CCAE02A3EE6F2917B61A2CC1
+64B8CAF309D1AB48A34227A7729DFF99CB6EC282E3FAEDD2673779AA7E4C1789
+D93FDC37FE95F087C5F88F53D30A2DA9C913BF205FC6BDD060A40184F4AAEB3C
+D080D63B89CA3DEFF310D09EF0A83F3914BD5B7932980ECE139EF0313C20B4C8
+576EE0FE3F28FAF4D3CE7CD0890BC824A85B8EF4636BDF1EF1BB519F93D36540
+ED09FAF93FD71992CA2CE2E83F5355162ECEB32AD218092F45D5A61A44E67135
+EF0453589CECDC6962D0E8DA7E7567603BAF50B2C8F1CA65EA5320984E7D69AC
+9A7D3D7F92565D79E8C9DD2D92CCA7DE9CD058545E9F98AA47904D70E1897099
+3C4C852B3BA131DDD348433C336BDF5FBDFB62120DDEAEB3255E3207B0C84A0A
+1ECF9EC869DB9BFA3693B03FCB27C5A5D3CDD62630DEDE91B4DD5B9784BF0BDD
+FC6EEC3FA7ACA9E15FAE47CDD9B7FCD2BF0EFA10716F08C0AF25FF67CB6F9598
+C607D2FCA452417D2C69DC808A9441A66492394C3450BD30632AE739EAD654BA
+4343459CA36B6D5B2C12C39495952F2EF93D82C73E33236785A79609E260C4E0
+CF3A3C950DE71DDC3939D42DB1CB1CA917CEAD56979A70F8F3B207C805319FA7
+3C000AE2B21D711A6D78C7BFB901334DC06F59EAB6D94B507734C27971F8458D
+D00193645AB92FB8FE163D5C51AE4F40BDB4F2C51691E76EE0636F071F37AAA9
+BA78BD12459CA499210EB0CE2F8BD317387797C33F5933AE7A6264DA06B4A6A6
+1188326147A16B205D1F965872DED7D8EDB3294FAD2FCDF0D423329E9CCF879D
+4E0B966D509F45527F7609DD09694D286F6FF7535EF8971B7DFBAF608A19D442
+C133207EB1152ABBD11C455D0977F66A9B73E51381D1CA4B66E87C0C7175A63D
+80C699A052F00C41DAEF42E7A40E07B1B14107AB0787E24E17C1462960E3C54C
+AE73BE4924464FB177EC62F116B2822842541543EFF7ABDDEE197D6BD8F8D4E6
+59175D8C5957550B70BE775AD52FFF6E7C00DA7CDC16E1DF7446BB5D8FD82647
+3E9F87D5EA365C82A2D991321ECB14A9E3AEADC5A56665DF7072D6DAE402BCB6
+14D92B17F9E063E4E9D8D239C91F5C7C0BCD2FBD936C9D4A0B57659420343B59
+B395BBD1AB5B6003F653699D57E7581F9813CC98D4F072FB78899D6DECC42D34
+F2787EDEA64058B46C4BFAA2BB96E9BE5CACE8D91E4C080ADFC0FA0D4A29C6B8
+54FEA9E11DBCF53D9CA40A21AE5076451EDAB3593E56B6D453DC8EAB8C78B588
+34D4C4F36861B5649BC1E9F3091E704BDA7613ED45C911DFECA74EEA05165191
+825F95A947CAF382FBAF01F3B8B041ACCDF39718D7DC5BA6CA12BB20EEE96439
+BF2E2628AA3BD2C91998E6247A690FCB0CC95F286F427345CC4F1115BA3A6E54
+4743355F2CC991CBDFF5725902C1F5A6DEFDC8638A26EA456C33C27773D6214F
+66536CD2E44FD253531732D5A8C44B336B1BB47B0477350EB8CF74889B93402E
+2356A9CAAFCA562315D8E0B3F42F08932CB87BA2499A875AFA08D11DA73B38AF
+F46D03B7F639A8D7BF88CF07FFF4E91716DCCE6E2CCAB60A64D5E40EFD8B336A
+1BFCC4CB04F49DE1FBDE7AA5B2092A6EDBD913D161A3271AB6411622D0E14416
+37F81E0102F5B0F2F9A2B27819E4BACD7C50E29D6291AE5B0973C657761545A6
+741729620EF2BF1046B3913399C10982EE5F4142CF461EA31042E432CC79A1A1
+39C607D22E45A6DEC008CB4BF6007CDE9DD5802B49A62C8E02A6D448B64177CC
+887AD71D171B99E7ABE2085B37D90B3BD8513995D9A57F53184DA474F6DB5E49
+B73E04CC214EA5398DF7D7541F94E623E8687B511640457A48A68E9D9D6584CD
+15B57CC044D8091C771D175F2EEDD411099BC8F7B4317DC503BB5E405AEEB526
+5E6E1B1F2705275D274E012A98F66075CEB90AFC648B964DDC0E9C4AE7B24CE1
+80B051022E5781A533A21DCFB97893847D685137EAD85BA708A7E118C72FA839
+A9E460B5D17365A0AF1F53A98319FB64A5819B087F554BC056C4BE44113A5404
+BEF759F890C1CA5E7AE156F4F8106FDB4F8DFCCC640976983EADB30976344048
+2A86D7B2AF4A01CA736B98D52ACE392AD4BECE7E61C710B08B66F01857CA460B
+B8376E257113E10F6DEDF14CE2A4E6A99ECBCD302C36CADB713D849EAE9EB598
+F29DC98531D793B79F83091F9B136809E006F34E423D528CC4309AFFB3EEB47B
+9A9DE4D5B25CE953345C326BCBE2B4912641780637783084D3D12693F8135483
+CBB0AC4EE0B5610D7CEB7DF205830BDB9BB404DC1B28FB0824CC187B26C19A91
+DA0025EC739BF3993700101D042DED86D67F5FB87912CFC51AA7DF53F2162D62
+6314A2CE13810D0B8D81F45771391A236422CFA0F35F7A0CDF14ACB2724AA57B
+7C2C28D53029B1146558610E0CFBBF72A85AB9BA308F846228F299F13F68E8F7
+D963B2EE9EF7D4C21690632B640BDDAD0556EFA4EFBF035F13377ABB5CBC280B
+9E0C12AACB153C93351E5BA95A7D149010E204950A59C7FC6581D9703468C1E9
+EFAE37E7E6ACB892B3F8D1248D9A4A72F642FECC5E0B25C15EEB921EDDE84D12
+0E524FE6133C4921FF4921242392C12FBE69744D53739F7E849C1B96C4020AB2
+1FF10DEA608F111749E2FBD8DBCB17F353DCB3075B4F4B8186963EFE95A76A10
+85AA5BB6DB4095291974221829A8E436680F4860E01C3843BE5BB3101D0869C0
+EFCE08D187BC04F58C7A450A59093680A0F09E8E3F12DF5223E7EAFEFA01978F
+D8354753A68022CC92C71F2CA732DADAA8A466D4AAE5999B0DC077715671F518
+E6277741F44AE798EE50DF44CCF71FCF8BC71F76374005FEBC4883C6EDA854B0
+88C0C2B476709AA809ECE41AE786DB1A32B3FBBCC14921673578D3514C8CA842
+E1FF90BE33F7B93ADF6BFB8B1AFBBD080783BEF056A6BFAEF676F7BF9F2DFCC8
+01D255A9F0391951210D60D4D4DCA93AA858B38C0D7B8FD740D5FC6F277C2A68
+54CC2DE1F40B6347201FCA2A0A91822708D820CE645C3E4E5A09FE25721AB33A
+97871ED448F38FC5A349D81F402B34461D840D5768BFC6849439AB6115104F78
+B87115B1DAE12542EA898F86ACE247709817850B067F537E6137196101D46DD2
+D842EA03EF4501E34074E8458E638ACC4EB349A7430AB035BEF2DD4CE00554F9
+18F9FE32A55AC1E7E50D64AAFDA278D77A7149C59DC5B1E3064A4B281A54C9CE
+A5EA94ABEAE4C6D5674C208ABC72563976487136AF2E21F835BEFD232D7F0D13
+1D19932367F51D5379934DA7F1635AC51EE5CEBFA63D4D32F018DEF13624EE62
+31DAE68A08DBE3B4FDAAFC75291C8C6CC7A657E3C7453C7D1461A36E88E633D5
+408253B673AD87A9FB2D0F56DF1305916D14D5DD62051E27BCE09CEE9A1F14AF
+1D7164BA5FB6E6EC8D38750F7E28BE330909F303ECDEE692E347DE13C8C2F82E
+29C8BE6EFD76546F362A12A1C2DC12389EA95ACB4DCBE95620F0C193EAD91B33
+BAAC5801AE827B9AB3FCE5D11D1D7854F8FA8A31670119CC0CA98628F801838B
+AAC7EF90AC5466BE69CE3E3CD9951A5EB9AC08014285422F6DA6F6E221BB30F8
+0042A11F2E4B765BB0D142AD52F4D85785EA71B2E1CE20728B9E9306CE93268D
+99B822A5AB5232EC7E26EE1160850AD3905864A01357F22722B6A54D4EBE58CE
+480EAD9FBF068EE965AC4B5FD2FA8CCB91ECFC6E90B9C49268CA0B0FDAD23ADC
+D5A74B41149BB08454054C451AD0DA4CCF8B60F2EBD061AA03A011D548B6B481
+FAB00AF9225BB5463F27FD67333FB51F8664536267E95CFAA0BE3BC1B8F889CB
+587A3A4FA2B45864F07E11372C9507A625C0030EF7030A0B4D931BCC48F6DD51
+A4D1F63FDC4B59C1CB18E6242E9F4B4B8AD9755B870FE60D640181FB7EB8120C
+C56F51DC8C47FCC6318C2145EDCBEFA7BC4253315BA67FD2B3D4AF6A9F3F229C
+AB75B592EADE15B1FB5FDBA1C0F786BD21A51506B7A2E42C2D086BA6F84D1B3D
+AC7531545F0B01346831FF36A52CAC1E390F99AEDC265B44B0FC9C581BBA6BE4
+48B723811EBCAEA5FEFAEA7E5B987F2C7B3E9A65D2D14A7B74F099401C57E367
+385352D0776D2A908F7A5A2E4D4160946C5591397877025C8C387CA413EFED56
+8B142E8341E349DB4DBA422A4FEE56A573972A0C66590175158E48850A9F7F38
+4B95726787B8F969FDBC97491CC81CABC976CD00A27D1DFCA7CF467A956C1C6C
+839817AEF8794B6151FAE9261119DD5DB787DC9D3B420FD325ED6599FACADE0C
+320D54C2E0D296537E22C1783670A9D9BECAEC63853EC2F05A990260DC189D63
+7CCC0BDDF2CF7585071ABAC14630666737041194D0777EA4292AE60BD7F7100E
+DB568C90F0D899EA006CA423CFFD6EC70A5D3D8AC43C747DBAD3B02219E47D8D
+DE030631F4678C357A58ECC52782B31B50CFD44EC33F41585E51B27E3997D33F
+461BEF897220AEC80007F13C5A1EE3A0430CA899047DF944831F8B010A7DE74A
+BFD26001472DC00CDC9F17CC435F61ADAD4E9AE062ED477FC621FDDF9242C449
+1BB3F77FDD1519A251B663A693D84B42BF0962F537757F38CE5C5D56B98AB10A
+3B70C8AE8D52DCAFCEC22E7B09D3C4EFDA1841C74CA975E4F8294F7BDC796500
+0ABE197ED3737A65F7BAE601C91DB3983EAE11DA3EA18ABBBA3650DC361C2E77
+EF9F97618B0C337A906FF39926D2B0B7883ABBA650816C4C6B34EEA836994EEA
+AFEDDE56E0099D0E09EB88EB093544B9BF4871200746A0409C475FC4232A38D8
+F3105B0FF44E4F132378DD12D9E796412FD0F9478322215E9F59E69396C35AC4
+097C4995B60BF4D8B3AFD0A002B3A6E4FA114131410D5658999B86DFDD3005F3
+AED1FA8F077AD1F27EA249221585703F20FB70E37A26C6C3F2E101693C94612B
+65BF89F37AA3C10A40EE8E49915F1A1B95D2193D8003DECEF9D76FDAA33B1AA9
+CEDCB21C2A3B05747FB3ABDBD904B66EEC60CED2867442F5FE445587EB8C6D14
+87A6B1B4871A8371A7ECA6A159EAB295B167CC35ADEB8512FD0C237421773BE8
+A081FB687F9C5D676F2944DE6E6B639C37E8E49BD4A6F0903E0C31EAFC4C7ED2
+C3C67E71D8BE2B8D5784E8A6F19A9A8929DF9833440E160945274682F435DFAC
+575048CC768BB8F13AA21C6B125E6073611BE138AE06D13E62E7EDE3D0239474
+E040B3E446165FFE60E20B75D2A5F9EE021B22256621C290A8F3342F0347B8EC
+CFA6AD68D47C05268EE3AC8683F4840D736EAB585C6284018DC94FC103B4A882
+ADAEFB625EA966F3877B3FFEA518B809A4BD184FE4923BFE783B4131410D018B
+E0FF5CB22D92CB1D1C8854DAE543594DBCACC60041E0B906FE5E692CFA6D2B4F
+31CF357A50CB1CBDC0BAE6C841A8C0A605330138715CAFE6EC005E8174AB7D9C
+9A9AE616B75DC1CC62B7F9EE69DB9ED2351442BD48E8D0A467E28525BEB6961B
+CF586AE20AAAA47D9B93AE7B0A4B992B61360AE1A51EA3FC550B5EA3720DCD75
+DD8D07C26180748FE67B2CB3BEB2EFB690657B726CB850C964A773F0EDE2C0D9
+9D7DBED1E5E1E18F68B114C42EB6D734DABD111596AB68D8DEC5246926DB5E4E
+D7D701358D7972B2995C7900DFAD6F78AA604C326024C0E35EA5F2E99B2540CF
+D72644DBB5EFA49C1D91FCD8AA69EF3AC33385AF45F42D1B8DBCF688A431DFC3
+EF8EF75EED3CA8EC03195F410A062E0400499BCF9017D11C9A4E00AECF98D318
+994CBB28D7FBD01C3AE3EEDBEAAAAF122BCA7A10544804177CC0760AD483D5F1
+4DA0ABD57795A29AE0BAFF8ACE042ED8D5C95DBD358C2529B33856B0E442DF62
+F86CAAB5A854D6B1E30E7E671B9B57B0DD28793445FBC64EF5469CD7A3322311
+E24AF1836C6981566C2B8C83D91079DFA5D02A974D3B83DFE932C0D0C8EEBB40
+CFBA6E52A7A2A313CFA0DB34093C1B6E6D740548B9FA9E8A1A4D0956A3D44931
+882578D2BCBC7FA215D51AFD9209524EB158E4E3FD4DCE581E3871AE2D4FAEF1
+6F25B0BA20F1FBD0943FEA005DFEBBDB1CED7F22C8C8A7FBCEA1642AFDE9AB00
+28624D29374A5CA5BD0060BD399B8750B55455FC22A0D8C5EA953A3CC77DD3A3
+472B6E9EEF8C58E28E19DFDFD99ED3FFDBBF3F164196BDAF0BD36479D927F876
+E2C9F0B20CFC925FFF969EEE5C116ED17F17E2682C997C29325D94E6B28799BC
+877868ED48D7B1D23107A5BFB734DE47CB46EB46B636317431E1BAA8F6DC1817
+28CCF87463C739E8E68C40288B69A9E790EB8229DE60BD665964AA130E564EDD
+CAFDD7DE4DFA4B553B695CB12CECEE7617CCEA9C7F5BD466DD88C177D116B243
+B4FB4DD3D2A809A379413566E118EFF3254260E73A55C03FC56A9ACCEC19493A
+6E8815D0B40B2A48E7DBC6DCC5E181F86BF252A4F312FB1EE7833D001520255B
+64B2889C78B19822D3A20363DEE900F0BA53D9CE738F25709C81F90891D4C279
+C5394DD55982721167BFA1C69C55852F92CD6BDDEFD9DCA73DC39791A85908B7
+CC7E5136823E6F4608529995F72C0A7D50874B93B0FC6D6A773A571E5AA0FF10
+C92F4F5E2931177CFC8B8E39AEBE9A5ECF7D6D3DA706E5924B84B8FA2FB56A55
+1130E7001543079C533248B118CD4543EC1BDEDB2BDEF437CCCB539676CDFF28
+9C05CAF4B8A1ED5720768705EE47AF1162E5B979153CCC82A8A9AD1393505BDA
+26FB54D3FDE40B8D2AB3F2DE79A0B483F7AFFB6022B81328727F66B4801BAAC5
+2EC53EAEBC6D8552AC3EF2E16F2977B8F80E8F2F682674C09CBC26C80D849237
+9D01AEAA507F5481FDFF95DA933BB57CFB64C016DDE71BE1557C659D09A9710F
+A073A68EA7B6BE1F70F3C8E7308B276065284DF6584107A76823B9B0778528C8
+ECD793F36CA5C1C405DF3A9F254C4E959337490840EC48DC14D2AD399111FEF4
+D2A870BE8203798A17D97E39BC7D3A0C9F21D609D6B5FCA9001428DC67C9066A
+BED5FB94E6F9EFD725B23AA3CCC97EAF1033C9B48E8682BEF2CEAC57F21C7658
+81A3B8028E6005AC2C13E0C807D92FD343F074F5C543F4B53D2B14FD50B45A30
+86C9775D4AAF93C2E2FE76467BBC2E3A6A95AFBFAAA36D8A9AEFF25C3BDD51DD
+D4B4E2B7C6FEA1F4C1A367D12531326160D859E83F458CD782294CDF38E3794E
+510F1C1704848465FC209C7E26472EA60F8001E945620857F4885CE61F78F66A
+4190871A4136695B576E39D87E5302EB61600EC42B2218CEF1F649F29383FD6E
+341F3A27793909A05FCC5A87AD7742BB41ED886460F0832E6BB8D443318AFED0
+528ADA31AE91D2D0889A755FBEB9C33AFACB902E3919605A9A8F9FC44C3F528E
+8BFD4F509761F1F513FE45863A1EBDD514E210C108DD567C06D446728217176A
+800B542834A5ED0874D4D5556898DFBA679C8AAB914F840C0C9ADEE375269981
+92DDF4B3F3E6226A6657B69604C6536785169F7301CF3C4BBF602C847E01D7B3
+C3824CA683D80C2B06BC68942C8CA4DB60D80043F07DC63E6B31B6A87B3674F0
+FC529D63C6CA00F3B4F2386DA7AE63BD2AA93523E3D70313687D297FCCE6270E
+3B5513CACCF8AC2045944C559F001791F06A2AEB21869BBEFFD79EA7BA743A70
+7917186B0E2E20CEDB0A583BADBACC2F4B3DB64A8A3F927D2000B81046D577CE
+43BB0DC4AD99E609EFD5F55DE8B5A41FD92F34FC96816E948168EE17CAC0D120
+13CC349F8B1225F396CFC62E3502A43F7ED355E901CA9E60687A8D5B597EB356
+7E1FE367860AFD2EE7B722F22473C968C6E91E7E8A4DE41DA2DD35D51E7DEA3E
+D9117DE9E874092248493F0FEA331AE639578A9322B1D3E6A9E866BAE054F555
+3DA676E2B24D1D4C8832355C6AB10F776F24412B106B03085AAEF2F5FDCBFC7D
+DBC4CC9F95E945A4E690AA2E8E16ADDD52CE957E883F09D141C560FF4A53ABBB
+45B07823B592960D914C54E09E44904BB28DFF1B805A1F72BDFC5D4A8BB5BBCD
+EC19366A8E3E08C100E8ADC25118F79BCC38E0D56E2870BA307EDDAC7EE3590C
+39C825E8958787A9F4370176A09984491EA71285ECE7AA6D60DB5ECED84E6A9B
+242B0472EE67542C4CBC98AB661DABC0BEE7B548EF06C347F287598B249615E9
+86081DE85D56453F3FAC216CD3F3E436735A593F4C8F3E28D5914DDF9DB7EADA
+516FF8FB621DD043CD00624FCCAC51EE263B86F46A9162B18FA26E1DCAFFE7DC
+974554DF975D02C2948EF4814A5345DCA12047176CBB7B68244528B6A3EF1CC7
+ECE0B8D472DCF741C82801D2BE5877EC14652819A739C6C8E7653B2671E83276
+75FB5C4D67331989BF8F0E699C0B8FCE9EED69F7ECF5B2127C4EBAA283D7B011
+7F30CF0CFED36D7A81856B746E7B08108C9C9AB484E2760D9678B82C956EEE36
+463826DF521155993F33DD1AC5F76B1CBB689999631298D2217B022744312A90
+2541727F580A4902637EE49DBC39ABD68BBB15BDEA8F8713F0B309B9EBB363AE
+A20BB2AAC22039C90BDC4FF6459814D11ED09CDC7992237B69315F56F9021FE2
+3BD0EE582D1FB0623A17775292868230D4D36CA7741D10B6C4A7890276C825D8
+7F4F04EA3144B8004821F5078C83ADBD3BC7588D856421AD4561AF9DBC18ADF7
+8F9CA070E79C15790E718ADCE4796C2CF3C777B2692A28F0F208FC2DB5F3F2BA
+1C3F731F596FA303E9DB14CB2D5281AF7A574831257A4B4D3E78D964BFDDB79D
+58497074BE55D6397C986981686771459B619C0FE8E2AE1066DFFDDE92F95251
+EB30125E767F8C4B673B8D733BD22ACFDFA7B2AEEB52D2F6C4C3579FAB300B20
+55FB500454327D13AF2DFCAC2A170678730D302168B433E462227D5200CC3473
+8165558FBC94E9041B2D5F44B4373A60737C63F2D1E126272B8CFE386BF8CF12
+511686330C6B61E5AED76AC3A475B8046736F5DF0D92C8F48A0A73FBB788463C
+A50B2266E2AF8E6A88E0385A485752229990FFCC06F517BE2A507A6BD7FA30A4
+2CDD60E5680B321662125EAA1A5C7C62A251C762EE0A028A8E8CA439F788D2A6
+54E47C631B9C1E86E47AC755BE98E7E3BF1B200E10758AE9A8D98935E2941A4F
+FFDFB8F5CF4472A296D6843299EA45776AB68295630A18AE7D28729C3DF2B6AA
+DCFA02D731A1BF2BB4715D0A9F86C45E6260E4D6213EB4A95628ED04D57935FF
+C24806343324305E4D81AED1E5AEEBB42CF2540FF8C96769F04FEE0864A7F085
+DB143D8224A796C6D983B342A95125662E65F969D1546BC8D907B002E46CE298
+900978B43AC371B432EF75E20302B1482B0BE4A1D5F933957F694ECFA8F5E776
+278E430635B727DBF26863E1DD9D36013F2A53F79884B99D4F81AC2CDD3D25B5
+92E870D36B2C8DA33341D19F1357D583C093A65C8B49561EFC71C37E25A74D7B
+C0112D1B4AE64F0B0B73405B416683AE878443FA527EEA2EF14A0234D36FF51B
+ACC4BE38DF8A92B6272B23E344FF4AF04CD3869988EDFDB3058C3E90E7A9659F
+311DE9F880061347C3FF6D326F18C9B67121013499C63E343CC0CB02EF6AE9FF
+FF9F2E46D176B884917823AA077C399E7D7C7780777F02315FC5C0CEFEC3E0C0
+DB1B562F6C1F61939D57267DBB35F449A69BDC6D93793CB7CE9ADB178BA79518
+A43D081F81DDE88BD16F2958EB56FA45516131655B273C8CE060BBA62CC59D6B
+93DD62347C2C68670073843422C24E25E891A4D5322CA595B9D9E45A4D958384
+48636974E6AEFA2A58D8F70953D7805D10AA76A13C75AC5535467DE9F943C582
+98545E8653E95751A2E605192A3EA7576DDC2B3EEE28037914AA83ABE4E8296E
+F0B84055E5413D56EE98A7337D4DD923D49C6BA4FFA8B6DBAC52E1C2B40F68CF
+9AB0FED29250B1B41E9F67656E098020658418BE1B7BBB8029973BEDF017544F
+713CAAA3211CE1E348BC5A56C12C516DF69EDAC03D886F0ABB2212913048FB99
+FB9B1E6802D75A38003C7785EF1A1377972B7DAC156A1B41DE4D6E811290727A
+9E2960C690A4BB5FFB8F0E264908175DA0751FFBB4D51E96DD1190ECDF2BC005
+F6F5B75CDAB236DED30E4F71F42F15C413D07B53672BB60795604BF2CAC6EEF3
+A5DD8F45023F33A77ECCFEC5402D5BE46E4F8F0CE4EC0F32F86B283A43C25235
+EE90E1C05B47BE5F33F1FFF0B69456110B9A8BBC03D3FDC8454D661E711B7B92
+338C0CBDDF9E9832E687AE4456DCDF304A482A72B86EF41F8447D401315B27D6
+3995B7F4280F2ACC8F7031BB26D3240A1407DC0CCFDF0651AAC6F9721B8A9398
+21BA080FA31CCD478972838819A4A1588D230C76C14B86EE189A124C315AA914
+25649216EC8C3F1EC35457264B5C394573C71A3203663ECC797AF3AA36B4C24D
+D6BA6B0EB5F531B8A25AD01BD94EC56BA1C926D753C7B391DBC3DBEE2C2E8C09
+15348A7E8ABB1B14AFD7A5AA07C65204ADA6A6CF391E38485BCDF8C905CFDD1F
+181313BE7025266AE9422E6BDAB3B93936B7C93EB07DBE70F2DB2B7F7958D7E7
+283E2A530B5BD7A41CDFF4A8C057D1DBFADBA85E9CE45A8947618AAE1CB3042F
+9957928296A4BA11CC2EDFB8485CE6D255B00B2F15BCE80D4E88188959722957
+5EEFD638B94E1BC01662E00DE2882C87AB937D47C81242F1C64AB7DB6C334F5F
+F5B73BB8A489629A36D58DBB7999ED2E0C6438272E4DB2CECCC1E64A49472FD0
+AE3AE0AAD5DE8E961D14D070964E2B11E18D9EE65D657E1959738BE1A0890202
+2F447A746243F878CD6FDCFC1C1F688AE4C532F2384BA60EE7243C8FAFEB483B
+F7042EA915A31940BE017AFC5842C951204574C0760A2010A197A7A8D1235CEA
+C7AEE034424412EA4A84B909A275C5BEA94F0E4D63F7E10FDAE75F8CDF7F835E
+F0D99AA64B6A9AAFB358ED698B10E275E1C734BC0B2804A19BD70782CA469865
+281B93F0C09BF0462B817443F3425DF2F006DD7BB238CC4A94619D41F71DE01E
+AC9B92D6D6CA965A9224A1114C9BA2BECA3F8C26AA02DCA5A0C636DF64310E60
+60BA72FE671E07136DD843743ECA7F915211B6F2D6411FDECE80DB5775DBA596
+BE97576B965191E407B394AF393D858847A0854EF280953D70A727707F9A46C9
+1B8A51FC1A19589750FC47058AEFF8AD1EB827CA0F3C78C859290D851D57848F
+E23A1703B33E474B48CAA4DCA698CC878136903D82624ED218A737F6C7D4591F
+C04044287D4977D8C9C50FF760AF82E80F3E6E3CAD0F034C00EEE8791F7C8E17
+000FB21D8F0222103D8F7BE5FD1996F8AAE791679A62F992246AC211D139ACEB
+1DEAE8EA556EB93BC2123C0B9819671EB214546344B935C99B9F3AD1B61914F5
+AD96D7D63772F933D785CA563AEF0CB3F71289E5AF02B18ACB028496BF8C82A5
+18DBA1A715DBDD10C9A0FCC32C5456BEDB824C59B1F9DC1528B82C235F45DB96
+0271BA11D75B66DF50FF54B234B4FD9768FA146E489E257D9F5C62578B3A0D61
+A468AFA9EA6F16C25D5FA4DC5D5F2A4AAC8669CA059BD9363EF6467E1EC13AF5
+747BB3D6B6EC468CBFD294409145E61F5AE298785D9F7DFF54498251C5E3B87D
+387ED09003333963CBEB24659ACFD273273D5655A9A01307CCA16E1FBE241192
+F6E31AC8D490E31C9D0CC49AD6067C60D1CC7A2F0FEF5B2B7AAFFBECDFBB5B27
+08E35A37C41A85F330ECB2C88B94CA5A9E4E047B7C700C32EDFA055335C04F40
+E345BDFD69377877897B25021DE05CFA7ACE7F89389922CA0386DE41E5F97580
+9FF6AD204597C7FA731DD1AC4FCAB912EEC7029FD2C829987AFE21D24F742D77
+F6F689EB2576E386B632F6C3155068C53C2940F731EB37C7905CFB16594428BE
+7B327CC0796E3B3FD6F7719B836A314DD685428419DC74E534E480D17A495921
+5C0DEF9A7AB28CBC1C7EC5642C693E4285EBCCA41E713E1B9FF3F597948E405F
+F7FA11F6A8E43FD5ECEC0CE1B07959A325B49C00483656713A0DF26165CE0BD9
+144079AAC23D7B2E24F73839C01B971542915D70737BB184846EB670EA3BD6AA
+F63B5DE5A709199EAE53CA83D8A248A80CA9FA65F03D0AF0D17CD290A62B8429
+6FBB59FBD51F3280BDCE40E021D9F0552F8601F4837325B87EB8BFFE373251E3
+D76880A6CB90A6920276343452E0854A7ECC84D743C59E8C4EF59FDEAC252242
+90B9C6B666E94CEF8B1A5A05D7940D877EDB1D52B0588C77BFB3149951CC7B41
+F2E77A627C62D6099BBFB571D90D98ADC819DA5691E297F776241EB5CBAD1BE7
+6A2F5A44F5475A6AFCB4683A3FDA9442B5B9C3B4F47D40100B8ECC366BD49DB1
+63AC7485A5B74EA699318C045528C1378CD84D77E0880850F723D341BB904FC0
+C4764E52C0A92058B8AA8ED472473692870B09AF6E22DC29991DEB71002EC47A
+5D8E90392533F3EB4BAEC3FE5F26CFDDFD28CAADE3519AC92B92BC9CB8639D6A
+E8296BA76587587344DFB67AE6C55C81710E9DF937FD98EE8D136A1A2A269917
+D191B4EDE291A7B3E38AD610CD2C79737F7992F8C932AC0426987D029C7E628B
+99B5A35ED77C5943CBEA4591A8A3521BF101BE5195E7D04001E8FB2C9BEDFE8A
+16E60F3F30042A6E33DE1508B471776D74A5C66CD7672B0DE4CC002A63A78001
+5BDFF52FAD0AB9815F70713442CCBFFAC8255EE0BF295F15860CB0AF53BA966B
+BE8856AD62DFF9CEF8679E66A156B8262D394AC2FF8732C235F4909A25E0E6D6
+F44FD9C8B99E2D1A7EB964BC39E95A0D9A1B03530EF9BE6991CA16FDDC5F04EB
+BE6A74F1EDDF7E6FCA0C28E813555BE7F133A7A0E7D33FB311A2A211A22CF727
+1ECF662DE52E971F6A420460194CBA17C19F8992C7C1A52EA49FA708FD097B3D
+BB797E6B86359164BAEE0CA06BA124FEEBA40C4ACDB58587CF914CEEB7CBBD2C
+747BF8E016AE6DE5BEEB9C9DAA15CDC37F27E5A1EDA91099ACFDC5D7A07F491A
+7179D4A2D5B5F045F824F126BB52B8BA1CD8DF1E31C45DA9126CE1BE450B6B3F
+7465E896A0EF8E6BE25B6135F5C9EE3D0E8BB30B2B7C594B8306CA078D9512E9
+6A35B94D24669491080AE1B9A1568ACD117B4D4A6AB6C0325EAB351655A8AEEE
+FC9D1C21AC27D92F53A9E41A0CCF29D98E032098F4EA9C3F6653F84C48AF4AB8
+F7BE53D9B609668997EB4E3B38ACC423ED28D8832D7DE94F63B369C62795FBC0
+3138CC22C0250F5CE92B0F97BC78DAB5F00EFBB57491ED59DDC547FCBDCEB9DF
+B3D8C0826780A9E0C5DFD394357E6BA6311C4B7E569E9353D872AE90EA4AE7BA
+33F62ABF92642F00495CB99D685ED803687B61462B342BDBE629F372EEE7CC48
+68012C362E27001FACA2D0CF46FFC80A2E3956F9501D2637AA1DE848A21F5D56
+0A7A6965B7CA30CC20FFF711457F9B332103EB1770E3D45B853D8205577E16D4
+8E15BAE0901F6EE488206A9827173C21B663CAF46118EEC9C2D86CF9314CC3D7
+E9AE5273CC2716FFF1A486299C00AFE7E28697F82102A4FC554867C401F9E96D
+669D48EFAE660E6C060E2917CA8F34D52DFD08428109E69BE69C49016263517C
+3015CABC10001BF2515E59CB5A0D1430ED0BEFE8E5DF037C816C7BE5E0144B95
+89FBA15801A48A7867D9607D694779BB772D10B6FC498929A4A689D218350740
+D68A8B8B619F8E427D21F7D0F55FEB9065F3C62A24F076884ADDAE44D7EBCFEF
+703C9E342555C8F985C73D05D5733F206A7568A9F3F58A8754C00223A1C5F3F0
+72F387704E979796C5B525E07B52B3DA1BA60BBE7869AB5296C70DE428227E2B
+8BA35911916054F35B5194CF2F67D2FA90BAD0E08BEA7ACDCF8852F22D77E461
+020B6568CCA168EE756DA60BA381881F7BDE913CA63766E9380D4D52371CA9BD
+4D88F97EEC9C9FEA8310BE410D0F01459BE8AC4FF81AF70E094EC9EAB7AFCF7A
+D70D69CC45C1857C6B2872D1B141D68341F36AD9126346230421291F24540713
+177E40B77E99A825AEE693906EFF6BD3B37AEA4425F8525353F5B2BE6AAE27FD
+800E0A44A75F5EFD9EBCA37878C3AA86BADD21070B825EF79FE864C8FAC2F4B4
+CC3255F76A697DF96B49B7477F4ACE3E01C3B308B5047BEC9475FE9D51866376
+00F8D88203A31054CA687E9395AB5E2A39F5DA26BC62F95B3E90CF97214E1DD4
+3E6442F1E59E154C5F6F65C7F8221FE80EF5C389AB47F70F6B929FB4C8D8F51B
+8A64A4E6831B67F27E96AE2B4E030BF39ED862F097DA695EF32D9D4C6B224A20
+049A643796FACCDC81504563547E574958F55D4980602FF40D3A1E945ABF3B97
+03A3E87F2826092B0632077DA7B44319E18341C0A3D1008B7C877A87252C90BF
+D18F22185A572F1A72D141F11A4975B4DC2134275B93AB85ECD20205B690A763
+D689601CE4F859791C32BD4F42400CDF8A711F9CA54C921021FFABAA4BACF191
+0D03B17046E2D6189FFA68152657AE9B54EAF9567A655CDB97DF85BFF36F3316
+501203209E372AC415DFFDECD6ABDAE58C4C80A2FEDE0E29D666FF1C3D345E24
+B8F0E42DB633E7254DD7EF171911B360B4B8BED9424922C4DC228A11B2E998B1
+533B734E5090972DE90739E8BD1429EBAF4A40A8197B46623B193ACD00A1406D
+E3C887E010C3E71ED3DED4F1E44D5AA2220956849AEADB10AAF9E8B6B05FDC80
+8E8247306178B255B90BCE6B21BC8C2951C8AB203B97AB3080387DA3EE38825E
+561D3E738C63300CF1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMR10
+%!PS-AdobeFont-1.0: CMR10 003.002
+%%Title: CMR10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMR10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMR10 known{/CMR10 findfont dup/UniqueID known{dup
+/UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMR10 def
+/FontBBox {-40 -250 1009 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMR10.) readonly def
+/FullName (CMR10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 34 /quotedblright put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9B8591E5F01442D8
+569672CF86B91C3F79C5DDC97C190EE0082814A5B5A2A5E77C790F087E729079
+24A5AC880DDED58334DD5E8DC6A0B2BD4F04B17334A74BF8FF5D88B7B678A04A
+2255C050CB39A389106B0C672A1912AFA86A49EFD02E61E6509E50EE35E67944
+8FC63D91C3D2794B49A0C2993832BC4CDC8F7BD7575AD61BCDF42E2E421AA93E
+3FF9E4FAD980256D8B377043A07FC75D6169338028692CCA8CD1FE92FD60AD26
+D57B7519B80A8F8DCE9CEE5CDF720AF268D3C14099498A843D76E3B6C0328F24
+D36EFE7F5C4E5B5C612786200C8DE3A41EE5F1FFAF4097653CFCDC8F4FD32E0B
+03EDB3E413283B9EFB0AC33B055617005BC9B0057FD68C52D1B0E67F0C571685
+767F2AA85ADE4E0104A1C777733D5E318A22A9944336E5B98D965E50D31F357A
+8B6EA5A0EA98E1B027CE68C2EDB149EDDD04ED74A1B3D206D471A0C11C11449B
+DE190BBFEBC08C9E1B7513B43DA3134D6B11A2516E6E86B67F68C970A320D05E
+94FEC57FB347606DF89989C33482BD09D011C55AA920319E7B26A205D3D0F004
+22466F09C0482A164CFB27EF6ED2B040ECCC3DCAF345B5A73676F193D43123B7
+72FD6CFC5E37930E61EBD5A6307E4DE70194E6384EC0D79DB6AD86D3B319A31C
+8B0589D0FE28241D8ACE280D0530EE99C80723E560BB72AE9D53F4713181F491
+344B06D3027BA4E9E94D4305BE1D817197C54C8FF56CD6964165F6448ECC8A8A
+64B48B4F0FD69299A137589E2491A283509B21A3A5772F75B7602A9F60AE559B
+07A58436D04222C73EAEA72DE9A5A441F88D27C11F4F91255EFE280E91A4ACAC
+1E98A4E5E6C57B9AE86FD218C3CD8F24A4104156A80F13821384E529783C52C8
+78B94AB3A0096090867ED32E8A30980E737922037F75F062BD83BF4F5929BC51
+CC22AEE2DBBAAA001CFFBFF41D258424FAD888FFF1BEAB796A44E3126159E120
+7E4025C676CF94888A1971AEF8B6764B3AF4A92D36FAF6FC56FD049710EE3782
+BC2CD84FE2473F133BE03C1346B875463F126DCAB15C7A9BCC9A727D23611462
+4E8D2BFD2466600285D79518712B8681ABCD69608E6AA9578F7BD771EC36E01A
+5A17BC17E375020ECA59B43790ABEB9DF5F4FBBEF807E5699EFEAC563E1ACC5D
+EFA336E75DE6D8248E9381BB110884FDC89C2F9A41EBBC9A8A1F98E6A41F68BE
+EE30E25CA148C1EFF42DFF8C214A6537AB11F260B8C329A4947B5FC8DC9C5622
+4DF7BF4FBFB00380D47BABB03BC30627AA74103E553F55278F538EDD8C1E64CE
+0F1398CA0AB5A86630139B4A7E8FC02804CAFF3830114640AE50D2FDA3B561B5
+C63AD7EE3347804CBB40FB1E77A6C89735DD870351C3A1811591AB493251B904
+314F65791963C0412377C1D02362C5E9655F1C3D4803CD379A8EF24C48218C2E
+DF1165840462BF37DDE1B8D5FF09FA2C3B261E2F1A65ECFBE5D4EAD43B52C029
+EEB3948CB8A252CBAF545C8FA1C31E920E23A12DD7222CEF2D2A513BD758EA13
+DA33BF5FBF1D734653EB83DA2D374A5B9A0CE316F24EE375D6DF6BDA49954C2E
+DB25A88821193636119D469BA66E5DAA9C92520FD4F84426A4E54273FA469084
+7517817A6EE3E21176D333825E88046F50B3CF6938AF9BA79A2F51398239EB91
+1A2D07F7FCD948427FF62F40FF95E39FE1A1AA8451411563FD5388472251C155
+69BDE9283B41900B21EB1190D06E6B13B7794FED020D2C1BDD205AE77B084BCE
+EF628249398B496DE85B406FC2E1939EF00DFC84C07E26CF72EC401BAAE756E5
+7F6673216E7560D1C2A723CB405EE5CA474A07F61B81F8836482F73DC9516D67
+CE0CB770EAD755B6B356198B4B97EBB29C63456953270CCC8D5650C1D006E69D
+38DE2DFEAB27DAD50A817F0D645D30AF5B75A7B53CBD3D2B8D87BD0A7E525AF3
+22F7ADDFCE31716914C2318260C2E2B4664893921B68C5A93334A361D94A759C
+0D7B146D6FD94F0442D672BDA0F6432E18F3C5DFA37ADA378D95B75F413C9ED1
+BB5C606A3EC7DFB3F796F59B0478C13FD1900381EFE0BB5242D5B5D34D03AF1D
+4BDC93EAF8020E26CA23C8B0E7DDEBBC6762A557067A4CE05A524188A8F02E2F
+3625DA38DFCF381727887F5646A3995A8A38A5FB1E5D5EBB395FDD0B7C8E71AD
+B48EEDB62AB2CE99D121435EFBBFCEEA69AE9ED8238B60CC7288DE33C766CDFE
+15B767B4AE2E6CE0965E77272AC9F86023DA620548CFAC85BC751C44218A29C9
+849F1C2DCBDFAD895B54E51A569952ED50F82DC8A19F367E7E44643854EFD6B3
+FCAEB04E55E4661C82D31E2932611748480EF61FB2FBFB0CFB940BEA81AFCD84
+4C6A6332D7A600170E38A8EAFCD4F93DC153C43175434C86BC747348FAC61B76
+1FEC9027C1A193E55C80F1F20B5317AA0A05AAA36AE235F6E49F06E570FEE798
+84857D7552EA92EF3EFAD52DE39C2F8F43C59E3A957B7B926FC95FC4B60186DF
+7F3523EE2AB74E294C8C4BCD8B4975E84849E0FBDA6C0B0F24A636DFA578B122
+CF97BC5089E21E9F5298D1C9F30CB8BAFF6A3A11BB4D9A0A5CF2B18D055C44CA
+4FD4D8FE1AF3630907DE7E585AA811F9CD11FB2C8FC791851D651009FA5DF20B
+3C33FD2FF848A9E3F5652BD294965A332DD3F246C91B0ADA34017FF2451D1394
+F9C3C95AAC6EC8062BE98E8914D51DA6A164AD13938693D446044859D03A949D
+F9AC5DF4A000CDA98BB516D762CB9F6D44B5268FD0C26E88BC4A760C0F75A140
+DEBDECA4F511128B7D2805872160C55236F0A0FA7637FF0D4E94AC079CD3C8A7
+D03A5A56F26B0438B577C46011A10532FEBCAD14FBD6032E224F45691A726886
+56F305231EB2FCDF59C8BBFCB5DBD2D093A0E84D62AC93A2312CA69295E937C4
+8DBA1802B85F54B5E7E6D6216A918F911FF705D3B5CF055F1D873B96283A0B53
+59344D910CD396D883F6F7836BA65FAB4393A773A8F6BC298069E5BA38210EED
+49C9D920F718E3FCE692527DC7CCE6963BF744F2C91BC5952564196D60574E86
+87A0FAB21F2DB2BD5A51D7FBD8FC19946D24E5A228462C4772F978E650ADCE3B
+8D66B9C21279C531CA1C3A8ECE3420BB65837287A7222CC3673A2A5F8BBFDB60
+C719CD073EF9A23675198462C7C87B24CC92D6AEE5C25AC63855CC3281494342
+D28F3D2FDE0C183486769A4FD5B0143193D31FCB2C2A14E487BBD96D0BADBB64
+D1B56021C363A795BF10E2DB448261C363A54A4AC1182B470C457AA82DF3F5D1
+F4B329806141EBD53CAE309319B94133D7EBDC2D0453A905ADD207364371E178
+0A95C2686E3B34C4A978BFC0EE968C39ABA00889BC5149162C2B54483D44FD3B
+5CFF41F611C7E03B94945F414560E874D7CF27FFD0630890D7D7EA66CBD15448
+229059E1C436BB33D69552B5367AB5D53591C4678D0C704DD3EA23F5D9E8A7AC
+17D003C19E333E726FFFA2961F33C70F429085F7BFE3E2510F59B78F58B19CB4
+01B48E184BAD9020FECCE3AF52048A056981DAEA02AE78197E65855DDB170616
+F54278395D9EA50DC83761AE759F9CDEF9E1948E7002414FC05286ED793E6662
+3347F2A9AF8917493D7305B92CF93E8E9185F70015F5594084298A6C2F9FD3C0
+689F262AC9FEDC9B89577ECDE92F08D3142209FBCE7B5C0A840CC767BCA56C20
+4E4E545E2BE4D21C53855CEE4CD0AB35D1A604C0FFFF77DBAE4289752276559F
+A05FEE65F45ECAF44E95E23FAB6052195C7948AF0B1126482D4E02D72BF8AB03
+DE0F1A632F7672AD9DDE70EDC82AA993678A82BEAD0BC2649C4707FD8509810D
+364B5C6FE0E10772E95288C622C2F06C634F4DF8C7FD1432BC9310D5F24FEE3F
+7AB324863D6DABAA1576E70643CA79EF4D7DF4105093D66CEE0F3B87D2164A7F
+26EA05F5C4645B22D3E1BFD2219657712C168FD90DE801FB0F32759E80DEC1E1
+43CEEB19FED12D757205043FC98FEC62D6A8D8B97BC083B4A0E985AF7850D6FD
+8716B9957C1C35A0675BC53DF672C425C79F43FDABAEE7D63F092CF271C9A9D7
+C41F40C4189510987887942E60A412B3EEC84C9A6E1AC7D54D528F5604B72C08
+94B7882621A5BF1F325B92FF96B80878CC550D1AE4D8196E41CB1251856609A5
+C4D3BD05A922D0D45E039D9450DEF8490A3E924E41434194910BF60BA1B08BE1
+B41824345627745541A4F1703E956328F6227D11C74946B38CFB096139979E56
+4E723B889B44C6D78673868C89912F8B4F0B4B485F1587A637B630F92E6072D5
+7F3B44EA6FD96BBD4FC28A6C1D90805E3BE3E42A7BC9C880762966C55BC04E01
+204D083AE976FAE6F37C94F27E68F8C0F28D52B17F6C0FD7C9150701FD78F8CE
+B8E8DC9260E3974005EB5CA728171F482D765016C94D4ADFE4A42EF42212BC56
+7E4EEEE8B0D2A7856CD4E44F55C0BAB762F92CB8D64C17022D4BF3A47C12F5E6
+279FC23101FEE93753653CE8CEDC3B75C9CCB29BF1D4554C6120DE8EE750FCBB
+E38B5D915206974962E320362E59B3F21B3AB1875703191043D03284D4467346
+CFF2F98CEB4845B73ED8E003E0DC94251B73E13A9B51A3F1430BCF6A21EB9B7A
+65E17FA411F53BE6432F1506232B8159E008FA257F884A4A01AC53BE91754D78
+BF14A5B0FBFB9C31BF4908355F8A762052968DF526D118708CCB0B7CB5BEE285
+6DAB6CD2E3934178E60BECB11AAB5478623CF6C50C92F8BB5D1A583609028FA7
+B8A53B791BDC9EF76A124F3F7641857E4BEA0837CB36176EC9A522EA7F41B8D3
+63C37D1145367BD300F17B54522A834BBB74DE12BF9EB26ACE6F24A046D58F89
+4D4B7DF74875F1A0C1C9D97BE0849593D7B398EB4B00BEBC8C8D1497B6EF831A
+A35380FFB7F1AFA4D888AA52C9482E8B1755CC209905F98F40D95B44D4DCBCB6
+67423D1BC2F3560FF0A8B4F0CAC352A4EE2C1D946E45AAEC8A6AD40303F3382C
+DF0756BFA3B1ED64C169E56ED1C760F2FF0E24DC5C9F41306EF8D2628153D30A
+5DCB0791126BEFD4947D7EF08301FE015F2B0008DFFCBF9F2D4D859FD43EC7D9
+C5BE237E9BF6665B7B1BEBB362F0C0C3A8D86010B9C97FA741C97C2E0513386C
+9C26C235B14DD2A58BFDAC7B5F63DB4DA6D5D37D0098175A9071590E1DF66A3D
+B8173A047C29D7D35557F06132CC920B5460B8AFC11D23D09A4E45D089F5EB51
+963FA1A6256E359D485107FD143B2BF21FDE9DA5744BC2615E86C31C89470CF0
+D06C6397D9FCCB316EA9989430240759D2C4945D941F159FC02327F34B042BAB
+B5C3A47C78E8C1A6FBCD396B1A51CC4B020B8AD401841EDABACECDB482D6EC5B
+72D2BFEB4556720FADD49D07307C8B22ACB7E310CA4151A85C71EEF70E8D15DE
+B3B00F26E0E166C14647A65ADA228A3D1C89025BE059306565DB1B1EFC37D358
+8C1EB024254AFD049BA977BD4C2C605050E17940A89D0D4C5D963E792320F5DB
+3706682E03D25D9E02487247819551465092CC22B6B56E93F3AB528038FEC3F0
+668F866707A19B0463BE706EC729D2EE1653AAC7E29BD25BFB3241D4792F5152
+ED415B4E7FA92C2EE5A22E27E8B75542C492E56D811C192E95542A6FE0BFE5A5
+69273C2ABED4300D491B92D2AECDD278404CB84B1BB1BD7AFEC858215837D118
+C0E928BE7E07CFEEB51A6D21375B772B8248C994564014015232A0DA4BEA1754
+3274F407FED0837A236371F1A32056240F2015B1E7F4B2CA72C6B58610A66F13
+407CFFBA5E0A2893C1F572D50F51286E9133B5A84239C9493B0574E77D281D01
+11D00683354A000C9700EAFBC1FD104EA19DFCB87470190E7E2CE26E3A6FD0FF
+2620B87B82AC8686B6206B530F17E9348BC7D04B948348802CE53A312443DB87
+4DBBA5313A6A2A8DAB8A1CC9A594FF8C299281C0A261C8CB2226B732FBEEDE40
+2C6ACC74A1A61379E2E1CD5548CD908268A32FA83D8504C442EA0E183ADBF7FF
+9FD09C037AB03516ECCA93FF048235BD11A25DB07F164512A079C5392AC7F889
+CE96AE5C8D9580BCAFCC087C35E76EED1A671E87C12E3045E15A687134736DF8
+DA984772AFD189D68571A2ED7256F1E204230E41D3D9DD876F938951714A3973
+0CA9310489F8E807C1C7A4E51AEA5BC030610A5D7263FF7E0F9FDE3E5E37A362
+5B919000BD94D978583B942EB79CF2BEAC33FEBC9A67272EB10865BA8FB75FD7
+9D280AB59F91B96C16C982DE848D76D8FA8620DFD7C80B7DEAE7264350D6FB3A
+EF04794DA3305844A7CF718F6D1A4A3AFF6826173A076A1372ABFC54ED3AC6C2
+09C9287FC830556CA694E21CA5342ECA7B10C90AFC4783D841D7B1E34FA3DB7A
+2B706F3E21B0FBAB23E7257962FC3BC309CEA2C7239A9D6B44CC96825115ABD2
+AF9A2566D2F3382C01569FBDB94C8D664A5DA0F7DC3DD140CA77C743D7BC1420
+324ECF9E4780280EB119885E96A6C619CE3C0C8E1E264E2DEB137E5DC8149786
+486D65667ECF47B1A1E20E9E6E4FC8323E0BC8E61BDD3BCDFC6575C69C03E31A
+EFFC290472CBBD049DE3F840AEE37A2486034240F80E75D8A79E0762377DF660
+52B12EAA16D678990B11A9BFBC03C1D4FCDA9FD4FFBB3E88352438102F10B7C5
+9F04C013B6575B5E948FAB58EA691984A0E54E6B9F3F505FFFEF74D06FA1CDF3
+4B8A95904C8A2763AA8AF5B71D00F5DE09DC1CDF87A08B6D181453063E14C12D
+B7BB3775A6E2A901636273D9EEB833EA8CF20FD83AE899E28DADE10EEEC20BD7
+BD93085A4B1AC80AC1AE8280C14767F1A487BD066007A0D050317BD081131A14
+6EA0898ED59E46DA7B6254BDCCBC660686E2EDA0E77A705A653733BB5C5497D0
+B130359F866CF293FB6EF0C2AC5BAA2DB0DED045E2DED3A2612D078333260359
+16CF0CCB272D34767EA069E0F0B0D42327A18529D72E890EDA6195C2688438ED
+E9ACDBEED41E81CA8EB5E43C2B09CE266EFCA03F2D7FF57F12B06F9E54FCC6A6
+546676F6FFC5B8B7D3F0982B6FF0D21D949309F0C0B175CC1D0976F8C55C6AED
+6E821C39041E22D91AB30922F2B2EC2746BC7DAB484991542FBC82D87B487507
+559AB466F73EE23C2D3194DC5CE4C9AE66D3164613AC5CBB3DB501B64DA7C91B
+C7ED2EE9027FC0906820B35D4F2CF66C4F9CE4A884B7C07155BCA884ECA5EB3A
+ABB83F84DB1F5639599DC7D3F51241AB5D95C3BCB7AB1EC90B4BC989F74FB354
+04B2D7366A34D335A47B8C00C05CB423482BF6C7970A95545424A08AFF9A035B
+7F83F52B65A9799CE76E303B85664B624C65E9CA58184C7BE2BB9D9C86A4DE5A
+8165EE3DA2E652B5022EE7893896BABD88931DE1D538F615787645DF5ACBBA0B
+A8E5B899A37321AA7D4B283AC9234978C2DD81813A1EE5DB6EC170DAC1B6EF02
+94892635B498765C07A38D2E9DB0B7581B11056C28278F89B0E60998379C07EB
+C0EAEDC32AA69B8B836F92A61AFD35688315B2C3F860632FC13E4BDFB63214BC
+41CC6859EAB3AC3034449213CAB99FA1D216563419CD6D6CE4E1B56F33E6C654
+7AA9DCB5B05FC068DF02AC32408C8010AD004F6CCA9887830927F8CBCD49CDB5
+18CAC1EAFF815FF2F6F527F936948201565003022C6C7390B4E3C2B219FB4F76
+9F12BD25CA7B3B61D1A2F8DFEE795D04D5428B42FB66E0C254AF7B7A10CEF7FD
+E5ADA5E217BE24851180E9A1700FBA66C7D2B0D7BFDE4F4EED1D24B821A40947
+5620363657F6D048E651A689822CF815E72FC8AE9D835BE31D1DD8B54C9A717F
+4DC319B4B59AE073936EA40B070524C7E71D5A7B64436DA107749746B516E29F
+E3BBCB8F8C473E706670E11E5B221716F315FF097CD1841D0069FA69EA1898FF
+9F9EC2518C77806A19730C97F54BEAD604548D553D4A6EDB247853225E24E7E9
+89D71F6BC94DB986467E755CCC99069B313F5745B02B4BB608A39F0A0A732B87
+7EA2DED68219754BF1FBCA350327572D769C962EF9242132D93A5C8E9725D8D3
+AAAEC15ED0F362471AA58488620156F3474FA59CA080EA96FE995D2B3DEEADF3
+3141D157481C66507725ACA5953CBBE1ACEE7E3F02C72C6552D15EB3D612730E
+61A06A43575568DC3CF3844BABF04CA767E2995196097015E0C4F622C4356B6B
+F41DBAFD797A4B9D7AC22332C552043EF98913D0D9B50CA6B7CDAF903BC5C04F
+D20A952BA5CC35B646ACD0A287C956B98C450051AF6AAF79DF37F8954473F8F6
+652BF03AE2AE82B99D820CF93F5FC0BA17EBD7AF90313E70594EB5C354023BFA
+07912408F1757319C7288E99872B907D5AB583B082EEED8AB079C63E38B07D11
+6744856E689A479CB3A8BC081F33CB06755926204981DC0A45B3ACC18F6865BB
+EE2C50DB43B62E3630FC1D9B1FFB3BFFAA6D0A20C0381ADF48E4D916BEE85BA2
+BB40F538F55C11D50F882B73913840B45161262BC8B0012694C3EF26452F9B77
+2CD7C7AD6BFEEAFE31C8A721C2D46AA00C10681BA9970D09F1E10DDB693AFE84
+246AB18279A2B24E5B50A2FF6337B7B1039FFDD4B00ED3667B5F2F7BC2786D2F
+525A0E82234B30711AA835EAEAC2E404915FC7EC0081B194765032708B5E11CE
+EF6868298CD26E5B9EF345BFA3EC2911E2B96A0B40AEAB95BDCCEE38F5EC170D
+3BFB792D2DDA7E57BD2FB7669484EF9322A1BEE009594901095DE2BA9A15A0EE
+4DD77404CEF16EA6C31FC04A8FBDEF27B9FC1AD3264388B0B12D8E476305B912
+30B51624D4605C45B514473F327DC3EE8BA69032A95301CF714F225A92C253D0
+D943C80B9CD0524C5B87A8D052D2E47A9725EF869D3B89097CC13CA9BC695FF8
+A9468004450A76A13B7EE78A03CC18917EC44036C2DD237344E594569B8F2DDB
+21F7619180B8C760741961CCBE54FD6DD07C4CF73B346099234A1EFFEFC88574
+6324E4232BA18A38EC9F0B780C298877EF0AF42C1EBC2EB52DB64A1E1E352503
+36AA29953A073B864FCB31BA938A4163D000A159ED4D345331FA1EB4009CFF67
+1D107BABA6AAA48075C6C50BC7683929EC146594E55B01D4F5B582328284068B
+2AB05CE92EEE1DF4557DFC8FEF287CB7F961F4F1828EA48B0ACF5C63E1EEC8FB
+6A0EFF132268B7DDF7B465D4A21B05993F4A4CFD168A700D04A7303BC2C00391
+392C3FF97E770E6FAFFFE501242B20B4F7B6C17331C64BDBA3E59695E176CC79
+E7632AC6D2E920AA048BD1EBCF9909D8C314D2EF3CFC5CF88D8570BAA814D467
+96D86CF4415C5B739FA6FE7B4C228F06268D28EE33381982E7B005C26D2604B3
+AA363CA4732B9BB0E4D4EE50556D777258A7BC232087C9F00B0D5EF70270B40D
+3071E14E4E5AB5AF1C686C5A7C268D36A0787DC9300D4CFA004F89A73FFEF780
+E6BBC957E31B764159C3ADF752E6E1A6C3B5B855F8A483497A347B601E3C8DE0
+362D76B715916113CBD2D3765197074104C7E17B87670CDD5C227A1467BD678A
+BE442F196034B02132850CCB77143C2873447FDB8767C462C63916D9D4A13198
+B7910E1B274B27644DFB2E8372C8CD55E6E2AA5CA952A079E1E6389927495921
+CA39D69ECB4DF382FD2DC213EE382BA1A48CA886CB6AEF2B0C50CAB47B1FC40B
+2C95E13190C92480439E3C56188D162C294F24987AAF4E15E8FF7ABBFF2A12FD
+AEB884FCFFD671EEB94CC075B815C6A45549EC23DB85923F4C37221641B75CE0
+C5C8FA8403C2C9FFCB66CC74C5160D6C7042DDFF33A954DD01C8E21B21F8F364
+F6FC735507D0DB5F68F2D8B520AAA7E0F1D503211339F9466006E9A148F39874
+A1488F1F0458409D442D2BF5935A655AD4656A8411543F58C63DFF9C4FE56256
+7F9F876B56BEB208F9DCA363D2E0F7DF3CCAFD5F9674675BF622CBFC2D1CEFA2
+7A5323971101D3641E99D84197B00D67436843EB9CF74C273062159C361A07C6
+E3F1E0E4666ABFD5C9AA8F914F05D02EE1906FCB66E421C73243257170617FEC
+2F02D5A7F3347CC0D290E52FA815C4D5D2A16A4D4A5E0B50165B0C5C77B675F1
+0EF343D70813346EC4D7384A9D9A091984AF29C810F8C3D4247D37F91C5DA967
+747890DFFB25E67F6FB766168487AE8BD8E49C55BC1B68B831E3F510BA1DA3A3
+9F810B865FA98AF89696CF7489BACBC1033A1C929023588E9E03FAD6D901DC52
+A2F5EB74DB679A16DE42F7B47BCBE16617EDC7328A2CEB2C23733D98ED753C66
+502DD2FC75CE2905A429B5B56C62C1C0FCE17144D96E0C615E7FEA48EFA05D9D
+344ED266BD96C3296D6005D289228C62D572167E369AC65724E0E62AEAF608C3
+423FD37E586D41B2AF9B10E0A36312AC1A6F61418BEBF528932FE61881636837
+47CFEDDFEB25F7FC156AC7D6E78D608A91270FF6D1D510E8CD61C289F3E7960C
+B6093B333A0CA3CB8BE51107C5C1C085B3CF6D6F61379420AC1E5D9A3FABF084
+80D6C719D93BF74A99D681726C81F9F83949E06A560F3B3905C0766134533256
+6CEECBBE3EDC220193964706085526386391260838C2E885C88F882E29F31F69
+149CB1B4B788BE82AEBD32B5A8F07D1F537D85077B4BD1FF945EED4BB41B79FC
+CA0B25D1D761129A6043D701AB1F6655C06DF7B0891C3C5224977B9464A6A794
+5FAC6547F7548402420976CA3A644E5A7CD7F64974B71872B02756FF6A135EE7
+BA60B9974A0A2CFA4E46D91B929A3A0DECDF44C39CC06BC2105538856718CF59
+59B1D9BD88735ED4D83C17A67031178B43CFEB4C301E551D708F5F08E80E5A1E
+5579CDA06C9902E412052CE7714A8BE29DF9911F556899F819A7FC2565522182
+20918E8C476DFC00F79BCC4248BCAC6615891C3115B30A39B365044CDA0AB26F
+C8966DB46FB9FB7B7BB37C48B7CC4852C8C05A57D92ED8E6AAE6EE5A60BC81B8
+C0B22E5E74610495094F12BA6D60DA3190C4CAC7F46D740005264BDBCDE61FB2
+50B8DF1CBF41195E616F4595F7860F1538363D529E3E3FD2D408B56CE034521F
+3D9AD6C30174D0AC1A9F9151C8C8DB6E7624290CEB82632679BD0A01EC30B3CF
+FCE72F32F4443E137EA554CDEF84B62CFE21A5E8BFB2EE52C87CBD603C8E0FC7
+35A9ADA5E49FC4C7E3F1538C84761186C045B9F11074F8061F0F4BE061D22C85
+2BDC140F6CCD858B1A4E9AE9444B4EE3DAEFF4E3760A8B851ED3B9780F990595
+36210570D82E9DE83AFB3A20D0D955F69FD838B6F9F785231A84D8BF9F434665
+CB62D518CD5F4623711E022DF76D2CF20202FBA15A1D1070FEA87D6BE954DEE0
+370280ED09237334FCA7AFB1A0CBC9A153A25A929BEF57B202A5889958A9AEDA
+535781A11DA8E2BB5C885BCB83053BEDE8436846C7B54B41703839F861F95D5E
+3C34C4DC8FAADB39D20DC53F642A28B92D0BF1B02876E348B088AC9B2C55DB06
+808BA40658ABE50D6956C9B1201C8D3D97CF9ACBE1FCDB7E7C02D1BB8D87AE61
+2902D77900C11D1DA6CE808C425A7EC0B31BBDC690E98A09AB656294A1B17E00
+2D12DDCAA5E0F1B44EC9D7CDFB5E916045F5CE852D3FF3E8D421A11356EB4392
+F7DA22AFA6C18C7F507F5D8892E8F1DF11E5CC965A61D732F12EFA8339951645
+CC3AF8C3EC88C5B372729EBBD3530439E0E8AE43B43CF57A5258AE8AB259EB71
+9E1F057688B110D4177CF54B1D56D2EAB6B1DB603D6536EA9B9EA11DD57E7F3E
+DB574B05043CEDD701DF8C0982EE726187EAF637ADC279BF7C83A244D3EA9800
+F9797A4D3E4D5F6669B49D2B37CC9BB1C9244B54DD62A5C4BE533DF46F618D3B
+9FE2203DC6C75B25AD6B49B2A760D3604F156ACD80CF5458FEEA64E243B2E527
+E750720E97CCFFE2322734D5DD0FB1A8FD8FA77AD87AA1C8EA1B023F70BCCF92
+624F9A6B0B27B5C8A5AD21D8C08F62BA1738359A4D78439A7A580D605929D6D7
+60790297E11930F43BA89832A2D351CAD0F77AF8BB70A2DD5DEDD4B34FCBC714
+C2BEA2C26F768EE44D27F39021F5AC95FEF199F6ACC4A2F3109E081A3AC7F42D
+1767C2A82683BED075A3293189784AC8D12F17FC3C15B83915E0425926D6069C
+16D58DCF97B1D8E1021F51C47BDB1286B5F9CB60A2B2B7D3F219F20C8651DCCF
+80B30FC5B20DD6D887BD571450A3A005F5980E90A649DEDD316A452589B2BBA4
+BE8625C231E5D4886124B24580C7795F7B3D063667F400C18150A80DEA255943
+B9BC4E1F0A0E5F5BFEF9F7322C836AE892F91A4B3291F216F99654C54BDEB5DD
+87563AEAEED8D8E65D1B60795F1011C3CC63B8FAA15B381E04E1FBC2A5BA5EC8
+B76DCA2AE3686F7D71CF0662338C5E468C0E8155715EE8DD963FA7C257214DB0
+6E523E1370D0F14165FDEF1C9D2F9DDDB4C61DC764B946DC40BB897E8A0BD7A9
+A7D9B684B5899E1A8F4CF9FF67EE19B4FCB61AA4463C5F06309C7B10A131AC21
+63E04A69A223818185F44D48ED721CCCD98737DF4BD3CF6924C6EF30372E9E38
+22B3230829B054EC1B8B42D29059AB5E706E5EBD6CAFA57502005BB170E5B471
+8BC330C11C068849A61C37E5AEDFF994D9A53E73E12D3F7BF63CD6C435055F5C
+875056658B8141B78E3E5050E3F8209CEDC015445893B5B798DED6777B98017B
+4B9766F79E20DE51B4081215A072BF3BFDA0AA741D3EAB7F35138C2B32982453
+5681A66A99A21F0663C8B559FA49AD7B854BD648335DC7B8F72EA85CEC66231B
+AE8F8FA55020FEB0FDA90055CE8255D02C0E2FCC829AEC8EFBAA08071CDD03E3
+9FE8C4F28DB460E0AE8514E319ADE43559B190D9104C78DEB8DCD9E1B2118746
+3DF257B5DA0A52F0F6F0F70352C2B1F851F14F3251A2CEF2B15590E4E80363ED
+652CEA14D0CD2FAF8CD0CD6A7888159FEFC0A3D8978F49D85DC8BFBF33FEE7B3
+C0B040618510F483EF114F46A509E86D08D9470B9A6293083E6FBD511C388D8E
+5A16B5777FC9FF933366757609163E9567B121906BAAB48B1D3CEF9D0B1028C2
+18E9B6536DDA27ACD9816D2D1D5571038F936FE496081B801485F9CCAFC7EE0A
+34D2BF741863A5F639D9D4E123EE90AEB355314E4E38F3F4C243CAD3112A0504
+48BBD089B189203DF7ED4933819A0C1D57ED8AE20B2B15F19F8A0CFD927CAC50
+116B04C25A4E5B20C4C5864A8DCF8CC9BDF5CEA59D1EC52EF62CB642A8FCF1C9
+3E036AA4DD6F4ADBA4F8CD013C622F831397B8640936910C6D1F82ACC6451C68
+760E14BF5B7845762DFE0037BABBE5046C5F3CE3874702EE51D1A463F3B86C69
+7C758A4B1960E1A796F07859A9B1860AE5BC7D5703E63A37B9334D67613241C2
+5B606439A6AB29FA7386317DB876D26FAC05188B4C59672F2CD9A750A0E70CD5
+AD69A8609AB0C78F625E7749C770391D5426D9C3CD1CD7D37445D9718C07A37B
+5BECECE3E6F3147731D5C12C4946F88A7C82500F8C495FFA7E2FFF6A9C2F0BFA
+8EF861E6C369C8DF969B5FB0F02CAC74E8E080B16BEF1CF0D1A81E90FA1612F1
+FCF086961FDD981A8698FBDCE44A80E4290B7B553D9F46BDF6E346627437903D
+499C80A29BE6E7A2C03D943D23C41F1B85C92FE922EE3A3E0601565564C55116
+17F01B2DC9FACA12AC59950EA410D5533B0C31D89FA68D07E9FF1139554C7920
+FF84CB51E13B7FA3EE6A32DDD9FCC192B576A871CBC9E04C5C66ABED560AFF24
+6D6271979BC7D04F7287E32F52B1D2DF60B7D7A53A7D776FC36D70E9C6F54E97
+44F15C5ABF2547DB40EC913EF0B9597A721563C3664E74E7283E9030CAE36B7A
+B14E781BC772691347ED48EBAFDF23EDC452EE8A118A840A185B7C1DFB7F3AF1
+A2D64EFBA1C9F662A35F3B46CC8E2D7E7A7F63F9BFEBB6E4A6DB8FF0BDC83E9A
+A70438435C3B8A780F7F92578501656FF963ED66A73921E014A46385450D26F5
+B73EDA0630201BEE50325B0F76B55E77BC55F4401251D083225EA5777F42A7C7
+748FAE7C22E6A17E04BA9F6D451B35A63DA6F3D80B0365E159B3E993E0DAA242
+2212784C9651F9A0766F473DF743748FAF491CB69728C2473ECC5524E0F2997C
+2650BC1F945EDA4CE833980E706C4D413F7929804A0B1D182E26052876D6B836
+01284296115233D90D2D0FE83317D4AA206A67207BD899DAC1D726C937A34193
+F0B6EEDECB391C6434144275295014BA4283D4346BCC495AE3EC6EE9C4FA7711
+BB6004D39D7BE17FAF0241F2798C36C451BCC4227899837FC244BEC3432ADE1D
+9E4F47F45E9B1D2C832FEF6896C92A207AAED7AA924520D096F983D66DCAF476
+83A2F6F1844E7EC5195EDD3E5FBD0FBAABACE5D13BF754BB2B0CC8FC633D83BA
+3BB65BD9837B109AC1B5B255298E6B65AE4CEC0FFE24DDC3D1883FB0D6F8FE65
+94D0A898278E0313303CF7DE2E37BE0152A1D4CDBA04ED61D54555B1B107D9CC
+C08C89BD2A19050191867EFAB8FD582226B03D7ACFA97C6D404BF99F39EAB7AA
+9AA9397B57CD7CAC1B338C21579A593D7DE1241E6F77366CAB10C3FAA772C663
+BD1051F9D791A84C35196E74D28D342553D344199CBEF83D3A6ABF05A4779B16
+EAC70F7CEE167132D04BE5F56F8F20927DC3C7A20239AC6AAC2B57BBC83174D6
+25F59228ED58B5D492B16ACF3EECA04054F59247A8E318B6F5A09F0A8B3820B7
+2CE711056E3A3ED9300B6F2DFE2C665D7C3351D40A779FEDA09B406E804BFFDB
+9831478F237DAF6352CADC53D6AE85A14E5FC7C0C1BA4009FF962FAA52499506
+C6F3C18BD4C13C1272D844EE151CB5A0DB0188AB7FA2DD47A6A2CE8554A7CB82
+C0CC30593F062451363778FD5A8D39C60835825D63CF3BEF323C8CBEF3055F61
+294FE558C7542977A3C520DE15A984C6D82041E06C356FD7BE75D601CB95816F
+F05AA3F53144B7D768F6732339FB8E6A068F8E021C1BDDB26572385FD1B3794A
+0E1C780576819CA271C78010D8416F6B19912227CE781CDF6AFEC335138203D0
+ADEA0617451CE0BEB024CDE135922C72FE0932F10589F0FF9F1DA721D32B1583
+8D032EB9049E4AC34B3AF16C4DC1A85CDD8B047035ED7D50CF8D9D02621BF6C8
+2CCAA23DE753C7B0B8818B68D625F44A54689C0B1CA36FA7C68A567FDAB813A1
+8B34DFF1300D5E42067F51ADDF7DC9BEC7D4376D304A417741E17AE427639676
+407472CBFAABB5AB329AA7CCF130B3EC6DD588A1F44409FD239238B1A8884382
+F04198DD7C5DC5E2288FE0B206C9D9516D468AA6E2B1183E2E906F9DE47C9209
+578321590CF839C9FFD5FBC3393FFC75322B4E703EFE69534745D579B74AAE3A
+2336823D2DD5F477F39AA9386736476F5C0B1CB19457D44AD6417BA503475D23
+51A99BDC97751E7172363DB670AA50D21920E98BC1DE7349EF8B8C1E72CACB47
+557B3E2BC30454F75CCC41B84A67648E894AA0A43C5A2BFB5BEE8D0BB07910B3
+47EDA7B547EF357C2553933E0BDC0F05D596E4C55B33AD63E924164DEC1934E4
+58F937DADD65AC866E4EA2BF02D36C54AE3E3727A8FF9F3658337D2BFAED5908
+5BE3C1F4503843FFA47C83B3D9CBF1DF2AED7A6B97A7E68CB6B9E5420E70C5C4
+36843B29D902584DF95CCD8C34647E87E2335371DCD89E495A92033BA482A62A
+0D2D3A7BB06506E42A4926CA0AFF80EC8DA63D7B73E8A04B25312F03251B512D
+76BBFD76C1F5207FD6A8E69ED9BF063C7DDD0FD4C6974BBC531429EBB55BB715
+0D08FCB2F80275425FE42E87AEDCE78D2BDC07CED8BC49D260D1671BA0ABDDB8
+98E0F7BA7EDA086F4E3585157A71CCEEA35750B9DC3195E3396F1161EE1E1D25
+E6FE6E0B022A9625B5866B8EF59DFE5391AA7F033886402C654F4834F4E43138
+EBAAA758DFC8C27356F012F4D0F398EB8D013678059D8419C2D947F3FB2BDA1F
+70A5FCB549BFFAC288ACA7051BDAEA41A4AE0341035B4365A63C553DB80CE429
+02670706A74AD397B49AF535067EB07CC3CB86704ED45301DDFD5238E7DF5ADA
+8DF465E45F7514D7A0BAA202305CEC73032FC09294480796251045AFBCD6B081
+8EE4481D29E817C7DC32539B364076672596DC24CA8AC45D60A8536865FB475A
+3DB48E98C675A8BFA39792AFD17B5251D56F0D5C27E229DFA75FA3560E7ECFBB
+8164E4FF15421846BA40EE13146A316D530287CC8652B58804B95C53F6FA9DF6
+F84DE1E222C5D69E45E12C06C97E672D456E21B95584F8371FE34ECB0E6174BB
+468EA60BB0C06B3DF48D996D9083F70181799CECC224FE60736CFCC6F246E5E2
+EF465A6B1B411ACB7474A59BECA5935DFD15F5C18160D4AD4DE9767D6213C35E
+08AB18F834CAB32013AEB8C634DD6382D4C7E49F10BC5113214A18A5EB31A0D6
+923630A849327C1CAFEA3B8F5EBA83668E03EBE084ABC1A4C1DEFB333ACE0696
+EB20FAB6FE6E61D38457C8E10D8FB7595C627E8FBE2D5563C4D50A6E1F3DCFF1
+F5A2DF1A62301665C0E44C2257B4516B515FC995A52D4DBD54B3D4EFBFC63A8D
+F07C27065CFE19527AE04A9CA14935B7399E30EF88D2B63891A58044D7CE07F2
+916EB8E9C65388A73956B3D82B4B41AC378B4B75AC304A32339CA7701636B6A3
+84254743EA5F8525897D4FB054698031D1FFF4C971A10440212DE812752425D1
+E71B02AAD20E994357EC8436BF1B74F016DD41D6B1F6C1578E4B261ADE5A7B31
+2ECA2C16294C9309F200AE0AB5BDAF2BBCB3E97B0FC5556BD8208E50CDEB88BD
+F137D2F72258B6E41092F1256CA4AD867338DE757E29298F404FF94F247A805B
+40524952A6D8581F065B11B6324F9F2821A3AAC2E7A583771EEE640F2FD0975D
+299EACAB2A99942480DCCC95BC7CEA846EB1B2423FCE304596A2581583450455
+CD1D56843DF8FFBA723FBE4A4AD8E539828BF48BFB4D0C4EAA68EADB81A2C58B
+EBF89CF83017DE3382BEF407B493FA5EEF810C740C3C8B646292AECE9A5180CE
+07ADE6E6B2935B90BC521D3ECBE25B43F14DABCF49F378C26CDD2B27C690EAE1
+E888EDC3C963F55F1AD13C8FBED4BE0BEFEF31C0636913B47205DB1D0DDDBEEF
+4441A3DE9825160AD57948567EDE8660567998D41A0AE2D9A9B5BD4207F2A0F3
+EE82DDE22D16C32A583613E0EC2BA331EA91042B8FA2865A8A7DE1BDAD0B6D33
+3DB1409222AAD20577ABAA7A2DD6B302803FC7B4244ACFF725E37CB5926563D2
+82AEF220424600581E25001DE71E1385C9D690747BCE051539AB8B03B2EA77BC
+39B27AA8F63CA37E3886C50E125D3886C5132869596039589AD6A8421C8B7AF8
+B0EE2872AF974A4B779F09DC1DF2BBF673A7FB32BD1BF3D8D99A94E1BCDFEF81
+37B2D7BBB80ABEC1EAD544448E6A49DF730A1B7F63267C9DDFE81131867F0C0A
+8D2B37E8B0AF2A6265C57CF9BCF98A01998081E7BBB94DD53FCAE52F3F5010C7
+AFB011FC6FA98FFDF173FA0F935D33EC3DE55890BFAD217870974C00CBBB6C67
+1CC558F6FB2C30B28B9987721722A27EBFA924A382569E3D7C47A3220F21EAB9
+1011D71B104BAD1A47CDD9CD64487A8E9721CABFDB83FDEC748EBF0D08E77CFF
+1A54D0B3ABF4024DAA403436C9F6CABF3B6CA7089776ACB183AC01C8E7F287FF
+9DA7959C4B7D73F00976AC5C3E4B810DBCCE732E4C9ED9EF8006AFC7314F0055
+FA3FAEC780434F273ADD7D07C2006E4B755B24A26341AA5AC2DCE258F8B03409
+188109067E22F078E093A76FA372C87CAD401794D94317B2665DCC7E21FDF901
+E1511307385B6EE148FE1666BB616351F48A8082ABF94040CDB058DD584364F8
+CBE3E94DBB8A2450D18D435FF5C8CF2DBA1EB562E957A83F184C9F3CC43C1860
+E6FBEE91C4D240C61D7A7D554A17B90D0A9CE1E7AAF7840846B3F1A1BB9926A7
+CF8E9DA56DB81D35CB3687E9818CE74C0336DF7B2CEFD8BC432268AC93EB34E2
+3D361A8387BC92B459F645BC069A49628D7382E22EB249BC7CAAE98AC55FBD24
+F570D8D654B54710B809234AA2E662D2ACC44E1FE1AA63A497FDD94A46B9D1BC
+E37B29430A5E0C2E592F13BE227CD9A6556E9A0E1C3EAD9DCD742D1F9CF62014
+5EA4510003418D1881C4EF1589A8B9EFB52DDBB67BCFC4E55B134A3C2E31AC1C
+4658B592EF69C2E23E335499A35B91A58DF9A947712DD55BDCDB7E0AADD53E29
+2777329340EC29A51E9020B8EBABB7B066113ED3A4791D3FBCABADC40CC45FB6
+8744DC0116379D2649B216366C6FC83999E1FC558EEE5E17E13A12B252E5F7A9
+E760CD51C96C1B4815BFE37D4D39621BCD10DA9428CF186E61E9921585C1944F
+DDC084DC9216FAB69CF54E456D47F65B3FB02F34B0CC998E12E41110A4791465
+19780824EE2AC1B799655553375ECB24149100E539C23829944BCC82211A85E8
+6A2D3559BBC0EDFEC2DA02AE3BB86A9E30AD5BF95E5CD956297C1F6AE85D0768
+1F9D96DD8EAAAD78CFBB543E913951A78D3262CF08BE0DDE7D870FDA94C51A1B
+1F8544122EDB7653E66D772E3EBCBCE4419F17500D8469EF4FBF93144B20DCD7
+39B815E0B09D0BC3283E8B7A907F203EA3B22924419C1C3A8DEEAD335FD538F6
+0D5ED1581BB64FAD4979D67D51F18B047E096747FC50C6A2B48377E458038374
+7FF93A3A46E09ADA5A844EAAA3EEFA1625510D3AB7A74764FFB229725FDA314A
+72CCE353A9693869F26CB904505B089DE6D41825336318DA00DAFD986779D4DE
+E8DC47E496A9936DD3CF46719D5E832E3B7C85B44D16D4BB588CADCCB90CBBF3
+3589F08AF2AF77D7ECC3AB68D6409221B2ED853012C693C522407B4E97DD4F89
+9EAA4CDA6C85F8B65F5E165399F6CA79550965F3AAF7D875CA947FD6BC42A4DA
+1AF797BDBAEE65A1C3BAF00E8E48FE567E757715166DD2757F7DE6C45FE4B3FC
+A0C76D12FCB66B4CE9CCB47060AA5CB3FD427BCA5B549A4AF34CA654D9421C26
+9EA4106806950525CA856624E9EFF9DC5B598AE4AFE928447D0704D4EE99DF07
+69AC51F4D3163B7424059ABA4381DBBBD5C8C7DEEF723F163AE69C48962C34D5
+7514F73FAF946C121EA5848C29E127DD0FDACDCB6B1AF4414EA369093282383D
+0213B391666CF596FAB2AA27270FC273E32B90D3209091D8360A0D50F8F28D23
+F7B8B097E2FCF2DCE92A7D5AB68EE680B691C2DC7BB846FD5132EB5789A30B8E
+9B849C18E8560E9F49764CB89FE01E2E9968C769BAF6B44E08E45E563EB14BC0
+70601E5133AAC33723E934677518C54A235EE9E4A832B363DE44FD82D37BEEF1
+E9C842EF2570C97C3C5D6C0DE94DED4DC5B6681E4A04BAA725F0D9061B16C431
+8ED6859AA5E5BF254BD3C29F100293FEF2D0D6EDAF428490E13B06527B5FCC90
+54768BCE8007EAA2EB1AE14F3F577CC243BA416AB6E43E92EC4FC99775BC1D92
+CECEA05EB8ADDA826E364921ABE388295AAEC6678C08D26415B2725025C70089
+9F12735F37C45F00218EA2E398A8CB173086C43B2A7EE4C95852110F8DCD12DD
+64AEA60156E560E8D8D84285B523515EC15888E9912C6C1AB91290E1D57D7595
+1DF73319FCA62BE7C04F4E9968F7E453C384899736D48EE6FF64DF1260057C37
+3082E207F796CE6AB2271E3F31AD2FF83B99FC3DF2826C07F4E4CD05077DCD69
+A3B9EC76BC02C12A468AC4C0D7D83FD4BB4BC8ACF9C312CE3144E76D2F3C6246
+A210DCC9834608CD0A52CC551FBC059B88BC2CEE954AC6B5811281737EC83C8D
+72B39D016B0ECCED40BDC58706910851447C80E3FFFA9D57898204F9815DB6DB
+1EB38FC10637CC50768703AF9FAE89A94B424A3C647A7870B26970954CEAAD68
+E069ECBADBFC0519C33AEECE55AA93C75B6CF907DF65B98C7A9B043E4BB5840A
+88DBB212EA2E86888D36B76D270926739B48D6435C1547D703FEA7B989CA60A4
+87CDF9DF654919F730787D58680BAD0E5B506FDC2BF0C89569CFAF6BE11F80B2
+07D69B417562178E087AE3AE9380CAF8CEEE40FD3989BB50E8521963B0617401
+2996B2C32A3F03B7F312A211B605932233E7C230FA084BB912BFB20E85D721C9
+532D22AB85802085C715206297C09713C3142039602BA9D607F7A52FEA25B0D9
+FDB7E9FB15499E3DE1E47CCF2500BA8B8798497469DF248B8244493738C81815
+1008200E9457B4CCA5740897B17F8832515EBAA84A237E17542B359F173E7868
+64E99FD8159C9051E876C235E434BD5920F55084DD7F31C6FD2B6CB58E5FF307
+0AF6020EA9012AEA47F9BCF018C30885988ADD1A630C2F1CBBCFD5A2C95028AA
+6FC89D43E089957267B6F94C7F4E05FCFBAC85E879D27F7BA921FEDB4B551F9F
+3B5D3197C0FCFE264D45F6C1181BA26796006B94BEFDC342C7CCDDBFAF332F8A
+D96D8D6C52ACBB10C871DAA7162501071CBC04CE01D8FDBAB48393E59ACCF1C3
+9EE4972D7DABC3E639B1C2722F346553DA9E9F163DCE4CC7CB2D1B966F561A07
+8862C3230BDB104C55DE3436ACA77800229637A6DFE1F041DB4B45B2D1A5481A
+6641D77981CDA367CD23E64AD5355B484930C7B09B47ED6C79851844099A68C7
+1F4E6ABBDDD7490259E856C267804A4EAF61246AB4C1233F025EE81793312479
+CECC3813C2D887855573122E59FAD0B85DBD9AF66203F4618F22D6D56E1F7323
+2BE1ABF7702D8BACA8AAB9FDEAB48E3ED56BC0D3E4696505E16473CAD93D0559
+54E8991E7F146F4D4C9E3DFD35012F5830B57FA04BA42BEC724E5708FFB6D521
+B209D2F6CDA86560921C705D6A99F822DD3B182B0BAC8AB381653298B82C86E5
+098FBC2E1E30DDA83919362D1BCF4D91702B16E849E032B44EC2482369B4C342
+211E7382390388FDDAC362431B45DCB55FEAA7C48C30996C47B0E21BB32FAA7B
+14D6F0DB95C450B59975CE25D65E727148BC7400E00C249A415AA52DA829F547
+8D7AF32D029BFB27EA195EA3E8A038493FE5BDDFD89597C420CA1ADDD2D5AE9D
+D3BF13CE3B530D78BB7413F47056F663395BEAFAF4002BAA6E9FFD3F1F0C7C72
+03592F5627EA49F1C0E8C95813E1C30BC256C99A2F34A027D4552B650B0376EB
+9BC2482C80F19BD6F9315C71A185EB246091F6D7D019637100B555077B1549FF
+27446A2CA0C8C815B6CCEE95CF19B78908DEDB25C1F9A5E6C36FFE65E0A8F694
+8A3E847529C50351F6CF88F1F3B901A78378BAE535678A6C60D7DF4A00505B14
+FAFB1A1AE87CE09E1E90769C046C11309AA7BD8476AFAAC0EA48E6D32842E0FA
+10CEE024B1B178D8B9A15E29F825E42564A8F8F1E1F1EC760FC03F1D5773DB78
+E177A95C3D2E3FFEBA469404A866E662D217FEF7A99D6BEDF9F144A2A8B97542
+9423BDE10EED471B99F70661A7AC7A260C6C32EB4D00F21F7A3A5257EC597EE4
+885981989562FB08DBFCE4ADCBE6D9A1C92F6E9FF65A23BDF943835BBB7C29C4
+0D7C987B626819583D4D52DA32BF7DF15C21BE5BB64B575C7F4B149AC539ACBD
+A49DF3F0480DCD61E3C14BBC956DE5D968E74DF4141BEB0106E6C5F7828E4F77
+4EC7F0775CF320C26323EBD09354B3E2A52973E75E54CB42F6B0F5C10AE8A8E6
+EB93124C15AD140C971D2E2D9C2B5275F93BA3B01556B72B7630CBE7AAF3D997
+E82D11875B82071FE770B13C232388C07F2E6F7E9C6930F4D7379BF74FC3436C
+D301123050BECE20F2BF95FAD2E57FC50203EE6EC6D9420BF8C218D3D2F8B236
+6572EB16DE1CB2AF00CF19C56BFD8D333FE1DA4494933BAD214701819B0C2ACE
+FD02F0682306A6B0039002B0B7095D992A30CB675CDA3D4B196C447F102DB4B2
+FCE3AAF81D94B2FA40B31EAC2BEC613654B1D885EA590F675E6106BFD0575B1B
+4AA50D0583A2BA2F79AFC2EF5640A9EDF12F6BFE45ADBBBA43B773B36DE8DD60
+C4BB8FB6F09A334FD947877A785AFCC4F9D366326F5B609ABF1E0CB8942560D7
+68D0FA410EB83A9BE859840A9E024FDF850DCBF5FA8D649B40505AE64B1BEEA3
+6776EC44EA3298203B09990EAAA5FA937CB648A0377173CAAED6432A38B48DC7
+906B730B6BFEB2B9B166526D1E8D4110C6A2A4CE1ADD2D0C9C179621F7867669
+31D3A28EA97D1281E80B4B6A4F223D1FF77F8960CDB83E5768F3A8FE52120CA6
+15164AA799E18FCBFD91697783BA537FA897D58726F5F3BAC1F0B20B57583374
+35837E9EE8DD0DE39B6CFB69EE47ADEE4624EDF65E43781EDD056024FE108280
+29E5A39815F494C65020B91F68D1187F815ED8A312150B414D9DA84F542E0F15
+32351B82F2322C9200F987E477807E9E4051D4057240E99D42E6852164704F26
+81A939AF1E3BD237C4FA341C702F7AB978F63CBA8DF745DC2C57AD5511D89AE5
+B4A80BFC57B1A5CA1A110D3BD5859EF41959EB364DF07CE50F709B30EA099EB9
+01C010ED4F4DA9AB062BB8E10F515559D2FEEE69C579859E43962AF7640A705B
+2C3086E862AB4297EF9625C58AF049BDC0840F9562D8D8BC686CDECA7D4259C7
+4C86D8C92909BAB7FA09AA2E83B4089B246F8B4AB7A086C5B9943773C496C62E
+9E6344BBD213B44C821CDDA42B1BE933F74BC8FDFD0A85070F50D4881C7E875E
+DD689E97ABBF6AEEA6E8C8BA377BF3E4A8EEBBB1D47FBDAEC3B88462A62CF500
+727EF93FD166092861FB67303490DCC4504B759BE754808BEDD580E6DC38223B
+E02EE2D9BB8F32E2D3386376F8E49A853F7C81650DBD33E23437EC98F4A6F7EC
+12705E52817A7B647F4CDE1B173EC370C78589E329D93C35895CA8B3EA2B945D
+E30630DBCB2B8ACC49846C7835869202FB5231ED9167F307CBA31D2DC0B423D8
+65DE2E24CABD53913C01C388F64BB66976FE3B0B421AAE861E0C0D495D5E0B26
+1D207792F1072BABB49156544C024118BF0D239BCB1AEF8AB7F38EEB34C88CEC
+C7401AA6177E9B7849AAA081334E04A2205077A90C0377A363F22091678371F2
+36A088CF84558630C3F370FE00FE97209AF40D77C6F70B1B4028F1680FF6268D
+EC09B05DB3F8DEE17678CFC46AE78E02DD01454A9A8ABBAE157086DDC92AD22B
+DBE7861A2909232DE46FFDB6FC84989B2B137C564FE84961BCD663B592FF2A85
+A65D7B595113AA7DA8463F852A28233A754591A5F2D7F70649A12EB8CFA35361
+1410C7E2F08EB5353A91CBF2109D6E279758B8E458DC7737369AA35B330A9229
+B73DFB9E1745410440E440DEC966C0B21349149E08D57740773B1F17161217AE
+B0605236A44353081EA2248CBE9E8F4A0CE1499354F6475C10346F337227B8C0
+2474942B49CF891C5D0953B1015203B1BFE0A7528C900968D16A876AFD9BF28F
+43EAD0516A38FE48F7091219A717617CEF422F7E2054F3E40D7D6239F6744E44
+86F62AD7ABB61DB0E75B245B44E7A6FF9D72DAB469A07D8046DAA059CA891766
+1420C7A397CEFC7CBFC41A09C54FEC6E77312347C14CB8D87B313A0E7F2CABEF
+CEAC4B9E15C279A18BABC098027A02EEA025F481769AAC7A89F9F419A9EE5908
+351B0D25A2F9FB805227F0ABC3D4A87C63C59E80B1BF915FBB1E1E164568CCEB
+1EB5B1A19180F370EBF2DD11827844584475357DE9E31A138874E567B8E1DA93
+FC5D6084A3737CA8EE391773F3F91C243AF33013891B4E7DCBA7BBE1E06C5031
+C3C0FD60806B7052C5F7B069BFCF4F879914D9C2827EB53C505D5C738E1564D1
+1FE8A3EFE5B3EDE0B766E816FF02473739FC5BED647CEB758C6D7457ACD5E352
+1C3F13E6F1DBA43FACA8FB3D257B24902EBC64B10C7701AD3850BD845140C3D1
+A6CB630AFD8E81ED647D65D7F51803369D37DA44F36D8AC77976AF53B9C4E56C
+84D5969C27EE9DA518FBBD8430D5769AD02F28B6036D5D8AB73C784734C22D5C
+7200D0A706326DB04C52907DC99648D46F2741B3A9BADAF9040F2CA68642156D
+E597FD6BDBB5658C87501440DA17A44557EDDEF1C576F8FE343A6E2DE27CDB35
+8E62AA7C8367E3E44DA6E435DA063BAC3DE82D73AA2A147CC5A844187D29B83C
+D12D91B9018718B53C9CB11CABDC9F7A8848C19E73E1DA7067632DFED7994B8D
+3A5E1260D0315558BA94389D996A960836FD9C7570F02C453129DA181B2BB9B6
+56BDBA69A47729BB3EE50403667025273C0FA725D6742B32DF5E58BAF48BA6BD
+DB77F2571F3643E792CC757B8F1AABD13B60965B5F1AEFC5108B68126149F4F5
+F54E72341790C7D75372F0550FF3C9FA8844DE0C6E71C261F94C2A763C6853CB
+6179437BFB20949F530804A81C8C71B2E04531E2F3E0C158040763FF38F69682
+F8FE6FC7F914C9BD77FD51B7F533FADAC22C819B6F7E3094BA3B4F96A74E43BF
+240DB5BC95B8577597AB79D6ECCAB0D65EE279F5CB8527B05BB521EF2F7F23C8
+42349BEDFD0E303A7969A9383A6290B9ACFF7C7D402EA8A7C9517F01C28D31A7
+5B705C785F6418B802A18AB458C03291A0751FB55AB25515926778649BF7DC53
+8E94F949469AB3EEC16FCA42F98220A5EAEE73D6E82C71779E8892B2BE652796
+E12C2B6E3D535037013D60F8211EBA7119383CEE9B06981BFB98666749064BEF
+338B4AD1C6300DA217F38EBF093C867A7B019F1C8F4C64226FAEFC38027AC7F3
+A528689C44EC4CC0D0612AEF76650826D2B16F53675A57273A78A911647D112A
+193F579ADA161BB62859141F9893013F55D636A595E532BCA11F26E5846724EE
+E6F3026983BA6E24C1E462CB599D2C6F3E7C0803244D9A773D1DE70325786EF5
+C42D2E9F3DDA5F7108E3C28357AD1F088404AFF56EF5BC9ABC92A32BD46FAD66
+4BF53BD32E3A6781F4DA33E25E0075638D941389DCF2D5F3FA3C9AD7DC26BC19
+28D04510B6DC27C7C6EF0EF6189968C8759920E15F65108B389BAA1D2047B977
+E1818381DF9FC5FC217DBBDCA80BAB7B98E7A00A97AA3BD47EF50ED526FC8583
+1FF5B2B4B470642E3F575F4C0B1FC5EBBDA263F89E6D644E2F56DBC6FB50D23A
+A04A2ED571997F30657BEDF19D268F69D7A624FB11BBE30E94448708D077A238
+CD4543C8E805BC0DE96A0F4E14E721CA75A34DF4F911034DCAF94C190380D55E
+77BBA860C105DCBA06BB201281A02830F8FE7951855ECD7E13A2514B2EC6A93D
+A40D690A17709E21DA5305E3DFFB395708581573005A777EAFA0403B2F6ABC0B
+EAD09C5C3E2B111D8E3687DDA302B8AC5B11341E916A63832439057BC72B2E67
+7BAA5ECF2A8FB4D60751A1F209BA3F80E2BDDD496106EE382F0B704B94A7EB2D
+1659474F5B80774BB710BA2A744794A74061970230B044218212BF7C908A9F5C
+8575922D7E0D13FE10CC1E548C182F402346C6E256C3C77E871703214488172A
+76E46E6B5BF7B7704AA57E3C8CE8EABC9F8BF0A53538F3A09F27ABC005117354
+39F733BCE06C01F617CA9552C01B0ECC3AD05D9C04E67CB7C194007C4C64A460
+726BA5371B9B33A713C6B3D69A6DDA20E104580E1CCF7B0958E5086B31C28AF0
+D645B982521DDF76581C7DE21C7FA385F5A5AE637169427D13300AA66B53DBCC
+4CC79A0320A2C5379B7A9A54AC967163DBFB993753FA7AF4E4F7AB3710BDBF8C
+3F10A9BCC0BB17ADB5C5727895910CD7CA7F4923F00B07FD16318E0A53633A3B
+0501EA6D8851CB557D80120DF270B85DC721881CD897BEB71CD7EEC64CA12990
+E8E580E138EF6F9EE2F8EBD3DDC3C5F63AAF381ECC7350379646788EDDE61725
+C72975D2DBD54F7E7B5B1DCF78969BBCFDF726C8F7CB93F39CA28715C943C782
+5CD1C1DDB42404E24E079ECB45A8C3625039AAE73D365CDE69473537D4E575A1
+1D017E12D1FB54B41D956915EB6315A82EF3CA876200D5CF0973CE5F56649FEB
+F62747208C08C8C61A0AE81FC3A538B16DDB109177C7A686A256CF37D55DBDA7
+8F807AD40060A99A44BEDF27C3B7178199E750C91119A7AF35496F6F1ACBD666
+B5E1C8F49FF59AC5C5648011E2D0F7F85596705D4DF9CA26541624DD059E8E70
+4E74F1743A6C6DFE15BF1FAC3CD9A004F3AD0828489706818A60C1661B9E09D3
+3F18885643D21E8EFFA14F48E22ED8124BFBB4398024C177B02C760A59F7C0CE
+E1B619449022B819131DDCD178F826A0C2E9389C2B8B44B229F954FEB4D5FC0E
+CA84B53501FC1767BEED2381CF24BD89BAC6BFE1868C78416159F6F933E7C828
+DB743BC92B2EC3DC2DBB0E14F569EF1BCFF9182C04627D1E2BD48EF654850CD8
+7151797484EAFF38C38F8577737F5EE125EF08565E4F6E6603CB9CAFA165A355
+4B06608C939495934D515A13D319F3F8C4C1425363C897D025D28BF1A4BFA09E
+0F97561179C2C0F030F0B6A3C8591537506D9FDF232AC0BC848E517E61F2AB95
+88D386584AB5F92CE4C68D1F419A32576D47EA6CEF4B37946B1E3DAB1E67FED4
+A5B70D62A9F69C227C21C8AB490DB86DFB4CA788B6CBFF8F02B920F739B141DE
+1A095167465D82714F492EA9D2B4F7BF14719BAB487EF25F8BD1B377FEC95E66
+F3D7020294E06E743A606D61B27DE20252F211737C4026FF7B9B4945DBFC9809
+8E1594CE15A1D7E5270B7448CDEC0E7D728AF99771E64A43B27A041FCE6B963D
+42B6E1975F5F8F8C26602DC75D04ACF27CB1DA2B0841529E26CE6A1D0E5E9B31
+0C191C39FDB29C4505CAAC095E91619AD29468DE658EFE5D5198FE5EEFB0A2E1
+4D6A7F1BBBBE87D543592D0E658FAD7B5A002D6464C9A413D8952C533DAE8507
+B88888C8BFC31C3F8838653527A3AF640BB9CF67FBB5844FA83E7D9D51D801F5
+62C12CA2D6070801067033521249A56C5B0B77B19811FAD4951E34A6CE5CA1A8
+443E4C5B72CAD2FFE1650FFF90A91EE8D7DD95D77F681C1858857EC9C449AA1B
+C0D7145473917BC9E1D8D6A691C91E1A9DBABCAB74BB080F506E992C1A974E26
+00C556FE22EA28DF85CE94B3898AD28F137ED56D605CE095BAD1AC60BC6B73CF
+85EA4ED98FC0ED5971DC5A75F289698FB94A4FEA6479479FB2A9BFED1859F69D
+1EDF8BEFD567FA71B725B11D55B06CF0E95F817DD67612B41AD48934A4D5ED7B
+D888DD698395041DB1C9290F599BF0ACD24AD9EEE1ABCFEFABFFEEA96A02D292
+C78CBAF56DC3AE9E909A2856E2614E2EB9D4F46289AF8248CACE1CFF69C66F94
+F5B939A523DD14332C225110DA3446A4818FDD67B5D16FDACA990DDE72B9F10B
+F3924237D2B6069030B76DECAFFA70FE97F5C5C684A750AC53EE37B1E27C5910
+48BDAC0DE147D16BEA29E4A67AB88588CD8F3B50C4EA3A18D81778949CB17F14
+E4B19BBB9FE53ED4105C05FC9180CFF9F59F956CA0A6D11230499F04724051CA
+B98968E61ED0DF26ACB0D0EB7EC9BA825547B42F4A439AF0F1B4D4F9F4518ED9
+4A80B709484E08438B6D103CA4F0C7C8CE75889EC2C501A375FD8D91722D5FF8
+195D24FB5D569630D94FDEFA35A8D881FF0271B3D451A884D106735D4A2361A6
+D71626BBDF60991E20045C1B980FDCA1F436C1EC063C9B454E55062FE19F88B3
+C84211C2D38911CCC65C1B10931EBC9D633FF04826D1875DE425E69D60905013
+3280E96B205088FA4C3AA2665B595DC5BE5AFF1C29FE961869F3A03AC93569CF
+A1EF8D26E4FCB55CC541FAD73B55A60A9AFDB07C4F26B7AAD34193D5D3E55B6E
+53B7E8C23EF6AF8D363C59A59C1C5DF268B43E3BDE031C960662E3B308BDE103
+5717C31227ED287DE82B9C1923F0FB2885C2AA2839273128EA545CB9704CC989
+C4B324BB68E070E9F0810137F4B1FDAD4B7E959872BDB8929AE4855EB15D88BF
+F1A10FDD74B735B9EE49465875B67070F6D6CA219A64FA86934A4CB5EDF7073B
+B814B8C9892EF9A90129E3C0D84BC60C0DAED6A7CA8EF9164BAA7B3B11736AF8
+C58302F9578CAF243178E37C0CC8C3C9544AFA68952BF4B02890A0D000645694
+7AEBF900234A5374E199A5D90F10E57A1C123DEA596AC51BFD29DF7433141F90
+E0656BECAFED14399A3CB3A7CC99D5B2A8F88FAF17C9EEE84C08D0EADBC15B41
+7B21B8BF97FE52CEB94EBA37CEEB39EF757F7FC8A76B150796A27C646D5C85DD
+69AFE8AAF7465D0BE73B348CCD8E6493AACB6CEA5C15A9636C2DF301E5C7F72C
+B8C6BA861E90D2015817619C9A013CA9E7D22D26C6E8393187F8179E1693EDEA
+F2531A7555FF7BA758D3792108786E9745DC6B235D02AEC8A65A45CD310169BB
+F8AE3BA1C8A88A4C2A8C2C730F428FDDE333C75558417E41F95D6DC547E0AE93
+134F547C8F7BCA1D2FF766A9E2A2C799C529348871F5A56D5B8ADEA3B2A11DF0
+545A0A5930AC1EB9B33D296DB9F1E8B815B741D855622350EC35DA65E002610F
+4EBA010D0E018E168377533CC24CF7F4B79C90FD7C4AFAD40756621200E45012
+6C65F1359854128910451346DB93A34374EBE00140D3BB639CC14901E7C448EA
+B7C6F6D76DD96CDB8910BC20869B7E235BEA990DC962554C1D92EC9625813BAC
+252E58DF9D422C9C3645A999A3F25B5ECBE2B43926E2E9951E47DDC1E302FAC5
+921AF039D110CAB81962ED99254457E99A142A2F3230492827806417B1480691
+BE5511A7C1FAEC3B11745B30A10B8DDBFCBAC3B3B8122115F3E869C36AF8584C
+ACCD78A3B88E09C7AC348187D3D9B650827FACB330B2492DA961EAF8CBBE87C6
+8ADD19B167EBE1A73EEFD7CC9239DBE4E8438A4A16A28F97A1C6CEB14F543C23
+238478AC9630CDC4CD3A01C8DF7E06C8B8F033A32D2B4BF1C23CAA5366367DDC
+D3CA457D69489D0C84E56D50796B28F8BD089108F4D8C7FF554CC68309055B12
+9F910D46D48AFF711073F5453D8DE7A781FD9DF4CF4B28799093DD8FC2055BCE
+E8129ED81391F18F26EED523B9BCC59E941DDED79B23E74FC37BFAE9724A9E24
+5304601310BE6FF3B480C7BA9E0B72E4C6FC8BE2A0A9407109E1770ABC56FBC0
+A8A44AC1496D3F41A74B8AB00435E679E7B107C133F3669697E8341B70DEDED3
+48D6BCDD9BF9D336F25E5739A9CB1420D6F1813D1282C0E0EFBFD8DDE2C66089
+8B82A466300D6356A3257222AD8B28F8185085218997DFE0FE1A1CE1AF554B98
+A1699E9068CB49374FDEFFA433B638B71284FAA1211B65898C3C056802FD3AD2
+3AA4F680922D437146E4F7DEC9CB8ABF1A8EBFCCFB7DC9B3BCE38C8C4F2A578F
+51B3AA15BD2BA58496CF4BF26DB0DE0CE1214674239166AAA4A25606920B81D2
+A0AD21E24B3AC6A74368F9E7F116BBA02DD2AECEC99F41BC3D955D43C2E22F2C
+7C81B1EB554351D47461805FEEF5CB89426AD58246617F6E5135F7F735822D2A
+8A41C2A685086F145175154762EB694EF1A877670A51C4A86139E64063A80933
+61B9C6111F450BE26BB644316FE30986368945EFA43F6BD4BE3840F578C6B7E5
+64E8BB87AF2A7E2F4A8B1AA257C2DEB9C8BDA8A5274E5076756B3E942A44F1BA
+D26498BF571F450D904733A0F796238403E5A781E640330D70AD296F6D74B679
+B0B1168B656E9B28E4BC7026FD15197875D89A72696FD7B20A3EE4ECA24B78B6
+6391F8DE690ED48966603F2186424B17A28CD3B64BE1E3768D8AE01954A4DC91
+CDD6F3A30D3C4EB5F9C2CE00A5A64086FFE87EBD9B4ED432FE59DDBA942F72B0
+F6B3C8CA4CCFA5DD2BB195FBE297F6E65CF6C06E9D4475EA2C41D61D39F0B25B
+889E1EF856FF0817142ABA12DE2C80A2FBE0C0D98A60952D93E3AB87C644D4AA
+B7CD2011876AD53DE27BB957F69F4C4E48B292D916CEE8BDCF3AA2FF9C72E580
+EB5482E26EB7719FC7BEBAEA7102D55048289FBEF5C5829D96A437F4F7CA57CF
+9FDE380071F7859DC68EFD00288063EBAC1112227AF649694E3D2D63B6AFDD3C
+7702EEE2F4ED8D760D2023EE1193D3266AD408AB8A3FFBBF6FB9FB1E8E849F75
+D79AA064A146C42EBEC6B1F5B77A02D9C92DFE729DB8F03C6E67E9587346ADCE
+213F08F02AE6C6D2340E8F041B212A760F0EB6D4C4F7AD11C0C7D003C384E9EC
+8009BBF3B5351BAC77CBB2DEC5547D9C9F2ECFEBCAB4D48B5985E891E51C7BFA
+0A02C7B166565EE79D8D5BDCA41C79C69399102BAB4561B1171CA99A57550363
+3231BB3E3F48BEAE734E65310AFB89A170D7D2C23690D07050E6246647B2A3C5
+BF170818138683EA1B4DEA8C2F018D0FD5778BEA72C72E6CDA1458BC8D1E553D
+E61050AA240D0677D9DA9D9C22810CBC6C0E441C02B27BEF9BB48027E07FC495
+9E83F67BE50872095AD837B6BF75C0B5669091CD4923EE8929877CD0BBC624F9
+17B90C8D5FCE286F68DE2FC1508373EE9F9FA6F5A3978C75F52DDC397E368A0B
+57F5B40322053BBAFE6C7F8F293E0E3BACFE054A8AA7DCC3FF253F58C75B9D12
+4669407237089506FE8CC6A24A1025C8B4673B48FF3174C042C4D66BE2AC584F
+6A346027B020024CB9816965E99F62488D47EF144740C30CDDD2562F6BAC56EE
+04AE0AA4421F68C2525130D92002CE82F361624166C24F7C2B11C69310B93719
+0947BA4E74BA25398727049E1E8C94669B709718B2BA25D889BA48D66B0A9EF9
+173C6CF93116BC0DCE2DD62D2A936341BA360D901BF23D9A6579977464D12A3E
+14A083FB37A4049BDC5F4D9E8D49D05FC4213B01CFB0231D2B03F552F366846B
+7AB75D68EB74D57CA505C571AE2086BBB8072B00881A57AEBE38304FD73F20D1
+B3A3F4DBA7CD736A475A04B7785C64F8802DD8483C75E50F385FE63D063E7ADB
+0FC45DC313B0585C605D1529D226FE08FF7ACA26E0CB2C1B23444E976107731F
+1795EE18D69C11B9969542AA52BF0D3C4D00862494DF946B74718DB8FC586DAF
+64BAE620E3C1512720B0ACB343DA448A0419975CD986B40D91192158129232C5
+85E18BBA914D219AE5979CF98BC9A4006687095BB53215DEE575D4FF7FDFE94A
+25A05F1CCE048E2F7A801C7AFACD586C218C1A04B43F167EEA5D6A4EC9DB4FB8
+C2E56225709D9AF95C88DFFF3B7EB9C337069278D51F0824C96DF582C630BEE2
+C4DFA3E9C9CE76D1B52A23CBAAC840EEC8B3786D45834D55942B46B6B4C612AF
+BFB077F21E0F7F0EC6436BDF1704EAC52789C75F7900EB441EF83E37C780A699
+2E3B2F5222D7FC4440FFBD93A01205FC7E64CBE9849BD01FD4448B343FEA4101
+9FFF4E1527F81F4DF3FEE2F42953C4BD655A50BDC6EFC02E25A5D8695544E166
+7ECC195622F1911EE8D637DCEFD8686B01A130671BA5597768246CEEDB1DC252
+214E01AB3AF7AB7E3D766C1FF37CFEFC2FBD4448DE566042D46B3F2A0CD85D27
+52F4CBBF632139E86B8A2669321B4488AEE0E3EE016440B026BA4F3CDB798BF5
+1E026DE9653F2851D1B095C7272112CC642066872578C2063921B1F1DC1DC37E
+6FCA614E9EDC7EFBCADDF112E3127B753D0DBA1F920964D69C779343ABB1B56C
+EEF95475F7CCE12C08A5AC0502C65284DD6F34C8FC31E6D696D9B1075B6CA4E6
+8857AE5D9267CF640DBEB733B3FA1DF1EE67D578445DA58492A8BC190AE91CAE
+DFE1F1C833312BD85578E1D63F8E593432BE3D4A9307127750DD9F9509660664
+92F85F9C97860433F1190C2448AAEE97CEFD9E048681D41D17F5CD3B8C6C3AC9
+E7D46179623C806085BB5D23E6ED26B2D900515216EFC224A9F25660536467B8
+B47665F6514284E567397A7AC78784A8CF47B61DDC9A66B74C04FADC5074B8C0
+476EAE541AB9F94E990FFC31CD94CAA9E93966096383C1951B00C4E79B51A728
+7526A4FD3A5F6E9D673555CD7142C94EDE73E8A3295341698D777405898E3B4A
+E149CB4E9EF567CC18C35C3BA9354CDE55382A6569A8D0B2B7453E5008347B32
+8B5745431E577B3525D343EEE8C0CE5CBE1CC6D3FD13AE8C5C9F672B10451183
+3BDB33698C0D220902195138EF44A545EA6092A79C9F4AF24D73B735E3733FE6
+67E47D76CE584299B16295BE997949021F949E035F49593BC128DFA89182F89B
+2FC9EDE36D2010B1BA62A6D900B00C4524AC6981F0DDEE41043ED7500F574409
+C275BD142BE36AD2F5B08121EB0EFD58E8EDF388CEE211D4FC3C2D04D09E8757
+17CF2869D202B2302BF7F5741F4DF47C1D76962A3DE9E718ACF684751BD968F4
+6B3488D623E734451674276CE47A465AE3F50B50A938C17DAEDBD7E40737FC3D
+35A709ED283B930E0381A174F3804E78BDF8B8761BC37179A96FA636127145B8
+639577E80613C9A547AA8C3441C85E8408C0C4C1A5143A3179F9366DECA49F47
+324BCB48FFBF44DC15A98DF0A4F9331BCD908E5D516881A82ADA22B906A85015
+6643813BFBBFBD2790451F64AF61E0252CA23D2C44BB92D546B50DF7C2F5F3B9
+560117B9EC0D5DEC65A4404FD7CAB019E50B6C468DA7B5D2239F298DB98C83EC
+8611CDF1D5207EE2F8F817958D2ECDC5557BA2D8023B69FE98BF4ADEBA5610DD
+F12B997F1D998441952BD2EB089AF2C6CC99FAD2E7E9AF14648BF99A09355470
+F32C0A511E8A02FE7E24F7E535020C6FA0FC4D9015532467666B0192BAE64768
+756C8AC401A71864A830359DEAC2919113979FE4DA48292EFC5DDD97A53377ED
+CB29E122DACB9C126F687AD2684F4EF885727C84F09CA8C579D48ADEF1F47859
+DA6848081327E0316788D90F3F59452FC9EBDA175845FF0FD6178A0582E20436
+4BCE9A140877B4DE31EC9006341568BDCCC9DF9DDA0B086DCF1D5A8BCE4060B4
+1F13F5A274242B4A0990BE59BC8DD36A2AC264258E19CFDC1AA63432D07E9DFD
+C35528A40580887195D79101345AEBBD0041A765274D09780B2BE95BD42CD1E6
+A5B490374097FA0E5B6F196A3C47C18E8499717C07A36BF3DEC7064845253515
+E0299143BEED08AE775CADA4F8ACEB96D70F08779BEBF179B2BFB0DCB0F1C126
+35B6BAB5C1F755CC9C40D5506135F11A22F802A9F3C79342B6FB9522729E681C
+C4A93373F8E6DB2CABFA5B7CAB4C243C975EFF5C5D634D4D311EEFADBF115E41
+1C3EA696F82803A071B80E18BE67F7828DB353FDE5B51073E86E68486CDCE01F
+5D79F3E3DB087505FCEF1F9B01908F1D9FE1EBEB25B6DDB40C119D5B28DECDDF
+0F579BBDE6CA59B903368E3460730A756FBEBA62903512DEFDA5CE765C479DC4
+5658ED736D9EEE0CCA46CD2676C475FD3F8E2BFEEF43E7B959F19468FDEDAB2E
+BDFF5ACA6119413724BA04E9B006C4AC43CF2A16FFDD90A1E46F52C661328295
+B245F8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMBX12
+%!PS-AdobeFont-1.0: CMBX12 003.002
+%%Title: CMBX12
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMBX12.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMBX12 known{/CMBX12 findfont dup/UniqueID known{dup
+/UniqueID get 5000769 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMBX12 def
+/FontBBox {-53 -251 1139 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMBX12.) readonly def
+/FullName (CMBX12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 44 /comma put
+dup 46 /period put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 58 /colon put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 87 /W put
+dup 89 /Y put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794D2D43A151FEE81296FBE
+0CF37DF6A338C826464BA5198991445EC4BE80971DB687336AE8F74B516E333D
+2D8AB74D362C559AAE6ACFAE49AEEF4F52E28C869222C1301D041E7A0BC1B608
+1BF728EF9E98F3A12EB2714E7F16B14E055FE1FA0EEFB058860ACADEDA9D0E4C
+42E3C6F1E4869471BFAA3760175F3FBD842755A9D7847EBF605F18293B42F557
+FBE2715002669091BB033E1AAD657532F34F7C66E4F04D63ABB07E6CB9D9AEAE
+78EDE8B79DD9BC87A1FF445EAA05B5572BB880E69F4DE1F82D7F0E9980AB0C18
+22C448B0B1722D3CC33C56FF287CECB80658B3AF5E7675BE82CEFF3DAD5942EE
+A03C955FF979E41E54BCFB5316A9AB8945C403A73180D0961416EC9C92F49811
+4B91BC4C788392994587517718521E416D469F69952149FF7F9224377EBA1065
+4A727BF806A112A7B45B0A1BA1D5A23683960575368D9EAC8C04753BF7465AF7
+95F25C258C63E4FDFFD0B412FD381946AA38C0B961652BCEC30322C47BF4755D
+9F91880688AF066E32FFB22E1A52DE741307AD3ED830D6BAA1D1F562919666DC
+5E8FD9862AC8600B0AE0BC7FC779252AAC57248744ACC8A8AAFA836BCF09B0DF
+9253DFBB1CB77EA8A59D42D1B18FF25E9AED72FA62FEC3F126F030F5D7DED9C3
+CF60FE890BA4A48E39E687BFFAEAB96AE542A6387F6624486037C8924002A511
+BEE5FBFD780AC1D4BEC3FBC47A930BAD0280D444259528B6C565DE11DE36BB65
+9BADC55C1EDA1A80458E98896D782DFB5C137897419602809F9BF8CA39F00C68
+EFB9E076FB324C2963F23CBFED28B9EF70EAA4E4B903225D1F199A7162AB239A
+D92D71C18B1B682D04C6A48926275BCB16D413B2A0E953E1257E0B12D8B717CE
+2EC84CFBC046A4338A69F454A469B12118E562B4F56C5FFB3CA5D357513E6FFE
+947A564B229C7FD873057D5C7CDF03E958294A1003B37D8DF565A70A00A3734B
+0138AE5277D383D10C2BD853EF806D3CCDC47739F0E374A3DF3B63638B949ED6
+4EC25869DC1C0B1F4DBDFFCC97382841D8F10F3635C792139A1EC462FDBA379C
+BE0990CA2E70FE73137AFBBF30CA54954D7E7377CC50BDD780DDD4C7FDC77AD2
+F3EB1169F14A0041F18160F43C24FAF556DB5D621709FBC544CE55424F7446D4
+6AC07A51C8CD5161AB0AD5084A96FB35D77F1CA155147DEF8D7A590EA6939514
+D4A226588295CE0007BA8A550895511C8D80BBE5CDFB8A50D249C3BDCA974415
+F5557914A9B805782F399E4078DDB6264F1A49A9A5BA45E284A5196E9828EBA8
+481D357B8D9E6ECA631A6204439FDFACE7D7E6A2392726107CB7D2517CD19A24
+FBE592C119626DB221BBB635B6EB84845C16A9585282E34958B961F4A543AF9D
+419B6A9105BF185FC767712D923437BE08A9C0EB92AB6792DBDC671029B6FCA6
+7F717FCE379C0F3B51C6CF042A762ED04898FBB4B0105C3C4ADDDC18C51BAA3B
+70A93666669547081D9246732CFF74C83EE90DA17F5B4F8BAF47FE4D81590988
+2858C9B96071341FA0A0D23BDD4947FC9BC2297913CFBD4FD6CA4303AB3179AE
+0203F1BD502065F90CE9BEA3B52DAFE4A29446082EA0E6B1D7AF1F31D0AD02CC
+9A7FACE2CA86E5FE0F6A425B28A5940ECA306891CECDB3CFC7A5BBC76B5D9E8A
+C754379ADE80B4D72CE493010317BF21A0CF4A0A55C1246218839DCA3F4D626D
+1F4161D38F54AD5142C1CEE95C61D8BB10FAD4B772F4955777AFDE8AE5A837C2
+A2BBB11D0BF5DA2E63D0B75ED421DBA9C789B281B01846B65DC572BA69591969
+21265DB722AE86BD8CAA3D887C975A617ACEDDFB7AAB341F47532AC0F354A530
+7662C089DA3939588774FFA16FC4A52555DED6D6F51DE718BF5F345C23C90198
+17B77CB8B5D53A5CE7A79F3E286B6A59F3F6178AC8BF15C0A15C1A8A95D03B60
+30EBE53DE328CE085CD9A1D49C69AA299C5B58B24334A546F6E274C1B534DC8F
+3289553F560C2F81E413ADB92FA0E7DD1C2F39D5FD268EBA97AB7335ECF28257
+96B4EADB7D0778706CB41C7E9C882760E7670936774A1088FFB2011115FDADB3
+B69EBD5108760762521C25C968C3E282DC3400001AC8FB1EA27FF643E3025950
+1D617BB8BB321281708E496277E11DD3AE0023DA9F25AD06B39C7CF527FED27B
+57397E88D3DF70EE4FCCEFC8A0927D6B05517E571B3E70ECC99F3CBA32CCD4DE
+B8BF22626B6C94FE65598A88AB90D238461EBD9A098DADEA4091AF1CDD7560EC
+8E1B9BC2321686E1759E6B8A270C8CB4A254F7368039602EAEAB86ED21CDED91
+8F2DB9889F46981C494C7EAF5E819B91C129F0740B8002B510014985E5791F59
+B16879CC6521D8E9F1C4C1890AC85A78022BE614BEFF318AB2616F0C3F02405E
+BB425D1555472A2642BA7686E431DC3FB8A1688B76660D9957C3FDE8D58109AC
+21B1234C9DDF3F0FAF93BCF7B2F88A001F23162E1A13E5E9118D51B485B70A91
+D0CBC39CF44413FD8686D9030782DAB58064F5B987E0402AF5B264B17BD31BD4
+FDF63951BECD73ACA6138854EF35B062D01F33073850D9C09A818828C581241F
+A625AB3638081DD0F00F946BE5450D38489CECEA4E66B4D85CC8AE0157E2AEE4
+A22A9313829F24D573101D84CC1784D1CED7DFAD5DD966601370C6CCBB723082
+A86BBAF0A5D867D0D2E3CA16E14E5109A29EF02649C47E12E88B3B397D65CACA
+DEB9940B92100744D686066F8250FF30E5F13D81428EE238A2E4E07ACE0F5C38
+7D79D4A336D0D26AF9C2B84088ED8ECDF94A1E3FADB45AFDAB46CAD6FF950B0F
+07AA2CDF82374DA76C56D29C80138841EB13F0D02ADD32F88B23E282ECC845F9
+BB9AAECE9CDC644AC2D49577A92307A83A99434F6493156DF25DBF0FCF2EC21E
+8C50A312C3D19E0609C0038554CF4FEF3ACEB7A833FD54B06EF0D617C2971C89
+E4C06075B09B84A4F78A82152B9A9C540B1D881313C2C74F20ED064A9606EC2C
+B56D7BB4797F1EEF4A9B13579CCF311FA4A4DFA62D80FDB7F535CC6526D1AAE5
+45C008EAF024B48C377522F74D939A475970533E645B1BFA81997549AFF26F67
+2AAE6C2EFA357DB3B525276EF330905688777057F4E4CBF584520A534A8587E5
+5A8360891E75A15205E8ADAC4A4E5A6E27D0C4A7D492216E4BC023AB027F37AF
+A8DC7579BA50204D5F45A51460C5BD8A5A7F87668CA6451137F2F59E117BBE28
+5C40820882A5546FA76F0CF49F8A6EC445F0647CC3227C400F56E7E9B84A6975
+E85E243CC1666DBAFF4E07EEAF3AF71BDACB30DAEA792F2B8504CAB071544F01
+5D66243D529C479D276FE22F7E275D9E7FA9C6EECA18716B2F213916E32C1D94
+6E32397B41AC6779543218E506569E3544803BBF9B404A983EBA62A494187B30
+8D3DFA4E1237A2E5E08224A60492C09ADAD8775B7CDB830520829BA164209ACB
+BCDEB2D574CEBFB7AE4BE72DF4EB1945FEF2458761AD8DCC0D378AEB7DA002C6
+9C14A665DAAA532B0ABA98D7BFB5A6151FF6703385AF7AE8FD315A492FCCDBCB
+B825707F9566B3B4943A3C61C3DEFDC31A843A2D67AB06891F3E110DD8C73D3B
+B5E4151B51D9F13905D7D94DB9ABBFCAF35F43B6EEE256B1A80ED6D1739D8D5E
+8C767F6F0E8704C5345D028A2A6DAFD9BB7AA048B8B895FE9423A7ACE858BADD
+595CB074A128DAFE08FDFFD6BDAC0114159A702FDCBF8013804B0CAEAD7AF38E
+FAF086A3248AD4FCA1401A85AE2F72E3E6956DC0996FE8ADB18F89B14A208A15
+13F81AF73D0DB72F78C4DA634ADE3C73756CAE6AF2E149C26316DFD93370BE1A
+FB4A79F77A67C07CB0A53C78367F21661D4AFE9E27328E077B522B50FD9AE2E3
+DA087BE481515B5DD7BF894A96A84A6C78874100505B7DDE1D22EFCE8D58B3AB
+313AB5495F72E2CA4E6AE22C0CB854302B9990372F1661D9F0A517F90686F248
+C5643008B3D29F7296E5C8FD4049886662EFDD4106E17C879F5D41CE84F87E89
+F6A3117C968B95A35940CC29C43E1E0DEF51C1E46B676301F40D59615C3F73DD
+DE37B72FF7105DB84227DA5241583272AB1C3CD97AE11C1EE98FFDB5E5F44844
+8FC41BEA5C54B26341AFF6830D9D0A5A2901B0653D8BD0746838194D240FF753
+E99750D3383373F453723D86BE97B571B8B84D8696089B5CFDD53E6C562A2197
+A8C4FB0CC690C27761A816B441029D3D306245052E0C41B53025D8CB7267CFE3
+C17FDFE348E765326F91AEB700CC49162DF748171214252CBC821493DD01AA20
+417D66DF47EBEFFF3E9BB2B0A2BE7D9B8C68BD570FC2EB0FA54CECC318F04C43
+19598BDE93F2F13DC7847354C99059AB20593EE51E94F9D4E9241869D605AAF4
+9D9B5FD88C3798A039A67993C5EC68B6326B132E647F67EACCA7F7AE7F718D85
+12666E90D7C73EF210E344964A38228B236679A2B18F5E081234CAA2458F8D83
+3F0CA308D19663CB12EB904076EF88E556407C33C9380A6A3D68A9EFE65387C1
+A1BCD2D26DFD2AC0881EC30E81C0A4E76C244A2BD822EE88C4A60B480D107E68
+90E419A1F512E865BA922A7830909BC2611A80931CB2E9344529586726614D94
+3AC5200FB9FF68AD9686506C5EFA8788C0AD0251AFE7F95E84683380CDB421C5
+B1A783B6D5F3A6BD1BC1C14B363DB01C87C0796DCDD5BECF41A1A9F43183CF6B
+82C2AE49F0BFDC5DEF7729F2E638EE6EA9E4D059EB9BB1B992AD8C82D501A550
+1BF73CBBFE740179B54E193E84A55DCD61B343C1852780FFB44248FC9426AC94
+AA2B3FE20FBA30F6C4D1E0FF3EDCDD8C0F57CCB50CDB0EFE2E04A8927E239C1D
+9B026C7929BB48461D4D695FFC766C8A0E545B1BCC2AA068D1865333108E7985
+2D93F9B00EA0A90939D0D3840D59B6CC0CE2C147B2E1A9A4F14270FE3ACF51D5
+99F7349106165AD627CBBB0ABA01ECC6D3A14C1DC1ED23A9DB9865BB4396C51A
+31ECD001EAC94B33C34E29C5611148EF3E55DD61813470B8F3CE32564C749414
+3C93C77EA5A3538A0B5AE3FC4DA32813B06772E0E48E25BB39F3F6FDCC077E86
+F86FA50E18FD19EB2F37311CE87F18F3BC85CE7FD71CA92D5C3264E34E04A2E5
+70C79D99F54D6C6D9D527AE45EBB48411221134587D2253E7C8ED7658EDCA34E
+5E768DD14E0200470F73C44D006CE8CB35DE1CA3EC10ADC668B0662A7774C891
+84EC95A31DD872F0728D9F65CA80940080E04630BE4DEC77A2C49E3913C39978
+BF145F8832AF2C4385EBCDB15F9D32C22CBA0CF950877717D6F1591D7C0B8047
+8C9BFCB16AF7124ED83137695F3D69228DB633053208C29E0ABA1B06A7FB3EE7
+5625CB44927E2DA6E038A6E62DEBDA2D96A03177982D8FA33BAAF4426E05F4B7
+9C1748B3FF7691F9888E7FF864A10B9DF761A41E6B5CFAD2BDD7E1C4924AC97B
+F4B352705316DD1A58637CC12D71C18A5CA691AB2AA8F171590EC24582B1123E
+94D4DC587D8F99E18A711776BF4013C96446BFECFEE4C809EA94B169088024DE
+0CBD20199A915AA406F0BD5F3D63D1467C49B4691AEBBB35ED6624F2D7BB74BC
+E80FD92B9FD04DD9C2BE9B6FD29EC7EC07FAB447511C61DD299C783BC09AE2A4
+7B3CBCA6A20C6631D06D0B2E2482A50612BB7C29B7E7D0A205EB0E8436702581
+596BC996ABD58CD8D5BAAE4B1478195CAFF98FE0141287296C4EFB8D2E7A8442
+F0A3AA9F9264329982532295A176BA1867EF732BBAC49AF485D9D0F7130F617E
+7F7DEEF935874D55A22240F8EDE4F247D5F73481373A392D40A8076BD91079E1
+1CE5998BA13D48D56B49A92B4A18430E316405D2E2E391B496A1934671FF1785
+AF42BA3B2D14B8E04014437FD194455C50289DFBA61B5C377BCBDADA48E82DEE
+4E70EF5E9DC03064907BCB8BE4D59DE069FB0C0CB140DA54708E630767313F9F
+744594AD8A499CFEF733E640A11FD74E46A749F9C7D18D49251BF85C6EB4668D
+67598C31A8F90922FEAEAD4B83B6E7184567DC798E4BA1C4C9B3461A478D63CA
+054F13B502DACB674EB49D6BB935E5EC82BF99FDA7D47C581AD7F940DF4FC6FA
+6C6D25D647033AC69505F0CAC58DE99087F365531A6283CB89CB644688963C3B
+8B2203A94294E58739EF23C7803630A1F9121D62BE1977DE2F41687C8CAF87FE
+CBD7AD3B98E0D95C8C6E1A7CCB0E09465AA874DC90A0F5DB2C5E7C130297FD39
+EFE63B0350B5139D09E6864D22C3F1150B29196E40EEF9723E71158B7ECFB8E4
+C426FEDCD439420B7F1C251FADA347C9A2C49738B5A17922E1EA93CA7B125B76
+57449EAA9C1D591CAD327D0E98EF2D44D614EE9ED49DD31ACAC0B956620B6BA5
+5BF6D08CA7541059D5ED2EF00AE2EE95488F5645BF6837D9241C0D3959B7580F
+C9ECB2BCF3E65C07D52EC9CFB21C11CD4C883E44C173214C900C44D2E1E43DD1
+CE8DFE3DA93C38B548BC4EC46FF91F30CFB97525E1FD4E77686433B20BABF8D2
+848C1CDF1BCF185CFD7A81D2D4BB826E837E2AF35CFC4F419F698DB0C43E9F9C
+B0FB628AC9A3CBE9B1FF4A067016E70333E78B32AB2D89C483834B31F5808FDB
+77492E099F1504DABCA5722C7860CDCEDB2DDEB512FFCC7D287F4945FD711F28
+87BC3D36173566B81FC2C1290C717A09697DAC6072408E20926D39270121CE58
+3EF97CE12EDD7F87F2C8CFE36C3C0400869C0D813B71C425343EE0CDF717BDD8
+409D5297D0F8F7FDEB0257C0A391F5635E0DB1116058942FF3E7C94D5F2873A7
+A3B0ADAFC3835AF2BE474E6741319BC6695FB37F59AEE388F81F6E66F910000B
+72E6BA7531B4378CEFEEDC79CCF4947BA1703823B5AB4F4AD73D9615C66C489D
+99D68E49C9BF765B7FC547BAB9640D51D5A7A2396507AB5A4DFF3D14F52422CD
+8FCFEAA06A56C6C7FFCD29C9A7A59DDD2A909A9363FE5F1E9629616D25ED38CB
+E754C059E4379318CC491C3B1A90128693AC53F80F8210FAEA7EE638902A7D3C
+82B95B3F5AE340EC1B648DBB9FB679D6E80B7F426D8671FE7136D97F51E2D2F3
+C9CE9183E4061CA40091A2A70DBB9ECBB19CE3F65ADD0FB346B54BAB182E2CD0
+EAF4C0F402C25573FB344EA771B297BEB615FCD0595172E84ED2A62FF8962634
+23C19076C2A9ECEED5135994EB397303A9619C76DC55E032DA83FBA441BD484A
+59F70A5110A8927F6239A14D4E223E189A5462E4A92EAEFFA4B961A2A32B320F
+C2B4E8C1821FA67A655B5042C15E4DE1FB3652B55078DB123573C4E986B19DB0
+1C5131F3DFAB271C30A5476B4A19D8FC922E31879C34BAED94C07A4841B8209C
+403369FB8E842610D1EB4662B6171A4465FD0E819964F62EC5B0ADC92F08CF90
+1DE0B410FFBAD16F6D355E8AD72CCF67961EDB6CDA82398021007C2D0462E893
+75EB0710AE4A6CDD15077C9DEFC5774EF4A657734D703CE42174259B58E5277E
+0DF26BF59AF8D1A3E7DC12E3C12AA4B67CF35B19962F6950C2020B698D971B35
+82FF84E72F72FBB0C54A112BADBAE6C4CAA358BDE6A705AB59332C3850CA3D25
+C7564499BC1319121CE0D93218210C68080AFF33420E3CB3A48BF9EB66BC07C8
+A79D8CD8E78C200FF7CFA3DAED0B9E87E6141C88B436D8FCBA50AC195FCBB9BC
+9512B95FE3A37FFAAB39850FCEBD4D50A243EA416E73F53B4B00F3B6EAE0CA06
+0693AFFEF215D00BFCAD02E45496D7C8F5E99EB9096FC4300D038C1AFD31EC4C
+5ACA6B72C1BE7204E37A4CBBCB1EC26AB87F2FF82DE20601025169A5FBD2D060
+62B5B2DBC288C79C33B596832AA18D730AD572C6EDFABCBD36DEA87C0F323C3D
+6E537AD3B43C6F3A905597570A8C6B0B4A5E08C08EAFF9731E745F2BA8ED0C0E
+1ADF7821CFCD4E38F3F4C243CAD31D9F8FC68B9043740852B4CCBDD37BF728E5
+648215961FA82A0C847ADCC5187331D0863A4573BE520C02CAE14AED4F06B3F1
+FB4A318AB54CD86DEC824707B29F858FD726A167F2333855C0575EAF4EBEA0B6
+754B1775F967140641FC06F82B191244186FF347A351FBD8FA62E8C978B21F6A
+E124929876488AFA97FAD1A68A0C3496BCA768F4AF8016D7A65BBA3AAFD7F5FE
+E75FE714FFF3D54D09C9747ACA01CEFD260985C6E87477C9C7843343C7E9E3F4
+0537D461EF019E046DB8B5BA258462B2FAEA1826B3410BA3333480CFE0DECE61
+CE2731FDDF7FCF2AEF7CC2B1EE7095F480B3B27932ADC486BD9CC130D94BBD05
+43872FEBA04FB8866ABCB4D379696E73B84BBE98FBC4A16CFF22F8A7AF754624
+2912C228030FF7EF23D51DD61BEB5171AD31E2B630475E16B6E0F3C78D44AC30
+712D165DB658FDA800798803C3CD32B841E159AF0F748400314FAF5038EAD574
+57D57A34CABDBE4B8D145E439A11585A0CEDB161559AEE6459EB57592ECBF980
+681ACF9AD4AA4BF09071C600432BC884639C5F2C3AC4B53CA6285AD78B3070A8
+4912ADB3C55A03A6E1A795BE1026EBB6C6E90DB03B110D3F098CB97BFFD836AB
+EFFE06DABB1B3AF419BB3E10009AD2DA9CB7B01EDC45BD60B4BFF2C7E54036E8
+5B6BEF57D32A76AADAB3B1683A49F317F6ADC62E5AC8BA5514F1B560FE8C3394
+7B6536F37C106A2F7A346EFD1B0279949DDAB840CB184F55E74A1517222483F2
+F8DD0E850E93B6F294F711DBB234D59406AC5BA131B55185128B95723E5F064A
+8C00EF33860A0467B3ECF05E9CCAE87111A62D6FAE5A661014C7D1E7292AF006
+F77D59DD6993FA330DFF85CBDAC37A18D22AF83571E74E93E55AF28C9438D71A
+CF5AADB51C830DFB43104B9094BCF1241DCF70C3481D70B0A96718ABA59A9912
+3D012E528626FDE23D941ABACDD35F58F19DA750BA17D5785FA604F4D91FFE46
+B0AB1158E2E16D72C6C1D563E647AAFF306E3156A8DE6384030E1F83FA970026
+795E8C9905CCF7E0C355BF05638D13FA6B0DF34FC42F166AC2B66607E3DD6A0B
+0F19D8DBE03FEB652D9962B9CAA991223F58B3B945FD7E893EC56412F1D6DCE0
+2BC705DC83EA7109A632270F024264A2DA7311C4E185AFADC8D2C6B58C0BD2C3
+4B38AFDB4EFE7E6E03F76E53C4B9751C138349D42FF32951B446AAAF50C4A9BA
+90650B757DAC00A06C047685725F0D1D8E0A7534B26261AB4E79B5B88182AE6D
+E6FBB991E6BA763687CC9FCBDD922BEC387620F818A7389157AB8D41792E7CE7
+649B1FDF4B05EAAAE1B7301710559EE1E232AF70DD2E137157657237DC466C09
+183D1EFD1439003BF9D14D4CBAD51274816E094ECDD8D4477FE9D58122AA92A3
+1BA2D3F48A9951FDCACEC51FF9835B21C8BC0E1ADDDCEBBD3FF56BE075236F90
+31A61C56B7AFDDB9AA121A24F1D48FCE58E1C584F05B5556592B80824BD2F9E5
+88ED93DB19CFE5082E12B3158444A5F955A2392D840B3E52C74651ABDF75263E
+68C8B20F6108EE6EEBDC836838FF413958C294E140FB3679963224E6288EF036
+654CDE66C9FF8BB505AF95F29A5EE796B58B7205698375727743A69920D43D65
+C1F9F203722B0C6F400BA4F72AF4973CD6772BE36E304EF8983793547EBCB7E7
+5B93EB6160FF8860E4B0DC3BEB649C7D8E8BBFFE919E67661C00A7AAD0E92D38
+5BAB4A07BDF83A31AA8CAA6B995B8B7D0CF168E7488D4CD98A7AC3F0A03E2BD1
+0F6D9E915C1511976BBAE3C6000D428A52114A7DEBE35275E642B01C92BF9F8D
+E48CAAF7DF91E17359FCB334E5189359A26848FB3D21368120A93965C5E695BA
+49D584FFE6A7463499E10AA7D453B7B39A4E69395C9142150AFC85B6EA0D59D1
+D2749DF1E7B14F7C1977C9117A1D7295F527D4FCAC5610CFCA887632DDD84014
+7104D659F4EB53A4C92D553EFED124192BAC43D6BDEF60F3CE6A8F7E1946A2D0
+125435F0889CD55C6B77B5BCB9A76D142E802B56CDF2235A070B88AF1CB857AF
+8B11DDE2A9086BF1D250C2E355A4C72A20956992B43013F0E5258165467AFDE4
+9CDF57B377F18E497004A59EAC9D60F72C8138AF828A73AB373D97AC2654E2D2
+58150C99F15AC779ED77FC223B3E7945A29C8F12653ACA9A717CA5FB39209005
+2894F70E3D5F027319264BD398F94E4445E4A4D54E3CA1EEC859118192E0118E
+78F9ED10596D2F87816D710DF57315BE9FB0BDFE63E74E4023A8320DE5CDCEE3
+44534F95653A5109043AB0AE1E838A85538DF788BCE8C3603DA2A51909B61DF6
+046778206655ABD87C14583EABA345328C776F58DBE125AD481D4E922593B8D1
+15972DB2E1C6BED5870572216EDF4C19D7C12ED2C37E49E6E6CF552B0E9D9EDD
+4F659CB21F3EBD36F28275D69105BF903309C8A7B20258A9642B0541E033646A
+61601867A46F2A577265222BE3978E6F84C29576F2DDFAE642CB5F42DF45FB24
+FA36EC2575A286E4CDFA7F27D535E408716EA40BDCFD7096A5358E9A98F123D7
+92E8314B8D51D763A84993E7D45BEA3195EC3DAB2998DE69CBE2C92A15680F91
+76A05F32B384AFF81750D6A1662179FEE5C1CA80AC689148F3D99E0726D68566
+2256010D2B2274742DEDEF94B338525FEF89E5722CAD34EC2C2BA8AD1E7A1CC4
+E5B71EAA6D0069DE687C6306C3419A4F9BD7E5C9D9BB215E410FFBBD6436B57F
+C4B18AFB2A3412EE490726FB568CDE52E15CF7F12B360DFD08F6F43F295C4E9A
+6FA45D706C707B37FF0CE27BCCFABFF5417DE624A266BADCA629870EEFB43B41
+C5859A5219C9520087C213583AA21695E020B4A4743C06F3A1557AC56CDD305D
+D68D482A6D43F8E9E6135EA1C1F2AEABF167FF4869B46F57207502A39DFD1DC1
+25270E5A3BC02A042E2F98539F53A563364793966D809E17DFA9C91089D7B8F7
+B0169FF8AD8D88BB5903406070AAC303369FC4B7CCDC42105A69674BADCD17FF
+F90270B5CA84DE742E5593596E1ADA971066DE7A9A6AAF884C9312BA73313289
+28F80F803BE810B0C62278C925B41E22441F3018DBEFB30E9AF1C11712CCCB23
+E392DF6721C557E3523478F913EE3CB5CD1A0F6FD60E32D5F00E281B87E1846B
+C629E4896288B86097A2F02DEA398F16E09681886C1453CB71FB4EED50EA998E
+36F164980A2663428298DEEC9851F7174394DB1D21EFE96A3960A7BEC512162C
+72D1E85E823B0FE1600C36971B94A505A085E3FF9BE58FB6205ACB7353C03FE3
+71F64580C76AE11F25425D9C0682F42E9316F5BFCEC0F5D8D9D830FB41AEDA9B
+C02D1A77C1CE5FC6442311150BC3E4ADBFD779DC186592D4A548634F07A16C26
+B79B9D641EF2AA8FE056AF840F16FD232AE1A530B8D23B99D0984D7E98C90B55
+CF4D97F40CC83455CF898CD9A6F8051C30B151219B60F9468790F0A7F4CD053E
+542E1EFF158D94F4ADBF05DAAE0581F56E0F5C8952470EA0D1245680A5AE661F
+D2C83B8D7339D55401690648D47AE9828D233DB32F6C9D9493255E9BAB57C9D5
+3D08E5975F1A844CDCAAC830DD6D2B99C6BE2D2690726A913FFC41DB353B905B
+5B6AB3ED132B53F19F52A6F82ABA5077E0E5E7CFB1087A01B311E943CAC3F44D
+72F28E989AD53808A158A37E73B8E5AB83A920AB36C07BC8EA85A9C78B12E68F
+359661C847BCAB2A6D223CCC012528D868DFCA908C09C0FC39785CCC20D87781
+F165109222779410AF291A3655E2E8199314278E52CF03F93F02502D878583CB
+F75E27B85DFC0B00A2D475201786A32059E04B7F0FAD834A622932600BBB4747
+8A62B566D161E96ABD0195F7164CD84632372541A039E98F75B5B3947281F5B1
+FDD2A16FC8A06A9D16A3886216E1B7DA3EB4E07D25BA5841A21E926072050BF0
+FBD35652E7F3E33B911280C1D2BB6F62CDB5F5CC92540E34949B0BE3E8591084
+6946C8345A0A04BB51574D376C0BC65C7A10F2B1109DB99E62B75B591830BED5
+295C0204A5199E70974A10E61F5DFD751092EC081D9986A1D39D9035237AA552
+CFF4CEAC9CCCC5E5BD17E52E1E80CD0EEFF7F54A9F428D2D6EF035C8434FB215
+1F64D22D77A744D02291B06BFAA9EF6602E0E0DCDE7CC0F45A778D9793FC5281
+8D4269E2F9B61EDC1A3B8D8A75E65D4DA5B3EAE95153EF55504373C24C43D768
+A6D1E210D22FAA4D08F99474BDE3C4E0CBEFA6AB7F6E0153AFE7B2D3A6FC2B4A
+9C4955C15873D2460C94519A5605040F866AB6DCE24200ACCC6A7F685BB96737
+5F82C2B20D6D33E8C482241B82BF228568C542758207B3F26BED5AFE57A0BBC6
+589A676A958E8B444EB839F1508FD1B8D995969BFA5D4DDF345D536F24DA0052
+6C626FD8800C04C8E41A523B9DC0C4EE10D456995C2304C36CD4E867DFE91510
+36D534CF0C8E60CA8DC1815C6256484010BED831F0CB0CDD8FA8303A504B7BE7
+75C5DCA66AB89167236F6983219DE903DE58DB7EE2F04A501E573AACBA610D77
+F4445E54AD79B901DA24C399DDCCB7AC66249E53DB1C3E8AB1B7CD20F0183412
+D10E911CB758B93D6BABECCB29621EC1F1487183603C68AF7130E06413CDF3D8
+9E7EE2263B5D753ECB3795E8E6ACE1BD5EAD4E646F1D76A482BE76D09DE51427
+EB3CAF3876095E404BBDAC2095D8BEABE73C3E97725C34EE9D4449A1F998C318
+A85F8D78F772E4F67B2F84368E1E77BD9B9610BAC6FAD54E047FB71F824568A5
+7AFD5293F486E26BCDB1D39972A30C87D4385088F7D5982D9845F8520CA165F7
+E78E259C139520722D213C9BC811979E84AC1C2054C46D560135F19B87D7539B
+E851A4F76AEC7773F782CCDB2B6DABDEB5711E4CD431A86F5CEFEA6A4C60CC03
+1A1034EE91202F9941FB29D9486042B3BF9A70F9FE0B6D85C50D9B96BE3EAE92
+03331644C25882D3CD9E082D3A2A52798F51DD903CC927AA44C766B782D5A9B1
+54EC47ACEC605C2365E206980EB767E1ACE381154509BADCDA7C1EB736DD01CA
+DCB8D7F7F235A8C7D2E34A5C989C2098AC19067AB250D7C16ABBBD2FC8E4D79F
+F07B9CD3667D19FBFF96BB389F3F753645BA0DEC0A123621D506BC31E9095722
+10EDEE90C92670CDA95C17E4D7CAB6337C8FC0F20152DAB6D3BDEB16D336F478
+FE9A56C823B84FB62AB0AE6C4DADF7A0E7371AB52354A1DF0E9119746808255A
+95013629C536E1DAB1D4288171244D5F5135003EA03D23E222E805EC2E00271F
+9894A9E82B1F9EB36061D92836F31DE252E30954AEE7CAF8DBDD66114FA2B2F9
+9CAC74B353B7656E05835172735979E7DB48681B641A7485F18E460398028B02
+AC62210C0F36A7FECC771106BCED57DF6334EE566E0FE2BAA03E6557AC99D81A
+CA025C8D1D2719861FB05F3901C313AE4189A403BDC9A7D648CAC3561612E0F7
+3F668F58CCCEA9A1C6F4229D575B397FF16FE843C9875D7007408CEE84F6EB63
+5DB941E9AB63B18DA328A44D401AE71A13CA2164C4A5BA7BF78B0EF2AC20EA97
+780F5BE7AEDBB15A4D135BE7B322254E32EAEE7DE78EDC69872E6AA4D15BABF9
+EA2D5723EE875ED677D294CE2A476731E010D3C204CA8063D56F1EA7FAFDA2A6
+A906C3F80DB19183D048D140AE163BD785E3DD7545432F25FC63D2368E506EE5
+6326065BA138CEFD02AF2055D38E5918CAA4BF97C94418EC6F3E14F70140CFEB
+432923B2EE162EA0C3DE430E908DF4545B058ADE35FAFD0C82AD8018ABA534A6
+946ADAB80E5D410F034EB0E22938953E2A1855387CE4FE9A5AA9CE5A74864B19
+E0E9100B09A76442AA75BB5CB4F622AA74319EDB66E30F16CD3FD203362935AA
+180EE9918F4CAFB782E0741EE6196B640E3F0F2AD00B9E9EE198C85AFDA53319
+180EEA95DE8A78F9781B9787529A75E890E9014A2AAF772520CDEBD3DB92A429
+E125581B1CFE03FB7570FEB4F821AE0889D05B9E011643EF88E888801FF81457
+ABFE4B89A160C84C69B129A8434EA9F396DE4011A4E89DF1D27967646FAD2339
+78A9F37E1F730EE96EE3A1D98851C45C5F16122639B326DA74B63F637084678B
+30DAD882C0F0D25AB93A7A4DE413A41381A35E2927D4444257AEF9ADB5260A35
+8E74E6A8CC720DED20CA0C1539FB47F96156450C57E7C0FE5DEAF92F47F2E0F5
+BA9FCDBA25BF9B8326004755A4F4008EE63FD7789666788AB1F3613AE5ADEC78
+0A5ABC85E7DEB5508BFFBA9279C50EF9D5E9907E38EB0225C7562B8D857548A3
+EBCFE3A8F0EF5C3DB8955FB995BA5A482F9FCE4987FABD8D375AC72E4FF7C774
+F48C17F9B55BF5AF12906AA0FAD20934C7F080C49BCBB3F321A222ADEF47D283
+859755588716B89EAD7AB3AD5CF9E0DCB524EEA4A6353BDCF51A5AA45F7F830C
+606181EA7158FE373CADAEA1EE6B0528D95DA03C7A03A1BB2CCE4136198972BD
+445CE59483ACD728B42C40DB7A072F6C82C7F4FF01F8C9FC525E4A2DCC965FEE
+20880CC3A8543F15082C382C30F4FE654A6092B10DFD020B790B2D74BAC86D04
+D16E66EED137407055A86070985E41312C5DE0E899EEFDC13C070CFAA40AA4FD
+3CF1B702A713E877B3AB844E8F639ACFBCF275003F6A3A1B5AF4FBBB0AB04AA0
+52CF9E7B50CAAF2A7D76AB50236694CE617A75AAA31C0DB404298234666CF92C
+9D80B402E7711C7F5489BA6E08CDF0E47866D8EE5F74755BF55B10150D59CA85
+3395C4AD476C07C9E3F2F09698FEA720AA3C1B63611CCB1B56193594A24D5F41
+E6ACEF5989585051EA8650A20D727C179C17C40C6CDC9A7B796596EBA4BDF916
+7A3110FF3D5400ECEB533BFA9D16A931FCFDFC36C1C62F7C09A0AB3E08489F4F
+D6ED312B44B5A8FBCD38F04C89E3BD0BD14C2746C499B08DB1C2922CD7AA770F
+0506823B6007604A490950D6790D024FA38A62762CD693EA10A147CE22107376
+AAED22AE7F02FE1B4810A96A3840741F12AF3E57FC5849A4DE53E296A2B78E7F
+58085E498B304CC62F513ACDF0EA9EA29E8A39E67AF057CE3735E8612F98D9EE
+77EFA7B090BC8169534E3FFE43F392292D231BD04591AD35BBCF6AC5B29E805F
+79994B73DBE38ED215A3DBAA3E4FE249E59CBF889E3129C99590536BB69EAFDE
+94946A9E58AB3488F0E6B820E64D50D65C4D399AC35894DCFBD1358802F5C0F1
+0F628AD4048701ADE6522EEE704105230336F14FB81A3F2D84ADE5EEC2439A87
+BA5A647767EB8A7273CBAE6DB0E5DB87C00AD1C8CDF539F6D00DD61F102DA4BE
+EA6637A9681163EAD32D8913200EA059833DC67AD40A0B69427A588F0DC0A93E
+E86697619084EB4B3B3952EDC511879FC526C4A702B7E6453B16727E51610E5F
+BAB227F6C24874BDEFD5428D9254D4A87526A3324AD6F63557F7296B377CE53A
+A6E27FCFCF9F6170289187C5F9701B35D822E764C1E25296C5747A216384DD55
+B641F02F3756BAFDAA08B7D2BB293D9028D8392551F5BE3C9906926FC2F5BE7A
+3124813C8AF7BEE14C184AEA21515452C07B0D3D4EA3AD6AB8F9E5B7093112D7
+ED9E958AF921B6EAD2DCE5CC74D651996F81F5A5EC55D438C7E4DD3248862F57
+3DC28CAE798B543C6B8FEF03B55B158C96340D27A5A57B39A53883D174ED7A83
+0A2CBF5DF06999630A74A63B59888ACC88E96A13BC788F02C5433A0044D86DBC
+7F8F5D5FC2CD8C6AE4E0867DBE1140B2E2C90F4CEFB00692765854327A9A73CC
+9B52513076AD8B265E94CB4B8FC0033CEEF644EDD772CAF83DF7F0949BBDBD2C
+F681D17D257787B3B93C4FC5B5ECA7DC18466FB5DD0F2A3D360A9B35F39D57D0
+105A0A5FA461AA14DDF1A95CACDBB531755D85867336F5491A1B147DC530EA8C
+1DF6660FE3558EC163C8B0BB9E4DE424AF228819DE1EB8168C3187C6590372C9
+2FDAB4A0E5A08F1121A7F2642946DDB6D1E278B44F9337D31DAB725A2B6250AA
+4CDD4FD6D91CC78EC693AFD3FD30F697446B3B45DB48467CCB4903C25B0BA209
+24EA4BCB450A1FF5153ED0FF51C4C2767821A63281070E8458501627BDEE7B62
+166A66F840493795981162D9C4F19787C4EFF2058CD685DF1DB94102FB88F631
+87B546184C81D6953BA2D749203FAC6520DFBC1898DD01D18F7A3ACA2FEAEE7C
+F013E36C83CE5B56A79FB90E3F3BED6CCBE8433C8A9699DC7CEDB60BC1534271
+4CDFE08C178BDF612E4EB8FAD203B08EBF8D43F0762F09E1773715E75138E932
+B291DBBEBDBF9269833A2605A3DD5C36804077C7A408A1055EFA2A1776E1F9DC
+914C5965795508E5A65D185596A37BF91CF5D72FF27BB20FC9013F7EA391C892
+8BC7C738413CA8D3FBEC8E1DFEAE2DD22E768B5D503A722A430DD6B88E69B2A9
+1AC29D68B111019886484CCDC696C6A87F1F67462D3232C84F431588D38EFBAE
+D8C9D1418D81561F75632154173FA6ACB8A8CD8B7DB19B50A54A265C0CA7B0BC
+DFA77DB810691538ECD0D9615528F7DDD83CD80F97534C7B79ACB57E7DD37038
+B0FDED1E2A80716D2687C4ED42669C280CC14A116FFD9218C0FA289D24A03E51
+2DF267ABC9F9AB70CEA856A0A5EC28017174BF03E32ED851734DA4E20C282201
+3090E1A218C3BF3B1AA3B28732A4D8F552E9A9163BCC6EA10F708972A8BBA763
+9D489A1CC41FE78302CFA605583450FC7215E141AE43AAFFEB28C19411D5F5FF
+2F43DE7454CE4F6AF1A4CD704E8EAFC757AB202753DDF31D8676730D737F4051
+54A920003A0F336567F245356C6EDF40810B532AB5B475E116045C7798EFD152
+D76F0B5AAFD5A581AEFDE044360CA79D5F6776D75BCDBCDA149C2CABE1CCD237
+D1DD3C5166D7C3782540C9EFD1EB34B735C943A5CC7F7B804F92110A5AA95E7F
+8AFFD2884BB7522392AE92A89913DCEA0F28B7B89A244C992A15D0B8881E6F37
+D5B1ABB54B970B61DE93578A12D81E4CC21861BCB1D287CAC00502477850CC0D
+0DDC29D2DE7B362703D7CB938DEB1A64935B5C07B25F589E3C2369E1CC12CE57
+5BE15FADB9E65068B94B16242D3F0181DC92BF0B04C81716F4E197F04C17C568
+416ED85007EF4CAB706BFC780F584633922547178C2D4AE60A8D2B7BC2628674
+15D8AFEF916B6A2EAFB651697BB665A9D53DD0D0B569F8270C1E35C24DD5D2A6
+90257BE909FD3F2FC2BA7EDDE451764CB87897823AFDB0D2109AEDCC5087362C
+783D3276D3388841FFEFE969601A775CFC5AB41137D5E2B86F30C5A2DE485434
+F372BFA764BA67A1B7F54BBD37FFA74A7A927C25CB63032C194F1CEF1D861829
+2EBA90769496984256A7BD0F2A427B76964882486906BACCE372616088E59E34
+603A6862A0AA2CF780DADBD2FEDD4C74FEEC3DD5E9DE299EA4FE3E60A2EFDF13
+EEA265F9988A2DCEF04FC29753F88E30AB8AC6F11935D4863F57BC12D38EFDA5
+CB566A8FCBB2211B58B4E99545EE6E1BD1478B3D4191799E3234132BCCF021C1
+D4FCD08752F2BF8F4A2A05E5ABD47F163D95CF160CDCF82429A6BDB4F72D497A
+8C3C4847EB6F91BDB98786FEC2150C0707D9F1D7E4FF61685EF0BEDA88765072
+E29ADDCE776BDAB6808573E82ED790444457D1584004DA42192932A06ECC3F52
+42EBC78FAD914F5A85E892FEF5EFD24D011C5F0A177D61688A7877B5EEA3F9BC
+97DFE25CC815A67858FB7A11D40EC1538B1879051120FA3A55C089BB9090360A
+5D4BA4A68C8F94D99142E37D619723534A00DC29AF3F1031A6B6F9B2B3CFE40F
+9E538DCFFA89CDED0FE65BAACCD42EAF4AC81E0E3544C118A4223D87C9D82B4C
+E7F3D5DF5D04423A3F809B3806481D689AF165EC25FA0BBE9F052DCD8FEC161A
+1491AF032649472B5ED62E74CAE799A744EBAFA9EAFD33B09BFEDAB70ECC45E1
+461F22F533596013B865CE7C6B0DD363AD150085615C36F4012B0C2367898DEC
+6367112417D2C477D1674C091F1B87575F0107DE1E6919A0B3E23089D6371942
+93E2454C74599C144AFC5ED60AF6B27671821F08063FD47B6BB88D37B2D7074F
+D0CCA9AE060E99856D7612BCAAF9AA1F38879B07D1D7F568D872194A862C211A
+B959CA73B5042E1F024FF6C46D1CCB93179B8EF60B7C003FEF273F4A8BB18F3C
+F51F479543497B252548A219EF8C3643383362D6CB8D990415579589DB86E011
+457535ED6E63B9D9ACC38959D6C68069DFB9D3F72A9B0E0707EC0D6B89A5CAD9
+A8D74A1A1FB61788514579DD347B64681BC247B4E2391B92198BB9B7A16C8D5C
+C29B1F2EE9C5E2484D915EB6862034DEF5D7757588CD8F44EFF325293A8E2CAB
+3D75CDF690359CD1BB95A8DBFCCCB815A5B1DB3B8C7EFC795D1F5B07A08C6E42
+01C46FC11BCCE630AF5055380EAEF2BBE7B124FABD4702D0C620ABD776AEDE72
+E7EE27B34B23CF701C3E305B3D06087658BA8443DF6B6530EE3D2F548463EFB9
+3F86D99FEE1640753685D68ACAE49ABC661CD9408D49588161B2B8F5C9760B62
+90EF02FCCE05EB43BDEE228B11A0F2A0E25AF8DEAA21ED34907094D57602F530
+93B2FBF0BFEEE3AEB27E97D19AB6751A7D7091B58912EB954EEC6FC62CA1FEAB
+3F878C9214BD5085D49ECD04D8A811047F9B1E3D9E23510BF03F4D2FCC62AD51
+C36BB125B68D83A57CCD1B5C06876793C373FF0F201A83F3435CEB3A67C44048
+65D41E0EDB005F84318BE1947C8C66D79F36DECA043975383524A20A3A71D703
+613F52BBB49FE292871F5D87F18D24B4AB1D4492EC457856915A1DB3F13A6E6A
+445A3CF286DDBFD282FFAA768C2B019C8C329B2E61EC3DCC8D16A5DC2D781C7E
+0FF005826FA22BECE6978B61C4BE296D35546EC1D754A9A916C236BA6ABA545C
+A5ACB0C001365EEB32CA78B773C81EE63299CE728C349F28589D5DD4E9C3A81B
+2EE0DA75AA8ED5C6B23FC630C5C3907BBBCD01C83D5F2D07E936AC4B09333C78
+6004D36BB2943B4A5B644636C65753899448E04E967A7F48B186EAE079041782
+C75552B617052ED972D7B6FC5520266582D1F487EB4EF1A3FBD1E0848C80BC20
+066B7443434F1E2CBBDEBA68BBFBC8A38279178D4227821E8DFC21D0E2EBE901
+F9B5A8040AD1132B312A6B0EE9D79B2922C972A24BDA1349A3564C3CC5F02E91
+E3DB08FB2DA6DE7E255907B259FCF7E164154AB4D72CEC17F2E75085B0D1868A
+8A58A959BA88E506D8BFC0A184EC7888EEF77C5E2B5BCD22ACC4E6B00B139783
+E39069AFA2A37B2B4967AE46B9AD37659A3AE9A3DB12FEF79CB6AF18AA1D7A5C
+B2DFE741C367C6C4CA243309056EB3B1E108D9FB6EC8AD273DCD90F47FA5E2B1
+AA7C4F9FDC46E6BDDBC9F1322F019F105BE7DBED29488F3CA28F9190095A552C
+CCF84B07899129672812CB1569716951E8F5725BED497AF4E30359682C293BD7
+C6A56260826EED8D01A243CEB4E90F199AC0E13B169DD71031A34DCD0416F6E2
+5F64628BE29EFEA5F2D1BB19E16801A3E1141031B26A8FCBE9A743200179E8D7
+1119B503EB36E2948DF7FA999B9B727341FE50434ACE2C3C652CEBC5F6BFF03E
+2A33576E534068DADDD223AF11E43B8C4BB5D1200B4254CCE5643CBD73398234
+0C23EFF923ACA9153E65E63E37274D9BEBC952914026E0D661C41620027B5B3B
+016EEC9C0442F1C3C59F8F38BEB118FEB9FCB2815BEA7763B5917A2C6F46949A
+3D1D30605B4AE5D3298F4E96C2094D7B2AD397E4931CE82CC820928B215C70AE
+5A48E61E9B457E869D2D99E34023553B90836C6A836791C8B8E817C57BAE9348
+CBC2EC7A2438FAF387BAC96986380BD874C29EE03DA2C9783C84CDE58F15773C
+15568C23154F885838BF4E8F7F9A0BE9E9480D0CE94E769EDA4AB3BDE1DD30CE
+B2A8B8ED3843CE96A201A423E39E3A45986537A3ADA499C61FC9F5D538A291CC
+F6CF384AF64B8E1348673CC6B317B02AB47A88C4BAA6F8FFA0FA674F600C0120
+98314DEA39A7B5099F513283D572127EEA6439F9ADACCC981CA002E9E9052846
+B5B6CDF69389187DF7BC8942408C71B87C1BDB0E500E9B2E4212FC21340045F3
+E4C421BB9BE10E4C5802524500F4031AA36935F92D8DA29782A13D8D80AC6A57
+D2ECF2235FBCF6E0488C4523B69448D4D6D2040F7204FA910F09973EE65502E6
+4912276255CCC93F30471E517B2636754BFEB588A110BB0992A8AC423E83B22B
+5591FF12D13011F30C5D8C6A3E53F72195C815AE0E613551D4A5BF7ADD5EE851
+78459EFE389D7213812607C981F3F336D3872DC617E687E4C8639F5F58DF1B0D
+9F8F89EA14EB56A0F6BB0B40F9E98EF7F1774F756E8A1249BDF018B7C106B6E5
+E3DA46DC768B2BC9E6E0BFD0948F28FF5186B81A6D9ACA6F87979BE5B243819B
+C341C6B5F9FBD2709D5DD4514F55B16EF6C20A6DB1EEE8D06AC53D6A593596E3
+5CFFF0EED18A48A8A94217F8F656E7FF0815C7A99DEAE190A46F6705FE75EA36
+F4F40100E125A77EE96425FB83E4B470E37AB52CB7E12D57B52C5C856BC1B634
+5A9FD75F12854EDEC5B49A4EB5A4506A073971BA96D86E8EFBE4AA55A80F08E4
+F9FE6F7EAD3BFE9D6AD23CE23A42508B3D1F0C5C706C1EEBEECDE969D33880D1
+DC553F44709645866F3BD1BCB8E768B0921A5EF72DCAACC194A56F970B363E20
+6F427BB9F981224745489CFB750C01A3F0B7FA898E23A3FCEC7ACBF263A4CD6B
+9BB07614881C937DC99A90AF67A9D7F98D90CB6BC7E68A35A198124F3C4ABBA1
+B2166DAB62F411469AD070C81C11D79FD6B7698E45759695CBA05E7B7880DDB9
+E4E2F989CBCEED6C0F3F164ADCC88967C29D59FADA20AF5FC2FEE18FD0201DE8
+F49D96FE359741C7FA44FDF60BB354DA8116FD5B1910D5A26DA3693AF9EDAA68
+21955C318B5BC1C0C020ECB1AFB1090F4584B6BB616BCE5FEF3C0FEEECC545D1
+DE92766EC499E8BF2CE72DE9FE7611CAF4929E7B60DBF82175757080DCD053E3
+E6E8AEE50B540A0C27BB02D4ECBD3EE8B7ADC3312FA31F6C2586DD03505FE6DA
+B462E28B67938BE4B6748B6C8C8A773D454C7D537A695EA8AF0D84D846CF3B27
+D43D15B2263E8ECB5C3BDC91DC45A4E1A3E74DF11CFBB148472B9B320CAE6035
+57DD58C6C05877AC98507619AF78FF76F8C31F04487D82D11CB645C8927D3421
+0C9F889882086C4082B91D3737DC1222FCB6304CC8582628F84D7F88411DAF98
+D2B31E67725F103EFA380555C09A9C01778A05EAD5549DC599CC377D38AE5300
+5AC88D41BDD304409891F0162D3903075A4277813378ED1530310EE75A28EEE5
+489BBED315CEE9928C012B9210E7DD4598996CD7A4A896DAE05724EC43FACD97
+1511EE90285EDA062C703A602B14872122778BE37609FAA932EF0CE234BB4941
+562C19702DBB1016FC64D60CE11C1BF1A5C4CA404CEC577A350C27F87CDBBCB9
+29720680F80556201296302B64B82782C34DABC6222A36CBDEAC67306AC65870
+B4CF79FBC80ECB5F99121058F1609E1EF924181D1A819602B5398845A70A5D6C
+424E3A5C6BDA08FD2937871ED1D82C616F78D56C9307A62D654E2F41EA6CC1D9
+595963C8F308A250B855DBDDAD4A608B9A1579756B70E643EE3850010C1D8B7D
+35252716C4806A79BE13FE4CAD5269EA3B2134EF402478A5A0ED0A0D27AF1EED
+36F9F96A058957C383A19015531250B07A63ADF11769031F86AC1925A0FEE3C9
+ABA906808A9D8CFB58C3D09593ACC2B735B956E21B5C1139AB40CBC12F9C3C9F
+EAF0A42CA26A61424B047531F5C32E0A331960A08BBA8107608BAFC9DB2C76CC
+974E9EDA3840ED36B798902674A27352645858730DFEB91DCD0C2EA4514D5D37
+B4E4BBAE31D3F6282800B92D9B76AD55121D66F35BF1650B09F058D728ADF379
+1D9F342FABFF3EC15D45B8580599C10D0F5E82A490BFF210B8439249A483BF18
+64B6CE120278AFF67DAC16723E1A9056163215EA597947555C22C196D92A6C4D
+2BAEBD772B7CD296EACCE2555DB375D7435A0AFE58D9C6BC8744DA241A1E5836
+75C54C03CC4065A8FA402518FCE53BFFB202403352B6CFD49B83D50B1F1AECCE
+2D03FDE4CA913E7CED2CA42BE3F96CBCAEE028E4F619C788CB5AC5436EC8D21E
+26A3098D6F093002BFD7E71A8F3A024AC612A38759DE7F0CE54767C2122FC1E2
+5EFF6B6A88CDE57566FC4CB6883FC070A0043E847A74307798346E0CDFEE858C
+300E92C2AD0A625E2A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMSL10
+%!PS-AdobeFont-1.0: CMSL10 003.002
+%%Title: CMSL10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSL10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMSL10 known{/CMSL10 findfont dup/UniqueID known{dup
+/UniqueID get 5000798 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMSL10 def
+/FontBBox {-62 -250 1123 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSL10.) readonly def
+/FullName (CMSL10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 11 /ff put
+dup 45 /hyphen put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 72 /H put
+dup 73 /I put
+dup 75 /K put
+dup 76 /L put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 87 /W put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7
+5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99
+8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716
+EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C
+02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D
+46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A
+4B60D020D325E4C2450F3BCF59223103D20DB6943DE1BA6FC8D4362C3CE32E0D
+DCE118A7394CB72B56624142B74A3863C1D054C7CB14F89CBAFF08A4162FC384
+7FEDA760DD8E09028C461D7C8C765390E13667DD233EA2E20063634941F668C0
+C14657504A30C0C298F341B0EC9D1247E084CC760B7D4F27874744CDC5D76814
+25E2367955EA15B0B5CD2C4A0B21F3653FCC70D32D6AC6E28FB470EB246D6ED5
+7872201EF784EE43930DC4801FC99043C93D789F5ED9A09946EC104C430B5581
+299CB76590919D5538B16837F966CF6B213D6E40238F55B4E0F715DBD2A8B8B8
+80A4B633D128EB01BB783569E827F83AF61665C0510C7EA8E6FC89A30B0BC0EB
+5A53E5E67EF62D8855F6606E421BD351916549C569C7368AAFB714E22A023584
+8B1D6B52FC6F635E44058690002C6BA02CEC21C54CC8875B408A8BB84F445894
+5D6B3E4841CA20AF852A660FE9C832F773691DC6F7197FF3DEAEE97418A5ED2F
+F2AE65300416227CD3BB03C29003C770CD7D2A7A2E4C1DCA193651C2CDDBF93B
+966938788694BFB562AB0010268955FC3555E5984CCAB0A9B7590C77C9BC713E
+A29E5BD7193A4E971D1752DDD0F0AA4648E7E87BBCE66A1E836C715C408B07A5
+9EB56BEFD4596706CF839BA4CFA90CAD4038C1E006B51913279A2C31FBEE5BD4
+A7D74F9103CE6124F5B439CB860987DF44FE17EF88EF1BF62C67060D25696BCD
+94ADF08F04E349CEBDF9D3389D870D94CC05E393B3F4362A13A6A672EE5E8F5A
+DFE7046AFE3EBAEA58FFEBA4A47BF61F92E2003756DA643CCF2C9DFCCAB62669
+E3C2A18D690B64D907F50BCA155A85E47C3A6954C6FF7ACA36D8DFCE777B7929
+5F5D5F787B9C247ABF13D6D7B4A8F06BA25CCB342F8A5071325CDA86AD71BA23
+8A9695C7D1D50D0AAC267AB7CDBA7AAF46A264B7B081B7E79AD937FEE4969FD5
+155A99E652461EFFB4BD010E5885631E2B2497D6B8C43CE77D7D47FE201DD46E
+4482FFDCE150A1183C22C004A0AF0E1F42AA6804E038E1DFC8B0A3CE26B52038
+44D2E7F759DA5C252489E5525963D68BC27C82247BEB18818C7D4CF0BC5CC97D
+8C701034B8DF798DD4CE36C3F8B1FD40B2DA14EA75583852875031AF8C909EE0
+04495FDCD04B05A5EFEBA56A8CAC1F57F1B8AB91FB25C81CD51EE69D6E0F52CC
+A0E12CF7E3187D67DF71A599FFD895FAA7BF80E2E6B96592BE77AE96905BAF0F
+F547355A36C443797DDA7C414AA606CF9153E03450B77D1BA4088D739DF55F07
+111B9E11AF37F45B6EDE6D7AC126E05886A57C83886DA87761BE600DEECD1344
+8A82BD652BE7ABFE6A0F50ED7C6F4EE12CDFD80CA7A5518692F267C51C3FE76C
+567BB8DDBE09A2AF901F79AD02B435287CB8057B3D5EE6655071F67B00438728
+C4C3EBD648BAF650993AFE5E2B29074A99ED0FB725D9B8CE8B0292B08A280214
+C3AF252BEEAD30C88F72E322FAC3E9D78A1038F5DFC41F7BF1AE3744A0677094
+51B77C2D630B67853FE5E975A395C06A4D4DA744040B272C2B88D8B7ED3A2C01
+66F503C9DFD3C7DDAC865900D2A4F2CDF517F449851DB1963468D0266D7A3E58
+9F6B2A1843E6444274F16A9930302DACD8D2BC4588765099A86BCCD8A31DF0E6
+2853114DFF2D19F812F19AE6C2E419D7AC1BC024D1195074FD0C6717BFB389A4
+4D5428E7BB2E4F9E9FDEDED7BDCBDD3460805AEA0B5F6460C2FDF19273CE5BA7
+5D3AAE0DB94C6AFA8339646191C23B0149E7CBF136FC4C844E025A38935DF256
+0A0A6466A45EE8B9B23B6A055856FB084F87C73BA28F1883E3B184CD813C72F9
+233B78CA4E125ABD26F29B92CD9DF39D6FDC2A217E2B6B45D9B0A4D536790A5D
+BC0903069565A442FA7466414D948AC432C6B75D8D0E1DBB217CA3DC38A52DEF
+62E9D5AE9E753956C13819D93148C7683BE4F71B80BC066D8C19FC807FB1C086
+B49215DCF56A91A42089F0D063B9981925691F7DDE3237403AC714F5CC3ACA88
+DB2F1DD205578C00472FD70C8BA4F752E3923ACF3164D442A6B639902ED060D0
+C5777BC20F9A3BDA60FA3BC986C38136FBD2E8F910E32EF36377C9CC187F4AFA
+CCEC423DB925B378522B748BDF12D523804CABA83CB5A7ED69FAB9AAB75EE8FC
+38D9866E3754C4E2F2B9AEFA804044D878DED0E114EA0E9682FCF38F6628E63D
+FE1C1B5615E54FAE8684566EDC4B616F76EEFD6207E0386F06D3BFFA26425F24
+303CC7C8A8D7021E7D09B202616988287838C3DBCE3179B4FB5C726E603A47F2
+8248CB508F327D1291CF3F08F7C88298DC2D0F778D24304EFCF6E074182BF5B1
+8E6551811FD6991971692108E289B61053D6DCBA2925B3903E8916EBD09D97A2
+C6D08E89DE4C0CDF7185E1E00DF456B249F0BFC686E04FDAAD2772DC2C39DD53
+9C23A41471267F53A87E5C2B8CBCDB66CE0B9844BC506428E6150B48D2FA6363
+4FDB2CEDFBAE0B7DBCE4D83E29B2955F8966272CB865EDB360C8A8C19EC62A29
+03066483E4083524A1E8D80FE3867BC1AA91753C26ACBE8489AB0E3330206212
+93E07ED473DBF457EB8489E66FB4B8ED8A9EA8911CF9308CFE3E6D6F36810EE8
+91CCB11BD548617B2C683C354452B9229E7C9E68828BBEC324420DF7C188CCE0
+FBB514547553A7E9B38AC265783891F42DA472388569C8E7594F7E8810895A27
+06E456902A8D9F65CA808F1FD475D011C4572F8A654BA01D67942226A663D179
+95149FFF41A9F55AE84EEB9A6A39C017D7E4FD6EFEEE7FF3CE847CDB064A4954
+9DCD273B810E0F259501BA4003A3EC1ABA6E13D24C0B57FF82D6DF077833B6A2
+7EA54801BA81DB961C261689C0887FAD83771E55D3D137AFBB21779397E11972
+6C6CA922F45AFA5C0526863A5AD8B9C0775CCBA17FFD37A44CED4710884DBC31
+5C9D3F5441595B86CF7CA2EEE42AE87896E9E60EBF5F35C2B7FDBF9A9CDAE262
+3F48396F0F741E9DDF1D4FEF75E68AFB020D06CC29B3A7B2ED819D1AABC12B91
+CA2A65F1AFDDA2F3FB322E0268DBBA024663E49EFF076455338FE31A16B04EC1
+797EAB0B49AFFB906A0690A1E8E2F5314773E1CCFFF43E6FB3875AC907F0C5D0
+DCB9BCC127014D472463560CA0CB1C2CE614D94177C7A52A5B089316689C8112
+CA57E35D716D956DBF9013B1E5B9626456B1433C8C15FA906458F957133B9E19
+8D46DC3AC015F7602538C2AE3927C6DDBACF38E59220C2F5AF36B68DE9117C51
+04CF7DF32B1AF55B87D1D8A5F4BCFEC66F63B32B6548DEDA3AAB06C5310E4757
+78AFF947DA22809B360FE535506A554DDDE5A6F2411246653710ECE5CD3185BE
+730520A766C47E1ED01890059882BE1432586864E1A86A7F586438C8DD35C00F
+021A741ED47E0F16DB6070ED0C50038632CA4AC2975578A8372A080CC0447C79
+CEABDF2BCD5E78564247B0F0025F556DA8FB62125227849EACFB724A4AE3EF57
+90C07A5B27D2E59425F56BF8AD84C5F5310FEB1BC73D536339FC2E6A5BE2DAFD
+97FC835E0D52F680F80ACA37DB498AACF152B9B44626CD89E3302C3EE1623EE0
+F998FA78305960AAB9F483F731F5F67A8C963C23DB8E48FB804EF8B86FAFE7F9
+4C09641915FA7E3930AC922682313408BC1607C76751CEEAFD660206A39CF394
+40ABE2A313AB7D5FD6444E219DC5C26734D322BA268D330AC17959A390D6C8E7
+3A155095BDD66516DAD5D65519A7FB871ECDA77061EFB21F359158B4470EF79B
+362C35C06B85C9A9505C8361939C6AC013F2CFE8EEF46FD8CB4452AAB3EF1FA7
+DC066557BADC2ADDDF7DDC2A0E1DD4A357E27A2073427EACF9B9035DA5272136
+7DF37E26D96ED4B2ACD60596E039BCB15E259C72FEB3344E3EEE3D4F17DF4233
+04C1416BCADE80BD483DD8C9AF979E1C7D50C4CF015870703F88B92C4FE46AB8
+DE6717B55C460C805B391B84333097E116F4A51F631FAFAB34CFC925BEE8B72B
+C9FD5F5A79D8F2295FBFAE649DC6AB47794AC7D73431FFE5BE992F2B5AC67049
+B5208251C0E442385A9FACF25E3A98D7F5D4C2A1ABDC600AABE84769CA83350F
+9B87F71CEAD3600E02FF9AC03C1B5C21C84F911511A0CF0111BAC7605EE31229
+3C526A79D943D92E1CC3C38ABE82D560CFD4172F318030852A5FCC0534B8B3FE
+D7365987C8B48A072907B26CDC2108130A33233E8E0BB5FDF14FB55098A10EA2
+B51AD9EFB119F82B08D256D396D3263FBD9DBF172D43A90ACD1A31F3E89E8571
+74BE98B9560E2CD661A2F93C69FEA3FF26B00772AE2C2C24B98D3D122EA2AA8A
+44652CCDF4EF4F01CA7D62A976E23E8A86291F43BFAF38FD9C325E70F9C36CB5
+A181DAD30156E98339E6A0498D3420B7BB3B4E651A9090D4A17604AE386273A8
+3D4AE8CC18345E6E19DF06BA848F203F74B161D6A8882991CBA7385F308696A1
+BEEB0130D938A764B98A2001A38489B1334025EA848CA44A116D64926D460D64
+01159E77EA7ED9ECE7BA77635BE564A4ED89315BDFF54ACE6AA1A26591D13CD4
+6D6425CA7933769B842192858D10998509396829263290A3A7CFEBBDA3EE6CDD
+DF1E492AECDFF7941B53573F01F623CA0A5ECC9D05A3D0954F7AE8CE94AC3B2A
+CD4E27519B2E16F033EB732AA024BBAF74626DB55DC74B1FDDB07FAE98B4AC5C
+683CFD8744F361838D343B657EBF52DEEE7AEA7565C5BEEFE455DDDBC4DCCA7D
+87D6D769C5ECCF14118A14A85A86865777C8E28F953160D5E82844AE54D541DF
+550D5F1519E183E0C42BE88F0458CE8087F2CD4B1B49A8E9E3D127C4A4CB74A6
+2E73BF4CC317781D03FF04BC36AC0E4AF99E2ACAD20F6F8029DE8A035DAB40DB
+17D237850BCDD05931FF4B0FE2D0B79EC5A88FE0236271CCB075BD194AA25AFB
+3FB93A5206F61A14602E4EB6F1C31C654527CE0C02D04314DF9AFD710D0EBB9E
+F8721B97F5FB18E27507E1F800B5509A58A1A8296C72B7B73F99B6CFE42E9C2F
+B63B3555475E562672645CD374BCDE937A9B05A157FB3E74C8297507253E957B
+1A9DC421946734CEFA3D5EE357DAC7E9DE17A5BDDEF6B2D2A740BC58128FC514
+61154664412BA1C05209EC992A77B7CA45AB7C0EEBF590A5B5652866008CDEF7
+124A3003AE6A7CF9DF3C72750CBD281358CD2FF25B162B78CBB971DB3477F8D2
+ECA3EE9CBC90323B2C236E375337EA0848CD7CB5781A2B0A42DE7E4D99DB2746
+0B26796CEE129D23C76794B7CE21C13C7D4A998B752C8CF43A4821B736EBE246
+D2A2BD7BA3351FBCD1B0A501EC1EAABE60D06DA2FE39BE1F0AD629769FDDC933
+F9D02F9686EC8C2D7455C26AF4DD3F6860B2289E3A30E1C254AD17D731CB73B2
+BF4DFE90CAEECE3ED0CD3FB4C8F4C7BE1C056AB4E9B95781A8968E3CC1010003
+75DFBC4AB9F6B27C5A9AD88D94441A8ADF09EB275E5F0E5E6F3BFEA0FA8C308A
+8593ABA0645ECA8FDC3F0E264B35D4B0DDB86B93CD8A047FC409E18196B501C3
+B003622999C47BAC04FD1ABD8AD359C977766E9643EF3BD6385306B08EE3E13E
+7DA5A06AE33D17A3D574C6390DB6E9429754B210F0C349C359559C7EAA2350BD
+F61D4D8A92B1AF697BC620FA0351E67E0D9F41A95A47EE0BF210C2C48691901F
+F905F65693DCB85BE412F097480F6A7266AE0A928729DA0F691CBFFF3B276EA7
+322BCD2206D96E3DAFDFB992CA8F2955F0E8B882729DFF840569D12E4DA1775E
+523AA734552AAB6F2F16B89B39F1A3FF0E07EA08D13E612F201716C67F327017
+6C041760DA30374434808273062C1FFA2C47B3FB578807BC26537F542040FF77
+66C995EF3E8B08B09FCD3EE89C30F157158A739606D2CEAA26694A4F1CEA6633
+B54933141CB85C60AB262E2D4E824A3B85C2BEF810DD774F296AB37D0BAE7182
+5648CD18556ACB124246A75474B232D712C2358908B5D9A76F82C626BFDE01A1
+093B8FA6AA0B32F2CDEF737B28BC0448FF816DDB5812131DA0DD5979D77C3838
+B978CC3F6778A4BFCE9A7087EFB19749285AE4C92B99A6649DA349A2E0889D72
+6D4FC664522F06C8C4D86D30BA43ED4E42211217D01636A4E17E2A132D26F394
+EC34EA12D84594AED9C6CDBBC0908860F39B240FA7D7B3003DB10322498691CF
+A294C0FC7ACC0BAD1EED3E9D60AAE3F7429695892D1A21CEBF062C6129B33966
+8B2EF6E932F9891DE6028B81C5E9B23278D35B7F0D83989BCBA25E20E9D503DE
+144DC485F09A4EFA1268AC5E4B551C5B2F1D51E9B9B9C0FEE585204F869D0BE0
+7287D7570A12940A47C1F51AC6134F03B415C30E147C49F89228855D093EE55F
+172711F37776E97A99CC4B36E2F10713E36FB279FD3FA5A0EB9F3938F42E2BB9
+254EB8F0C0F30391735019E02BFDA21D9813C6A22279B898EAF01AA892B14DC6
+5912B9275167AB46EBC420836CC1A5F38A4EB47C039A7BCA62BC3FCE4199FC71
+011DD6E5FFA0F3D7F04AC02AF91B9249B9F993AE346572329DA852115BEF8460
+B94690E790003586F473F37EAB5AC2922F5F663EE2C3C0C336A8DB71650631AC
+0A923A389AC911CB215EC2EC7D50CF8AEFD59EBFFA53A9F1FFB7E6215F17093E
+3975F186FE23BB5FA5474C11408FABD223E1E6F62035B5A5C1AEFD8899F00FFB
+E729C2D5FD551E80716CEA4E8281660286A802AAE8D5834F37F2EAC46297E57E
+993B09251DD7789D3467417E393B7DEABD06676B96241B0E43ED1A1A9FC3B12E
+0D34B2B0792B79AA648FE9450C3B209FB6D7D91F50C52A5DAB0BC81A8B698BD9
+18946EFF691912D7348D48FE68CD876FC6F71F81165D0C3272DA1A992308D9E0
+ED6D0A4DAD679AF495F62B78D462B463BD4A40931172290C615B3B3B6B47E45F
+CEBB85E0A6AB6832067CA6D403C239530D07F199788AA4DD52553836851C5228
+1072406F6D7323A334E7A7FCA588897C4FBA6D4F7DEB65525EFB74E539C988C3
+A685A98752F7198E77E456A545F0D23A1BEF81EF58B02D289CF980A3F17BEC8A
+6F83DD90C4A917EB0E5E2B444A608E2E9D2FF80620E16AC1D7775C0A10C1299B
+BEE0E1AB24C50647E5CA1DA65CFF3B2C295F0644CA7826E1DC6FADEA93D66A20
+DE852F20AD224D28DB900519EB1569837139C833F24B799F7EBE3FDC14235323
+1D0BCD4991C861F38DF413A5A5588B73AEC3BBFDB885CE17BB3E97B4E6A79761
+93EC8418C2BC4725CD61B5E30C07352F647C3FD50083878C13CFAC241DDCB082
+E53703D182068727F9EB6FACEC25F6D901D7309ED7370867E34E267519E22D62
+4FC7093448BD0D6B1C43D318A3E14C92032325C132AE0FF7ED707E1FA4A955FB
+F5224BE0045CB14ECC321D0F333FE24EEFCC504F7C756451D7693C3E6CA87526
+4912E1B6DB935BDE76FBFAFCA4ED473F1D2618812CFF25A6859C626A216603C1
+361BE3E071FCFEC2D4BF2FEBDE07DBD56A1BFF8303901168FA06488BA6B76F36
+95B0A90D7724E9ADB567C2ADC65CF3482CF47FD1D16F70AA19A97D0F9EFC611C
+AEA5E1ACCDA7FB2DF05E9480936281484BC329F0B771775E73F7FD72FE3F45F0
+50ADBD03932B38F37A8F0A66B2F739EA3AC8811C8F514E68C5643E4AFF485C81
+88475A523D7FCCA5C8809BD49846C77795A38DC6406082000236A4D2628B5932
+AB7916D44EC2210CB941B1455867E510E9D8A0B83CB645BCABDCDBFCD51A4E12
+60CFFEF0CCA548F654037D01CD631FC4E1F97B4F65DA9AE79D99F13A726E93DC
+BBB027B7D175FD17A704C4668F6F8428262959DACA9F8C687C923CFA053804C9
+9B2005FA7E0F07D81E52A9A37AD5CEBA8EA63929093ED0DAB9F7C99C82A50E6C
+6440387049A0C359218F5268C9A28F581783BB9D29E08772D7252FAFA6739687
+22570150178893C418531769CB3D96F799BF1C6415820F96B6EFAB5344E82796
+38A0DF66609F5EA332C1065274EC93027D264B84B52AA8AD82E13E2A41AED340
+B240D1888CB89FBB748FD10B214773D466A44AA2AF44371CA8B9A4450DA76EDC
+0167B4015A270B9983B89EFFA023A3DFFDE181B90C51D70557B0844362B0652A
+6345C6EC83DFEFE099455232455943718297254186940D6305C96EE2B9E3E7C9
+A622D25E0471AC31A8ED3AF8897BD19E322CFC3BD3860D8A0634081D9AF53A9D
+84F4ED39D8127CBCAF9AD48E9CBD10A67A2CD0CF93D61A593C0627AAE80E297F
+610CF0B2FDB6EB3BED1D866BC1E1DA14C1A2583976BB788E9B26B26D6071AF28
+04DE56A166D01ABB14FE7A5C409A3F6AE1F17F322522621F97113DA3C0CD1EA5
+11AD5168DE7B3BBF39F61A45B553D16A31A1FF6000C7BF7A3DDF5B852BF6FEB1
+2AAA616AD71EE44D7A3EADF8CDF02666A78E346CE8507646ACAFBCB42D804F89
+07085FB776C81D773B33AD206D49FA01351D19E9B93423686FD7C8D1F4085009
+A3D67A249C7B38C40D4A83D74E819A62B938D89AE9070009275EE70CCC716937
+0BFC0EE647EC231309588DFF33EE995006FEF93469A8C4CEC33E5C77D53F8BA7
+5C444825DC75D418831EE39A0FE3DA51CD3C5CDD8D28EA853EB7F4925E040BF5
+F38262DD8FABAA1B6A5EAB2E50AA4FDBDAA7318795B5E3B8520B9CE2C02D3053
+74F30A8680D3D25B1A8D9287B67430BE892BCB142A6391FD774289B426F82590
+B01E16018820D33ECEAA498ECFE0023DD959ECDD891113323CA14761136D43F2
+A32A3F8255D0A00E0FAE6FD2BC390D9484AD38193CD5EF2A0B6526B925D91FBB
+966E69F1F7310EBD4306E2D9D16F308363FC231C626445F3029990699E6B0CF5
+229ECE0EDF004E8602D582EF7810BA119B058DD90C01C22744B5EF5CB156A1DA
+7A9FA7086CD89B2E8C5E90B258A3D64AF7A9E698ADF3D0EF1C2CE3D30ED5A4F8
+93572BCD11B506228DDB2C85B79631258B5376E30EC113D2D97C12854A892352
+4016AA0558446EB491FEA150C7707E53A959AEEC3F606E8FE8BD6803881E7091
+625E3DB91BD919071CB21186DBCBE103403C49F634AD063EFEF99A59DF1F589D
+5CDDE87414F6D12429B32C1EEF09665D6606F33E015BD62409295538A487A93E
+796AD8C64182629AD78DF437E04C0E09CA8397FFC74FA927664EACF7576939CF
+CF56962843FBEAAB2C5AFCAC3DD6C05FC7402C2148280AFD5025C33A1D117359
+68BD0E06472B0D335BCCD589365BA20568DFD46180A38CA13770A8570C3C90E3
+B1D86706D81754B00B4F1CBA76D8341C4A552851A79877C8F14E8996592E8434
+AAAD811BCBD37DD9BA69E6D76A19192AD53A8F60E50166DBC41DA9B77783DA9E
+5358A61F08D5FB1731EC73386AFF81B09631D57368A2984019FD887CB16A37D2
+FF085B743E2A3EEF2CF70CC006799F1AB3DE1569E2377D0F00DAB31F73CF6EA8
+339CC5F37B42E0DA5A9FADBDE4348EBD8E8E41F4588BE9CC71BA9B8CEA1FEB1A
+296BBFB3E93052480FC0460EBE407B68C5DDCF3471D5D70D58562132E228742D
+E1298F26E89FE76925B21024384A3BCF0805BA535818525AA30E5267076EED17
+9479E85C7BE3A67B23390E0D413B04E548BB08E7AEB468FA87707225248AB35C
+043355788C90839CEC662D883BE9A5BCA92F1C802734084553B54BA72CB7A8AD
+CC7A1B7439A68E84F1B1F1271B32CD1B719BA52E0BA5DB53C6372CBAF47C6622
+65D10D789FF729CE2F422D464CA83424CCE7E06591659809F91F7087EE721F64
+6FF9AA5E47FCA748EEC49D202F538023F7295E03637BD089641A14BF85F926B3
+7DDBE5B216F4A85262EAA63E204AABA92552EB93169A07C9BF3BFF389941D751
+EF82F9118E9D53EAEA71B5DA45AEAC7FC1F855AF5CAC11EDB1041FAB35423A37
+B1974AC24E5E83F32931CE05399EE7829BB1785A0F117252DD7DB5EE45159BE8
+F96026FC3A9D6E67FBE906C9FBE5D0B1CE09CD30889F575471AACBFC343A60E1
+253A70A4F7F9EE8A771474F8C3C8DD5C410165F00FD2E08FFB820C030088F452
+1AB1770F80FA609C8978C5CD1FF94A6C77CCC7315AD714B990BE419955B99747
+82D883C4DE1593875FE60460E2D370337DE830A3060EC38B2CBAB76FE40FD9B6
+00E693B9090259ABCD7D3ED4B9BA444C94D16573FB33708BCF12A0016A839568
+E223CA958242021032FC6B4AE83A900DC87CC6ECF2BC00F9F8EFAC6606208EAE
+FC933B0689A554AA1BCD5F7FBC20299DFB1632B284C24D64AA90DEDDF272F7C3
+470CE467B5F959C24D45B8BF53E96E5E56B2703E863FF8A846D14C210696F2CF
+FCBA34C2478F25493F39B067A4D16F8BC484F5BDA1B11038DCF25D149F49C59D
+3DA99DC0A08EF232D98E9FBFE46FB5E457975E7771459E330DF4BB863E092AC6
+B368FADFC326DEF82C2E1F5014A54B5D8AB78EAD86CA2496D0D753A4914C4F3A
+9251677B6B7A76B3F46D564CD855D423B7FD3756958DDAC02CBA90115E2586AB
+2328ED830172111B3048FB5021CEF1A52424E31DFC904C67F3EE4D176E0AECE4
+2815188935C37E307BE490FDB7D86C9ECA73D165C659C2102D60935CEAB955C6
+D5F932B3D3F355E5AA2CE54EC1BCD0863949C0D976FAE7D862A3E8319173B55C
+FD17CA38B17015634F22CB58DEEDEFF2DE3735ADA5C5BAE39B4B0805A6F77813
+51C64EA337386FBC74F2C86446A50E134E20F34E580CCF0C88F38F7D5BDFBE8D
+884777BB0EAE668E1C385AF59359668BBA3584EF4B0DE732C2DC88E2D0C3E081
+358298442A33541E8494C3D8E9F0261A2B79382507FDC4503055E14ECB54972A
+66FE4FF0B584E91464DE5AA6667E8D8B123CB182A652224050A235C1B0D8E5F1
+07097D98476731A1D9224E156665BA64DFD471B6C0B11519703F349C3846C2EA
+F123F5EC585E2E357A9B016D82004436D460E4E3A0D81C6A4EBD3A600822A6B7
+FC2C8581DE02B61096F1E44DBDA5BD22529B31D715ADC9FEE721DEFE8D5A7305
+6FE51844A7A31FC453F8E957212D0262D8B5654C47123385D6309C9E91613C37
+693340BBE694449042CA913A6F7AF2B98270C7FE9B4ABE728AAB48D8D37D8F1E
+BFC3AB2C613FB6DC9B12A69276FBB8D4218D800515BED9CC3F8ABB90F4907993
+D252C28A994B71A7A725F4EF5E189E4B8E3EB46A756469DFE6D20CEB897B331D
+AF8EB7E9DB01A539EC89A3E2AAF71B4F62F9B46CF90329DAE6D0905DE7D66667
+8DC3D965DB4A54B4FC63A46CCFC487784A0B4F9045CDA8827BE808DDBF6FB4BE
+CA0FCCF1A8A6B512892EF43ADF8F00CDB94D774447B0CA23AEB62641CD4D7CE8
+4DF24C4BE165D5D901EC9F8A0C91A21F1E15FB1C6994297CD468EFDF37FDED3D
+CB18B1DF5F8B13F6731457E2E1E84C694FD59321C214A6FA00FD63736F43A0BB
+46610DE20C7B63C2585538EACFD958D38CB48B848398722596F99FD902DE3669
+AFB419590B21C195FA98B123154544DA1E9C3E6D54679DD3434FA27E0209F7E1
+EA99684FCA8BCBB105DF37297E9EDC960DD623659F26B3C1B29DD90E89D22F60
+2FF619C26F0C7EE13B0924017DB0B7B09D6C83837C02E381A8CA197E5D590669
+BC616C29AF0E5534230A6AF724FAF6732C6BCBF26596459BB0B03E3B4D3D9F88
+3444C38978A9412CFE52ACB5DE75BE92349AB04BC08F99FFDABC98F7D20ABC47
+7FAE1E6E9909628F16DF65854E991B44BE8471ED5F84DD77CDC32A03D49BB82F
+BC1E559026029D81F2E80B46062C743EA521C40E4F598655EAA50C749C92227C
+26C7E481559F733518A44E467D06A92A8BE1AC43C57F3339E517F8D43F75D434
+BF40775F91ED694717B7B6A5D6A9DA2FF46DC29BCC9CF53232454BB3846DA528
+72A46D4B199ED2B80A20993BC303729EF1C06E341B321BC37383E7E201DE0BB3
+929CFF074B2AD7EAADF5DAB328D01F32DF7D3A886B90E665F5526E279DA4CDC3
+3985B1D582A1AC36C0F9708C27ADC43F678EE09101A04312072C5C4F9DDACB30
+ADA37AFF97CDC00220B71ED8D762EF3D06250D5FEA90EB29CAF1A9DAEBC23DF1
+F9680F8266D9BC42613706C8D328C2DC41CE73A6BAFB96FE7AA60A0D5D904C81
+8B2F64AA3D78C3AF18A7B99BFFC96211223B4EF5B70B1C19BE189DDC613378DA
+082DE0BBB822FEB46EE05F8D83F201A8AE2B59861CA9F52C54780B3360160814
+BC369D35C07A4D4EF9FB534477376B336CF1A372E6C6E7D076D2C1F95B6507A1
+62CF058FD9D28A0D9A86E859DEC3BD2E2DA69010B1D6C3D6D0F35E25CE3458B5
+4A8DD7485A18858B6EC1ACDA8E5D3DC74CC8B37A7EA18ED9E1B3A333F7F41545
+8A9C8598E870F85DA7E4A772175DAA887A4BD065101ED1D704652299FA193387
+7A1E684357205136A83B6D76EB0C167363C9248221CB09199477D24D3788115D
+B8446CC827C7385333000BBB82DAEDE63ACF9D328041961710D3FA09466CF2D7
+B1685E6B6FE892F9B75F49F1DC7F6AF4E8D5F2B0AF7986216225FCA4F7AD1D01
+880672F6AFAFE640713B5B83567264AF6620DFDB3B0BD45E8EB6C375D230FD28
+C5CF99DB705DDDB9A2B6884E2D62A9547DF6CA0D8E86E7FD1FD28CDDB4DFE321
+4921327FE2D0AEF48EE7E15E17B91D71B3485CAEF2871BF343761983B4DCB7F4
+156E6D8D5310ECACD6661DB1D962A7EA8FF44A2A12C37561E21E5C1C5AC88D32
+38159E3CCDE194F8BEF038B04F94CACFB29F8A93EC9A375667C8BDB4ACA5D195
+CECD055E06C67ED9C2C0374DB6C390EF4D65AAA194EE54BB26CD7869A5FBE3EA
+09A6E1285F66BC0C0B5F1434E1F2BCFB6EEFA0A215C37CF8DEFC02727A637CB3
+46A83C6ED1B8AFB5FFA7DC2C4F1C3CD57D63BA2A986108E3EC91B54B48E99AB7
+3A58D8990D8EE81BAEA6CABB3F372A2AEA6E918F49266ACBE23A68D9A6863849
+4DBD6364F2A0AEC6FA454E5AD9D56BD097F7FF16D98C5C8FFDC5222A301B3C57
+6BDD7F281E6D575F46DCF293DDA0DFAF727226254E8CB2E39DB8EB1B443FAF3A
+4F7AC38741969E050F59A9A193E0BE89544825A0C0692CFBD7044CD12CC14189
+79EE566E5FC74A76EC65E5285684F4575AF05F9FB2356CABC4BDF8A6067D169A
+EA546A99288D64DDD928598FBD7ABC96B9B7C42D6912273D786385E7C60B30D3
+29756256728279E500FC73BADD4C21F0700C916E3EA0428BD052FD8A2487054E
+049FD14E372F0ECD6E3ECF4805D02FD4E146DAEDE6849AC9299390414A0FDB10
+153A2AFE5E8FA44A1186A395EBBCEC9ACFE9719C6E7436785BCEA6380941CE0C
+6A46296F0DCA6C3C13C3A9252BB87A45E9E4DAFCD3868CAC9D83BB0DD174DFC6
+27D5D1BBDD986CB0B5A9BF9CA5AD2C94BABB3AA21CAC876F10FBA5B464622B3D
+B8AC3773E3C8B3C36BAF980DB29432A01FB5733C2887729D5FE0C412199AA6DD
+A4D7623599680BA2196E9F439D6C293D6E16A2FF1205168F31277895A853FE6A
+1FD47593AB67CA4F4D407A90E7F7D8A80C6D9BE25BA5ADA64F744A50FF665A43
+D9F7A8430EBF084928BC3B492E8F1EDD523C8CD0EBD4A065096A78DD3D8F5A21
+8E6A5E4DB1FB611B4CC47C87394409400C6D0615F571EE4A96564F3366E5D938
+236560F6A9957E8D087AD152B8F6E01C9DFC27ECE0BFCFFA409B94C9D523EC69
+3C328139DE7F828CEF88150A864F8F64CD7363A84601216DD34DDB4085FDE7A9
+8D90D3571DAD0C3BA52419FC79036754396903B86AD37AF2F5A877DBE1BAF1F5
+8EFE1507E8787F5C5AC5368DEA4DF9D8A8D0BDD5F0E9687D1D614BB70567BDC8
+8B1CEA009D324518C46B17D521F28E17AB8C2252E01A88DAC5187B153C1C25CD
+C342ABB1E059247E276EDC61D51A2CAB2114BE28EB27407DF0E3048143062E54
+215841330CEB3212216055913E93FDB5889D0862798B2C9EC4C7AA867EBAFAC9
+8D9C5E5221C1D63654A4838F15D0640C6360EEE3F78BCAE95892191BC102EA2A
+84BC256B2E51E3D5C6A2C9C4DCD5189189A292BC47FA28CDF05EC12740D45F2A
+480FA39C3A164A201F0D353CCE51F8B765FC47BA5EA8FAE41832320D18A90A24
+4AD12E6C4E82DF6E172406961F414305F390148F61472D732364E581862532EC
+748309596199EBDE301256766B26CCD77898C8A97A226BE0D1634DD4CD12295A
+D6990DED2FB64B5CFC8B4073EFF20540D50E21A56B9E63F075FEFF20D50D96B4
+17275B729D73F68D4CE816B36FAB46C5551E4D3C001B55107EADC29DF51874D6
+E936DAFFC19B2DEB8788C7E7FCB9D2ABE5660FCB3708E81F19BF9C600F203BED
+4DB8649D9B91450982A801D15B3841C7339D1D20EF138030CEEE013EFD570348
+0A6346682F82963745931F85C431792C64B1E6E0637B63AA85554717C96DE31D
+B4D2515B18A00891063AAF9FD2B4BE8708009A334F7CFD689D81ABB348CA4BDD
+F21882F2EF86048F018565C26728BBE7417E685776114470B32B18A71223DBAA
+EC66F6A864F7944A4C459F0899EC7B5FD8C0FE9AD393C867D5B7C9E98C5FC32F
+707027466005E23475A87BD88BB8B5520BD87516120A2FEB5F0C00DC0B424C88
+5D8204646F2ADF4C7081D2CD0D0B3453FE69C955BE1C40AC66624083CFEB434D
+FA7D2214BC69F0310594029EB6B1D355C9FD13A8895F0BFE85B725E47809A824
+E74B7A7E31FC95E6655147D20B4A14E420A6DEFE9BD80CDD4B8924E2E7EB3EFB
+3774B612975D6DC561D4DEF163AF1DD76EBCE76D339B583950C2981EBDD8D02C
+48A5D5B2E8AE036020BE8B760049DD6418440ACBB03E798C0BAD524E82B6B422
+0DC30556016452AAB929801A343B719367419ABF1AD387925953A2CF4A1AEFFB
+8EA00A873B2ECFD127C80E23BE2F36E10E77F86D3BFE8B076E355BE1B85292A7
+906BAC9371610C4AAC2D3A0239BC2BA384314ADC834AAD796C8A7557139D9BFF
+A7B56DAB7D63FF9AC78AA9AB416A0AA3F96B0EE6C525BFDF5925F4859A3A737C
+6E573FA019456ACEC1AFCAC3787F83DB80FC3DB6CF66F351D47E9042C33DA41C
+A9876A5ED89F7E1C5C32045F44E6D9F99CC3AF6F3F6C537A9E6B5B33E18BEEA2
+7EFC03C85F3F9FB5BC05D57510ACF67E864A20F5C9D46BBCC179C00456EE9D56
+691F2F5A0D4F2499772A6D91517AA6EF54DF7BF4E3546C63CE47076149D5A70E
+4A649D801BA0032F47668005F8460F6BB9488566D4AA5A7BAF13FB1810B219F9
+7E21BBB6619D78A42224D89A8C02721C3E802E0AF94C55461B5761200794508B
+E379198FFB5A4EDF5AF7C0FCD6DC71FA1F88623664D0447694503676D6E59738
+9F79981C2AB97EEB8E493F471780B0A73031375C3827B6F50EA1F7EE885B9B90
+E9AB441283F4EF1C6C41DC8FE9DCE582BAB0CD65CB8AF0CA61DE4A7AFC3B7F75
+CA6097DFE38E07B318BE55372C64698D01486E55880DF0E177BA270AD2A5F813
+5701A4E5B87647E53EF14EDD19E4B7007683B569712FE119C27BCFC075979BC7
+8A5B0748E1960C5ABC8C5BE4B92607B33572F525562C8E039ABF49E965D2CFB8
+369DAD99981263229E068F5C3570760842486D82A78DFACC9BBDD36E4C92017F
+52AF6FF3085D19FD3D69BEF26BF4FE486C4DA28B67D8F8A9EEFE6880CA09D2B0
+D6659F69E9CF9B8C048851DD2EBCCEF01D71002B2DF0B991D2E93763D7FBE496
+0CA746868E3EC8576735B7AD2980CFB4CF3D13A7D2F1A7D170816E7B5F36CE7A
+26CCC8F7FDD1FAB9DF86966AB4559A2698EDDA603842D97622053AC85531F0A2
+16A97ED8B2E9E9FCE247C33A414BE13DF50A257AAEFD9A00764142AE6CF9D890
+BF73B590807FE1B7ABA71BA62CD68867A96739EEDC1EB0824C8AA59A13535931
+7B3BAD294588402474B9DD42BCA14C18F64C0FF78B85971BD4179B299D23D9D9
+954D71AF0B94986149B5EB8F18232D957FF1EAE068B90B560C72A13EA7B442C6
+828EFED6D96384E045B610B0A8BF005B0B99C11E2F99DBE20627C056E14B7C2B
+0DF7DD753917691CAF013D7964DF6E4ED5E49241B65914397BFA07D68A5BC15E
+E52187CC260540A2F41F4A6D4BD7CAB2C825D72B312B8794BDCB73DDA4C66E96
+CA52C51928647A5A59FF268BD487BBCC5A8A6F36AC8BEDC211B6B108606C8D36
+3A2D4EA6461CA1251E10A86A40D3C46C10DE603C3596FDD87D2510A8A29A9D0E
+E27A52372345A829A84F1254847CB52378A710A8B3EAFA2FD94892D3A32C9F6D
+BDC495F27573D7E5DA65146423736952A0A13E6E8030A184D2FF95CE2B68A33C
+7F0D94FDE8DA4ACD5FB84C5E6B7D6AE891F4E76289F28F7D766B79B09200FC3F
+A082AF28A6DDBF1DFBC29EE3D49BFA8116E5A8EA86D9B1A5E34558A83545B7F3
+0C512D2004357DE29C5221FE6163933C0A7C59995769A07BB5B817DB58B6DEED
+415A3D643DEAA04A5F7C0B73801410134501C6EC7E55C737B81CFF59F91D1084
+BAC2276662BCB529973FFE12717D95C884E714678B60481B69F6059E16B83120
+7A6DB96912C2B6463E03732063AF2C6C703E95DA52B5D72265135A18D7186618
+F23610A06500E0468758B19D198870ADC4D26227C2FB99B97F231216FBAF7769
+83C421D4EDB4B880D2E53EACAC19FF259B7B61C0824FD51E281571FDE1F82A54
+93794D923DE8F5512070E6E8AFB5BFF99B8B73E22993305BB60538262B5467E0
+678BFB37BAB72658DDDB5037126E86D0F9935A9908164A06FD5055651E83A11E
+E7058915122D9F2EAB20D69C6937EA70A58CBBF5F86F846785C92974B6C52D96
+BBE2CF060BA5BC78CB760B5BF518DC630031471CD2C0C136628DD815636E878C
+EEF640E2DAAE6663EBF873CC521A6272349A7BE9F845E9A2CFF2007D5CD9C12E
+B156BC49815D2261CCA72B9ADA22FB720223AE8C0253DDF43A4395566146B9B1
+687D5612E8485AD038BB26AFEE7433A77E69BA110183D4D7922C85DBE0DE76C2
+DB0438CC99A281AC6CDDDEC6080868AFD6C9916FF45F2FFE9EEC22EC13B7214F
+A4A34342F0715E22540A26503251C4F079D53B507A7A8A4C26C765CB5D3E6487
+D3AF0A0867AA512CE112F77B379F54D91759225907A1454733EA33674337F06C
+BBCF54429C15DED15DEB59AEFFFA82B4FAF1CD1E3C071A4DC9C8D634939A52EB
+89ED3BA0697FF8EE3697A64F48115266635DB5F4286E828E308E1D7C6B5D5A01
+907EAE2ACCD3199FCB8AAD01471F7098D54D457215C2756D9617C9316A8E0CE4
+F32521B6F32B9EE2A8980614744A02638B157355B709444055DDD2AE8ABB0FE4
+885F5F55150D98BBFCE02164237C1D82E55F9061D44893E73C337B7C17327945
+B164F85481401656CCD0FBC280F0213E77FF6B433A49A9FA6B3DAD3C2E191131
+0C76576EAE08A677CB46CC44DC87368EFC29D4E9A8577535B619F594117D3BD4
+12DE2166B4CF59F122F16B4FB5092BB15D9501CBD734828C478638A01C7CA12F
+2F3E9519766F1E31AEDB3F6D6D6820A85B72CEA12778014D207C2E5FDDDA6AF9
+B3604DF3634B123C7C7F2EEA0146FA7412FDA6AB9E62F4B0F2FE3FC94F89BD4A
+290224FCC8C85CCB7AF6A86CC765ED026E7DC1FA8971DD25C67451B0CC62B07B
+30549C6A7987C5A9D576E8A5DDF2CA26B9756E89B526E718B79406DEA65FB596
+0C71DC919771AA57E6913E56FF5EADD3C966F1D5FC26E56087F98AF7F37CBC22
+4FCC928AA4221F925CBB7E0A3A623DF3FB2ABB658361B88BBB1E94B78A948A9E
+21198332A3FF310217C0DA145DC97314A6878126F88CA53101F0B3D4ACFE85C8
+E7BC1F33C6DAFB4D57A89FA33E8599A76CD796D653B13C2512BE4F561F81F502
+67C69AC40EC879790C00148CACAFDEAA424A809B9246486C45ECC4E09F6AE655
+2FDB077C4C5A2029949AFC6958FD029922164DC9AA8207790D0F138E0E736FD5
+5970BE8C4E4EFC951E912D614570A998DD034948DC5449C56A2B33E89B8B077F
+97A1EA7542176C03553021FD98B8F0C96D2C135A43D8A0A6D33114DAC906D9F0
+4334AB431812105B969FE584623C1BC44B8D6D32C433EEBB7B9BE6BDD1873C25
+F06CCC01B9B43E4A6445E9E0936805A38BF1E01F23861FDA9B0087BF3E2C85E9
+0776A5306C6B97DB8CE6377108739EA84DF52CADF14C806DA7EB284028805B94
+8DB61CB5C591B5E3FEF87E74A0F3F1B963A1B84F717DE48F085F5AE9CB8D60F5
+ED2D3D09E720072A2A4C2A256DD98A9F69FC6095C964DCC618FAE945A714BB8A
+24B0995F5FFED10FA0D8A6CBB2DF565EEDA1950907CD9AF9FD1B360BBC6E0963
+82B35E3073FD7FE70B874CB51F06D9698959F459FC748589C1856387CD60BE2E
+A8F7E621858E50F0FC7965BB2CD3481C53A3E3AAC137B75F2EF13AD72E51C0B5
+F6101240EE677EE6D89E0A8A45111DB661AE6C2B3A07A1BDCE24C4F20EDCB4E2
+19DE64A2C1099AAEF4CC90568A13B83957C016D518859643557E54C43D03C968
+3B22C4834FF5204A1C94611B8B968A9D0BF33915C7A74A64BA80663F318C6349
+2A176111C6A2DBE4C5B25A6774AABD94C148F64BAA0D94A7520B23BA02337189
+F8BC91D75417AEE0935D699E4E113B7CA25E7BDD189B787D278B83041DB25479
+84098A94BB2159FD82EBC32596FDDD435D2B568F3030E31A98F005E8FEC084B4
+42FBC39627119CE8D8F7A84BF68353AED19A7576D74B7CDBBF9E6BDBD2026303
+3C1EB51FEE04DAAC22DA8B26B0C3DCFD7AD50E44CE9C734BDCC605C2C5AFB99B
+815B9E0DFFE77CFB35CEB211C6E5092370628184B08ED27B8CACA1C7BE8C6521
+E41D3C4142A84D267702289E6AF90C48B7DFD05156CD6FB4EB424B0CC12BE5D8
+9A4DD29029CAFACF480ADF9E9D8BBE6F7D90F77123F3E15C6F667A718AD69721
+F2D996CA371AB4DD46D28476A84DC6C0B22507FAA8031B7D0CB8693DAAF8BD6D
+24E4578B3CEC87D60018236E612025BD514B7AE56FB0C859C451F0B34885E629
+434A3937990C3C20227A043BFA53C3628F747BD588460BB25C02D0C607C409C6
+F56A23750F8B09959C7B3935E70F90650EF8A71A9293A7EE6D5D01914B9B9201
+1B53DF0BA9D573F2D6A6C0D9B884E9B46BCC92D4D82AFE8EE1661B66F77B13CD
+7C5267786A4B9ED1A036B591962A4C9F49D58FCBC86EF12B447363A724A9EB9A
+43B0A46580564CD8B6CDBBD0011D2C2AE51C1FF386472A8DD61C66363D88F0EA
+5BBCE688605B3C7082248856EC479F04F99DE1E827D87494285CBD2AEDADF415
+D154BC6C30A35058800A1360DECF3609CF5513D86F41C4D058FB9304FE0CA42B
+90F23C676499E2A983AF06FCF09E372C69C5AC195C6AA0007014878AC4EF2CB2
+A8FA9151B2C77F776DA1C329736E0F908F48512991562FD3C0EE5E7C75EBA52D
+C4686544960F7A37FB2DE00B945C521E9FA54210F42C1E453D0439DEA072916F
+D1C9B9C01526E79D44AFA41B7AA08BD4CDA27379C1A0BCABD929AE917BCEE67F
+E3AC05E5764E79ECF059E52EE85D64D28766076B412D2CA9271B74A6095CF04A
+31655432E2BF0F9C2C5F37C257B31E7A5B06EAD92329ABE9D70FAB1C16957EE5
+8C80A873E3AB6B29B0126C75CF659E483099A5A32D9B0B46E803B5F35386F136
+B2515ACF4DFF8779C311E74A57A13C127185C2CFEBAE6B9997043721DE4450D6
+61648C6A697F09ED42BAB11759845D46E8605079C36B670CAB73A0A1E01D9E38
+433FC147E25E8A702282286860917D4A0DEAC8222A740E58FBDA91816DFCED58
+F933AC7F7EACBE198DB60E6F11ACF470B57FCDC16DE31BF4B15BB951E50ABC04
+7A9EED8550B60364CF3782CDB7165385DE0B650599AB3DA34F5D5B963514B4AF
+09826FBBF93278DE6EED781FECA7CF00D2191D14C9D8A5B018C73E3152EC3C7D
+079350C0BAD84CFB574C35D7C9B1390D81957EEBC3EE70802E0B572AAF20C79D
+B08D8C2EC77F08071356C2645A4F7C257899E0B72826B89B713A4501BACB6B92
+06DA791E0DFBE3C0E68CC28DA52D2B1FE5E924585BAA78C463D865D7366EAC60
+EAFB579FFD8E0C57385D05AE1E8B6072F56DE0D227339AA24B0E4B6838EB84B3
+A891C4F078A69245717FD73DB2704A1147970CCFD9E4B4B1B109B3B717320555
+D6E7A3CD8DFF269AA35BB959BE5A70946ABA128DA86D92B92046BDBB73C7822E
+CAD1F50FD9C064364071A9A8CFBFE3F365912C2B53758807859107685023B015
+E59A1DB2C85CAEE13175BC9D60942B31EDC438AB4743AF2CCC57A0379F922DF6
+11FD6B1AB6FD9E136EC11148C08372C65278116A1457BD8DED61E3B987C0A3F9
+FDCC5C1BD67A2AFAA505A50E925D18863E2FFE33E293195DA5B3B9B993BEA762
+5C2AB3C89DA2BB72EDCADF3C7993445A26191124196494FD3819F38E1ADC02F4
+53BC8487EAEB01B6502343C360EE62FA6A5133354DE836BA12A6E98B3770051D
+97478423C4C26A75B667B30844EB7C7450E39439F5E2FB30763E519F67A1BEBA
+1164E4CBB723531B04BEE7572C808408965E4BD1A9C991DBC59469C57504EE3D
+0EA77F0B688DAB51C1A11B5447DF43B76A97CFD09A6239A8293C9BEBEB2786C1
+04045ED4F8791918648352DBFA58626CEC471E47A0C2DD369434AA93C4D13C01
+FE22FC16270445D61BEDE0CA168DD7AF4A4DF923FA871ECE63ADF237D37CEE47
+9C6E657A4D8874F7872D0B62F775570AF435EF8FEE6D3C85571ABA7877348E32
+4712DFF94F1DB89064281B94E44B3606A9D3E63646F40774526E99390EB4F196
+4CF48B9F39EC5079091E4FD385F6B7A98DC6076582AD027DC94E7A4501B0BB26
+8C00F79509D91279A17BEBE5FB19022C1C98B784E113C126B9B5568E20700322
+E45F1CA1662471B3F3E667EEB8E0DAC038199F9982DECC9EF81B8560C697187A
+F83DF3CF7F399328C13ABE41F7D091F60046D72E8F94B94D4D539B228754B4FB
+769A930980B4CA7F2D88D31A842E45476E34EF002FA928E866584C7F93908AFD
+E8EC64790D76157EF201BED6903511F4648645B0229E648BF2D2A61A759F0B9B
+E80C814D449D65F0B7588D27BCE36D70EABBDCA2A09973BE36DDE06F651C0E6D
+9A83AD303008986B2A94C0722620022E6706BF709950CE9B3EB09D8B5D4C50EB
+922C5779A5A5350F0CAD649D175EAA8F3FE4C7E6ADFE77B5D9184F750E51A1CA
+1C1021C89AB45777CBDFA4B7DE550005B10E21BC4D1F034A03DE398CCFD7A21A
+A68BE1161911997EB8F43B150CB2A683FE2DADC53914338EC9DBB7A26718E86B
+51B8D8C9E098B021C510C1FA908C4D5FA8FA60DC6B4DF825352610D5C65751DF
+B3F01EFDC2D71F49C650384595806CB70B21C2503E27A06E817540EC46EA7772
+E876DEE2F17252F39A9D57A542876D9CD51F41C489813D62EF5F7BE7BA6C3644
+42D3AFF0BE9C63E2A80A4ACBA1C2E042983DF080B162FC392987DBC66F4FBC0F
+DEEF00B9503C7699DA93160EAC233C7DFC7F09F91752213BC63D05775706A18B
+45B5A9BE0DB983220AD2F24DBF5814314E194528AAA540BA19C95DA8622A2A61
+4FA39EB7BE6BDD394DC9B14A77DAA7FE758F6BF5F0C7B5C3C1C480CF3B41743B
+6466B8C95F4C112879386508264549A56250D02462ACC3A5CA62304138A90CE5
+E0FD95D975014F3FE0EEEF30B20C5F21CD179246EE87C057FA304689471D515F
+B168343171AD40C6D321510804AD735871C08F0C14A5549D21A0F4DC1BB8115A
+4AE7E8739DFFAE2D51E28689ED56B3C9653CEC7B160B5A90600A9EB139E3C3B4
+99B692C28028970D70BFC1CB3B5FA95900E3E68BA80853756B768E7120F08BAA
+67734E0F5588B1C71961B1CBDA92036DD24FF72EB73796C52BC00EDF27DDC1E1
+7281D147BE84C4FB91A68FEA90C3E245FFDDD78CAB1CBB53F1DD75449C03771E
+5348317A3C4DC79FF83340E91D29692DE71101A7BCB4CB400E8D81DA9536F601
+C84BF0277EC915E4A0F350038850E0CDBFE9250FC166EFF1B12A92A6C160ADE2
+02A9B84DB6F998B82FCBCAA88B22E24D2528982F3F4FD44F722EEA4978BC5D1F
+9D8FCAC59E66A969430B760F7433A4195A10AB6691FE2BE4057BA6B45E5A42CA
+A09CC3F70DCA414232372EE4BBB9972B730F1B5E20E61982E39BB4520E805442
+ACD3D64BBB96105ADF1EB4BC3EE8790DDE514E25A7757964E0737F383816BC87
+5448723D6AC995CFC16C6813234952E63FCB69789B5A25AADE08DED559289187
+D50251CFC03CC3217BEE1F024523EDD5C7AE5A33BE538DFC366478070EE20BA1
+DE588DAF0609FB946A0931922453E5CDD65A85C2B0A59E4CD661E447C42CE2F8
+34852015D26689DF23E52CB2275A21A0FD2F4F52A98D2BCDB53C09782226C259
+B9EDE48551F5154D78EC14315D7ACEF6954259D8AA6A8C76D476AD5D7D141B8D
+0C7B34988A2DF797B6F4319DF83EDB8393C6DBCA6CD1073A6D7AB000F5C911F2
+0BC35104C2B580D5019E8C16C1CAC5A84EB63C79DDD421E92BBF3C553EFE5BA1
+D0EAEFB56A51D13EF586B3D44929C32EF5CE2D087841CA2FE75EE9E79F36A018
+10154805412B91A4873A793DD9C1D7A1CBD25C57ECCCFDF950C0DD2FEF7EBE2B
+A1E02B6E2F884751A5EF3A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMTI10
+%!PS-AdobeFont-1.0: CMTI10 003.002
+%%Title: CMTI10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMTI10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMTI10 known{/CMTI10 findfont dup/UniqueID known{dup
+/UniqueID get 5000828 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMTI10 def
+/FontBBox {-35 -250 1124 750 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMTI10.) readonly def
+/FullName (CMTI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 12 /fi put
+dup 97 /a put
+dup 99 /c put
+dup 101 /e put
+dup 103 /g put
+dup 105 /i put
+dup 107 /k put
+dup 109 /m put
+dup 110 /n put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 118 /v put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7
+5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99
+8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716
+EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C
+02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D
+46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A
+4B60D020D325E4C2450F3BCF59223103D20DB6943DE1B57C5FD29DA32D34C95E
+2AB2ADB3F60EEB0600C8ADE15A2380DE10AC5AAD585FBD13097B1A7E8E210D4A
+EE96785449E07F0C8EBC2EC5EFBFD0897DFDC15E5BFAC9584D8DE95C5AB288CD
+8AD8B9BEF0B8E5F887B3B0B331542FC8184DCCB753DB6ACEEF98B85756B988DF
+CAF1AE0DBE7D37D5F44A2E760AAE3A5197C27B15E32275A64946C3E4D0476FD2
+7FDE148C788DD2106F7C825E270588AC05B57E625AB17BDD02306F9E5FC851DC
+32A5A6EDC43C770A71419B2C0C8074EF3F222C8A2097CD81A91F333A521B3A09
+482A4FE1CB231CE344AD126AA284C3280AAC3AD162CF0EE241BFB4C8F20502FF
+118507F5D1B5FD898571015E73E5CF2281085072E00D401F6F59761EEC3E8381
+1F26F75DB66C504AB6BABA87D121B1E7040A07AA2FE01F80DBC246CC03C4B2DC
+C2A715980C52B7F96BC1A78FCC7F4F52EEED5F705E08FC1E5BBFCAD121FA88AA
+8EBE58172C162AF409DBB0728F14923ED02A65EA24E5D52B6AD07777455A70A4
+61833D3789C719BA92E901232599767E423D5AD9C807670BE0E7B5CFF8256A20
+C7BF7214FFE0342809570F5966A2C43E784F35015D9040BA34FEAB6A6F089504
+3A40A9E9D711A2721D3F4998371430FB3C94BFC619559B97D49627BB630F4B70
+9D0A8FE4E916235335C3962F3CFDB04C4A3CF714DB5E260F4E66FFF2F27CEF2A
+D4AA26BBCAED23B8BDC98F8F453BA27AD7758537561E766B82DC3032E92A9EB0
+125D98A22C5466AF069BF72A9BFA052A8628FEC6A6AD0B711DFFEDE3AA2D7CE8
+34EA487038EF50F953B8B4471CBA6FC3C53877EC1BC94582B1123EDF44B4056A
+30F49394BDE22CDAD7F01951C7013D26979277D18EFA594E8F4F2B5E615187D9
+39E842EC28461B9ABA52020A127D2CB9002A673A435B13C10602EEFDBBA6BD49
+9DDEAB9E68D655443A5C2492BA061C1391A51592BA8C353A6F6A0708E8860184
+2B5D031D2CAB87D618E9F6F7A0BF3F66B3FD5A25BB91F7F1F5F99CFF56EFF4FF
+0A35C55658001ED2E97B26C869292F6274D433A5443179DBB8EE987196306348
+3F9E87C6422AFFDD30080C9AC4EE7FE5E2DCBFEE4974331F4AAE479FD8806D4D
+9C2B85FC69EB0453AD827A1E767E5C484BDFBF5C8D6E2B3C96298B390F22D757
+802643A79D5E29CF3AEDF0E12CFBECA4663444FC87F2027571DBA9ECF688BF28
+FF0DDB3AEDBA0FB28447CB4B5D5205F40C1E7A525FD7373392EEFFD910AC82D0
+98E71660A1B3227C4A2592F3E853CA4CDF64DF19A52582E167234F4036FAAAB9
+5446BE102DE2BF43E82F0112C2A20F15A3F92C6571AC761665A905362C4F8BDF
+AC8705519C99862CD9C0D75113C4AB5FBB83C880E46B82715B5628890D9103AD
+A2329638B95D93C4DECDC5E6C588C9D5183EE6FC28FAF9825F02DCA567306D93
+5440987A81B51EE7291107A08F201C609FEF91A8F0587E8B13D4BAF74A5A6815
+DE9E4441F46AF8E1DDDFA2D611C889614040B144A5EC064DEE4638C04EAB2E37
+4CA8F50FB8C4D65BB296DCCCD39F1F554CFBED96670A91F515CA10EF896874BC
+8EF48C6447752C70FF5A06F928DB55586354076773BFF7E94C4C3A7A1C1F421B
+A9B4E3936EC26E0C19BBBFC90F021E877F54B62108F6DD1C7F6D5B8E64FC9362
+E173F01BF2904B7E5A08B3543611562C2714099DE7D4FA330DB148B560A9601F
+42A84452811CE213DCE782A0D7809CFD954D6BC1EBF2BA4D1B18F50FA8174C96
+3E0120E266AD5DDB40B3F6798AC28CDC5C3C4BC34583528F5B5DC8A222B80B59
+A3A93DC715D061EC6915E6E6E21A25425C25E8747C60F170D61047108826F96F
+7830E220C108B441B6EA3198E33C49BAD8D43086E49F5A2BC7958A1A8CD011C4
+49045193394696EC3DDD0BE084E8F2E9F0B9496F035C0DEC1CE11409DF566428
+D50043CFF5CDD1092F6E0807E660B68163BCA738E8D98FC6EE3F713164CD204C
+0BA84FFF4F33F47BC31750B448603D7ADB9AE92FA91AEBBBEC0DCD66980E6955
+CEB425ED07115B24E40F53B29B9D840842EAC691B4F591F866DF27556474B485
+1C6F53DD72499847109B16C7093984A6B8487D4F3870DD517945CD90E648C1BB
+8A6861E540FCF9D75B984B5009B5CC760CBE297042C240DD624111670B703388
+6FE6FC0E89C6B4C88F51DFF3913D0CC1FB4770C8CBEADD4B86393605C0B6C468
+83CA5594754411B6FC331EF56D7CD6D247FAE42E966583C29239A8F862348D29
+60B177984B6B957E733DB4D275015691D91443BBB13C2DA96097A29733CDB284
+42F89C85A7A743338C9DD3BBC4EE53F695E5163E6E1ABE5791ABF100B198B9B2
+1C21E2FA2FB4AFE7F9BB2D381260CDD3A2CC05BF513AA1E80ED69FA27BC5ED5A
+21445BF00BC2F997B356D94AF13736C6D3B0613EB6F4CD96A685FEB672661DCA
+206105EDC3CA07900676EB2FAB37F48D2E8207BDE1463894DA3C5B1488AC1EE9
+D39DAF691648048F5D7A384B8927F8DA2BE3602669F71D80686E427F395134E7
+7ADCC611BA91AD4B7A0237213C60CF2C905359C90795230344FC3C50A22BD44B
+55B2044792509F50F5C21F53D9F9E9F063ADBED3AB99E2613B23334FE8DF70B4
+6120F2EDF69F50BE793EE145B9FF9C73179DE640FC2ACEB5C6617F918CEEB762
+4CD81E665B2E544864D13230B058717B207D3CC5D6647D5343DB4D0356082392
+871EFFA896631A7E0D6477942B632074A9A4EF7B09D4701B1639BAAB4E03A40E
+9B54A7A4F845CD63F88831EBFA4FB847847CB98F3455CB5957F2E0A0F5623645
+DBB5C5564C7F8B117D6E27E65C0F3EA81AE67B4AE4B201E7C4FB0A8364FE53F5
+41A7CE8F834C2C4B322809B353A5E63BBA7BF3B7DC1A85EA700BD287C2BD3FC8
+2832B0BB4695FC937FF5EF06FCD87DCE6DE793C2B1EE10E6450352C17726155F
+220D550B1759E15AB2C1D5968E52C8080CD280E99D3CCC0E80C2EF8BBFD96001
+A226FEED7311EFB4B67F424B557A877379A15BCA54780F0CD2CCA00400B9B39D
+981C6B552AFD2506D1B23618FA9AE6D8143CD7198A8482CB416CCE62B992347F
+337D505A4078713BBD91E5535BD58EF0351EBDCD749CC24D4AD39F8CECD7D6C8
+139756680A4C03A58B3374CEC658D30160AE4863A3938A891BB59CBE02BB451B
+1BA4B2B6E68AB61DEB85F95E3C909B8B66E220B9F18280161C279F10F7093CDC
+100A53D542F071CC0A5AF834DC1D18738F5DD62A5573E884E1FFD22BD810828A
+1EA47F8218C15A2E97CBC609927DA3CC2B802EA4A0D7EB57627C135E3B065905
+F97597D818A2C5CC6F328AD25AD11FA50F1E4FE637980B7474D6F85A521892FB
+72989AABEBE02A2D0EFE88A6F67AC29F5D8DDFEDAAF465C439983C6B84389FF7
+A6434462BEB7B07DBE4BBA61ACD4A60C55B5C0AAE527DE381DFECA2E6BAFDC8D
+310364ECB42CAFF72BA93C067B2F02D1CA7C34AE7CDC46787A0E234C8BE8A928
+7A6F3DDE0338FAD532A9886E8E3525B85DD39364AB03EC4C0DD25DC179CC1989
+1BE232E387E857C78332D834679195E10F1E7B87B7966DA3B2238F53D1E13FE2
+8F55ED6A92A750C7250C9B91E29796621E7E9520373214D7DA81B2875A986D33
+80382AFF6DE1F829F048E57664D9C4ACE91E4684A51023943A4964AB5657D610
+3A5405EFD4CFD1EBA684243E15093C9667797BB47617B66054EE02C41FFEC45C
+C1BAE8AD56B00D323FCB1D2744F061FA16E161988741A319B1564E04BA210996
+4F9F02A3268CABE450D166A763F5284954564A1C86B76544C5F5ACDFE0D758DB
+865A1CFCF9FE8CD5F9C3B2998C56468FD52DF8EE60C6935A3D221EAEC7714E3B
+301371C7DDA0B03A2416238F2B47BAD3A2C5021C886DF51C695AF9C87A864B48
+3BB3FE0B355EED5454B59B25A0D8A1B8CBD356C24F64D9B55E16C30C011365C9
+1E0380753BA3EDC0868788D5F50B9353D0227BCEE1BE36998B2622C0759BD66B
+E4444250589F9CEDE766D8B940770CB6B89503E925B35C00CBEC2873D2DC4A29
+0823FB7A3717B69A7DEDBAAECC067949932728E89BEECAA91DE3AF9BF070B9C0
+30EEFA8C0A55C8388CAA2F0515915C98E67FA095BB98967D14B0DCAFA9622E4E
+2E0EBFC768D80585ACDF28D8A5C2B6EE2FE7AAF62FFB90F569F84A0903996DF0
+C1D5723366C436E4088F3E2BB9B47F9789052A71CF5C49908CDC1DDA194BFB89
+14D7E3D7D4D72A150FD6FFD8303E9DE5A97A71B808B8BDF2AE466F31BF5D7A4A
+44F81230BBE2B456A221E2F72A8B59F8FEA8D31F8A005A5BD93B9F49CFDC3DCC
+CE2B67090460F632271C7157BDC2F05BC2749FD562FC28682A616A52D1B67654
+DF78B7843A9EC26A7DE2EB168F874904C2915B97534B2D4D9F74A9573A771D34
+9F7BC855E8F794621BF6AD471BCC347E2DF5F620F5C209E33A4CBF1EA85AEA87
+4492A77342DD33EF615FF34037D660B713C908786D9022051B825226545827A3
+2AD1B05D654DB6E6D261B4E8AF0933AD1F0FCFC7201E1A7C1B4199F160C38676
+21ABA2DDF1CEB655B3EC3226E0B122976EEA998F7A5241F062E54AD1DFD6ED26
+47C99A439E0AE95415059179867CDD3F0FF751F3141309F40E00A6C7C28433E4
+F649BCD5DAA64177580E05C495EE7BCBCC5FBF104DAF360CC2711386655B26F9
+D349D887EEB32ADE595241560FD5924A1745A22E6A01DB9C285EF14596EBFF0F
+03F36EB2E0A7C3864F819EF7B0855121292D49482F046A55CD7271FE03F02EA5
+886864D9D8EC22A68C23089EAEFFF03DED6484D8C341861EF8B6FD3C5BDF5AC8
+352DA4E13A1E30D0CB71E090E9CFB9AB2CAFD0CA7C34AE7D8E3B2EB4666834BD
+9CCD1AC2108348AFEF6071796F4BB2FFA4A67ED917E76A109FA2DC2A30D744A0
+9AE653A748C1D18FB52595D84E87F1C1FB6B2F32667FE203262C66627AEFFED3
+92B23861E5EB238BB4EDCE09DAE1C65BAFC198CDD1B45D42CDF93E16BB82D35F
+821E9E49067E966AFAB2AB52928F8DD6359984071FC37AA652FB834A09E5BD93
+3AFAE161140E74C6531E413E8FBBFC42BFE8A464B71EB1D8CAA93B33D7BCC3B0
+47C7EEFCD3E9FCF26FF9441DD9BDE68D77AD7251C06BBB9A2103049E8827CAF0
+F26BEF33F656A690235DEEC623CC519AFA82DE2AE16FB99F780FD7D8290DA40B
+9B604AEF36B529FD184239E7D50561A07428D28E51B55546590A1AEAD4B7F2B1
+AB8C5B9022C1FA03E33F8F409B24911AB8BFCF6EF4A8E415263C789F89063E71
+C0910DC20347469380B7FC1EEB87D4CED7F4A361E58B61C91AFCABA35C03F978
+B9FB5257C31657EE48504C355CE893FE3C553274C641DBC4004F5D5B879CC5ED
+D3F21F867F6DF054127067DE86189F0B59A1B90FDABCDFEE61423609D888EEFD
+F4A1367129962110C651D9481CEDDB8C5C2576A59AED64E95F7ED042AEAE2F7E
+81AC0C408E593DC30DCAC334EDE9EE27D932B98F040DDCD195D6155607DD2038
+970EB78221A94C52BD4F0EAC65F1FC10E5DAA93C17266F351669CAE56F42B68C
+6D01E1EA03AE554D63CE76D800FDD9CFD89F80A241EAEFF7EDFA41794EA25CE7
+97BD5028464D2CD45B53834B4AEF8BF0B9E7C6ECDEACEC887E8790A47A93F668
+A9095E5FA1116A122C0E5B74E2226C654D3187C6CFD8807917820423DA3EC1DE
+AA020EEEF2280C44A15209EE2F3FC1776875308CEAD38571E7BF889F287E4594
+971A83605E0B4169D4A23EE790515223DF8724054EDAD905F57918FC0BC64F96
+514B4BF7DC9BA79E763C22C977FB6146B10D26FEA1BAA7BAF21312F78D1625A7
+8E242D743471DB5821408AB786E4A7EA9D35E30E85533C617689F95758FB2C7C
+392E759C299DCCE36689686DE0C4DCE32649493650BA194A6208C5EAB670B170
+3F2C70BF0EF0E3BE2FB0A79224FF4ECECD6BB3388C6D06867A0E5E3DB93C1B2F
+464C23E44D3132E7D4086E3B59B1D13F49EB4772DEDF8EDC4F603217233FB7BE
+C13C28648E9AA51D53F11FB896839F97AEDD8834BCA53CB0021AE91FD8E95E2E
+F8A094093AF556B9639F508A401542B06821FF9DE1A745FE9AC5CACD5E8E1053
+911442FC15CA5333751ABFE2C617D38FA1DC332BFEF44AE569DC631C93EC54D6
+261583A695F5A392867A57F59B741EFCD2DCFECBC55D1EA5F2317601C9DFE9ED
+D1EA466210FFA905A8F85BD58B98991BEA58DFD1CDED5C9B086D42CCE632DADA
+147941917B879139E016B0DDEB8446BA017FC8EE5A354533D667B0835F5D027D
+C2D580C16B80B3D05CC92C0465CAE077729F0A15B2DAFC89DCD349B3F81D0516
+C65526EB5C10E45A8A85D716EE35FB9AB201FD7C89ADE5AD925A174169DA20FB
+61E96C73A143DF964C20589EF24A0FCFE6195317F2FA0D2249C0D8E649C3D9AD
+FF13332EA2E4C9CD36D8443EC8F027B61CEF92C6A6B72DD4ACBACC16E429A9A3
+F5F29C1631360E32F8C1C93ACB22F810B86D2969A7480F486F62F8488BEEC74C
+2C1AF13BB92BC578E8CD30BEA6BC8CB68ED730F54CED0167605FA76AD7B7E88C
+7AE7688E598F91C471BD65A542E96D64B1EAF19FB4F1234308C48C2DC86E2193
+11ABDB4C6189C6F201627C693691A86DD07FF55C30FDB3F72381E09C6080FD7C
+9182762E5001E30F52A216E0B71E4D2D4E2F3B20F95DF3A11FDB2D2B5B5FAA66
+C46226D5E0C77066349770514E5675550FAC9394FB27CD2C2F974F1FD58C04A3
+1EF53A8AB3B2202CCA1CEFA66228E1480A0709436C44BD3319C40CF888AE4692
+5DBBB52B15CF3A518F627F672135A24D5DB9B2EBEF04C860AECF231EBB5A3BF5
+6DCCD5E72FE4B6DD29E896691868A7DE4120AD06AC573F5608B8449B38E71CA0
+EB5CDA3F942482EA7973661170F81DC88D54DD5B92323F46F833DFA757107E9E
+F62A47CC50FAA1B68ED535C3E0E1073532A05ED339C8D70B3B9864808ABACD23
+AA95E9FDA43D54C66A675FA074E0A5B8777D3C07850A09087F36852B5351F35D
+8BC4DDFCA35CF29CD5E3DE118A741FAC4DED36847F2E2C6CFE08669301722D94
+376F540982958074E7F1383C409652F6C99DA39FE90B38221E75BC1ECB93ABF6
+B00F410A0C5651DB418566AB350FDA1789AFD88286AF3BCB42B98386F7BC144B
+02DEB8940D20A6B3062F0C4244EABC50923390064F1D027A8BACC3DE45156E56
+4A942D1B87F1C4A76B0D4D6801AE792CCAE3009BF25368B31B6AD5476FBD3BFF
+9759EF463EF5E78E10B7BF64005B2ABE0E8813950A08A1808587A98E0021D0DD
+751AD515E8278F1A0759E85D8A084490BBB0F8206484AA36388B1013643D3198
+3509078847BDAE08E76FA5BF3E3A73C323CE093DCC148E3C02C2DE1E26C94D5A
+40EC8308ECB02FF7DD04EC1005A2A0DC74D4E587F10A3EF349E828F69FD38962
+2F0C74D5DAB3ED6CC9F97008ACCE74C086A503948DEF1AAF58FC8BEC703CD360
+D32098A56AC776B1BD08442052A2A4EF6C8798F7CDC102AF1A2009657254762A
+0793F79A39DCD6ADBAA5EC84A7ED6018BBE727E5D477893D84F157074B24C13E
+8D4881C7DF8ADC13EBA0D89745EF93B7616EC5355600BB0D2B630AABA3CF2946
+AFFD0B2B724EF0F28393F3CB6A4DCBBA655E3D6E27F87E6D8BE12A15D35E1E75
+D36532B9C5000C06A58822444593A1038EEB23C7AFC9EEE3907DF8232322B09B
+230015E014F1B4CEB866234266440AD3686E30ABD086CF9C0926E711F0757925
+5DEB3D39C8E6D6F0C05A364A0DBF90F6E32CD28887F7E237E04093E07A94C973
+462254BC1B1586AAC29FC7F15A80FB5993ED22E79A0FB5BF0F7362CFA24BB2F3
+D4EF7D39E1902C53053C27E2AA49C4DE54A05AFB1AA6C7CCFBD9F72150DE259A
+BEBFCA5C7E828BE667E9C72222B84C4C79C2DEB885A69861DDB635B02814BAAD
+9672A14E50D6A2A236AB35C6DCBFA1165F47F8F52B0787EB4B70BFE3CAA8B511
+A630E8148A51C1394C7C321156CF52EE7BFE07B6C354CB65782464D2BE42C0D8
+14EAFBE88DA3D5C90614F22E02626ABD343F3AC0A9698AE84CB97F1CC421D34F
+98B69FF4C335B95F4222A8BAB77662B4A57A4B574265A679334D5EBCB073FF69
+66BD9322B1C2253AE85AB38889B26761BA509C7F638C6CBC4BBCDBBBF4BFE1AE
+855973129978F707C87462B67509FE6EEFB5E0949674C34768F001827F12F1BA
+77AE866711077C30DC0E40C2D8A6EF4D85355E596E26B675E8D223D4E55C3580
+5B79260E90985DA5E5B2F43DE7713D5E67080D2843D44A3585E078615BEA476C
+88233D241D3A427F9B1AD26ECD535E46C137084A835CD816CCA936D0011C53E7
+B33D5B50ED7BF3F41289F48E394BDC963EB1AFD6F14F0C146E0F13B03E76B389
+8AD8E81E41F14D1682A113D8BA1482D9DDFDE71208AFC351B62E028C3D50BE01
+FC9CD5D5F36E28DADB469201F41E9F39098B65E43FD1227A26F6FF812CE452F8
+B5476C28FC1B1B3E5FEF3A3B94CD552E29288AB0A3ABCEAAEACBD2D5E9001579
+738029B0E7F635C6C4962340187558084D9CD408EF7FDCE23F465AFCAA8EAAC4
+8855BF64EC9BC75371A98095CB51BE7FF107E4C6C21079571957B2AC35ABF77E
+9DCBD599C549D3B40A36AB846859C7BD9F87A2FBC724621FC7B305F02742A66E
+F2BBB6B21671FF62D682982C4E8F6645EA4A7D875E03774474BD86F76AFD4053
+61E9AF3C9B374D730501BE61106AFFF8A463406722AD2C14D1A81C08C2A31E60
+42DBCDBFFE4056E6AEF59CA261835523196A8921D1BE0013F8B3D6F05793FD18
+3E767E98289DA6CA9DC9E2EF9E697998D2367E45AA87B3E75A57F64021FAB21A
+A480FE7095000C29AB92E6D299B2E5EA7AE1997A6B23E1F90549334F62417196
+89BF7E9F62484C2816CF5FC2ECB7DEFBB11E63D70CA13D96BF3DB3B95F39A41D
+2E0C84ABD2FFD86525323ACE4A85A8944601CEE9D157445312EE9EB81873DD63
+A1BF3256BD697289C32D8598046EF6F6646629A7C29D5B1C5855CDB95882C2D7
+73536D20BEEF480B4213C0F02826D89B76300F6BF3ECC9C1DF3AA2C91CBF7D8C
+2862CB42FE32A3715855D8B7B30FF83EAD80181F8034395A1ECCCE5BDE7A2C9A
+124900DD8F1732791A32ED4820F93BE8D15A5B5960F824BD17A8455F537A947B
+9726CDB5DBA4107593EDBBEFF3B140B7CF51BD51B099045DB94A946271DC6C00
+24F77C781DBE53479E423426F3FE3004F4282816CB898B570C171FF63B4FC904
+8D716F6B7F3BC9AABBFBF1DDF2779CDD19CBBB60DDA40D5DFC85ACDD2A0FD2D7
+6402B7768E5B1D7CAACE9241F5891F922CD586255D1D9DDAF0910E14F3A2F8A4
+631394010C96EB7EB6E3009591E12C0C80F511D1FF14AAF65FD0A74E56361BF7
+07826E5FDC23C1AC2A50347CA313AFA7CDFA9E42A077C9D301A351A89C4DBFAD
+5DC8757C93A6869B2EB9BD784B298CE59E14C1F64C508CBC1F0E3EF713F173CE
+E4139B6AB00D513BBA722CA46E21F6EE9B689E29A6CF80BB91656FDD6FECCAC4
+932E55395B6770AC6A86EAB50AC58FADC1408B43F0D45378E762A9FF61DA68BA
+315AEFC5A5C2B929919FFB3AFCAE5ED7D739567E868D77E76D4B70AED79F2AE7
+21CA3C966D95AA795904FBBDC8098C3DD628F503B3778D9D7583D25AD7DFA289
+204F6DC33211530ECC8E9D28B7F53F2AB48F21536F2FA00CC12DF01116D011E6
+F97FCCAFC752452AEF7E6D141205AC701FF1482E02C8021E7A50E515EB1531D5
+F0A3B72FB8B97F1EA6DDF4823AC8C1B492384AB5C4DA7035400A0A71C7FBD379
+410391CBEC1B137DEFAD3EF4F45F19A594C0E51FFBB619C7D111D213FBBB2693
+43CAE9833E9ACE422DBB6993DADDDE44DE3E990CD7ED0590FFCAD9DABEA857C7
+F5FE4C18C260F7428E4A71A65E9610CE16932F7405085CD9C5562CA83347414B
+EE167A0EEB80E43C1C9251882267B404676D5A4266C3F22C3CF38FB9E2414A43
+A82971C7A66DAE9474153572B8B92BA81F3253890A6CEB715B72E1E8C218422B
+5F12B8E5155A544FBF3A105DC23132C30030E335AAC5A5B1DF44F2EBFB93DF1C
+AD8A7D6E1DE1EFEE889DDD22BC30D51B5D0A6BD9743DEA811F718D243F589B41
+FD0E2DAEC6CA60E7DFF1B79F53C4E1A2D5D5903D85F35CBF76BC5BDD296B1BCA
+F3CDA8F0C8C61EDD7A5572763D566283D08BD014B18A1EEC712A0B8CDD4CB96E
+08E991E0E78223C434B338C6F78E2741DA608167AFBA9A05CFE5B6B4499D88CA
+99AF98FED3A5B1C10B71F74A5EBA7E4BFD7479D7C0C93217C7F1EB956F9A3EB1
+7AC6A9485D4EA93066EC87F135A82CFA6D2B4F252D4DE83621899D8C72270A9A
+BF5C17098895A7DC73DC69042D7D2F1E517A39996B75332DFB966FE556682E9F
+AA043C5C66837F618CFE04262B8EE2E34C047B2B8DC03171B4A485289C392DEB
+7CA7A789D1A58642B114D535141283C659EAA77970125248DE0994BE1BD57667
+520E755850D131351E0BD4C1BF71141843CE981E0506DB539A3A867D16D1FEE5
+F409C71D115BA2C90D27B2A8F5197EADD4FAB34D0EF448542EB07B9B2FE8EED6
+BAFF794AAC03C9AF50ADED1D99BD9859D0538229F1415CA971325DF855723A81
+C04DC9D5256E376A66835ED86671E18C539279615B0798D07798BD8C4F5A6FB9
+4F7322D74669AAFA796AE5B2B5F1F971E510C1A22A05576C98075DDA9EB886BE
+711211EA5F9C03986948964732849438ABDB47B88AC23E24CB4B82162533D0CB
+FE408BE676FF0BEAF32E558F0F8FA82AD625A8F7F18560E3601E815A6D94820D
+0CAE42EF0F650F7B954B1A52228F16683DF4E4F78B007011C8140FB87ACDA2FC
+664F1F24B9212D1D44D1172CA1F8E532DFA297E07DBB928C275C7929AF606617
+865E2F555664F953926C673CB8890F9E404259A729A2FF324FDBD9CCA92FA5C4
+93F926178D2CCCC3FAF83E2AC5F574A0938A700F72D89841CEA6AF46E31FD7A3
+D2CD51BA1730F7ACC3DC8C34B3734D4B710D0CCFC98DDCA3784AD038C2D689CE
+EDCF1A1F6314FCB5F59AA1C761CA9CC58666755674E7ED1E34CC5A7860C2168B
+2C2764E43812900E384962D7837C932CEFBAEDA1ACA75D19DADCDFF2522A4984
+6B40BDFA2C517B7E84E3F4EDAC1AA9DBF9C10E3B031BBBC917C75214C70C0DB4
+1BDDC12BCEB48930D10522CC153BE6C0E6B2DBAA48CD409E33EA5056108A38AB
+4228559D411FEAE1C0711190CFCBD66C4392BE1BC5F011E8ED31C83BC6EF1E70
+6E53A5037535DC8767B74025EF5F7A4BD3894071698C3A8D7181F60567E8B25E
+EEF20429380CF256671E87499DF2A14E73B4F79AC568F0A781C9A4ED22009B55
+C1D8302B7BCC76F2C14C6760C1711CEBA13A739DBEAD0F734E9320DEE0AAD306
+734080AA5AD5978D850C25FEC472047B7062487C2D0F955911C7609F535D48FA
+BA52F16DFE20A866221F463A5A22EEA0CA9247CAE708FD257BB51C5BF9075051
+2F5BB8D8E2BE94BF4BB9032C312CEFAD46DDAF74C68148F5F2CFC5C0BBD4E87B
+BF978A8192DE587539601EFBBB49D4CDF1FF4E229B299DBC3855D51571F5990C
+43DCCF357F4756774FC6AAC1707093B9B7926C36DC1F4814D3AAEA7A19F9FD22
+5DA49DB5BED96EF8C544F9BA29B0609134A3649AC6AB20476023DFD89D35B200
+A3ACC84A6F68C209A1B37F6B0620380CD2E4A23D08ADA7F66A3D129B702A2189
+9EDD36BEE9335386E4B742D56030C48DFDD1DA50CE4CACDE2827D4E1F7E2849D
+5CF13FE1BCD0DD6FCC9E7BA36CBA91A13E4B329E8E72F0316B2AC5DB80C4490C
+74C9440AE86D4FAEA76B628CF30E67609661299D1255EE6190A996EB0795BCCA
+B58CD015F1980D7951910B743EAF16374C4EC491CFEAA0F89731D14A0AF43428
+473CC721027C9222B5FE9287BAAA6D2D0485C65F46E5CE9B84DAAB44807458E3
+109DA0E1AB85D0608AFD7A9831250FB4A1E19AD26707E4C188591FA88798015F
+93E16EF116D128607F78D5662EB558E50459E00A2F7DBF72675EDF896D52F30F
+975C45C190025E6481C806A519EECBCAB88C8B9EB9646C5689D76BF8EEEF8ABB
+17ADE68C0B64521D69430B39849396ABDD904B25D620DE7503BCFCABA707B881
+935B5DE0AAFCE001EF33910442A82AA44DDC8AD235DEE928DC1706A1874348EF
+0A8ABA338D60DF49BC718627DC00EBDF887637C5E6C39C66B4488C5AF59E57D3
+35A70E00BC23193E0AFDB2D6C4E26C9DB95378C65FE35BA71D71B1C51190FE32
+873AB8EB64FA3AA7EFAC3BA3DF5D3AE4DCF5170CEB863D3077FF905F4AF13055
+F76C150A6DA1A7A80B798C4E21C6044F817F0408C1D3893381A08E11F9890A42
+62ACD1A61F9F640BD13D3282B432A711E5E624B0BCC771EA1B319843A7295172
+D661D1A062DB84408A21C82C781E02FDA05F68FF78C396C0C10C7CF0D3EA7537
+6667789370ED6CAC90369FF71A3E5C8BB7870C45DD0098C6EC30CD968E897D33
+C87971E6517FDCC32701809E27AD13C747AB20DF630C3480AB0F868FADA5EB45
+EEF2ABA20547B199F37C44AED38582FB94149BB53FDC70F12BFC4AE288A7F4B3
+DFC2626158715813F2E287513593D35A304D91687FF188861ACC64AA5F040969
+CB76B0877286DB69728CE7C2B0487452ABE3863DDB85202DF1773345B654FA37
+8A1CF611A24B493144EF62937F1F87B5B83ACD523DA63FABE1437AB535B99BDD
+8C2A3494911E4EF4324313C420F0FB8A5B2B5B5C0FA33E5DF0AA3102EB802B7B
+313475E5D27B0FDC37BF71136350056830B611B9DD6344616597806258120F65
+75BE0D46A6C5F8263F998EC717D42350A1873BA03EAD4C337BEAD1EE21FF6080
+97A298B6D92E9B8DA2AD5E688D99ECCF577CE1BDD15FFF28E125412C527EB327
+9723B500D3CED93AF7C930CA1B94FDF3A73F23553AA785E5D8525C605842EFC4
+DC427E47BC86A737B23FB2C9178FBF673E5403099A01F334F8E6926FFFF97685
+CA02478B0311E4F4F3519EA57B80
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMCSC10
+%!PS-AdobeFont-1.0: CMCSC10 003.002
+%%Title: CMCSC10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMCSC10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMCSC10 known{/CMCSC10 findfont dup/UniqueID known{dup
+/UniqueID get 5087402 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMCSC10 def
+/FontBBox {14 -250 1077 750 }readonly def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMCSC10.) readonly def
+/FullName (CMCSC10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+/ascent 750 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 97 /a put
+dup 99 /c put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 105 /i put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 115 /s put
+dup 117 /u put
+dup 120 /x put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5
+45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4
+7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7
+72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E
+BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89
+974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674
+11453BC81C443407AF41AF8A831A85A700CFC65E2181BB89566A9BDEC70EB4F2
+048A6EB631F05C014D372103E37FC3FA317EBC9973565A638403DA02E48B7D31
+CFF6C241DC5CDB470561002FF46437C06EF93BC99352DF04393C661FFFBF4BA2
+0723ABD9B3E9CA9E63BA57EFDBAE684655CBBDBA15ADAE43E1A2C98A3CF060A3
+D16AF8FE3A49B50A24C20EEED716E49AF6013D4D38CD9CC41A91C17E4D04D79D
+567E1EF49110AA9C34464E95D81A730ECEB2C9AF38FBA6B45E253288438B4CB3
+DC75B3A906D4357293BA41E59C35223A6C9CBD6FF5FC90C2D07CBB376C7320FF
+435A6251822BFCBB612CE630EDF826C37E95F541C21B93FCE127591D5E38165E
+2B58A34AAE37712BC58B63FFD70AB80F4F24612CFD2F1466BAAF3CA2BCB45148
+D0DEA0E9B8FBA4C4FF5B8B3CB02E461355051842BD1C94F41066B9B909DB83B1
+DCDCBEF7CD00A43E4C0B8191A29600CA197F0BA227FB8309BB539D2A620BAC70
+8A1AB2DFA51ADC9873B8E5582DCD3ED154E5D727D1665F99BD89883D69E6CC2F
+DB3A57AEB612171A88E22F038461DE03FC357F771675E34E90D4D19B4B36891C
+9D2333960400E97494F4FC4DBCE6A73C34A0409E433BBDC0AAAEBA7D3555066E
+1CFBB4515C8B573C9B9DD12ED5B6ECEBE35AD0DDEA9DB004FC6CB540B5117B49
+59CABE5FD74C6F5B6482B42C20B5FF0467D1DBD7CED2CC651CA57852B6FBB402
+A6764DB342889132C911CAA713A7F2FDD8A5E849345D6C81025E02F5B8B682BA
+90CC9B467FBC37362436EA6BF8EB62D784B01D5430147945BC09D1F49EE89F2E
+3E2B8E6D439248A56F82F2E03EA5C7A922F2813BE6538A3A423BEBC55B345AFB
+3B3C125306749E137C647D78028AE1FBF3E1A82C260132832A9668F454D39C41
+736717DED0A99F6B11F005F0E1D07FE84713AAB4C042FDC166AA146D7B5E9198
+E4F485BE5B135EA281FF1C1E616B5AAF02771F58C5840CB5A427FF9794F93E94
+17FD799C78AED1DC4810BCEF4C6C51D3C1504EA2C6F2B29805B7ECF97B5F637D
+FE92E168CB9029E90404CB54FB312FC7AA8A9F2F524C03E61F03B1E31D4F061E
+1677B39D5D30C9FD4673E1723F4AE3CCF38593AD6D7F61E9DF3C010E51F25085
+35D51105E1464BA146A78D7297D4D310AD91342A0BB942034A3EC0696B467367
+3E39D202D637E6B14D0EBCA6AD3CF22B07D4CA69C0FCBB6C93782B2F0DFC5AC1
+5D8A16CB5EDB671A0C1BA9D10F63CEAFCD0E06E42C730C8EF769CCFD57937245
+658F486036D37E8BDDE5670A212FB488A8753322A5B170C9662750AA958C0BBD
+8E97D8239D2A08B30416504DEEC4E506013E037C91785C674F8A6A44E23FEE6F
+CCC00CC5E4D355B0871FDB8ECD64F70EE32449BB5D6F84F8C8AA2D5B1A489BA9
+D7FF2DBAA8D0B84054E93D64D3E77850A3724824914A0F821EEC3D605DD851A7
+606936B8B9E24D6E932E16C448140FE94DD96C75AECB73850035ED9C04A1D93C
+64B21E7D4657E030483EC5C3554AEF8BE4D0FE5B9743B875340B09E01273DAE8
+F256C50A1A8F2E0417440A8BB0173F59E11523E1CEF2593A4AC5AF2167627B00
+C5EA97D125EB8A4BD4C372877ABF10F5B7B149D73787E0834BFB3084E9508DF7
+072DD71637019599252059738D4D6BC57A9358E4B14F6AF9C4B31DB8E25C29B3
+7A15F9953BD73ACDE5F0445A5DC406BB4635FAE51C1D8202AE31730E6F355317
+1DC197DB0B6177307C60E5D38F4487363EE051B2E609A52BC4D45B14B6558B6B
+5E1618748794B8340752CDBE7756C068975B559615D4CD5A97CE30BAA7B2B1A3
+2FEF2E055232B24FD8A21BECDE1B6A479A28EC80AE2CD16DB50B30B4A6CFCF06
+491C7CD5AC29FB964D4846415233947522676DEABDA0D9535F8507D33693930C
+B4E4240A02B0CE7EA288516B8A6EF908D7F8BAF9012D052C6AC96D9F8F6ADB07
+8984F3559C5E7E3022A957982155FC9CD599C74E18328D3AB46F9DD15D1C4C3F
+9B93ADB4489BA02CFCF57DE6270F3AD2F8597BE71786510EF08142F430EE5568
+4F9DDB792B7C46B6135E341DBBF062FBC50FABA80CD4A384157BAE57CBEA9781
+AA4416323265168AC097DE7E30A0D4750143A4FCE70A863A31876A8FA5327C3E
+36E89589E363AA2B1A6E8B09F5AEB8FFFD0396067173465B6503383DE517A6EA
+88C0FC08578398C2A721E5AEB29F4AC9BC990A50CD87BD35A11F9E81F68E7B85
+5E5B95A4F9A5D30379EF90D78E1E466DEF867BAEFC4F5ED2C762BFF099C1C2B3
+5E0DA1C2FB33BE1379413CDDB1EE6BB3A495331F72F2FAEB8152E8AD5FD334A8
+AAB0082A71D5574B618EA8D487B8FAF1B445F3395B1E21224F5492A0E06F5152
+7726835C900E2E52BE3B7B654183AEDEC68053DD0AF19EF6DBC10B6FC08EC7D0
+CC0E2C8FAF8C9A4C21FB7C34E074BBA4EE64226BEC8C928A784C1BEE35B72EC8
+E9295240B29DDC2539CD118BAC38DB3917D14CD33AB45FE47E827F2A2B193AFF
+53C5396C52CEA4F43F06AC2D08C74CC85D608CBA267175EC31311EE25AB48DD9
+FE811B411AE426C9FC0B6044D1EBF130231623F1566CEA4D1C06D8032FD9808A
+94479C842BC41B675CF6B90113BD681F8D43F51D5016D80EDC11D7640FB950D4
+E709A46184406ED90D0892A4CD9062938A8205697A200DBE1F38EB166EFEA0EC
+4FCB45CDAF82EA103DD6FDD03D146F3E42EDA6496064DB3F4FC1C5280C9E604B
+D5EBCA08BF2AAC90156C11EF68137DC76502EBF216F3AF3EE30DD2676D218428
+F41C655093F8B530FCA378B5769F262A6FDB4B66B83F18F050E77227E28D71F4
+5F4425CB8D51B3DAE872CD86D7804F870BC564A6DA1CA13EDB00D131CE4F6460
+7021661B99612629DCC20C85CF155EDC5111E015A77B0B82A8FC1EBB374B7EF2
+361419BA93B857D5C9944BB5B4AEDD86ABCC261542077FE09701C96370168579
+5F89D5AAA08D700E2643E88C2FB8D1D56D37AAA9744872E7C050B4CE046B47A7
+83F224FA9FD311C955EFBF173042C8FC66524135F579B1397828870D5C9DC71F
+8615FADE2A1CFAEA90F732B6C266E2F3048FC43EDA7A6B6D98E9DB793CF457B3
+F5877E7A055C92B0246FEA8C72B3B3456F93BF36E2651D32CD614C3AECC0B4BC
+F824C8363E593A6458D37408FC5B09883B280005DD24123E2D4B1B85F4113327
+EEDD9186A4AF2CD6439B46C5C168C125CA80F9EE9E68906620EE126CFBF26E15
+B269838A54224EDCFE2A373EB750D4829BFA410DE5F1541E428BB1E024AF496D
+F5F1C151F5A645C8622F2EF9088D57A2811868A8A8BFCDBFCE3ACB8463AC35B4
+8B6F44E1C1232805842F56FA468F81FF37D5D55B81CA56058558544C142EB3BE
+07CFB1F75DECB1E48C14D6AFDD455989AA6FFE8B8DC54F462B3C20E31D270BCE
+8E68E2B43A6625AC7E9792704FAAD6CE8BBE0B341DA7189EBB3E9D5375B27FD4
+12506D5BCA50AEDC6955E6C3C7BAA84BACAF7ABDF3A270C7734EC3C6EC22793B
+E67B0E288F99699D38DA8B79F2D21DD97945FBDDD132A8F0BF947950D3C0B4AA
+EB7B2C435AFE54489E1930610311D718AC610C21A644F34CB2D1959B3066F39B
+EADEAB5CFC6AF4D191D86B02402B00D1C5262707861C5308730579795EB53207
+A291A27A8B5C4DAE0A87A0C6A260026CA3CB620E1002E066A515D7990F3DEA29
+0FAC962E0B82B7A6C86B1EDC54007822BAECED673FAAEF88C8109777EB79A53F
+AF3C58546974F2F56E70E9B5CB59ACB5C27CB01895557B2D82134D7F02029B24
+3331621F38E68717F5CB68A8892D0B9C0A8ED4F8BB56E80505170D44C6856128
+2DED0254ADA4875CF56B4D97372AAE730D4C77A2940DC8C178274DF88A9EE037
+215C6FE7B9D481EE4DE809B124C0270782411ACCCF89906A8B143D0BA8B2CEDE
+E9B90465C3E57A4FD9AD2702323450256ABD09A1F8C26F08480317C08B75B720
+70A161C99715A35A94DD5C9647ED0F8A5337B774C8E54F9653AC859485A1FED5
+37B725A7E4BA58711CBCDA6054E34CBD8E9F9460179DA7DBD243D81A1531FDDE
+BF2BD425BD9DBE75EAA333B1F5793669A215549A774597E6ADA16D323FE5601A
+EDA41092730009A99BF5B5AAE281844A6BF3292D4D4EDE36B4FD8BCAEB6EB72F
+AC5D3CD53D0D621CA9EA8D254FDCB2B5161EE9E80B266563F669805A3A15271A
+0753983004A1ECC7FBADF62AFEA4DAB49A178C231759857DB910668BDB07CB3F
+7E8EC24901863088B3231EE3FA563924032C91CA9D68DB398F9BD9AC0C651EC8
+9051C9F709CD784F3FF5951DECD7E869ACC34B83AECDB011E6594347855EE7F5
+28811F744A4BD70D4E9077EA7EC19FFCF612689F12B34332857AE41F13E6D16A
+962DB9B6AAAC167B9FBDF0068EA13412F318384134B29F3F0C399F1973A3564E
+F9C3C39B5BDD4C98D81A6CB476E565860B50704BD65ABD630A5F1372F2D826F3
+3AD47C08B8AD3176A170C369EF3CEEB190134006D6135C5B8CCDBE1C11FFF1EC
+3F6D8C46E15C4F5EB9ED9F31A129594D542D40DC3815CD075A0DBB648D868AF5
+15A05C4BDB28BF23653A3AD96CF6AFC065DCCCB23D5D9A945F8CBB539DD3BFA8
+DB8F1FBF9B6F25B41EB4309995CA3D5D6ABD70CBB4A2F0C6364E5439AD1045FF
+72F6B45A30BD3A548CFAADDCC6C15D46F6D783D3E520215751DC98335A4ED512
+D7D19235CDF911CC69F3CF4365B678EBF3E87C456A4E77339C74930083445588
+462529C22A96A28C5CE87AFA0C981F26CAED5A1C8DBCDDA612624DBE0373F026
+465185A4D8C73CCD8D71EE97116F8F7D341B87FD78F9CCB9FBDA2A7799711607
+6BBA855AE9D5C505870DC85FDFAAA130A351D56AADBFBD6A7D52055E3200F8B7
+8AE9A00092B55DEA8BDE224B4BA7FD4A191CB1FFC4CB995FEE1AC2883AB69E1A
+AFFC09AB5B9AE311A030A5BA05E2213F9BBF016C8FA80689C069314D91274B20
+53FCC65C7D7B3A7504887525BFFA060304931672A078BCD7F269595686310E34
+E1ECA868899BC402D17EC36CE40D5041D7CEDA77F7764C9D98793F5334F574DF
+E93CB10A5E8ADAE95CE63D2339557091B4B4911A4987CF21B7F1DBADBC2DD605
+8EB72473C1F2EABCC44E0D0339EECB55DA74085606C3F89D57ACFBF5755A5395
+CA8D4BD47E4EE8D8B882D3AB31A1F0C62E74654C7E041E4FF2693A38A9796064
+46526B0A37E6B5BF8E48E80EDEF81E34DA8F6CC9025936A4D0E6D709D61B7B5C
+AB550397117F3F9D2F5A542A64DEA8E1178F7337124D6B56BA92F659AAD694D7
+391028731E01284BFEA635314A8DA8DF7A34EA3B6B2F8803BE6DCB423A9E8015
+55EBD90EBAE8A00298B3B6B1C02BA516AF528122C1F2B07EF69F5466C2C36643
+0D665D6561705509B7582D8301AF3C32E2F3B9433E3E04D62117C7E8A368BDE1
+0D4DAA1C415B2A6573116D2A169AFEF700A83F55D88813585E89C94C07802BA8
+3AE8F9BC3CDBFD9C2E35D062B1FD6E79E1EF104FC70B0AB09D12CA027F33F85A
+22F0ECBB4AD55FE8C616B82C46CE69A600E4F767BD7A9C5F9B37A3196B038384
+5DEF76A8884425FE598A63AEB19FA698C2AF7CAA4983CEC789268E22BA051EE0
+20A40633D22D8F707626ED30E8273EAAD1C065F0B2E1718B5AC853ABE09330C3
+B0082A71D557169BC1559B6D285A3499D41C4CCF1F74884EC3917EB9C574371E
+AFE8578DDCA459B8D22C0188A8D150437B05FB92022C95EB6FBCC954216B5FED
+CBC7C90B9A1F061376A9840FB64390A6BA99CFC8279A86A730C6DBFD14C53C4B
+7277D676BD42203677E9ABEEC8C97E13DAA626474513B06F8734DD784F2FBBB9
+B3B448B8E8221E380AB4A86D3A683B86A54129519D50DD4FE63B30954D805CED
+A9A5D9A39C58B65B08E1C19555E927C6DBF7FD07252B2B57F62B905D6B488201
+213D106A41033B26FFBAC2E616DA6ADA6D560BADF10E68872806CFD6F6E19D7B
+57CF1F7A030A7BAD374F16A977E0ECB8742D034ADAF9C247DA19C8AEA74EF6CE
+DAFD6B1DC562FD3B77E4D008BDE4D8C7FCA9895DA1AC9EAA01C32A0DA712B082
+9438E77230D38FC4153E1711417B918BA6CC03203A5FF082AF880F48518D8271
+C1121E4F1386B30A7F1BC6F10EA98443F8A65C867A109336B808BC9A8E2A75AC
+F950835AA84B56F59DA4C8A18859C3B68F6B6DE09A6675F639EA9107BDB67B0F
+54EBC564BC2D781B61C14363A54956BA78A2BB89C9F966C94EEFC29EE9F4E23E
+C0BF750144DC289F0DEE1F8A25BB52E54F656FAFEE4BD2DA57E1306BBE648051
+1D0CFD6A23A3DF082E3CF13197BF1B7FB22B2CD427BB78F455C9634DF989DC90
+7BB2AE247B1C99AB2062855B2948341B0F857ACD750B59E370A6698C6A1F5287
+72A4A9628A592E313956C242DF8277EDD2F1FDFB07CDC104275FFBF796D7518A
+DF49FF3CDEC3BDFF1D290C382F244DF18005ECDABF0C5C2C64EEC4383E2E07DC
+5C82587C071E59B46B7BEF31D268F39D9B12D534344FBA515E9DE8F166FAD1E2
+7D1558967AAAD3829D3F7EC6938D20E5379F414532976ABA844D97A5E9078901
+EAE4D0ED1F4C7EE7A2D80D891A5013D6409A38ACFA497F5A169EB7F9F4890DC4
+62FA6A89EA48267331F086992B9CA9305E16611E6AEE67DCDD588A25D37F45B1
+0DE75C802EE021E574B64B3969DE2E5061ED9364B646C38D4BBA86802CA6338A
+94E135D2256920EBFB1AA22D9E90C7D16853F0DF9F2D942748EE540E4FCE63C6
+5380D7AB4ADD6CB00FE8F7867E4862D8DB432F28331428CC350CDF7F447A65ED
+D7683ECA35A22ADD06E9FE6BAF060913AEEE7B2B8EE4798E437698CC9EB2428E
+74CE73F84D0D2292DE709D71FFF8901C3505370E6F1D4E28E6B7372492C65A88
+159371B1D60D77CEC93B272B6C5394EE1D2EF9969DB2838B8E128553879A1BA5
+2884B0A596E8FC3D1E648B7E26A4AC57DF09B9CE09B2F91D8CA618CA52AB3DBD
+D005A56A420366069B73146A6F58E88BA49671A1AB7C2070C3D42AA770285143
+40AE7D7868C0E1993506B07C086AD7D4F28CE2D15853FC5FBCBF9425D8012B9E
+DB6E1E5002517659C8DA69DCEACA94F368537668843D281FC11782F1C5F71977
+CA215349EE6F20565DE3D8D8212A40E1227A4B22965FA64A0B02C62BFDE97E6F
+C3C54FED4057EF9D258C42D7440C78C5E0CC58A40DD74ECED4152F70A93CE71A
+1B3A57C46F74A6D27BF98C97CCD31A8EA487260F224A3E40F52C65490AB4098A
+7B9EEB54A5A415C8C88568F7D9EFE74BBB785FA18AA27D9201F28BBC477A20A5
+D1307AA78EB8C7CAD409AB64B29E4115E45F5FADDCC80CA74B296C4265A40614
+37F2ACD8386AC0202D6FDB6711E8CB06442F209D781E940ADDD6D881D4F8E874
+357C533115923B90138FFE31D3577C6AAE60D768970FAAB682CD0DCA3E9A9A68
+6393E4B772691C1013ADFFC90C508D51B02D2518ADCC7E79F7DE5DF9D18B8435
+6129064DD1A3995E5A6F45D78287CC10A0EAFBF47223494C5EA934B1BC2F7C53
+686C5880303F9E3ADC8B100D441D944686E1FD811C646C6DD0224F6CF55FA87F
+D132EF50450879A25242A18683BD6D0266F8F333F3768D1952B0F32AA75106D8
+EC0AB703F287E847CB91FFB88CD9DA174B49171822BDE34621CF41EA772230A6
+3088F8D19CF2364A329162D39E166AC728B267758341630B00398D64538FCC4D
+E3E6CF103794C29AEF7F7E56970F6B1ABA87DC8D23E280EDC77556593D02DFF3
+154883CFE4EF04E07E7539A4750FA1CF1A994E99B656E728D140C83AE1F196AD
+9F049188A4184C84556C0476BE46DDA8ED86888DDA3065C5091D99EEEAC43092
+40B97AE327215024ACC0134CBE91FD761C26A48EDFF9028DA28222985FAED7B6
+A1CC891D07185666E34BEFBBF77C6C32B88FF3F1046E4EB2CD942E70746DDCDE
+002E74BA03A2B15E0529E61DCAC207A71F61C89D81B3C53C5B458EAC70ADFC54
+810310CB04E1A21FFBC5DE2429EC0989A3F2B6AE4290A005FBE736750956765D
+637B7CABF7F9A593D9FF6C322895835C0007A78771D1404671122F9CF898AB24
+1A5648EF8C40B27FD537612C4CBC6E584FBD058DBD4F0A00C63A79077826D3F1
+859589B221F7F82DBE392601B0A89142648EB40BCD943E382FC7758A10F978FF
+6DD9C3C1D284C5642C812DBF29A75A50BF63F788CBEA5883DC1544ABB49289EE
+2C99CB03C1BA72C7320904C7EC94736825A793D5629EABFCEFAB8D28B6F23858
+89A6967942A943FAB5E5B26B8567CC9606DE60329C6D890843F700FC1F60656A
+38164ED7976AD47A8E54940B9E340D61353AAD260C9273D45772AEC8E9F4F045
+9CC576D152757AF3B74DFB9B6962001EA9FF7F62C2E36F71D9B76BB99DA7631F
+774795B8CD1E08480153496DE5E08A1F4BEA681D0C1D6336A49A222B0537ABD9
+75A3A9D27D0B71B8913E9355F8E56C5FB3E14B9D5ACC4F87339FF9D9039ADEEC
+660B5CEF75E7C1772D4A3A4D0C8976A165766D9DBD0CA8132D17E5149AE716A9
+2E255277FB5294A96194C462C74AAB251A36941768EDB3EC6DC2C481393ABA6C
+8BC2F3AB0BF5A6E5619BE16DF43BB099C6CEA5044ABACC419174664232E97B29
+ED32362D219AF109E5D8CA751EB1F9F31BDD08C93AE018E5269AC327FEC67D99
+588CA80F068AEB94A7B943BAD5EC8D89C0B8D153B4345E77A5AD9B4522208A33
+DA92CDF765B44123C6EBAA06D629EB9E8D0FDD29BFD60EB582CB369474767FE4
+C0947F27DCFE0C8BD3CF5131E706E02ED136DBCE6363CB5CA637E08C3D832037
+5AAA88B746B6D915EE72D7B458C55598DA6284F362D2DBF06C51DB50A9FFFB5E
+EBFD69D8D06AB0A6DF2D03F6E14FF290B1A1531109E43892B82B29395910021F
+A6EA74B8420A14FC189741ECF67F81686BD3C5559DAF75DF9FEF3346CCC35AC5
+37A1E30C2602945974A2359EE3183A1AA568978F7732C35BE2B9224C27161748
+515E5899B0387F0640DE1D712F390A8A026FC5C5A893E98F46B418B7B32BEF07
+AD0EEA87737D929180B2BE697D0DFD46CF307E4FF76BC03492E66633F1357848
+AA5A594EB8CC5913E76602C9CF8B7428F67965D5BAAA29BD6C978EF6B22B0BEF
+4203B223443554971EFE558FD2F51D01B35D2194A1F6820293385CF12DC1ED73
+79EA6082A30796D5EB72A67C5DB42A01F18CCBFEBE2F10B091C43C2CBACD8914
+D665B340281C1EBF92249FBDAA577CB7769974B669DA0B74E822EE5DCF3A32D8
+9C6714D8C82CE9BF3F16E6336094BC55381E73A96D45B7A70AE00F9CB8348E08
+2A64E4B40B3BD0A653B423C5D3C1ECB62F5E05393FB8C9B0C44AB26F6BF796BF
+5B51601913014ED708B97731A5642351ECD0F6CA9C06832E0BCD0055E9BA51CB
+7242CD34AF0B75F3594AF9235C42B974074665C5B6C934B08E5C7F55638E7DB5
+312BC541A8000E69A92ED6C63AA6485A50DFAA1DCF9B0DDAD23C43DF22F3000C
+0CBF6F8F64F37BDF8F8DF321FD8F42C3FF774A388F9C033572B177A493814ECC
+BE19595AD285F11763857603EAE0D6AED509225CACBC49351E6BF1457BD11490
+EDA1C3DD6DE8C7036464CF80FE562CDA51ED2EB92BBC79252FA79EAFE5E6BD4F
+DC16AB83B2C902A9027BA4AE30ABADFF6D513BEA850FF35416E76FE62D8E88DC
+69F0C60921B33BA59FA3EDC8F532B47FF2A5E5680BEFCDAEA4474DFA2F8FD68F
+74B5837A22984A7534A5321B83459E436AE4C498702EA14A77D3F78DAEA47BA0
+1BE6CFAD95132683BCE0601F3EDDEFF5207FD5FF3CC9093ABD946CC7C1076DB9
+4DAF08C682269CEE980159541D92FFE484B7440E5AC58D7707BAE579605D1EB6
+42C396807AA13B3ACEDBF3A465CBD56F076FA9319E43907B6522904F92483537
+6102700CEAA52EE916B80AA4C5F8C98C9AC9557F97784F075D37A83649D632F5
+82A519507162012A671F3B4DBAC454D920606E9C87CADCAA1172A04E445A28A7
+0FA9545E5FFD15302664B5C2C4F479C8C760C2A015F5F5CB51EC6C0260154D37
+4A65B01E58B458ED0FEBBE74884C9DF7D50770153FB498E94F65475A5EA6A687
+543DEA3156D3E5CEE23923120DF4D561D2C082F1F3BFC5039A1DFC1C9C3A328E
+6F879AB979F2C177FBA357FD63F8CC21E8AF632D6B01A3AC3EA7DE91C17B8120
+42E78A1AA2E04581B1C434A8147DBE81A87C73782DAF4BD5F309280FEA22DBAF
+586AF386182364E45D7DEAFFA74E338E875B64B13CFC909B30E074D777D347ED
+3A58A82D5F6A6E913054F9FABFDD9ABD8BBF54DC3480F3A90965A0081092714B
+D77604CC7275050DBCCC800BCD8E2BA540B18CB07AF27D66F8887A571685600F
+3FF8C7A4966A8CF8CB25DE0495CD4E048999ECE6579AFA82D1644FE160E2D3F0
+EE7CE89045332B172425D7D1443E8DD9043A12042ADD7EC106CB4DAAEAB310E5
+85F93869A1C519DC0E3CF8F4C05030F0BF7054C5859A74ECE7D6FC5644C5B84A
+F3EDF0C4B2DCDD0D193599CB3CA00464A90AB55674F884001EC896726A9B374B
+3A73AECDCBE06895E87FCE6267091C6CED0E779DEC36D8CC35184E00247AB90C
+37161FFEE7CABFD7499859042093BCAE22D6B811FD16EFBC8AAE6283881C12CA
+98E0792640063169F76B18EF543AFE7951E82EDB1DB9597F2F9C959B69943379
+CC7F5BDBD1BAFF7C77AD8D504D5F17E1B7DFFC515AC237748D33FB6B9D7DD903
+2F3E9768290A90A5FC5EA516A94C1885B17676D33CE4124CED1359E473305B02
+03C28731C0FC52B18FC14360C9494FF2A86AEE929E4022ACB78C02ADD6174FD0
+D35105BB00643F6560A9CCBB3E5CE2F79F0EB9BA774D27DC476867C991598380
+F77CC0444500CF43DAB8D729B31EA5A3184F178F82622A8B711A9CA6A770971C
+521C44969E814B44D8E1927C283E6A38B78D7C258630730EA463FEEEAB263838
+2A517BA176D1C137AAE7430532FFB0FFCA8BF110DECB42B1A7A9457A9ECCABFA
+D6CC11CD925518857AAA8498CEF35377CF92FEA77C09E6AE25DB2D09F1E355BD
+7F7F5C72A76315F3C2B6BEA1AF7BA5D0E8000778A0FB2C60FF677ADBA9156A11
+A5B0B7AE92DB368571C040FD7A29C3DF384CCC29A0E9F40FA385630D23AC1E97
+C15C06848761CC7D19D208BC115A6A2933056BCEB3717CE2488E86D0B0D6D276
+22B2FF1E77FA719372BE62A5B6E10D3DFCA57DE70AE16C57718B86C58B6A7F3D
+C6DD45D7559F9A0ED8889E707FE7622997F2D573F7688621245E0FB3D34A08C6
+40B72F4BDA0394CBF90735B9E6B3928AD56F50FEF9A5DA8B195008164EC03424
+7F5317FB8157C33F6903FD6D4B4728F82F1B02046DA16F4285DF088E08A136FD
+1366494E3F5AEBED4B48B3B9072BC811A700940FF4B2A51C0434ABF225B37BBF
+E4AB11F394332D66393420D4B843CAB6AAD9C32418CFE6A2A1260BF430E61176
+4B1762E3C9F1727BA47AAE4C7589E7099A56F5E1CB6BD64C0C8D026ED60EAFBC
+BAD1476E98F5F12ED94BDB1E4B0D8FE9E36CF40DA6F5B2E1BC41EF5F7CB49825
+EA5058FF7C49C5FA11F9F9F575AB4D8237FFC2573F94B695CBE9BC44A1BB26DD
+C6E55627BA16E5197CADA519CC7302DBE77F1FE4CF68C558D8F6E264
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMMI10
+%!PS-AdobeFont-1.0: CMMI10 003.002
+%%Title: CMMI10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMMI10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMMI10 known{/CMMI10 findfont dup/UniqueID known{dup
+/UniqueID get 5087385 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMMI10 def
+/FontBBox {-32 -250 1048 750 }readonly def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMMI10.) readonly def
+/FullName (CMMI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+/ascent 750 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 58 /period put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5
+45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4
+7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7
+72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E
+BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89
+974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674
+11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBC7878DFBD546AC2
+1EF6CC527FEEA044B7C8E686367E920F575AD585387358FFF41BCB212922791C
+7B0BD3BED7C6D8F3D9D52D0F181CD4D164E75851D04F64309D810A0DEA1E257B
+0D7633CEFE93FEF9D2FB7901453A46F8ACA007358D904E0189AE7B7221545085
+EDD3D5A3CEACD6023861F13C8A345A68115425E94B8FDCCEC1255454EC3E7A37
+404F6C00A3BCCF851B929D4FE66B6D8FD1C0C80130541609759F18EF07BCD133
+78CBC4A0D8A796A2574260C6A952CA73D9EB5C28356F5C90D1A59DC788762BFF
+A1B6F0614958D09751C0DB2309406F6B4489125B31C5DD365B2F140CB5E42CEE
+88BE11C7176E6BBC90D24E40956279FBDC9D89A6C4A1F4D27EC57F496602FBC4
+C854143903A53EF1188D117C49F8B6F2498B4698C25F2C5E8D8BD833206F88FC
+BD5B495EB993A26B6055BD0BBA2B3DDFD462C39E022D4A1760C845EA448DED88
+98C44BAAB85CD0423E00154C4741240EB3A2290B67144A4C80C88BE3D59AD760
+E553DAC4E8BA00B06398B1D0DFE96FB89449D4AE18CE8B27AFE75D2B84EFDB44
+143FD887F8FB364D000651912E40B0BAEDDA5AD57A3BC0E411E1AD908C77DCE3
+981985F98E258A9BB3A1B845FC4A21BCC54559E51BC0E6C22F0C38540F8C9490
+88A0E23EA504FA79F8960CC9D58611C519D3ACDC63FB2FBCAE6674357D7F2285
+4BCC9F54D3DA421D744D3A341DA3B494BB526C0734E1A8FC71501745399F7683
+FD17EC3044419A88C3979FD2ABA5B0130907B145A8462AAF0A9B511D2C8A7C7F
+347FF6AC057E6512902BFD2918E2CD31DE615F5D643764E900B60287670AE18F
+FDE15545D8BC69591A8CBBB275AFFC9B14BD68DF0AAB32268FB84844D4DBC7BB
+C591C1AC5102C50A9C7BAAA848DA88B0519F0F5F0813BF055CF0E3C86F633A04
+B779D2E8E656DB1E09A66A85FE21CA8BA5523F472A229E83F2C4E91ABA46C733
+F3C7B5775B06C97782BC225C46385BEBDC61572458EFC5CF4190AB7A9C1C92DA
+29F84BAACF552089195966E3AD9E57CC914D20B6962BE80429A16D4DF1ECAA66
+36C4343FADF0B2B48F12E2EB8443C4AA29D00949255F3968617F98B8ABD4CC12
+048B838EE243A21AC808BD295195E4AE9027005F52258BFCA915C8D9AED9A2C0
+80814F79CF943FBE3594C530A22A92E11BE80FCEC1684C4F56712D5846B0749C
+9B54A979B315222F209DEE72583B03093EC38F7C5B9F9BCB21DBE8EDDAE9BE8B
+75ACE6B12A31083AC8348EC84D1D29D2297A266284B7E9734E207DAF59A25F4E
+4AA38509E993C5394FED76E6A2F25462685C4C86C6E8CFC9863338EC1428BDFC
+74616BB1BC8948B0ED4C87C15B4405F3A7796F9DB3798FFFE8BD0A94E834817B
+D5E9812E308D0CC920470A6F2CD088FCB80462BF7CB3F039A7DF3DAF5B2B5355
+E083A385CD2EAF0FC181E40E96DD7E9AB9EF5C7E6866A13B8A54718E950FE097
+EF0951A357114F18CE9933D28B3A77AA71E3CE884661F13284BCED5D5FD1A86D
+543E588FF473DC2CF9A4DC312500135F29C2D0174B32018C8DBD40EF9A232883
+710A1F2AB2CD11312300ACDF789A9B7B93D2035D81D1C84984D92D78A53A00C6
+EDA94B24BBAC1AD17774A4E07E6F74ABD90415965616AD540C8ECD8C3A44EE4F
+7F4F6BB6238C5062D63FA59B7BF08BE93FAEA70A2AB08FBEAAF7DBF56B95FD93
+03CA406543BA6C9527D0DF01F5108D31A51778A5EB1C93F27B72B46146A353A2
+01CACBC829603B9989A87CF64528682CCBA0562A8165B185C58A5C6BB72F5E89
+500ACCAAB8ECEFBB2640E99EAEEC4EA979AA793D013D61D8ACF8784FF8D9398F
+F6A252A709324FB39509F0B3A4E725E82F53543383C6765BE556CC897C758208
+AA3AD37B0406E4A79F8F0A6C1983FC73E71CD858C0DB66ED66D5D992978614EE
+1EA91EBE191E082EBA1FC040AF19A2202575C2EBEB8058833E3520FA03D2F915
+85C1ED337E457B9FEEB0C6EF2735EFDA6E0D05FA641BCF698AC6B97751E8306C
+4DF00A39B8581FF53DB8F8525FDB196D85950906CCB59B8EF171349AA3B567B1
+6A00819947A995FB383C3C1709C9A2C113B2E40BB832B7D4A0FBA0B16A2C455F
+55809CC425C403E9668DC66BE45B71A81C332FD4DB279D22A2959962304A8F18
+085893DAC61317D24A8F198FDAB95F3B86F0AFD35047B868A9A17037A2829A02
+BAB042F75F349E197A7EED41984C2859754CAFD0251439921C248B463B516951
+2E1322C80D73F9CBCAA63A585450275AC2492E4D3FB78E800F788254DB5E610D
+CF788DF5C70FF99892BCDF16133E34B24B77C8F097F546B87C603DDB8998B66E
+BACB68BA27462AF54AA405682EC96D701F0D474DECD5F95CA2102DF639EB169E
+D518162C2BAE45FF698B6DE15FC6E7DE48C336C40A670FD26952A6BAB09115E1
+991F0073419F2CC2A1C08BE91096936AA0C37E4ED3CCCEE235476074B8FF1125
+6BDE3701F85532D8BB64CCC927CC335281C95EA689706F0AC717DC2CF680C754
+E5EFD7FA4BB8880B2B727A964C876D4A223069D4E6001771F0E23EAD2A4BBC80
+E76675297B2EF05F52BF4E71B3EE2BE3048CF088C79540113C66AE98B2FD3CB1
+B0741A215FD070882C52765009D7D711DAA2508F19AE7DDA15229A856AC49BC3
+4DDF40814FF96500E4B9B02D412E94623C5FDCC76C0FB8E42DF56A904FE49D65
+1DA7C53901B2EA71AB658A464D3ABDE27D9DB8D9E0B48F64E61A2495AD5D8DAB
+B5E72424AD017DF37964AF911BD7FA21A5EB4775DC8E95EF0C0EB856B00D89D7
+8172A1DE8530767D317B8256103E53CFB877E10686A04F5A08F8DC58D843DEBA
+FD5F40597588663D103689F6EB3EB14D06E18C8078F2538B43E712DF491FC5C6
+AF639256C8C6134B64D560D8476DEA6329D995E46CC4BC78841C59E73648B47E
+BFA7DE0846422F738454AE77E822A083405289247BD7C478BE4974F742CD6051
+E99FBB1D1B3FBABFEE855174734EE45E87D0AADF32B1283B911162A9955847FD
+38944D70584FAA6B1A7191C5C134B73F98EB632B69E2F0C0F94156787C34C8A3
+7622A029D58F9626B74F8A8A1F3803E0BC20E0EADEB1E99B70F1BD9F980FB751
+2A842843DE42EB142A84D5D3138629AE9EAF6F3479C423E8829C8816FA6EFA27
+DCE5580E65AA9854B1C64163DC318420CD993C15BFD76A8BA1182860A6B03D6D
+22B8CF43CFE6C8AB27C64842E239CAE707D3086BADDE1D7C94E3BC96319470D6
+8D26915C575CFDD03271D6BB9DE86A0EB6EEA6E768B224A626C62A9AB48A6EDB
+44F70BB5AF991CDF9736D65933E81CC57A78F623F33EC9AF535F2F25FA4EEC90
+D50DB7E87F31E971A75A33A301CA6013EEC5A4E179D695B33DADF2C98364434A
+42926776000B610E17524162253F6FA638D6581C18F99EA0BD1D2E24D2424ADF
+C05010D08192485153DD03930C7BF45237593E484F9851E6D464FA10FECA5D9E
+0C8CCC97DE029030900CDBB491C5CF226DBF903CFE7735D939C3FDF3A20B70CE
+66579B28B99313FEE914E295388C7BC8E055A2E54EA3A8206D3C8F4F7C0BA5E6
+E519419FD8CE215F7B8E9BEC604A9E3FE272A0328A24E31997C8A91E0946BCF1
+6943A97CBED2AB9FC636B49828BBB8B89E0BBC2653796431224895ABA5DAC41E
+1854BD9764E86147FD7624F736F40DE3B7582EDDFD15C2BDE3F22B5A54D7DF10
+B87A1301CE85CFC061689A890A321412A13314AE96DCD3EDA75035FDD8F4AB9B
+897A2C68263A68457032C469987970648BA2D88B1C5375DFEAA35A917B8A952E
+EE670427942AEDB3CB599C5746180E392837D371E15D860620ABDB6AA7772C40
+A5E346661673ACA530BE3D8E3FFB895E5DA3DC23B1B43C080C77F7E47847F0F3
+F3AA5CA9E4BF75FC5EBD18D19F21A7DAA3B11CABC6E4070A15F7DBC8B05EB6AA
+A02EF1B078EB66D61D6AFE41DA9B36FE7EC9EF94D1EA26282A9871E2CACB3126
+2AD49C2D9B50A6E47D8F2CCAD50992D1B430979A45FD9E76182A19964BB2A1F6
+51779A2B258DC1DF4C2F3074621286831F3848AC152DDD2BA561E6586ADA88D3
+598A2CE2CD048F027CE0008B828BD915887D7785341E8305DF2346ADB76BE99F
+87B02173BDC334E9221C8DF54114A6B24C1C5340299512FA6C8C51AB4C8778CE
+178CEF531C6D1B5FF0A1BE8EFF767F959BD4C345C52699A29A17B2A230842BF6
+4B011217D6D24EDAC3F6D53482786F1CA33169B90ECD499407D37CE9B70DDF78
+7B7547B32952535BA9ACD1E244447AE3FCED3AF28717083CF9590A09780984D6
+AF0743C82AE4FB3E2BB2856A4153A3967A023FFC35382D6C22D84A924900B6A6
+3DDD400E6D2418DA6C27F2FA34C075C902B89EBAE658B3C9A18EEE449DA5A379
+337DE95CB7AB3F0970CF1A5D8FAD8090E495570FDFB2FBBA79244780D8035547
+C5A55BB21A2270F724BF5D442CDC5BB9F09BE0CAE59B1C2270F0BDACE698F2C5
+DE8F66BFB9634904B161F5BA2B1950048300D69BABD312D58D89C4ED527AF7BA
+7DA2478EDC2CDEE3473DD8A8ED9D891CD1FC21F23013228BB3281B71FCE959BD
+6F8E9059D682A7FCC5265A0620992D4FA8D78377EB34CE3ECA070EE3707239BC
+98907DB0120CE42ABA32CF97127E28382BDDFD685674279F588D4F951216C355
+821361790F64C2CC720DE97E8ECB57326C43EE47367628E05769E106868B54F4
+C33C9951908DF6FC4F5ED2C7787BD8FA591BBB3E9C6C1DA94CC5E38D9B20C886
+7D237572FF46DD896A4D6163408EA6CEFAC398EE041EAE29D577E75326CA17A6
+B072D47A7B13EC441CE6DAA042ECD02134CBFA6809A435050413817193DAEB16
+A5882C8AEA44BCF36E74E9ECCDFE7E19FF5A5DD7A94E5AB4F8702C3DA7F42325
+23C808670A0490F5B373DADE40814FF9650241D3D69C91FBC5ECE728F827D9BF
+C928602E05477903449E079164CA39859C4BCA60C579F490AA455F82B5050BB3
+969AFB478E0D4A257B3356EA3CD62051FCE6C6B1929CFF85BFDF166BEF658E10
+3A55E007F38EBBB248B3F0B8ED1925106B499B762E45113AE1AC9DE09644C84B
+9C08034B297314EE69BC32DB6E7D7FB9913CE5AC17E7335979E9DCCE2BAB3725
+1976155551F9706A576FE0E3ADCCF72C87683291528ECB749CB0ED291966E239
+B5E3630676BD409E08F85BC1AEC9A2D4135376284A96EA24431243BD6FE8B966
+95F11A4BB53F392E0AEFEA623064FF8A7002367B0A515635CB2D2DDFB9B4A8D7
+FE721754E81BBA548848A235B91AD4E4F7DB19CCE2F61D277FC00AB956EB93BE
+44AB4970CA56BF59506C94ED160FB1E25D3DF2988A532BDB787BFB8539D22986
+FDC378AC31444E63C4727FEE121A43751043849E6DCAC5B59D0FC703AAFBBFD4
+E8B7C268F21615AD02CE9DABEFA27B5FE6A6441B619539CAB1F810F1263447AA
+633F5DAF483752EF1A0421740E3A811D2D2898CBF53E7F686C9223FD7235F02D
+6F90D2D48CC20AB87778DE3C6FB335E0F0EC20B5DC5B65223FE117526DE2C72F
+FE839DF93CB2A7D66CD900CB325F891E311BEC932F703FB4FEFA29DB8B9C88DD
+375EC71B3D58C7BC59ADA91971A3BDA1ADEA629CE6CC92BD542CDDFAA7706FB2
+6CDDE2DF07E56D6741916AE8E8744339816F3E6C38062747AA9FDA2A2678A6B7
+EFEA870AA3A4D71B25EE3013EAB1DBA34401B867C7A41AE51E0421D41D3BB83C
+E120C8FEABA6E5DEC53A689C21426D4BBCB68CB37568761C360E6D4E3596FB7D
+F4DEC7918E58C0293D12D6DDA7E9DCDAAD7C939F55CD1BC4A228B31E9A904156
+DA6B40B08E6ACE674618B768DD681C772A3E55FE096CF949CF3B0460ABDCD891
+D17B37B355B29AB5137899C036F31DA026244FA25FB798FBE5105BDA29F46538
+D3D3AC1001A7BCECE64DE94FFE6C354166A0F97256137BDFA07F6E22A3D1D2F4
+9588DBAE95E895BC5E64DDCBBAA8D0A22C229B42CB717FC711E7E9DF793DF80B
+9F14754585A3C7E17F37B32924B9F9870DA8635E3E18BD1DCD81EDF01834D9C6
+B33F23C956C2FCBFA47D84422F583459D827D1E120B97694D12F1F54D02379C0
+D288F7104F3FFCF4F76E3494F4ACBD1BE3A15543CC680924C78A473F8E311ADF
+8FE00A04C6C393DE61AD3EDA5BC031E2353076A2489391B52632387CA28A7B93
+FBB065A6EF3658AE80B1ADA47E9B2539E73A71FA75645F85ED8ECC257FB4CF26
+B6C912DE9D0F9899E70BECCB934AD32CF49A093371A9F73DE6255EBC39DE1E7F
+00D0CBDABD4D0383977E694890E71FBE5C376BE5F3A80C28987417504F515C50
+909F3D31178BB9B1D085BE514F71B910A9085BD6122DDC72A150BFE266920E49
+5661BCB4BAB51D6DEFE32B616963DBD989FCDD1637B294CE4E288655FBEFA1BF
+7F25BBF8CF17C2D5FD161A7C2CC9CC7490D9BF15A1D35B3BFA43ADE256E88BDA
+BD490D92907C57BAC408A575EC84D6AEE070148C7C9A91C03B09FDBD792E8FF0
+C0B886AAD2EDD86541E5E579359D40E3AC312ACD3D8FD49F71BD533DDF8859B1
+BAF17F1884E331DD07CEEF93B71D492AEBAADF7A263450A7A72210CE630A0D37
+BF024BDC09ACC882816B8C22C62AE38A3A8D0F6EBC2B1B2C0B8161A8B076DD5D
+4B779C0788546BB4CF57332230D237856B00D79C28A7C01D11F44B7304F69075
+94B97A745DA43D1BE561372CE611C345A843834E46AD9DDB16CABCD3FA33D6F1
+F6B5C0497F5EE5400B305CDC16A7EC286AA4D45D0EEBB9DA06AC9C5294D68EC9
+E4DC3CA2B92CE8FC0526184A86EDC7AB34D67E60AC12D9CA8FD300235EC968BA
+92C6FBDA47572BC5600F25249F60AD287CBDAE980E747FCBE7EE5CD323E733F0
+63553B494D3DDEB9CC1480B5C3BB79A28E419AA65B18CB297AB383419E890E2A
+CE6F98C9900CCB4675280A10CF060B8D220DDA1BE55DFA65715EABCC1AFAA271
+B1F8732341613E17B231231A0D24D4D7FC198AE04D89A99C4536217769C6FBD9
+5EE24A6302F97438F7C0E311C878F674B4477A5ADA3952CDE4055AC408B8174E
+86F8FB797646DFFFE0ECA25D1BAB9A9F71F3926D3D85AA63E7A8C931D71E79E0
+AF1EAC26FADE468F4FF7F3861D14C10E3BE1F9EAFD6D3A544E8108D5DAB5B180
+3950C74818BC8AF4758A108F462EF1826647A49667F5E482038C54716856D9BC
+35F29922846D2148F92F943E951D7438C73D6A60459A8003174036C64E1629CD
+155D47FD04B03C023AD67CD5A70C98AB556EEAB8C48169706E5B352F6505D580
+AC945171BFE62E81F8F500438AC3B64D857BA5BC54C2C4BBB237F8FA51296255
+E66A92A61FE13FDE781D393557EB72CEBAD86511035F775FAC39A0479CCD400F
+226709118F887F47CC2ECC8F79816D4A945B2845F50AFD62D8C9A9BBF4739496
+9E644BC9F7B04803B7EE75A09EAE94365F6F374B4FCEB0B506C76297564B9B6B
+8B812BC3A33929AA94692572B010E6210AEAA312BDFC88BF302244AB9D587A9B
+919823FD01DE12438D960944D1977800FEB49E638C32E5B188B1CA033E0C37EE
+A142F746367888AA119535F0CCAF7EAA461B790EB089D2D6962E28A398439BB7
+9C9943654D7A2D765B46BC0DD1F915327F369162E1BA1BA83110B93F442905E0
+523BFF5E279508A98568CD5CFD18FABBE9D17265A9081E7BF64155A2CE3C0DF7
+88D00671AD65654709589BAD7EA65BBA811387ABA5CA0BC3F66D3D48597A0D1D
+2C268375DF47CCF62166262AE4840AB03BF49BE67A05EF66328EC729F03CA5FF
+AD3937FC053E223303565DC771ACF32E63DFB96D5030E787961D72D02C195C66
+B48E9AF0309DC169CFE8D16E2818DA94693A18F027DEA0D916672480464F7E22
+CA6E431FE38D3FC019BDD229E064B72C545C61C6EA55984565CCA88ACB01F744
+3B4593CC8944C70F30925FB48A16342CC26D444F54CA15E5A624C4A2DAA2AEF8
+404145BBA339F2A2D6FC2F3ECE54387761CA1213C8D56FF96E37C6147CA44B84
+262EA87E7CC10D931E6B5B80D7F09813498497AA84ACB4AC69BC6C8481ED2953
+084F560D7B1CF90555E69BD2AF7C5D944E8E3506165014652462BE1BC81CA341
+E1B0725159D36DA0FFF3577D1DEBC5D91AE683FB0384
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMMI12
+%!PS-AdobeFont-1.0: CMMI12 003.002
+%%Title: CMMI12
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMMI12.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMMI12 known{/CMMI12 findfont dup/UniqueID known{dup
+/UniqueID get 5087386 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMMI12 def
+/FontBBox {-31 -250 1026 750 }readonly def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMMI12.) readonly def
+/FullName (CMMI12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+/ascent 750 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 58 /period put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5
+45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4
+7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7
+72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E
+BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89
+974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674
+11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBFE3573BF464E2BE
+882A715BE109B49A15C32F62CF5C10257E5EA12C24F72137EB63297C28625AC3
+2274038691582D6D75FE8F895A0813982793297E49CC9B54053BA2ABD429156A
+7FFCD7B19DAA44E2107720921B74185AE507AC33141819511A6AC20BC20FB541
+0B5AAEC5743673E9E39C1976D5E6EB4E4D8E2B31BEA302E5AF1B2FBCEC6D9E69
+987970648B9276232093695D55A806D87648B1749CB537E78BB08AA83A5001F7
+609CD1D17FFA1043EB3807AF0B596AF38C91A9675E2A53196FEF45849C95F7DC
+182A5EC0EC4435A8A4B6E1CDBF9A5AF457564EA72BF85228EB6FD244F2511F5A
+CA9B71A65D53CC06EF5F7EC3A85106139A4D312378BC22183C09A229577B793A
+1B7422611C03E84BF809F46C62CE52D3AE29CE01C32B202ACDAA5B72733EB0AE
+C31D7EF7BA88D2D14F85313F7A8B9B7A5B124B03AB923744D336C969E5CE304D
+3AD977A46664479EDEFB69F113024E761C05FA48A54072DF9E12C2F352ACB3E6
+D04F6EEFFDE209E7FA3DA22E5B1D1409461F4286B7F4F8251B44E5CB7805762E
+E129FF4A06A7458F3191926B1CAF70E32C6571AD2DC07C34FF62840896F4D200
+761B1A7FA356526D1E3AB4C542AF13623BAEB9F61B1BEEF79A9205B1FEFDAE24
+8799D516A9ACC30BC0139C63C9A0523E9D5439213B67D490C96F902958779B8F
+68BD8E9FDDCE8A3A2E35877DB6C94B7612382ED8F218EB1157D2ADD090A2448D
+10B99FBC9211C5629ED1C61C74FE93041E5AA03EA4AC3FFDA00C2B6E719CFAA4
+262FE17F66804A6B54D3669836EE4367D2A2991580C5564463C973CA0DA38AC6
+922716E13B4A807B50304B8826CEFEAA47C305FC07EB2AF25FA7945797237B16
+56CDE17AB0834F5C97E0CC5741B061C6FF3A8DD1A79B9A173B66A6A750538E26
+32FBC92E75BA15CFFE22A7302F47908547007402569158F62C29BA2956534FEA
+7DACF1E507AC309DAE8C325F2A6023D2FBD81EF42146BFCE6A16A6310A650460
+7B07BB7647C8760FADDF0DBBCD3DA6CC4645D1732DB3A22D8B76E1D2D48E4D4A
+46F4BEB80CE65F3517283A1AE08391FD1C10ED452133706BC6725AABC80107FD
+754A8BA47B0281D479F052CE26A723EFFACB79B213041A536542AB334769A2BF
+88505D82C498ABDD5A73EB539530F47CAC52825D16A969C8BB56D4A7F2830B8F
+CB63B92B576E7BD922A4B25E634751F8A3B7C4EBAFCB373EDC8B8281B1D1371A
+7844E9AD990CFF09F0D7ED73A5CF873D2D5C9E8A9923CFA31E1A4B4CCCC40760
+8B3AC8FC3C88BC08BD7407725281BB879A1A822D94997826418F1B89D303F2C0
+BE7A0102E6F529630CBF1BC5BF3E4578C164A3DDE45E62A957EF3FB7F0FBBA6B
+CA1E79A1ED195B6A11CFB345B663C5E72FA55D80476F604F6C4257B51686AE25
+8F7D159FE605DDA0AC74BAA5034F29FFFD403070013C6E2D8EF6A0990D91173B
+D5A3AEB98B64E412991505C3CB7C2CDE13C091FEB3DFBCAF30C4C19511102300
+135BD5D444BB55692013F52056908DFAB2ABFACE81A58423ACEC59344CEF7D4A
+C5A3EFFFFF70759BC3E593D878281225060B97D1BEE6B26EED90571FEAFA1812
+1115C0EEC892F5DE6FDD68321A0B3F10A2D771B79BD85476AF6018472A499A86
+07D64CFF4550866AFE590C471C80EB12CB3A989A60BC7BED39097C12D9286E39
+14C7952C4C64820B4DE44A1827B7B0B535244E93FDB80036D6332F90F95B472D
+7031E7E3819E881BD0313CFA112EB3AAE943C99C47635CCA7E34DC0306C04E5D
+2E9F60FF037EB11602BE74E8E6B711392E866E3E55D988F7C856417A2B9C186D
+639819B4786D039B77F8578EF63C088FF28BD08D8353031445C8498A8F445BC3
+D08923D32AC04BF3CAFEFCCC1E77EA894F4E846F47EF62D6841B8D8576FEAE8F
+90044626869D04D61D64D56E8C51AF8C18D6CC3FEF3B6C4F7D56FE3260354948
+10104F69B117FB8269292579A7D52FED688C663B643D8D99F13956612271073E
+1A337AED059B7A93819A28CDF01569CBEB51069D22ADAE25C47355560F402B2E
+8C9900DA82B79C64497C8494F42FABE5AC41791C2010D98FB7E593C744F250DC
+D837DB0EAA4F75D0016970F3AE8359878A08CF9A697A06C5EA945819151265B9
+1A12122B98F79185DF852257BB4798E7DC03712EA6ED34F6E6AE1476788DBC33
+9229FADB8D581BE1A63F596698DBD6DB98A092F67197A4FD4A50B648F2691875
+EE2495D6BB310078F516785A0CEC7EB6E8305FDBAEB1D15690409FE32DD9CFAE
+DBD3866FB63EBCAAB73E3E4BE5D7F3AA44793938AAF3F8341683F0790F1D46A3
+60CE083F9BEDDA22E0639A92393960F86602216FA51E2754BC2F4CD0BDECE3D8
+FFAB7E0E49613DD4956C9A10AEA798BDA1F756C755BEC12147ADECAB0FB73B7D
+203A11D84DD2AB5AA98FD38C1C2573570FD49A4924A94A106D2A7D850E793608
+FB135853E8C4204441CDBE697FD0CB330B1C3596F32D2BCBF263237EAB362D09
+DA6F531B40384DC91F30674760CA7B64BA1968F6A7FC9EBEF431A1AFC5E76D7F
+2D44DCB7F61C7F6B16196B3E8B47343F572DBA8B8B21B43E35BB6B2DD5C7982D
+244FD4304D254D6CCB5E8CF70E77F50812F41A988EEB3B26BF0F6F69BBA18077
+31134B5A5823D10FEF6201D045AEE7A24E0F25376E9FC66340C56C05F6CD810B
+724D85CC4BB8D789834A447CBBA159565D08BA5793D8599035BB5063271518E8
+F6C50E7DCE71B1D186270DDC860C6DC0CD506010EB5B1FDF6BE47A9A18CC15D7
+D657E58BED9EECAD5CE5D49F63139A39BC52C6584BB2C3264D51BD584B40F8EA
+AFCD8B83F548594386EB2B05CE803105E84931DC6E7A1398073D48E130E0D907
+CD0F1ECC3254EDF5D4DDBF44415DC9BA66C673820CDB0FDF033D59BE2B5EFCEF
+01FF9D33EDC88F8D522E07F1689D024DBCD09A16A63519E1764C8630FF36058D
+CFC07027E0ECDA01E0E85B166C613B22F587B4D355EB018BA93E92A36007B4DA
+287FF5A91F7D8A0EDF5554ACCF45AC8066E88865C5692E63EB99CAC81367B605
+8E6C19EB98EBFE0D2D161B447B9A70CDD1122C7B78A413369016E6D8481E2AE9
+9AA97B5DD0ACC9B0820F7742CEB2F46F89F3E2092621969A88DC0156B4F941A1
+6BF1546D4B136657C47B082A8A35FE96016BAF3D9679B8C32EDDD6AE6DF3BFB5
+7854074FA019707FC22BFA82299E72ADF9A980AE29A8E2434277E58B01F6B03C
+192E1E25DADD49F6E3F69799AE62B56E00B60A031BF8721DB8B2CB6D4A4C15CA
+AB1FDE010AB7DC0DDED977389B101B8E53A949222FAA126656E02817DD32B0D4
+A49516CEC2B97EA7C78FD66229B044EB92F502384BCC6CCDFFF995EABE3BB7A9
+50D5D1AED861E7D3BA8D333026C673C5762712E763E59261426044583D789C67
+A606B96F97663F92BF104CE02FBFDFC521EC0D6670B7D4F85A229F51426DE912
+3B729C4A535FB7C88D0A5E78074751B58885DD6BDD2DD9E9C83F105E8CF63DDF
+CA7DB39D0319CA7CC2E73F42747F007574DE25AE1538B4D493D22D0D5F0F80C6
+5F6FA3937C8391DE2F0116F81DB2DB0EF751EC838A7F85F163A6F48804E84B96
+8D715EF25B7E2A5CAECC558D80F421052A1D698F3B8452AC27E30A4E6226E3CE
+084C8A83ADA0818A110923CF7AC7AD4CB92AE4ABBE0A9EC1FF935FD02774C1F7
+92A278E513012AD17722A23C55EF82E18F8847B5CCE47F4FE3EC508BA563F7B2
+AE56C94285A18DED4D432FB0CEFC05A20BC17DDF9FF919C724810A8ED7358A27
+97EC93C1A13C443A91947FE1F6F528EA7B628917FA7E554A1D7B31ED46C5ABCF
+92BA57961C8876DB4041305EBB029B03D8351D5E2819FF87E97ED214D8F1CEF5
+7F7668DDE223721C0B810F4A4AC81CA4EAC86EAE546E1B15D91E626FB9A31824
+5BFF17C4E79FD56ADBF6DBF01BAF6453A81EBDCB38A5FC0FD0FF0646B3B0D199
+13E2E59A1B5CAB6DE5329BE389BA0E2A2AB55CA40B711ED746C24F1E48892E76
+6DACF7DA163CDC90CF076763008E7A899870CDED5A80758E6177BE6B93B07EB1
+5800A3BF7B9AAC3FA825CE594EF5B7546B181375FA8F37608DF17856D2F8EBD5
+6030A9E6F6BEAF224AD2AEF76D03B023E2FCB922CB8E3C6816AABB61FE6E4F83
+F21B4935102C860ECA03DBEFCA461F0E5B93E5A8D18440BCF7D1D6252A24CB6E
+A64FDAC8B67C4888519AA368D9C4A8C08C7155DF5BACD75C5196C571C3C456C4
+7CE8D90215FA6EE8CDD72C48740F7F5930EC3632DB63A9C8D2DA125088C0F05A
+9FC83D16B7F53163F4EB6FF372C6C3115F1E68EB35967D11126EDEDF0BF80817
+E68A698183B3EB0A207DB43786E1B9D289359D75AD5E465328CAA90E712C2962
+AE2A466173F2FF30EB535A6054BB0B875DC8552C16B49DF17CF84D98D35497BD
+F55E273FCBB0C735899529A69990E09149FBD2DDE64B7FA8D50AE83925DF03C8
+0B63EA158FBABB12A028803DA4B9DD6C48C0FEC469C4E730729F4BB420D5B003
+1918B4AE9CF35CFD31E8E62A44C0484E3D00143BF1D330235E821E5CFEAB4D31
+7CB4604DB1F310457FCF9075A3527279644D908DE847CCD00B6F50DBDEF91D3E
+38238CAF550FDCABA2C3A46237218DCC5A09AFAF69997E1EBDA7EFE6FC99ECC8
+5D4AFD5EE35FE2346BE79B499EC8EC436868154A947D13BC02C780EBA4B9E64F
+3026F1BF5DC1F8D64FEA1281EA40B4BC355638A3A59BD9055BCBB232FA45EA0B
+B405131B64F105814019BC55466EE78E9E9ABB62DB30EA452F7EFD7196C76A85
+15B2CFCD89922CADC0F392B0C54A231F3999AEFB53C24EB0C63B0C8A1A1ABB6B
+AAB2F93E5ECC7AB90EADA320E918106BAAFC1F8C425C617639984629018BA674
+6FF4F338AC43E23BC3740542911C058D43A49A11CB3A0CC8E3088BB5BA6048D6
+CC2AD250DE956BFBE83BB24C945C20D9C22E7105983F284EF478F9B68BFB0322
+EEB7D62802CBAAEFF1C2332159DCC7243EA40CE15C734EA905E04C476B178B82
+A08ABCB0B86A7330C75E62EE7844C9E22DDB013ADDF20AFE08122EE1B930A81D
+806A0F8CC584CB7FF5F56F9B35E5FF78FD93E7E4A40C64537464EAA275FE88F4
+461FC6A467C8A69B9A9FBC10D44AC1B753D313A8E7D97F5FAEB60F82855658D1
+4DCEE043C8FCDFD8A29DD091F3BA55874A458B2B8989F35055C72FC411382361
+9AADC717E602B48D7C9521D3971A6F7EB19D539445DDE9EFBC5B58FA9E5E426C
+172C45CDA24985FC4632287FC3B15849DEB56F5A061993AB10A6BC59868534E6
+69888175053108B77E4978D971B4EC57224C0F93EEA4C15AE92254140A94704E
+ED5666FC06C5341F643F779CC88A9E81891565C63B6F7F6286E664F4E0A48690
+356DC96F1B98026C563700772485B83BFA06435D4E0793EF822F423C93FBACA0
+E5D889D2B76771C6F0EE997A5DB43C2F6921132890406E3C33F6F159B14C5D78
+7C151BDFFDD02B697315F191B5490073EB418A4FF2A398C68D44F0CD1B87CF9C
+B52F12728B72F94D752D23151196A256908135C87991E508B8906CE2539DCA8A
+31F86809C8C6C18A09F6129BD7CDC6B37E76B648788056851F22BD3E3B5772FF
+EC01D822B57FFDB3BAE624F05531292641FD6A7E3666152D18F6C653048DD7D7
+98A942C840C4A0FA662F260B21C64214152BB86F03662A330109C5AC0A5EBA30
+C6201F558858130703DF76AF4FBBEE069BDE45C0D9467077D85FFED4F9BA9C61
+AED87D67CDCA453A6528AC5BA153E1039D9CCC556CEA5CBB542265FF54A1B208
+E0E13740E7E7C26AA00AEE909F8F3ADC2726081A744D8EF6BB711BF5F611A900
+76F91C26A338DA13A7160A9F42410CCEB3190000D963D036FDA05A29F598EF40
+8FAE6F8E7E6F50C99C3304A573501C13A00023085F057DF331E3354CBE65D573
+CAE73BF15B3B96B502E0AAF2B4A86237E98A997AAEFFF4227D5A26E8972C48E7
+761F430733E6EF8AB2D903C17FAFBFA21C25F8A0AC157D397BF3CC1AE7598F0A
+2BE4FB46B29443CE57F41FD5F91122E9D86F903E94D5B55E2BB95949C156D138
+89883BEFD634311F9280C7F028DCA6408D3A682DF5B55B9F7ABF08F019190F60
+D39E4F0E80F0594235B09A5320109638B938633A2C196E4ED2B43DCD8643C3CF
+C6123B076B7F73352F906D96FDE0FBF50CCCA432712C574D5857838BAC30B485
+D25024EB254A7EFE57D1DF0892C275CDB3DF77602F0FED0FAEBC644BCACA04B8
+B424DB125E487794CAB36E01B5E1A26F5E1E97A739AA36D77A12F5B45338EB39
+AF36CEBDED55DCBFCF497FD475FC6BAB5530AD6153C6BD982564EE8712185F1F
+D5EA7ADF4104661168A01994C1FD773A50C8AD6A3E4D332E4D59521BB8BBC6C3
+866EB4AC3EA4532477E6CBF6BBF0860031C3B916AA25E3492670EA67F55CF4FD
+207C684A0DDB6F4AD21B2909CBA71BCE2E762012B0927BA72367A6AE0AF87F73
+756C9BC85E4EDE35317E2CCCD138C02C7A8013AFDC1A48C3A4BB8EF257BDEEA7
+60E012F54D12D31D18DC59D5E526F12567B8688B4B67E16B56713870300016BD
+A3B9DA87FDC865246AF8E94316799110D86B1DDADB8A673402D4226C519C058A
+1D1E5A5778584FC28AF12819B1924060BC4F54B1054EA6AB0149E04B8C4302D4
+A56D8A347EB5D3D2A0E12CF7E35059BDB53D9FF6BD25F6D9619BC4669CFC1048
+C6C9978B8751B840F27D82A69075832BE59F55C1737CBB1220FB8FF691FDBDF3
+03BD7D225A9372AC221C38245E48320E1CCF898D9EEDD678E5B8C65B7F588321
+1A3953EEB9B39EA9A8CB72DB08C3E9234DFFF5FDF9DF804C021D57E97DA7622B
+97F4CB6E0EB640E0DC9EA15C5193F92A3A7565F4C7A4C9CC327F7CD2C44900AE
+D9E76FFE62FC37FA376E77131B566AE67C3E09DA80F198BBB995EE8FA47EEDB8
+4B467C6C7DB8AEA745CF8C56B8BE56534E9C56FCB2B7006426DFE93D728FA4CF
+94F131C549814E54ECE7C914C5FE8E4961D3437CE7475D03534B62650F551D97
+201C794AA877445DBEB11C85ADF6119B05360700F8CEDE4766E3A1D7A35CDDC7
+9ABF7C619E3868A39D1852DBE1EEAF5D7898C78323873AC005542B68C43C5000
+CC58F675EB595F87C879694751494676465891E8A897158B481F11A171CCBBD7
+29603F00210CFD7FF31FE3D273933ECC34AFBCC4108D9B76D9ECE63EA06CF939
+4799092A54A749DACB82C1424E9879672C8BC084C360014C9C1B6D5D65C68AED
+66CE329C3AD712C0A36BE7EF03FDF339CAA2E0336D387A693B1DFAB5D5164E31
+14755A158168962C9B399F8F1DF3FF5060D7464D5071058C30C572A2BC7DEE53
+84BD7614A4BEC4C84E18CF7EC81C811724463BD46CECA5FB57B0F55EAE20CC74
+6AD815D1897B037C197D2456797B992C20C70B663BF99FE28C513B4E221C8E12
+49779F8C0AE8517048ADDF7CDF0D698E3EFE60071C4997B7F5EF12B6CB65390C
+224F13FBB99FFC034C0710F05019899689B6D3350BBA65C7CE7C2AB03D81B9A5
+5F3D65E4D462DAB189006669F7390A78A1B8908A4C913B15DB8827DFF15BB9A4
+A6037DDB643103B937257A7DAB025F09D53FBBC2BCB6B0BCD8D56B2B2784E498
+1F6CF8470DCC892AD0CFE11578718948BABF9C1427084643B66BB9181094E29D
+5FBE37708E1D8A6B7518A96876844CB66954227A7A6AF28DD075A462526DD5D6
+40EECC56FA366106E55C7068997B54B7F0D03AC1AD45D28C67C7ECA99DBEDB1C
+E18A79C353113E2E05B837E703278B202112B1C69E42A69D64B62F0E7D8F7E5B
+C1F93F0F99EC20EF312046F4B0CD7DAB31E422070B629A7FA96583CF3F1519CD
+CF08806F40ACD7BB5C960F21E9DA7FB3C72CBA0801ADE83DF738A4EC94F2977D
+2B95A166BA4AE28CAD1E37FBBF49D342CDB4DF615E2C5F3076313AC517C350DE
+710F5D52DE31DF69864D29DABF14234DF13904BA4333B0D714EEA55CDD79DE45
+FF5D64259C877191547076B1C7684CD252C0337BD9DF66CDC5DBAA4F3102F2E8
+FE48385C55727B80D11F3BE0B7568AA9356FB2B180A6B1392D620DED02F0B736
+5F4399FB9D32DFBC8ED942AD311C82250DA8BFE98D65
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMSY10
+%!PS-AdobeFont-1.0: CMSY10 003.002
+%%Title: CMSY10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMSY10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup
+/UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMSY10 def
+/FontBBox {-29 -960 1116 775 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMSY10.) readonly def
+/FullName (CMSY10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 13 /circlecopyrt put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0
+7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81
+DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91
+511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6
+1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD
+028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86
+1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A581BE543D73F1FED4
+3D08C53693138003C01E1D216B185179E1856E2A05AA6C66AABB68B7E4409021
+91AA9D8E4C5FBBDA55F1BB6BC679EABA06BE9795DB920A6343CE934B04D75DF2
+E0C30B8FD2E475FE0D66D4AA65821864C7DD6AC9939A04094EEA832EAD33DB7A
+11EE8D595FB0E543D0E80D31D584B97879B3C7B4A85CC6358A41342D70AD0B97
+C14123421FE8A7D131FB0D03900B392FDA0ABAFC25E946D2251F150EC595E857
+D17AE424DB76B431366086F377B2A0EEFD3909E3FA35E51886FC318989C1EF20
+B6F5990F1D39C22127F0A47BC8461F3AFDF87D9BDA4B6C1D1CFD7513F1E3C3D3
+93BEF764AA832316343F9FE869A720E4AA87AE76FA87A833BBC5892DE05B867F
+10FA225E233BCFA9BB51F46A6DF22ADCEACC01C3CD1F54C9AEFA25E92EFAC00D
+7E2BA427C25483BA42A199F4D2E43DFCE79A7156F7417ACF78E41FCA91E6C9EF
+B933450D851B73A6AB6AEA7EE4C710CB5C14270D1674FA334686653793FCB31B
+491E870D3C2BC654D2C1DE463EC9BA29D7371AA1078800EF93D3F66263A2EBBB
+F5723697BF7448BD0D2E301544BECF497FD475B85DFEF52AF4F8F8BE445CABE6
+019318806D10C5952157FF8F8286C1EE701545C8F60EFA854EAE66835A2046A6
+915D395F1E0366EFE0C0391583FE001FF16D82A2E2DA5F57754A2C6F69306E36
+356ECF8EFC3F1188AD6FCD2427E0580C97A5B69B4E0E09B85EEDE142F5ADD2F0
+5DE51D6DB72B127412A0D57106C19CA493048A4F815129ABE767D51715B1515D
+9C21067CB5BC88741B7298C83EAE36A866DFA87D8981F179B1C31292F56BBB64
+3C430779468AAF07C8A8B4934E1E775FE3F35186BD1FA6EE3689C1C750678AF1
+FBF9B23195A124C5C991FE670AC0C86FD39D2B07B9A319E74EFD498B45820252
+720ECDF7294F7B0B137CEB86D33BFCEB8606985A3260FD669E461C8BE94216C5
+D434FD8854F44EE66E5A289A9F9E32BC36AF645D53F96652602BAED418C8D726
+BD04A1B4617551FE4DEF54083D414F7DCE004E6BB2DC9C2EF7CE232B254BA2C5
+7DCBD36C2072ED46FF711F121A701E2284BF1B718B3164382B8F453D68FA0377
+DFE106503B8401D4DB87F5402A3AC9A442FA060B0610A9524D530C7157C26B56
+AC970FCC1D5655FFFFA39246E6420CF97D08ADFB7B05822679BD40C638DDF0E7
+A97BFE8918B611A145AC965C203F1428812F9D340AF499B3A915B22BE798594E
+0F520109FC81E452180AE45B170FF999C5FC2761C6CECD8742A5A6FC97F16743
+AD4EFCC6572A6D3F3E4E330C5CB2FF6FEA48A5B64DD3DBE943BD9918D4A18E18
+CBCF598AEFBB6AB3CD2CBC9BFD6099272F6543F3E532E0E21E614BD2880B1023
+0AC234CB705827BF016DB84E00E8C255FDEFA0101A842929540B7B4AA8A089BD
+5EFF05B72356B6BC3727817823B5CDBB1B963103000D7F2A4E2A1472FC3E614B
+5CBCB6D6D784023173DEFEBFA8F9ED87EC1A0A9EE98CA59CFC964CF943DC683F
+E9E00DA718C4425A705A69D99988EC6F152525C790912C2E46A2381A569424AB
+54DF4798BC2D7E7A361E7991641D4B756CE2A7FF4A2848927092C59C2C4B8809
+E13AB84FB6B111E680D7FB9F2FFC2C5C66B0B501E4447C2E46C10E2F6124476F
+A140C404CFE2DC9E0199BF61E035CEB481D438139A9630934E541D261FFD2906
+4CAD99E20655FA746AFB81EDBB5601F5FD6B1D6832A01D585E2C55053F6A7378
+4DAACCAC7608DBDADAAE732D66B3E7F87E79756337C1A961E53A4651BE7C77F4
+038B89C87F650C54A2A90EB7F1D525BB353F33318551EE8D84A6A83C718EA5A4
+B2AC0F7306B1E095819B87015A90CA3ED739B09061782C28CDB36BA4BD5E5308
+5CBB70414E4112193DAC4A1FA30996327230D1E021F3CD8115E12D239D93FFDC
+B645910EB29E40D830E7BAF2DB255FD7C4E776557BB38157917D993EAC245837
+A3B515147043574157B8342D829C7228CCEA843ABC89D1785A9672A5923FC4CD
+2F3FF27E6FCACF84E2D3136CA2C0FD3EF1EE7354CD04C38B5FB874553646ED2D
+CEDF7E362EADD04B18051F20A8FB0DE18E152385B9D05F98A3A7EF177824E246
+455ABE69E2F700EB78185CCFC07E3B4C6FA301112528D977367D30D0D5D59EDE
+FAEB706DDC970A9E296236C725B2B55B09B9C336B8E23CBA5FB8692D56F33B03
+16294E5FC7FAA42E96395A57CE51CA8DDD77442F142E2E576B778373FB31C81C
+16840BB422CA827E30A81829648BDF1CA36700EA32AD888D097C1FE0A05B2D9F
+483AEE40269DF09AF0D1AD3DF80C45DDC59C2A03FBB661C79B87853737C6D352
+67626B657321B16198DBD6DB98A092F17878AE4698121E1006E53D6F9B0A3BE2
+3FB68828EF854A0CDBAA68B37ABCA6AD4A3D809AAF0BAB1697A81FE59C98C472
+1E33CD70A75A22C249DD11D76C2575ED3370A25892A16D2FD569CDA70C130770
+93F493C7D47D6F9A5424A7A542BAD726BFC3AB225DCEBBE6AC4BE006F8C7C0EA
+051424B08305BF2D951AB2986AAFEA04E078CA79B399585BFF0F1ADCED02E15B
+8765EB6BF6A8E4D0901EFF2C3AA104924EAD9637A35D877E0C51A3C37DA78CD4
+8643C8CE6DCDDE3F116A6C2390F948E5371BEB5AD2E87B41C5F01FB5C196C436
+6E256A88D082E3F46E4EFFBF605B2EFF1E9D9AD5EE4DDC323A137CD9451EDEE0
+06F7D82898D71FAF2362C0FCF1F726F97F820305B7CE20728CA08C63575083A7
+84BA28B7DE2B916432475510E274C12FFD1660A717F51DACFDF0A102D85224E0
+D6DB607BB72569ABB8A7BC6A10354CBBC01732EFE35B72062DF269CB25EA3DE6
+DC603B04C90C5912D2C38D7A5ACDCDD3F6F116D884F0D8C528F69D5D47BA20DB
+0A9E585C7D8CC3C324FE8A1DF150279F7E8FB43BDB720E624E5E9918032C02CD
+8020636AE5C38DA2484B7F4B34163E0D0A561B43B80E97746DC05C871AB620EC
+C5D47101ECED4A7E25F291184BEF8B80024AA7BB456C1B83A907652B331DEA34
+754226C39C6889EBEEFDAD081E01EF8FE47751987667836FDE4C8BB8A3FD4406
+1E643B4EA37BD370734D1A2DB17C2F4B74B4ED75098B433601F75A88C9A37A05
+CCB157EF6E32023BFA33973F3E655A4D58289136996FCFA61EEABD70791B6523
+1FF5DE71AB8A17038923118A5EED8D59C4C58D246FFA9BB26472346B40C8741F
+153D19CAFF20DD2A86C6DB89154A630FB1761929FC3F0448EE2F089C1C953E02
+905BA8DE75D101A982A611056C4B237596C10951DD98BAB838B742D3CF7DE718
+617DB72E5268583223E37E029D1C8FD3F1D21690151F76B76C52C725CA135CA2
+8666553E863CE188BFC9B99AF56AC2DB5BFEBEB12FB563D00244EB89E478657A
+98AF2E1223C1ABC25A4500E8119B86EB3C26B8A2F3505A3E5610F89B7C34E278
+53FA0A54A7F46D84A35EFEC36AE660A9E3C37EE3864106702DE5AF6C45ABF64B
+888A4A51323138CE77DB935576FE6B4824B6942DF80625098CE1B5B32B234F1D
+052A9D6039697118A9D793793775D8729D8574A2E74D7109C7B7E23BC5E2E87A
+CA8E019203952A4892544E1AD3D4EDD22971611358AB230E9A2ABDF00A288501
+A01B67C42B33F6B78C39562DB50F4663B922D9BE0D8A150311AE44B83C1F129F
+07337323E9A23211EE58E16043E127C6F9574019179F5635648A011266677B56
+B5D0201A4E1470B952A1579B57AB2329CD4C615395023C653F784D36B5EE3672
+10D191F29EA508CE84763CA4CE7C2C5229E38E241255A5CABCD6C7CBAED901A2
+CA53B5E24111921CDDF83578D33D463D70EDACA0E470D8F592303FB6BFD68B4D
+3F3BE2D7C5EC8BBF10C90111A33E205F2649B56E8443F6FAA6C721C66575AE12
+D4C40F1F46CF9E9DA675AB5D5840D938780CD9E4AD6736ECBEB6A4397613586F
+849B51048AC5F9405E03E14540A5E5582F61CDCDB57EDDF95A8C6705F433EE16
+648F098C03DED8A2AD94AE3DE202D629B9422ABB031318D48F2C85F9DBFA17BE
+84708AA3B6C9F81F4508F7A5CB7B6646AB8722ECF817877B77D473F577556DAA
+2BA0ABACFCF5DEA7498C47328E873019A956FBB250FD9D8885D21D368FA70CBD
+2709D2DA44EE7A9869963EAB48789541906DE49FAE785ECE1F18A22C7E7ED204
+9768896B78E9EB7A2BD6EEC1B26083940656ECD689D92942CC8AF05CBF82AED0
+B45A7DF4DD7AA6526FB597322560B9ED3087A65B5EEF1371C328A021411BFE3B
+D9B5088B2F1AAE381FFED52D2D1E02CD0DA78683E3B06171CBE94BE9760005D7
+135893D7CC2DB097F6AC664D9594CF1C650F84DA80D2EDE04802DBA33CE3DAFE
+EB7A37E8AEFA4FDA6252FF21E8673DD98E67124D5DBC7BACF361E57077B71939
+C1D1FB923E4E35C075CD1BCBE0E80DAEA1320D55B43EAB45D9B26C366B278782
+7519FDC482D98839BF0DF2E7C3A56A1C1A3FC0E57A75CA414F6536C1FE8EB7A0
+4ADFEE3BEDA0F53BE8CF5F64230784A797133E8CD46BCCB3BF38BCE38A73CCE2
+9E073ADE792F7128231DDD1F63E6156ADB2609C200837C2E8A2D93D2A7BC9171
+050C709A71E44E32B1B03C92EB5CF1D3BAB1C38E027DC4ED9AED633D98CD7486
+3F773ACF8AE332631CF2ABE6D606607593FE862ADE31803964E3F4DC3CE3A271
+C76BDD95C87CDB3B87BC26FC7A16D567EEC62E6FF0D471B4853DB8A94D4CACF8
+843824F818083F10E88D52FC4253E8203292CB40F1414AE7E51DD7347007C342
+CD70E8E9F2D2A13D71213B841DDEAAB208AD9EA644591C15DEB084165F9DF24B
+B91D3BBEEC2E34E38EF16A0C3F00700A7BDCBBFED2EC0D09601AD6538288DB50
+3478B051B5E16B604A0341FE621A58718D960D699D3FAD284310DCF54EB13175
+19A75A539EE98E804AEA24689D3540F0F12951A3C01FACCE9A7BAF4D0DAFA946
+FF65A4D2A4C39969607272C6886F44E90ABE27CA3A1F12A29D9B32E60E8E34F0
+17C5FE43D0E69A99A922D98909B2BBCD145E59A5E7F5426B3988F73B09A525F6
+8BD4915663C1301323180E760BE81CB874B020FDA3AE63340E4261E4F3E4949B
+CC0966BDC4426190BE9F5D77F76A72AD925662E5FE1CEF9CCAB68F0BD33DA003
+F11EB91AC4502FBD6AE48DA0F9D07C35B96B103E379B8A83A05FE728F1716194
+1F650F75BEBADB2E3810388F3E2DC7B19F1BA9E32925F2FD9F19F4E8701F3E4E
+4069125D7C401144740691E7A460021A47B1E27997FC1DDABEC5BD0EE0B20194
+2D579C7D6727AA124083242BDA46D8E116E2751C5F298851A62B60AEBE82A929
+9B9F2492BA35690D1EFD16215B8EF14E7A3803B93C28FA41D971B05B6AF3B593
+E74AD1E68A5FCE12A86E63B78BFEA87D3949FD164F12277A4688BE96356791CB
+8671C49365608F3EDECC109321AF92B4C29CAF073DA3A7D73E913D0D83FAC5EB
+BD884D4C686056404DAAAD6F82F94F803FA1FB0DD8908D1DF08FB87A8BB83027
+04DE0CBB1C6FEB6B517FBD7CF065120079E608CE41893C2BC96A347826CCDFD5
+C69E161217F2127A59F1A6F22037641613F191F22D5B4CDCBCC2EE5615623404
+ABA7BE6C5FE475481615B2AC1A2412E54688DD21E44CC9AF5F16E634AFCA389C
+4D740B7B51BB141BFAD1080E7C726C1606A28ED492E6BDE9F800EFACD1513909
+84E98CEB6A0B7A2A6F3E1D1DCC3B2552795E0932673E59ECC56DDD37A1D52BA6
+C3F0E905978AB568941A163F4CE3AAB5C5B16F86016EC47BA6F3F7AAAA77C3B6
+09C8C3ABDB6D514A76ECD37C37AA88B5860630B3406B494F7725975596F84777
+D9CF48686EC9C5DBCC1D78513F591C7C10AB9D153B3D41426B7BF668B0D04503
+56BCB686258462C1DC61095724B9F3312316262FD7C1AEC6E54DE7E5A7BD8EFF
+035299B8FD8A4A7B0F51404F4A760F4D8B4C0FB7A32FA4B2383AB6E9C78FDEDB
+FE6A5788D38A6701B123630C2A6D820A684166FBBC83DB17069494FBD411B333
+CB37E2491C5BD035A33867A6D3A3D420CC31ACF43AA07182CAAE67E40EC63663
+B678F71D4C6E0EC3A0AAF904CD3AA66E0DE5E3CDE049E94249B39A1C06E3CE9A
+F974B2484BB2CDA14282B9511E505B3C89F9C802218AE40D1A7541335C5736DD
+CD565D4B9F4CC78F3A393737EDB4FBD0DA299E21CCFEBA5478EEF013F0552A8B
+0BB11FF46CCDB784E8BDCF730A16363E66572049E42C695886EAB42A9AD9094C
+B635DF4B5B9BD9B9AE8455DFA3EEFC77653190F9A8B1E93B7281C2A21EA7DDA9
+33484745BDF7E3DD63C7AC66C286C9A5A698A5E4D7A91710B7FF943FB23609B6
+4B442F83CB795788FAB5E9CF3F75D5487DA26170E4561C7941C910B088C3B86D
+F844B0F340CF82786A3FCF347048463EBD2006281A816627065DDA6CD4D3AC5E
+2024BC96C7D896381BBB567951E7A1F29D4E95351298B000D29E5F3D0448CB5A
+CFDAE1BADE9403B90371C3A07D208948AFA022A69C519434B6813086ADF518D5
+88E0B92072A44BA1B3EBB630A13B7AB90992E85B6D67361C8D96F3E0D826FF37
+17B67E4B1EB7BADFD98D7F4FD17BECE740ADF13C141EBF0A91CB105DABB32FE0
+55086D56A0D358841D15FD349E6B95512E4EDF4C430216FF85C2ABE995E4B40A
+A6044CC8820AD885C07E052B3F91C2E9A1D163BFFD210F7BE95B923E2500DB50
+2075106DB541C267BD450B25B670CE80BCD068D4DBFF2D82634175B61FBD3BC3
+406131F44C7D6F18D375D1F2270829DDF29DC14DBB58A30AC193245D18DE91F8
+AB88AB548D8138605BB5A50073295534E314366E26665AE70482B890E4101D6B
+60E4F3B37ABCA1346DAAE8FDB8DD9C832EFF3E73BA470E2BACE7B8515CB43388
+C27AF99FF9322175CF8D4947E6B3846AFF5163E972156847F58A66660EC8A3A6
+5FB47C9F637B4CBB4C73B6A080B0CF6FD1E9665E92032540570FFCC747C67C50
+822811AADC404BC7ECD1673E8AA6C3A2F1D82F39430B58C29145E2F1B679C46E
+94EDC711883F1E4EA84117A54757E8895A40401A26E1437B39A2F65CAADD6E02
+D71FA8AF7453668DC613F326A3344F74AD7AC67569AF399385500ABDA5EDD3BA
+343CC5EDD4B558467626850E752B9959FEF1454E53E7A3DCBC2255AD8F6AB4FE
+894455118A61C58840CB68A925ACCAD75CEACE863D806916228F0614191A1CD5
+DC9BAE256018615AA3725834519449B0A88B4F396654E74099C007930ADB1327
+DD119BF799FE3B0B223E1EDA04FE2DA7A1C879143E1C33B6C6344F4BA033AD6F
+8E88C33DEF1977796B454BAB2494C930F492A518E8198C708A75FFEF8C49C324
+A718AB59B889DED521229E741FFE53F98EBE88B0405AD523254FD3FA4BBE96DA
+DA1C27C1C979A0DD4E61C3B1F4C4DE01E42F1C4435EECFC02D97994BC8AF5270
+E7CB1458D76ED0229C5FFB4A23B8716018F9050970895D51722CDE8F2EA3D947
+DFF374D84915D5C5D16463A6FFCD079D1ED416C4347BF831FF0C4ADFB61295DC
+4D5785BB0852BF472CFC97EC174491CAF961AB90629F055E75DAA6D9898E8653
+5BCF379816CAE46FEA62E7BE8E9B953466E51828172C4DBD0E1BBAD1CE28B5B1
+02B3E36403BE80B49A47446A6677FCED438F01D60EB10F478C89528FA337D0D8
+88D3FC123C076507ACDAF783A9A6E24ED73BF24B6E0F11C13E532DE5F70EB02A
+60651FC2E263002D3986B7B20CC2AA08330B9FC2E26765CD52266969A86EE30E
+71E0B41B6C1C6DA423D3A7E1553D2FAF26EF40DC183099322D362E4965695C52
+9FC3E5BD7ABD743CDCB717DB10372A722A39CE53FABB454EADE2179C4CBFC016
+A8E893C28EF549CA1692C8D8ADFC471DCCDE266FB4E97A1F3035801F3F034D44
+AE6ADA0192657E8078A1D27420093FEBA111333314658021B90DA4E7A8D4B829
+F1795501020D5FF0AD25584C1D47BE08ED6CE96278050BA67680A3B973613647
+A93FAEC756FC253B3693FA2D6491B276EF45751EFB306961788E7C15297A5822
+AFC5A2DABD0DBBFF0BE135267EA6B9D1B4E4760ED14895FFE1F8C3F564830001
+EFA901B8442BD2D98561BAB9A0FD939E0F856E4D2EB04A9A4496704109B8A84C
+EA06AB0999427B3B1BE776004AE906D0F22159C051D88CF573A0255D99B56781
+CF326CD11919AA40B096769CD6D0ADF3ACEC7957621084ACF21AF1F265416628
+86B67FCBDE9370D4F5C6F5CC67EBB0A2727E074090DBCA459AFA1A4778AED4C9
+AE5400775223E684BFCB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+%%BeginFont: CMTT10
+%!PS-AdobeFont-1.0: CMTT10 003.002
+%%Title: CMTT10
+%Version: 003.002
+%%CreationDate: Mon Jul 13 16:17:00 2009
+%%Creator: David M. Jones
+%Copyright: Copyright (c) 1997, 2009 American Mathematical Society
+%Copyright: (<http://www.ams.org>), with Reserved Font Name CMTT10.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is in the accompanying file OFL.txt, and is also
+% available with a FAQ at: http://scripts.sil.org/OFL.
+%%EndComments
+FontDirectory/CMTT10 known{/CMTT10 findfont dup/UniqueID known{dup
+/UniqueID get 5000832 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /CMTT10 def
+/FontBBox {-4 -233 537 696 }readonly def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+/version (003.002) readonly def
+/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMTT10.) readonly def
+/FullName (CMTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 33 /exclam put
+dup 34 /quotedbl put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 53 /five put
+dup 55 /seven put
+dup 56 /eight put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 89 /Y put
+dup 91 /bracketleft put
+dup 92 /backslash put
+dup 93 /bracketright put
+dup 95 /underscore put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /braceleft put
+dup 125 /braceright put
+dup 126 /asciitilde put
+readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA
+0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93
+51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71
+7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551
+E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078
+0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273
+C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E5ECEBA191DB82B3
+7A69521B0C4D40495B5D9CE7A3AF33D17EE69979B82B715BAD8A5904C5DE0260
+6C15950CCF6E188A0CDF841EB68E5A2F88253E382140F87C87E55C9EA93B8C89
+14A36CDF630D6BE7CD36DBDCE22B21778E8648B97B7EC6742EB5114BDF0454B0
+0EA7B1FE236C84C0E5308C871F67B973892890557AA12E00B2C20C71F516C397
+3F3BBD14A1D0149CA064391056E45E9470FC7F6F556ABC82653B3C8049AB5CF4
+BA83C8F2158C236B2FFD4208846013BAF4165E8BB8D334C8FF2E8D74AF5DAB2F
+D44788869B08399421AAA900ECC6A2D594641C121660D4B5F512938994C18DD0
+FCD9B008F68F0351D21ED735B2740CB1E0C1CCD25EB548C35B844601D98828DB
+556F71D07E081A593FF12DAF83676492A0FFE16E95717A07082B43A966C1EE8F
+8A59E1255E1705C43A23CF29A5E4A6547C93F1680A870EE7BAD8CF74D838CD5E
+F806911D8FE4262ED8E7F5BC58B92C9C6D74F8AD45FBB021EC7E97393018B9DB
+B1B84E7B243ADB05ADD3F1DB3692ADC5D47FEC7DF93080669E63281F1576B673
+125EDF08016664BE73364F65389F7C3B66623AD1754ECBEF9E5CE6948D933787
+A5674279ACB2EBECD3B4E6361419AB32028A27670C9F3E18B746A10B00AF6D77
+4EC00E3BE521C02A99AE5BAA98F793EB1228952BE67934B91472E01AF7B816BC
+56D7F19F631A1927846D800C107B1E9CBFF9D2DD513B4A8CE2E0DFD77B1ED178
+E43FA7052765E9FAF89989D490D8FEF6C536EC0D4AE27A74F474B98DA9E6B92F
+15E063DB260571979A5DE2423920CE1F59F56EB11E00E3BB9D466A8263E1E385
+2014BEFDA8D1EA3EDA04BE32AEE6CD15C5C010A1DF7F705A2C0C18E87C8DCCE9
+05D9163181CBA56C0FAC8C06A2990554C8E759D076B01BBEADE3B5FB8B551390
+6C8E4A2A1C6E7D9C708614626F3770C0AB7DD2027469C77975C27576065862AD
+04E5E50CEBE907E3E991FA0C627302C0E207B4D5992BEBAB5853AD1C0D271728
+C76F40A79392ACCA7358F948AC65DC823CFDA59E1FF69CEBB6B7EC3CF21669E4
+70D999508F9C49E2D9F8818CA53C977D93E15FBBBAF75B1E84F0BA62BCC4BAFA
+4EEC82D804C8A8C0210F3E5E258BB1F6921AF02BA9861BAD5C3D5FC8CEFABA8A
+A607E547B802096F7AEB09FBA99C83C9A494B94408DD607CA6561A6E6660C473
+62CF8D35F31D052F6C6C8138A8E1430CBA7EA6973D6D510C1A06B3FBD79D9364
+240C1A00272DA44B89A9FE8D5BF36DC1B5EBB4A78ADBE9C5EDB485F093D9517D
+69E1AC9A8E6C9D7C324E3797CFEAD9A18E82E03F69B2CED7D5DDCD1A218BF2E2
+ED2293AE999FE2A4B5213A10083EE0407BCF8007670B8C737EAB30311C868D84
+121149ACB4A27F3ED6C0C181C98AAAF51B105F264B5672D7F745131ABAB5BEA4
+0C9B43C0DD9116D6DC61F90BE72018F290D26D5E9D341055CAF09C9F45333CDB
+D45B7954271767F638EEC499F7B53C2CC5774EA7A7F024C4CABFB93D9CB1856A
+0C671A4ECA7C62EA5242648A84E7F3AFB9547A0AFC29593CFCE6D8B873A78157
+D337CABD291431C0A2CE1F37E0CD7340567AC206FF98E4B5A6410F70F750451C
+550EFB54AA259A1B236CA9CB730D2CEF125EC65D959441F7CC9768F777B44844
+CC9842A307C72B740680ACBBF6AA35FA7A94825069BF7696ED81A371A9E5475A
+9D997F2DFAD339AADF797F7E03E654234455AC3D17702A420EE0A597BA31BDE4
+FEB8DBA7C61D311CC90441A620164DC22DC2D373973EF84CC553453AB1B3337F
+7B39983B8DFFB3A9425F119B45C1CD37A76F905777B3154CA6200792F1759D06
+E017890F4041A385F2238E3C48B6C8EE6F5258463FDBFF7AC762F6C4363926D6
+50F004D473B7B7F73CA686B559C2885F1AA761653C727A77D73431E9D110E76A
+2E55C68CD50F43997C9B2FC4710F8C8540909829E215678E63BB8363C4B8AF05
+9986102BB36580D9CA95CD216B7C321822CB41B2E0422CD077F3B55E0246FDB2
+44D5976F67296B5B0BE4B06F6E43535C21164E6C5089C3E9BA2D6B30888C57DE
+49DC8D9D46C0D5EDC47ACF2C03B72DE3B69512508539019B759280BABEA12BC9
+385308A0395C4CD33182A10A5A229743379C2075D82D8BFCE4A66E1AA087A091
+8F5372684FA5037D1B92D50CD9CB4F50AD4F8EE7D51F1C9E63C721CB5B9BD011
+6F0A8DD4FDCD2B008F223A1036D90F0F3B252487DE7898F9AFBB3A9D9CD49E0C
+EF4ADAD5155A98D2125ED5A3D3907F67301649519419F33CD942E8DDEAC1BDA0
+E90C431B198F646766A8FA9F8D1561B57E126EF604838C0C1966655CF31FB7EB
+C8CCC434FC1C96046D38203E1791EC824A3D7AED85C029288D4608CA7668A2BE
+484C99639F121845B22EEFCE0A3B808261921AA042AE19E641769E91277BEC29
+4594082CCB3058F90FAC4A700A8A827ACA00FCF574ABC8EB7DBCECD97F2B22C0
+0AA19E8739B81AF8C6F621D69B8E6F29BAE233FBA655A0AF5BDFD7F5C6B9167C
+6BC7AB693D45EF2AD999F5DA3CEFA39BA48A17EE6D9F2C4DAB91AE3F0044DC3F
+5D5506CE4675AA928B0092D6F173644F91295216D8BBB14CDDE0AD524A4D545C
+1B5E284A3BF0396664081CFB4F186A84A0D24D61E82F4767C1E55A0642720CF3
+909FA1AB8EAB78030B59BEA067DEDBD2F1D0340E790AB2777DB18248521934A8
+BB38A58B7F633DEA4291B0D5D13E9A882C974697CC6D3B49E030C94EA29B5506
+CC29C44D01B4751B453A46A9F6BF3BF135AE87A4CE232AF57B66578310DE41E0
+2A6AC422117F1963C4D7CC306BD25A6E724E51921779F22F029733122E23E2F0
+CB340008813ABB104380C80A492B3FC6D0BB07CB8D8409E9576891EF6E5C9D08
+EB8320DFA31BAFFBD336D0C2BBC3D3B2D30368B9860768FC080D30569C7F7811
+0EBEDA2962476113625EEB555490B8CE4C5F99D74ED10F738C61854CFF8B41C6
+9402E56BE8856144A1A05D0B05F4CB7EF728B2F4F5A439F18C3B68CEFA41E59A
+D8308ADC92EC1289DC84CF48D2CDEFF509A145BF945E1E00D552D329EBD2A7C4
+21D58082CC8FA790E981F4AC8EAB99950678FD3A7DA3DF13778681B208DD71A0
+7C3CBD0664B37C9EDC6B601D79A2C51FB54DAEE849F93209793849104E722D3F
+52DFAF7047EEEDDFE744787A5801E4AC2C3D58EC5DDC15FCEE03990C53B0C57A
+FC54F125A04C8E4A0ADAA725808C587E7DAFB9F784FA2875689979D316DC22BD
+AA36B306A1ABCF907B63C6476737B746099973CAEA8C1E2C5C41F27E0F7DE8D7
+F0D942E34E92F43FE902653D4D2EBB6F3B9F7928B1550A82AF234D45D028F429
+067652BD3D391BF423AE72B9CB1E8D91E898161BE3A7849D456A861A2046711E
+E934DC59442AE7D81661CE8EF727D8D7DDC0270E937E40F896AEAE6171661431
+C1025C53172F9D366834BA0054FBFD84503FBAE328B6FDEA180F8EA35B1DA937
+5CC3B8F00C206908C2FFFFA6A7AC6915D15EA44BDCF29E2BFCFD4A849535F19B
+0D307C696BE8205C7D84B9C77F02EF27D911056EDBB4080E4D3ED72788666CAD
+CD91B0ECE27A177DB23320A7FA9C31408B4D02D2A4B1CC6DDE1A6CAC3D8EC1EC
+2226EC98E51046D1EC26FA20EE62D24747D83CF4941DCE5CCEEC0DBE387149CD
+E05B19FFCAFC0D117F9A3E60DCD4C815228D98EF95EB559AD0ACC0D50FFDF714
+56C3C812EA5ADBB013BBD956A7C4CC0ED7D3E25D5C9AF5E626F18297F75D4957
+F5B0B33379114B903FE98BCF35C3FF76FEE1D9AEB711F2962276531F7380EE3F
+E368720E0292A170A15C5539B1FC7BB954EE2624B504CB8C805B8D31AC38307F
+0513606F09211AE64DAC447693B2A0AD15E9A64C34F5A911ECD0ABCA90E9791D
+67C6BD202B0858EF96E7722305B8AC02B01AB1706CC6AE875A8DDD15EE349046
+EAA65005E7866B506EDFB7A5A2AFD5C9E9DCC821A79EE9C1EA2C7BBA32A40BC7
+CEC26DB1AC473C8C3960ACEC581B37D6569E8C8C42950BAB7930B65E1570E3F8
+9A7FA719F1DCFDA45A3BF2AAB32C9A93BA3552608A61C623DE59BCB346E87EF5
+9CF025A87803161221C5C1C6F6B3403712C76E9D755C7BD68D7F2DC03C14CDF0
+C1BBED1D648B905B4B17037B7263C1EA7A7F06FAAC4E09E08483A8D714C19861
+327CD9C32DDF850302DD6DDE24912D00C22ECDF3CDFB18FA831A41A7488EC203
+F564CFE30D506F0829A96D35A7E09C3DCD107D589B627A15B55C5D6649126BEC
+60B88C55ECCBB4E680265D9EAB4CE22965D3B1AF759B01ACB0D0E6C92B6B4EFD
+A81E6A648708979487FC591CF09631310D46891423F4EC159A73E30D8DD147A4
+B0EACF6D45D18CD16CEB8176F03ABCB41F2234747B9733C8FAF34AE5D43D3BA5
+0CE0FACFC9B087F84FB6C68678BC6E76022B1526D6E5B3A48EC1A110BD75F45F
+1C4DC6D39F254976453F57DF873B7D635C80C42026DE020E5BAFE0DA0D54D1E1
+DC634D2621BA184347E5252F645A6A1DB7657C48124186F0E4C644077457C24D
+55753C651A9A7B6349867641464B515B821349C795A645420508673B93750D0C
+7A3B33EB1F09782033742AE8F3A23FC02284E6C03818FADD1731361542E3FA3E
+75B8D52B668C3E18A4AE967D0FC3157083D952AFB8144D549E69EAAC51C279C5
+E5D88A0D9D53013DFFB4352A1598FF84DCDE6FA32FC377306B9B92C0F96EE149
+8CD55E7B2445B86CCA7A547FA732D52D59025129FD8C6333AC0DF4F0CFF6287E
+F2036D5DBBB3B91B92F12FEBE0B61A313A4DB5A9CF0BB3DDB781A56FEBFFACCB
+8CB9D1D3DBDBC4CB6AAE6769E470582403CB920630221B68BCB625CD4605FA8F
+D3D5B7A1A28D15E44B38E92E906C138E72C15B86F64C38E23BF0440052A8C914
+54397F49DBED99D0AF7CEA3B0A05FF37C2D7EAE1412567E6776333237C31E3C0
+49949EC8BFD6E0F6446CE2D4DCD2C1524A288818CC5D159BF8463A847AE4A2B9
+CC8C58F822804B81B13BF4F2DEB6229C4F51F093075581791D02C36A13B855A0
+34900AA7CD4F1A797652656FE3A8425A38F421C4CC0ACA1CDD44FA6B31219276
+1CDE1CD63D6A58CE705CB56CCA1260F9B86E989019071563A9B4C274A87558CA
+6EF1660D574EDA276801F0057740E2C3B80D253D697736484D892CE1AB128B8A
+DECD69712F5E70E895FBAA927E8194D792A04AB6CE205E04E38A433BBB793FB4
+E8BBC4279D58A223C6673D909D6AFECD246E66A52F4CB35E5931D24C828489BD
+4ECAF621A220D8ECF702BEB01C4FC7510197D3F6D15321EC87175ADBA6434ECD
+2B5A306E91375CAD22CD94301763E4A8B981472890422C5488FCD523C9CB17DC
+ED22FBF12D5F7525D0D6BCFE8CE85B0DFB1D6F989C267FFBA0A996D309E4A934
+3DB54A9D29C88B9D55D7300DA3D46419256C5A07A2A529A8DE8BD1727281F5FE
+97033D861E0531B14E811378EC1AF1CC7EE9BA2B07D935843D3053F673979F8C
+FAFD59D555B56CE338F606747238B22BD62C42BB7238FEA335678D474A643570
+A9E7B4970E8C541CE9DBC7BF70ED7BA33639D6744A18379455029E934C95E2EF
+639C4848CE9A0879B51649FAB023A71782444B451F92A34CB8A124270CCF86D4
+D18EEF5C1D2B2A29012613851C49F50702D63BACF95EE2AB4D72B375E0A62615
+E0991E130A67ECBA9E05329B740708F1CB148724C3A6E5E3AEC1F88EBCA398D2
+1CA8827C977D72734310233176D1AE26C55CF2CEACA62223315C28FCF6305C7E
+A22414D4739A059F552F1F9372CCCA5FED4F9AC987942848EB498900269511F3
+F408CBEA0659B954F5F1B18AE4FB270213646F9B28AE4439D2BA2D3E0AAAA780
+5E530E4EFC8A060EB979E12191044509DA0C14397AFF949E12DC970658D5EAF5
+4EA963F5BC1407A32F3837CA6A24B7F3D60EB8E6222B702E25ED903F9D21AE50
+664A095009BDEAF4B78DAF94E5A55D48366CABF07791A1684B2F54EA69070844
+4F031AF8DF416C2D3679F8BA038B0DC9DD0400CA6B34667BCBBC07E62C1668A8
+35A8C57C9048A7227E672E89681B54D662079A189A9E96A3CA96D8DD10189B04
+1DA49BA2729F1CA585B1BD5C467295285D52E47CA904235A1A3E48EFAE9EB6F6
+01374125CE89D53C276858668CF45D2F092DDCAA52418E0BB94C2B8266B4D88A
+5D911507BB1DDA3D8F6E7C14A91CA11AE799EC42E993098E18CADA70BD2A1D82
+2C39326C6E3F9E84CD9758B9AE43D79BF99E6A0CD713E95B3D9B7DB90D127DE0
+DAFEBF850CAAACBD860B5DEF2082F1ADA64B44B193C4A1417BE221FDCA36456C
+BE5934C8CE3ED55AE3A11697C2D682B7D0F72D48976451D205783BE25DBD2507
+39C14FFB4BB828DFD187104F38A7F11D5F0698C11E8C1D4F107CACE573FDC4B1
+C56FDAE47024D6FD16A2FEABB434CA320300FC4B6C1B6CA08F76C60B7C08A665
+99F404DBA8A2A1EB18EF6750E4EC186E31561A3F080BA6562967546715859481
+7BA782940F5C5D06626D6F6A412CA7C13820EC7C1DF23E15E5829F698CF617BE
+D940523E4EE4ADECEC48C24297DBAD528BA1DCE7AC335A1D15D55415B108EFC8
+6D45030D27B3EA63B2B4CD771DBE66AE0218ABB1153D4B7482289D1313CEF184
+5C960B1E3C3C953912CC6F4521D1E15636C1545EEE457EFB87B88C9E43CC2F38
+6BC4BC96969F4FF28ABB06F4454C01CEF1B6DC538F1E832FC1666D977E5A881B
+F72F1B4C7DD4BE167A5535F1163A0706F9A0B26400178DF8A128FB5EBE6A7B81
+E478AD183EC06622B591337B9F1872AAEA356F4FC67EE767B34CB5A4D90702D9
+39FB846947F4096FB3DCF16EC81455164783BA0B5D723060DAFF411B68307E81
+7BEA1D9A47A5AA3D648E618C83C60F060029E6EC4D46B045FA7415BAB2AD0AA5
+ED9C729C24136F6AF61E6409C0B5CA760B16225641E268A68CFB8260BBEAFC77
+6626EBD97195E77CAB425CFB0096D805D9EE699E41680D095AE9FA10122A7882
+2F00F495C9EB2102DF0D3E61833BC0A2E468C5CF7AB430FDB7C0BE3DF2C0D230
+1580BAA25D65F599378D873165482A1FBB224AEA89C6BCCFBDBA42AE1C5DCF41
+06969F585CD3B737D1388D6359F5468D88FCD2279BDB270F6A858FB7D2ABDEFE
+5EE8FB79FA437F8F50237B92C307B73B0DCB808D07A9C3255CB9B3B17039CE5A
+288103D05D132863FB522A02CEE3839EF9AF7F07D99732F0B8B384745369FB3E
+7901166478F4A16076A1504C5E98D17408494E270BBF4470ED12B4332422679F
+759F1D93984D7E506D16950DB6C2682FE1379EFFA6F6C95DD71F6E55BE3EF6AF
+E0CB25388EEB436E6527806FC75484133F6E561DEB979D5C1FFEFDAF2A6D964E
+03BAE0BD593C2992AD84569C81050F7A793C5263E50C2F50B98C4CC703EAE17A
+6AEDAACE312DAFAF5278D125B6EFC5587484F61DAFF46B87B7C9B1EEDECA4859
+314A9A9E2248467DE1E54D90DD671660B9040B3E0DD982260822177EFD757266
+74A16C83A7FB168016A320D3DF3BD7726F1F4EC90EE5DFE810C96B099FD4368D
+906AE4699049EFD37E8EF058D4B97BF71106445AADD4FC6E90615A0066823A36
+673B8DE32322BBE861AE251226B4385AB28702831270DBD25D666FBB0AD7B96E
+A44E891EA1EAF0F87013AFC982E33D67A28E96E0C9CB99B9E4192536830D9901
+931A8CAFA41289633B20BA3BD7AA3414B6DA8D57CCF2FBE39920CC06361F075B
+CC40335DB9A0071CFF77F6B7BB47F3100DBDC9C4A58C2B81EC99E8E966AF3390
+E3FBCC28BA1D79961C8A1584266454DF772FBA99664D74D4A89FC82FFEDFCFE1
+4C9E4A04291E803D142E37E7ACA66AB279378F2F192FFB2B5BBAD18B95F03136
+2CB594A3D6D3F8576B90A6C4DAD6D6C8EE07AF682F925F01D0B26CBA347C03BE
+F3B0585CF4539FDC66915E22117078CC94D621F31DCB3E021998A5D6EE94CA4B
+E214D07517283D56973D8E4367392BF6C1150DEBF459D141AE0941C1C8C5CFBE
+E735D796E365A1B0F60BB4CF2801EAFE4889EE5F338D3C4885368281B3C95CCE
+251C28A90D318A8A0384439B38D63B94757252062EA44E88509FDD2E75FAAB71
+7329622828B2785C1A8B26351BC74237A6BF99216652ACBD4CCF54CFC8AC72A6
+46342F1E32D4318E7E27C7B2DAC943B3E72C472FC6F1DDA8684AA922516A672C
+E969C047E318B5E3B1270C1BEB1C4071A15BC81B29B268C679B41FC5E381BE33
+DD95F0D68118CBB60C521E5CB2BA46A10E50E9238163713290DF6DD8A27D3813
+F871C07E725D4518013D9A84CEC96782541E5580E33C2EBCDB18F08EB4655A46
+507A8526DB26C854928B81FD502B0CCE4A68943C12078F57C10F4E85FBEE1025
+46D925B8B3B447D4920410FEEB9844FABE985F9228FDD9F58392F2F3BD650E49
+2E3AD5A14984874DF4572816931885CE8A448EC95BBF40DDF4F85653AD90A88C
+C4A879C0C7596E61997B972E8A55E57B17F802C738E5C7A8FBF6424F8B131B23
+CEE3EA3747DB066246C250EAD335A76FA166ABF75120CECB59076AB31A51F176
+57176CBE8C802A97B0542A5CFD6D5E6D7EC848B923012E45D9F065BFFA0D03E6
+788B68BA4DE51DA37994948F859D41C28BA939C3A82BFDB44DA585AE80B8CD7B
+A6EEA79B70BFB4864E06F06A9751BD2D2A209D150D7135E0A25D67263EDD2A7C
+C63B5B76ADB05A2BF747D5699036377F1A645372E5CF6497D8D4465492780B56
+0D7A64F4AACF00DD611A0D4AA2A1B4ABBCE41B0BF87A7351F26E125166E2E07E
+2E64639C4DC21B996EB744C784A145F80D07676331178ECAA4967195803AE02D
+1A6A04B38D721323251A1B1F656498F5FF255E4F1632DEE1A8C2B197CD7BD5FE
+3819B1998273EA5EF8EE032E0638F6DCE419852021D098A19CBA9A2B675BEDDA
+B6513BFA1F239FFC92CEC9ECC612072E87FBEF1ABEDF6804E605AC8979E970E1
+3EB524894E3949BF090C1BB477C45FC0054DFB6B6816C5B0312BB9FA09EA87A0
+9A18B9B5E0DA687BAB199267EC6668094D1FA853632DE7124CEAB78BC994D6BF
+FD8BB4B920B89A68DC0D60BB73AFED84D38925B4E8C4D4E239080FB47F44979B
+7660A9C57F1CBCE1AD69AE3E7782796EE69BC910251DF8406ACF78CDED5224AA
+B13F1E17BB454BD4B5AAAF0143570E5FB2236DD096A2607B8D24EE238110486A
+0759B4AA276E3B5AE6BCCD2299EF7EC5C0ADB9E3A838DF0A0541FC56F62684E2
+F165BDE1EEC719A7DD44D7251B0D28C63304BA3758C76B1FACD54A4E73C9B32E
+A49366083906EF8927B6463215012B3927CB643C0292688601AF2348D62292CD
+5E20110FDD05739D7EC6A3BD1B166DCC421ABA7901FB926025EF88A54B0E695C
+38E9C894A2EF7F33E5D0304268849FC3D2F972148ED6C631EA375D67DEA1F8C3
+C44173E5FAD943C81B72D818D7202AB20B77EA0299D4FF7FBCFCD7BDB0C9655A
+B02646E5BA32F6A7033BEA306BE69EDF532347B24DC7E6BA226C6005EBF841E4
+16430F8B4405B2ED05003F10080C12CC74EB07708FDBADB821BFE0DE6C8A3278
+C2349EB88B977D15639695B35C35235E00862E70D7E9BF6632E0F2E342FCEE2F
+16880A993EA9BF5FE7C0220D844C5920A5428CD87225C7FF28FDCD4FB898A052
+A0B1A3CFAB8A066ABF646D25C4A9B9B7E940CC8A46D56B1235EE247C868B3040
+A83D4392DA442669E8524ED46DFAE1514F44EE67F9147F0A8ABD317CAE4BC719
+0E0E2655654FC2DF6240564952A26549517E0B48C2500F5F052CEC01B7D39950
+109BD5E58C7C0EEDCBC27CBFECE20B9291E85CC2E80A8D41D1603838C789F254
+30E5E1A7B589FD23566A12D027B5BB21A3A0D9D40CEDFD850FADBE1B12A00F10
+7E3B1011AA803A608FF37988C7DE6AC1E955C04C1D1D08ED95F1C0520F069B4A
+53082ACE33BDC0E2A514CB5EE0ED77A861F64C9FB4E23586A6B2ADC96B4D71A8
+CDCAF63D2BBD0D8D935025944BF6B17546BAC8DC48A5ADABC729BE68EE00509E
+B084990A2BC6178A994455F9286937DAC6EEE7583FC13EA26F504E6E66142EF7
+09DD59E6A9FCA4713E92EDE9E4D415872F1FFE2F5AC5EE285E03B895E81476B8
+1871ECAC61DD555266C1D037B1BA381D130F9E21F39849DC022ABE678A7F2EA9
+1823352AA456085C98292DED9FAF082E89FC52487BD40ECE92476CE768166431
+92F6AB4CC2844565A01B9B8C16ED8FB1B59A70832339A063C5D408C566DCEA53
+306C334A0F24E5159870B2F8D999576D4A88AB3C92E5990D22AADFF62906DD21
+A7C173D5BC35A4B35017EE8F7EB0EEC8BEC6A54E1FBF1956A3650BD13560818F
+75699A8846A45307AC3C6AC39E7147844D098E2011490315DF92E188503C59BF
+525AA6C11A07F3FF28D346BF0B37C891A8CB5DB768B20E954466C7032C6FD35E
+EC745501DEECE92659642EAE17B656DEC9A19E38AE2F07471333774B9BFEC3B6
+2AEF7077B8FADB994B61C91C7C48E51FC3EC6CE490A71C82A089CD2DF1094C39
+8E652DD1F7BCB905A78F5F4350AB844877956B837795893A9D08EB5EB02F0881
+94A0670ED2AA24FE20349DADA8B51874773167DB9A897BAB5BD85ED5F38ABE6F
+A6D4AC4E4347E745919A78E8AC8781C586646D0C4195ADCA042A4F4DA6F4E253
+8B208E59816B15DAD0C761F0490CD3CC898BBA3647C9EB7B316717EE859DFCBB
+C1CBCC5CC82ED5039851E8BB34D4F7BA55E5268D7DC5010F985B12D28C94EABA
+89EDA7AD3F181889DD8BC773044C49C8DD6D3484ED6ABB5E15F4DF7898D01CFB
+EEE92BA769DC7E4CD4A8FC8BCF5450624F83FABF5CA9C211B89490C5C7222AB2
+3779526A71526361ED2C379ADCA9DBFA54708645485ACEE6918CFEB08A3B932F
+B2070F32ECE42722897C1AD9E6A375D7F789809B4AC77CDE3467108292EC20A3
+2C93477AE6756D18A0F6E3812E43BD6B5BC69540904C2AA56825D73500F90AFD
+5F008EDF78BC053A65AE1FF5A96C70431D39319341D0F40BE6863DF9377D1E52
+FF3322E00CE6B5407E1085B1D5104903AA396FC8BFBADBAD045C005A89B2C0DD
+DAF6263FAB5B49AEECE01384C811D7CD6F47543077A1A13C521D64E30219493B
+2268F34FD8F101329AC69D417756B409A0E3710FCF1FD58AE0BF6E031ADD737A
+7EF145530CBB631666A10C443D004B7A5B15B913A00461E8A77CC311A899BE4D
+1BCF43FC73C175F2A6CE589D68CA1D4231D942499D5874C9CA6B18D5DCAE8691
+25C8F66CF10B72F697410AFBF10B097312CE5B3F3A1DF658E60183C6B41D526D
+99AA575525B01BBC8C7FA511AC55EF418D623CFB9BDA56CF7A0A6D9631A8068A
+8D64EAF69D686195515A8BB77FE8832DFC42AF6120FBCE8EE04C0AA8BBE76698
+AA6E14AB126F943975648593D61B43AC7CF02F70CC7E73AF153DB464621608E5
+34EA5FFF06BDBABFD479E76EF16C20B6B2708BC6975A0916AAAC519852ED02CD
+5A0263E10A1E86A3B24E090B54A955B059E1CA5D7C777FE5B14C7533E0D25D1C
+DA7C18633AA579BAAF156FA2B70100CDA3A4DC3CC1872C27D7B74DB62AC8AC2B
+89436B90799506697631BDC3B5046645E447542243FF308F1292043098AEBD4A
+582D640FA44E67257672F6D970C895BDC9A4D76F64A401EA9546B513B07DBF4F
+E9BE239D2CAEBA74AFB0478BF80B60C49E279642C58F8DE0735F63CC8A90417E
+00453A7C7894EDD18CE46DB581AC7B31B200C195FCDD345D4E041CB612C41F63
+0A9E92D85A844FA6FBB87FD97F8F73719BFD12A0D8EBD1DF7DFF8306DEC16839
+B837E406959906450EDF9EF40CD44A3AD473C97ADE2C01AA359E228F9826B0C6
+C5C1D434F1465203E0729A996DE29F3BCC92C87FB454329422931B9207F736C0
+5D5E97514792F2083FD9F1525E9EF04DC053B789B421F3E1AEB49D686392777B
+EBC0E947BB46EAA99BB5B7AC7C18F14B69D8610C8C79B65FA060ACF860AD4A85
+D0A7739496E6DC26B83665DB7108F24530D6F4A1A61CAC9C73600E741EF36EC7
+7EC5B8A90DA28F20DC78EAC9DEA0FE09766DC2F366F035471E74DF28FE5F0ADA
+A9DC604FD782CB0E49590F55DFE398DFA307BA722C9D6FB394CBFA74093A9135
+B8FA32034AC05E82B513763721F72F6A4B7C0CD71E40BC5F39EB014512A973FB
+61CC99399D73062A1BCEB2E5181E58012782419ED04275BF52E0644C8B047D51
+90A9F8D14BB550C9275957C9B42D776A4A6580C29F66C1D558BD532303DD8F6B
+355E4589C383B16C30C4366584C985E2EF67BF9E4ED2E43C394C721C08256F8E
+BB96D01319C9249E4DF21EC9EB11A5502614B3AB1FA3E88E78F574F24F9BB0D8
+CAA6A831219E22B4BEB5565D90F47F65063714F1E1072AE989D20E3322A07658
+9005E26EBA791BE0EBECCBA007948EA225EE84D7B17CD57370CB7E81E20CBFA7
+C108A591743A35470E9B75E228EA751EC4EF6FDC8E7FE4AA30CCF26ECD0D9201
+288A20AE15E48B02416A424AF491DB60594B63C2B3B58E51A0E68B8C19685FC2
+ED2E9CE4DDCE32F69C5223935CAA058FBB23FBCD1226095D1B08C611A8D20455
+3305D203E4C7E164F6D2F755789FCA26D9FE576300D0D67FD60C7A5518287D38
+E921A0FA64A5323033B7932FE2E4F2C611D57CCB21E013F5C68BDC1F9384D359
+F69A9FA143D949DE07F815CEE5C2BE175C21EFE7F4972CCE0CB5ECBE15D1F935
+07B74E4D562153E20034E9963772452873FF6640DEBDACC45D478107E1F63DE6
+2849DC422AE297F9AF9BD5D693F67E94075C78ADF063F15E1805CC6E7613DD44
+4F737BAE5458383BF6CE214B25B597B94015052E1762197A486DF662694150FE
+5861DB71C9B1F7C8363ED993D7B07D03A9A7820A3C7CB15B22921C618C5A7597
+C0C426049928B01E78C6FCB7776D3BB98787A498BE501A394771789187A40AFC
+F4C8DB01466F1F45B7C6B8FB1CE812FE29544F3242FBADF7947D43C5321EEEC1
+661568BD694E7EE8D3FB402C45DD5329CEB27FA083A633E9AD0C8AA34B5C8E46
+3ED00B2B20606532FE953B68CBAD741CABD3F7D672CD605F5E64FCB1595453C6
+A36EFDC1C9E98FF3B2093CAE8D3961BFF4E005CFF5CBD5601D2EB5536B9B6CEA
+139EFFE8E9B2D4DEE00EFC3F842097050B18031420D76E5AFEE2B8B11E09EDBE
+29E6FF5974CA3320141D185AE1F530168F2CB0C1C888B7D26324AD488FF12DA0
+431080FFB11CFD5861E618A7B65A5AE1D1B56D26AD7CE67FE12480B601E4B6FF
+4237E34F2D3E727113B123A27009A4C81693B0AA77D121F3831FC72C9D5871DB
+94BA60B6A0105618DBD146B6AF1DA4DF3CE38296CE453A05DD95ED9694F57009
+83C2678269CB44118A8C7B343F4797C370F5656AE36FEF1C886BF01C4EA883FB
+0C42F916AFAF34407846E2AA43A3522EFC994E554D6D65FC0726B1F11F12DE77
+4C78A0BAF54DDC1C9904846736E274007D95BDB876813FF180704CA8EAA734DB
+FA15E13657059E50CF9A7551968478A76740A562AA711180FE6D9F373C3401AB
+BC6077CDE48C9BF0EEC50627FD195FBBEE1D90B03C9F7F767AA93E97FD05A1BE
+ED5A5B069C19403A0E992A7886F45D4C06EA8546AE507B0299436932F2AD0478
+1E379A14CEAB5ADDA6A8626E6DF684070B79BA96B2083B410A02989C9EF5AEF6
+F7A804382F47D5A7B66B496DFDAD64AC9D6086F92CC88190B2307A4B5E3E71D0
+35E24506FDD43EF2562AB4867357801E5B5BB6AA64ACE2DCF1B97B817F789E15
+8973096781509A4058F689A98D1B05ADBC207645FF13A0825995996402D5EA00
+B847BA18818498028B02AC410BFD5B3414272C6D34DFBA9CDA4AB9930BDF9506
+B91857E1F4A5049F4B05E172009703746F067DB51D4E997F3EDF5C075EE127E6
+18E8EE032C2E83ECD277079DA1941E31D952379C7D63918EE958D6E25AAEABBA
+06CFA50DC26AED0A2E6E3566EA97E0F21CB454EDED957119EA0A8FADFF8B368D
+948F218F20C4027148117C60D3B4BC939A642CD738C876A0D92541DAC80A499E
+248DB1E598754E33BACA4615F42D6397260E70AAB376943110888E1D69303AA9
+71D381EAC2ABB156E11680D550B4F54008A7938F38D6FF5A50817E55DE259420
+29AAC7E7123D75292E73235B46A3CF5A4C28365E82EA7D8CA4EB509A283C37F0
+35A6F52AD84DD677A24397048D047529E11253385E15C2FF341B7DE707ACC496
+F0A2686CFF1B5CEA08A96D28659800ED072CC2D9C79CBB1ADDE8F7394C2F67F1
+8905D68A157A1302EA67D781351C78DC34CB2D1AD93C6C2DBD48A3A53DC61D5E
+F9E6A0CFF942D6D9DE3BED7BE729C2CA6190F64A0B0EA8493EC7645531B7CA41
+0747884902D1CD0298B1DCAFD5CF1F66A5A3AD0436FFEDD294C72A0B0EE7A5C3
+90522F83DFD8481A0863E3F07A4714791641E56D5E9369007DBC4491306DFE61
+2047BEFF64616B48EF99038FDF956C03FF681FD3B7C1CB8C6606E39DE034E294
+04DFBA771187CA8695B9F330278FEC2EAE9F45478D2C1067CF1106DEBC98A274
+5EDCF9558BE466971A70E843CB54A2BC53E862EF20D256C92401CD94B3BE8A88
+BAA77244D0B40764C8D8077EA8EC43BCFD0ED135EF8C88F1B9AC84415247B838
+5F4F709AE4DF8A2DA0135E8DF48B8AEB925DFE31A01203A33CB1B74A4535F408
+A8ADC7F972D5244C2AA189644C106465D2E6C2C48EA732E7BA43E7067710928B
+B423C4432713D799C40EC86EF024F092F8229CAC49B86ABEC80250787F487BD4
+BBF8314D2F4F9F539117710BC6AB068759C16F1DB4974827282BE302A7313685
+16BBF11D450E360B5B7C5B6A75A4CD29B666CE4ECBB1FC1CA2B99FAE83F75812
+E61344B81C1FA5BA514BD5327E69C9DCEB4BD4AB758FAAF50DF78DD4BBEC06CE
+EFF5CEB85A11A42EE3C778B7EADC94793550EB108517AD41A4598ACCFA639E40
+D39EFBCB19C8CCA7DA731C897ED64471FBEC17E91CFD91BED8181FB42DFD3778
+9E0C6B93D8AA7E26200711586603A656D57B0F558DF3796DE457D400B6908D67
+479FFE7AC76B66DCC4FA1543B5802017CD00D4219DF00A0B93D8A4C2C3831751
+BE64E87FA5E64C6B248A6FE29A67DC089B61574B0ABB2D4335455C9427F39AD2
+77582C61F93397A409EBA5342DD249087364DE2A572A1E85E1FD719557551582
+91119BB95610F8BEBB846136D9C1F061FCA81D9312A96688067E4E4521715605
+F22499DD4DACCF31B2CEDD089B492C1AD8A932F8F317580189F9405D1411E119
+7322A61C34D8C28366732D159EC649921DD30D45104C6CE3545FD04C37F56171
+0F31AD0166C87B3044A9FB57CF1022D61426353D4EB90092AED1787B93128566
+CD834695773A27D6824D0A27D4DE5AB3F4F7B4E2033AD18B18382515EBB8EC8F
+1B14C8CB4D16223297C948279967D5260373EAEE3115BDF4879490C057A28955
+2D61B67A36F7C36C22D4C1809AA0C212B7C5818749B8A05E5C7C29BED844424B
+A5D6B567BCE77F47F68948E4A1724BED4905ED6242C25B4D340BB286380E27CF
+7EAE415F40B6CAA65CED05B83247C1D7E7E7FB13840B032D1B6417D387DFFCE3
+1FDC074917C02C9050E30FD3515F868D14E78EA6DD1774D53D536CBBEC587F08
+7ACCD9EF5D0AB6783D7C5ADE6EB45635BF621FAB33A2C96146F66269A61FFF79
+7EE8CB26F53AE36DDD6B5A0F5DFE4623CFFA95C62022DF4C5F7DDD07BE2094F1
+1B52D753D7BCC7F2D027C712549BA2573A9816DF204C69157130413ABA61432E
+D5FE2C8F832310FCD4F447224EA6480493C81920D2D3FC3F09864F3106B3FE3F
+2A7959D486FD0399684DEA5ED991976051B3FA1EA35EBD85BDD576555B4CD7DF
+260C814635BA76377BF73A1F731D3204AF925597984921257E0D96298A4A1FE9
+46B5C0EA0E2B2300BF6BBD213B90D057C1C9FE128B538F8A468599DBDFBAA75C
+D772CA628843D9B974D71C54151F1F39B03ADF0526BE78C4FD254B1804797F8D
+712DF3256BA1CE48C84114298044AE44974A85C4DD88EF100A343D8981F63DAE
+54726ADA9541A267178BC364ADAB814B4843C220A90C0E3AC2B50340E401E79D
+7EDD9C79050D36BC884EADB9A709914129412F54413EDE625AD5BD358EF2840D
+B790523F2097F866B345C6C7387C96706E397F19C8AC6B97DC0E81AC5661E170
+05B7959DF77C5A6303FC519BCDB33133C1E15FED427C684AA3E6E97C37D37B7E
+27F7073DE8D29D302DF8D54B85B8A15A10C5DD9351E04C46BAA0609A30571B95
+1679D5087B19A1FA8CF0521D7FA06064919E836D4863D78782142F19C026C89F
+E4A4D63DB8616B2D0F1803C06F1E5BAAC418E60851519F5A26E128ADAEF6539F
+BB81B33A953E7D2EDD4876380897CC5005C5A6446EBD2048467BFC12905A7E91
+0B8EFD5556FC65611B041949CB215856D8C2BA72B610BF430528F83A65511E8C
+9AC94517F552BE2B360026478A3FF288671E84F10717CE62FB5532805BB08995
+635CC573539FB78027C7FCD047DD3A114A805AC8DB17CEE18A2F877E9994A012
+E50A6C1AD66644E4C9681B0140194236D4ACA0A3373BACB09A8697703EEEDFC7
+8FA20135C17B1ABA2FD0070181E70B4E7664F3F3D8E101BFE84E017B1FB63878
+41282D114DEB771235694F26D7DE9E56E9791A82AC31EC52773F803B564A28AB
+321848A9A5618D672EEE376898CE5E8F1041CE60623AF6D9E93D1D0656B0C5DA
+537134D9DA2B1695EA902D32EAEB3C052122044F4BAC000C7E9D08281C425F6D
+65F6C9798F355209DB4E064F70A29247785CDA9E3EB4DCDF8F8EBA3692165CB3
+BA213D93850DE5BFF53C5B7F8FDB6317C85022DF1FE61D737D9386BA33C81123
+2A178503ACB370A73D47EAE72AF806F919117FAD1397E06411F6A38C35B41911
+A2A29A108C2727A94AA062E460C9DF98285C1E9F18C11E46E9ED356A57D86E09
+B2B354741C5EB89D030373D05F8BC428633B2B3B34E576129AA4E00B747D5D64
+92EE15C465FEDA8CDD7198B281921F68A358220C1544A4E32AF3F46A14B878FA
+66C3A72D2099264FED218675AF7514DE124379D744C9ABFCD095A180CDFEAC7B
+55CD99B8AC31E70F5025FFAA3AEFDCA59230511E5169E869321A10735C150F8E
+20CE65284CE384EBCDF8ED5625FBE021C06881474FDB5CA6E35A93DEDAA4994D
+4583F593618B783A04B4F570F4A49F7A1B5D71A973494A9A1847D31AAF4EDAA0
+32AB019FC8402204E5ADE1F6A4779BD194A988E12A5984865A01A8B3803F11B2
+443FD579D4526DF6367091BD71D7EAAA2ABCD4348EE7EB8A9297BE2EFDCFA98F
+DBF753CE4F12E85C8ACC4E08FF3769A7A3F726938E0E55F5A3A9CE490D7F5431
+367968C741B2D995B9E85B3EC55A82B1296025FF5C21E1983E472EA337E7ABBA
+72DF1EC1DA965F7DB1C86CB47681C1081133343B11DBEE24C85468ADFF83471A
+2CAB807668E6062768887BFF51D8FF80EFD05D60970C54A2E5537C92FFB9B22D
+3FE513AC19802FDE6CC580706E32055BB984A519FCED4432F14136C87737EE09
+FFC9C480F1D18587850120D87DCB4B7D3A917F82CEB781456CB15B9E661F5040
+4AE387D7CD536748AEABB810398B2DE36AA14D5DB5CFA46AF7EBD109685E0DBB
+34DC36E2C71A84CC32ED67DECC9E14B9D1D175A82E5F71285938C2247D1DA758
+06C57A01BD59DCFAF05348AB71C019B791B1FFDD106139AAE43D89E718858A4B
+4C31FEF996236826907BB9EC5842625AE120335B1C6FF4C8F68FE7BF748373F5
+2CB3EECA756C9CA0151D91FD2EBE7B6DA5E887E235DC6D6B34CD3FA42F8026AA
+30B9C7BF0F5A2B991C1F4C0FC1D675E7ACECAFACCC07F08F585C76A18397CCB4
+1EE5B17DC4B866AEC1F5284361EA5C65E0BE363CFCE3F14B81B7E44090219538
+43BC367204A88570D920458E36614D7097DA6C015277F83476AB0D9BA3CAB2BB
+F937D01957325E9442527D3892D3EFD388DDA4F7C1DCE849C6A490AD5AAA13A0
+A05F966ACFF3CCC6CCE8C08D8F384FA73A96E8799865D76340E9634D0009AB4E
+C4F539A4D6EF523744294A5FF4D3B934ECDD46460DEBC6852468A85B33C53210
+F80ACD68DB86979EA360CE9DD06FC7194808D064B35933E5E046CDEE1AE18183
+31FA6A62DA4F18B3C7092234F0FFF91A2635328FAA18D250C18C688422B243EB
+D5F520A6457462C393C57BA985588D0FC47F2D8E6CD2CB3D73D6C35EC6E578D8
+3254BBC4BDE31429C6706B72D518DB45D4457E8C60D0007623C520B1B7AF3A01
+A79AB2AA961FF7A5237D9993A4446FEBBD6AD51D662C9909D2D1C2D3424E9CD5
+8A170DF06CB7C304AA9774F13301495CDB010DA9218EE9A1FC05F477DE533217
+5ECC5996E4D340CBDD2DD6C53F9B8EC5E9E5300AA0D5967555B9DC31019F45CA
+A702C6F0568109C55DF33FD90A0E9B8FABF3ADBB0CDC353AC7B18F4E60D88A96
+E22A85193C953042F26BAC0A4182352080D44CDFE47AB34FD7848BBBB9021EAD
+82D68F7A6C6ADE8E317C8B7026043F5321475EEBE56C21EA0C6FDD617C588986
+EF0044BFA70E2FA9285625739D63C8C9DD6E2D62CB9760C62EDE6D29700BB89F
+AA7FD01A9E4F3A6364B2ABCB324DA52C6A518E68F7DA61FB12878DD94F8FDBB5
+57300284213E77C7D6DA5E2BA3DE91D7A3116CE9C8A45F3F98C8DE7C7FFB5628
+D3175A93A027FCAE02A0783A09D09997F247A8923D7E7442DC3B1D259893BB6F
+3D664620C9C4A2C66F6B4D1F2E9957D8C47119EBD1759B9EE6F5BE2D2FB0EC32
+EAAC468888774B8AADCB59FEF948FE89F18D2436D877718900E4F5A4B885C38E
+9C9B344895FFC5F2895DC187C3481CC23F4F1B87B9FEF11AB9FEAF9498ECD126
+99A8884A86BF9C943D6E03EC4D974F030F157E387B51D360BF8C21C799DA4848
+09DDE528DBC3AF547833DCBDC7404452245E0580012542267EFF13CFC5DC8EDA
+66958A20A94176552A25D024ED91C3F6FF945DECCAA7C0D71EE0591E53E75008
+0D31A8BD2D1096C8E8A7D5422595D65E1B981F14489F00D5A57C9884EBC6AB67
+2E0C5156295A3D2EA764D77CFABF2DD2A8F32F75B1A4F42BB819F3B59101EB70
+7C571225510ECA1DBAD5C618B6864BDB0FBA7C5055D2F36D5599022F2D95E340
+A0329B0C30B54CC501448AA38EDBF41E023EC8CB8451D32D392D5FAE1736ECA2
+647D6C41BCAA3BACAF8070747ACDC10B51C686534EF2CE5967A94BDA40B8AA37
+7E21DC9BA34B7156BB4310A60B179DBD4CE01E76A84F0E8F9788C356532ACA96
+9A122BD6ADC5F94FFA90A0C3A14C839727FB419A6A49B119DF87CD515CC5E85F
+2A4C2CF778C5B893B8D24B966BEB874B5292C31737F985C8029CD80E1AECA3ED
+AAA8EAF5DAD31C8073512D5E68511D31513B066DDBAC22B75A5C78F213DC962D
+ABA84D447C6D68BE5979BD72B7D5F060F96B9B1BB07B7A0CE956BD3BDFBF116B
+77CA0D330B08B4D276393CA20E16DE346AED3650EA9CF3DA4FC30061DFF8801D
+0AF8C7152AADC3B929B59F328ABAC8357C09A393C33EF7BC23F36CFEDAF32024
+84CA10A51E1469915A3BFC5602565BCD3F89A875408526A90491D570090C98F3
+A2BBC8B14F8F4EEBA923594002203589879938CC709564111459A10D152C45BB
+113E255C541E2CA81B683D4249C25A2C64F46E576F1037138157477B23631E5E
+473DF12785547266190EE3FDEE18F2B78308E3B66996949E4482FA814CDFC92E
+F6C4B5CB7FDBA581B35B5E0B8E9C93C2A0BA5E251DB94C4C56D1DD4F7FACD2BE
+A8A28E20B8115309859E681D4E93148B4F09E06C5679BAB4076B808BA999FBDD
+E654E96EFBC2B99FAA1D6B03D7FDBA7044B8C1B9A4EEA8E9AE07071F0218669D
+42512E6BB0461118C832392814C7E8E98082FAECA79DEEC151E2E09601629A2C
+95C82BEBA0B97206EB627CC80A12CB85D93145802AE6394F40E53D0BED4BBC59
+0D36545D1D272C9F9FB2DF0780674F8D4E482A85F8883516691BBBDA48F23308
+F10630CFFFFCD8CA7467AF857E5AB4C8B6DB9162C566438DC5B99301D3FDE196
+C3F84B25C8C3664A8375C41A63B2ED7F3D68E9C364CE6E5EF3E77540D8FA5D9D
+D5333D3BE7705DCE754BABCDC8ADC7CE092E877AB0B202B622BAAFF4B106FC00
+11821EAC567FC09BC1A6964187419AD9993A67AC4D7C9FD56F59FD6DCFCB07CF
+488016ECF192A7C21978A965D9B7DE9A3A0D9BFC4FBC575A5AC759148820876F
+CF881A503EA410922B51A9DF213548943125218C779A598FC852C08098E5C3B9
+202E68950097BB1B7990A0C814899C446C332E662622B1738A49E60BA8EDAFEA
+F7079B848946ECEA50EB3DD0F45994CC0C40E1FECC5372FD16D15DAEA0CF4EC7
+2142A6996B21BB26C3C0D2ED65EBBB549B3A5BB223F7558BB29FCD5A74407920
+17088857E275CBACE034358B1E6019E1EA4D99A4B5AF86420ADC8971C3265979
+5EA9FB66C49EF456D95343BCD7481056158D0215723ACB98D856242265882D07
+1073E86E684FD4AC53818058147D91E34A3354337127C6068B9C795891748532
+D9E212FF70F5FE51F71A735CDF254E9756D4925377E50203F857B32669F68E01
+5E1E588D7B392F7F68482434FF32D1075112ABD9DDA7B5548450A842B75A05C7
+8CD1061A90AC5AFE23901FDB209CFF92A9E582B78DD2BB2A9FCC9500C58C7483
+A8573576C96CF7AFE5204544D975C5D349C75E0C100D4F4C87E5C2FC2C4C2708
+211C9CF169EB2E862EBE04A30F87250440BA02BC5D419E2EB73367CACD2CC246
+B8470A0AA6859105193365520C5D9CAED67D98D634C2DFA472A78EC5BAEDDD78
+451F8146DF4C698139C7C87E0548AB705A738CC3D88D4D2E8EB12F859A319A13
+FAC067CBFF9A5382F5930E144CC97C79C1D3106204BDFEA2E668F3B78A5ADCF8
+64B925A7626E7A731603D1E0E18571D3122435BE105C2A8FC81364AACFA468B0
+2BFAC6E5725A0D8302B2384FD5A6AD833A4BA6F9A68B60F11B4268F8AAFCA77D
+B1B97BF7249815B6E4747E80AF42DF6EADBE5DAADDD938425FBBA6AA29BA6162
+19349F546A26E5CAA8619677493274427DED8D06D8365C4568FDB3ED722125E1
+7F71A26172462D731D08B26826B673F61588C4C72141504A3A1ECE7C63BE260C
+B181571B3B01092F8029909E2DD0AF6B569970715A10039ADA5A1E8E408C5A42
+990D9FFC95976613079B5C41FB82593B1F43C7E2B5AAC5B380061992FFE05E67
+AAC224C578AEA1E900048528175C1397C39FF257D32CD11CC5724EBA27A5FF63
+CA8DEDEFB7926E1A9484A733F3E1D1608A8E7FD468F8130290233F4843C553C9
+A9AB80FFC55DF6E961A32174D02C569CAC2EA8D8D72B9B301D87F695BDDE44AE
+AF7ACBCA79A169E05D9156613E3E6A46C9B7B1DA76D3AAFA9F0E40630EF57F41
+EF285DFC9093EF3C6B50FEC74DF0B9063022F1D3C54EDACC4B7CAB6A219BC271
+7CAF4D3B0723F822184FA5A22899F2674812F54951E7072C0F8FD4256748E452
+BB8D0DF7B9D5C7C2A6803FE2796CA7F49DC97D9C2C1257C0FC7084E5D04B96C6
+D340C9839D58A3C10C9A8CED7DF1EA90CB6DE2917C62B0673AAD1053593681DE
+3E0F592B5515A94B0289DAEFF215958ACE8A8552B046B18D6CFBC3498CC1C8D5
+FC3A971757DBC374C25C4856EA4340659EAF6309C38F9CFD28CBEB3A69F39E56
+A40DD0DC5DD44B1FA830973506CE0B06391DF4051E4000E0C3C26F60F872A4E6
+0BE9119C5DB19BAA854EDE7AF240AE413A197CDCE98DDC42856D4544EFBC52FF
+5D6D174FB3D034CA658D8BDFCF9952924BCB88762C3E1AAD29A85E5E77654ECF
+FE26903AC41E3A2B1CD3FFB89CAA132D5278332FFD46AA489D5667BBDB73CC0E
+6F450052759710E8B96CEC8487EBC16ED29A41D4C5ED88212F7FB702F876C03E
+481579AC5072AB64462CAA2337A720C89FE442B49D135C5935FFDA2960710E64
+8A7B80A5E71AA1A693671EF5718E7E342DD4BE71FBD10919E9A2F79FDEC33F0A
+8FFF1628A6A18E8624DE0FDF484A0647DF62C7C67D1AF3959E452ADFB4493521
+DEA9C6C81FBAE5EC68379C93DE9C138E2332E7A2D9EE1953BF10AA9D1CC9CB2E
+654FFF2A2514FF93478E9BB0B84A445FE6EEC8D92BC52282BA53BEA122768FCC
+73DC0E6F1935A06F2E253988CA69649D0E8C39CF9AAFBD3DDD04900E2698CEE6
+221D808B958CD833EFDA976E6D7B359D8CF62428F87FB70D47CD5CCC55007212
+A9B932E5966B475FB7DEF27B4F05B3B969C100CBD384DE7DA3B1245B5BCBBF4B
+F4D0496A9B0AF3E5CBA8A2D239346CA6577AD19B2C23D2E401A9CC6B2FB9DB72
+F522E2935C3B3D5AFCD18D27F94859B797473502372F188F5ECDE0E69064B6A7
+6EC311DC3A6A7FAB5691652F7C486325CB6E58BA814C8EB2861F974913D173F4
+2A429DF45B2B91BF02DA372CA190FD22FE315E877FD24E42F82CCD0570748C3B
+BE64305C56E7C087D38D28147F80D93B8624E63093FDEC6E546157DE842D9021
+26FFFF44372AEEB9D0B197B668B82793D719A50AC9F819A3E4EB3C0C5BFB0C01
+29412E6876FD5A5A183A19087A65270E06AE876E28EDC8FB2C49EEA549BDAA4E
+2E03BEEEA8B22C667BC6E6B193E5C914A14E09FB1103996B3CEB61F3F4549EDC
+B4D9A78D7CD44A28448F24F27EBAF2C255F19097AE400B8999F080167F14CF25
+959BFCA4059FEC8B3D8B1D1EC66DD5AFF05CE758BEFAAEAE7E5D1D434F1B0B6E
+1EE01D63FE8A2C2D0E1FE4A14DC35D2A63128049DE51BEF14482812ACF89E981
+E51BBB5BE0524DDB01771D7B419DADE73EF0AA7CC99591BCED208E55912AA6F4
+EB9ADE2B7D47514F7E11AEA12BAB51E93B24313A2CC4FEB226B00934A1D50CCE
+21F84E7C4CA87866A3FF5C5529D73F7F848B49C9D350BE4543CEC67F1D2A0BBD
+A79C21470C090659081CA4FE7DF3138ADD83C8A35DE85B44BC4DD3A955911DB4
+B78F9CA3F674D36FC9D7CEBD66A571F73D1ABD57A2208706ADCA285E4483A95A
+73F1A9D762872F0AC7AC808E59F69D1E273C046940D642F92E8E6D37D08CE03B
+608FFE19F882B40AAE1DB3F5355F6C2192EDB927935514794BB8DD035C072BC3
+A9793A31480B7A761144B77777EC03357A58D90A7E08B0EC9EC90F0F2D67844B
+0E6AF90CEDAA04CCECAC1EA93988322CD7543E57DB0C763F68528C7171F264A7
+D1D016B1470DAB2747EB3D27BBB448E040198A43C67AFD52CF31B801C6A838C2
+A720B7A819B534ED283CA362CE12EED34B31F32BDBD521ECF71DA160578602FD
+ED11D7B60D313A5A613ED89ED8BE69F5C2F1ABD04331A2E1D8ADA570FF96A5C9
+C6703EC7420F8EC43598E81691D291F193AD4F95CBF82EF712EC190A898CFDE4
+72B0388BBD08BC03CBD3DDA0648E3E0A0DE0FDE15739060FDB10629D78457645
+1D32ADCC813FD66FDDFC9EE79FA705B274BCD3656E745B1CADC2A1799BB8430F
+7C34ADA3E81DF1777D175B3BFA199E092B3CB5517EA3D41BE449BEB1E5BABB65
+F42069121C1014B05D9D2B90DB93296183CC7FAF597D88329918BDFDC283F3A7
+CA2A2BFC573F934E576B438761E75487377CD4BD09085158ABF569C0A4BC209B
+9952457D15BFB036BD0BBE942E10A82A89E4D012AB1B72A4A59A18A55E5EDFCC
+CC9DE3382ED090B1F3CC5D8EE59900828175C92E7C5410631A804FEC75603CFC
+F1033827927E485F6236B227E9D54D29CE5D2A3009B88A3D2ACD9430FD5E3AC2
+E321581FC966FD628A099EB795A4D1230C0F57F78E8F619A6D4BE8F328886E3D
+AFA2C1CA5B009075056F92E55CBF2B55B59EBE68859B7584CB852C3924095559
+B255ADFFD79AFA6BDF6D68838AC48DE5B79A277932244DEF5306E4A47DD0325D
+5DBA34765AE92F8094C11FCDA5646747105131838106D9C1D79714F9576C8F28
+FC6E7D0BD07254B1D29FDA5E4FE5E2F7FFD1A56D41435AE2F6DDC1970C9A89BC
+930E99448B124112B488AAFBF01DB6EC917734BBBC7376D6EF09DC05EB283A36
+C2B8CA16F4E3718C00311C64DE6A03682E84845CC57BAD00F9C4F5D85BBF6D46
+093A22DD9DF218019573415B8371AF1DEF2770CEE7FADE0FA43DDC61AF7858A0
+ED625FACF6FB35EFC5968F5FA0D2FA2A8961CCF36FED33CE945A1F7265AAA702
+F33CB51F651600EBAF3DE4F3A2326BC38E48F8A6762DBC107DFA4F5C5BFBE52D
+CB3D2A1AC15DAA0564A465FC1BAE1202C3DF85AD87832C27F4440C276D11BAE7
+7B591FECAE5171DAA8C68DFBBC2AB09312BBF1B4D2F43A59A80DBF22AFECC1B6
+3B7D57C3DD4C00B7ECC587F40F5211709340A56FEC69DB55DF1B5E8F78790722
+A0D712FDF782AEFA64A7429262E976AB9057466C549D8C05178AD9545ED838B6
+CB5BAA750B223DB6DA2C137E4EC91A1D3750C09D56BEFD4EF0760113ACABC2E1
+BC2A833994518E00054595B787195547424C8D96351C86113962E507560A92FE
+D7813AA3CB95AF370975998ADF00AA0FD5F9274976B119805AC287BBBAF27E25
+91913C949BEBA56F72A7B6D01789313B63DD404F575BBC1D2336BB81BD1BE035
+F54116DC276E02E0F70D6C1BD3FADFBC43552E07F39758D5E2BFD423F3A06341
+524468B77DC403BD7D6913DB11284EBD1AF581F391B9D4CD599A0DBA01E0907D
+4E211BC887BD450FF7FC5E0670215037AEFEEFECDBC096A4141764DF63D97C1B
+3A77F3DFC74A0325937A5D6A089C8127B511527D2D5FA186FB762229809B7BA1
+E49BCAD0B9D7F610FBB3FC37AC5021250FBD022BE60A841FB4FAA33C359A4268
+2F7C9E75F3E72DC43D2DD07FA94ACE36FB9A774F2E076563048068D6127BC83D
+CDD9C71A01C1D7F5C345741C64F2AE3F891914088A1F1E5CD29F6CE3D5B54F7E
+0C8407DE6E8673F1AC639E20178DBDFFFF951FF36FA22AB4ABF6A99EAD86A733
+2D50D2D127B66F5155BE6EFEBBCE178C529CD741BC5B2630EA89B7A18C0B084C
+07AA4DDD7DFAA145FD912C380809D194DB1475B00798CC816F91747FE19C062C
+9B3BF4C93C3A7B33B60C6F143A67A877946F9C01B9CC781DFDBA109101079CB4
+FB585C978B17707F76E1DBE44201A0AA388B0237BAC3FCFDDE2A714BE0B80BA2
+FE71AF9739BDB8DA3A066B5ECE33BA7584924EEDAFE2FE28D5D984B9243DEA82
+0A92529A6DACB90EBE1F1BA717E80C6F25167C5077E82B23A1B66FF964736B51
+57E1359B9EE4189E21A889AD4EA99542612C88B6065F294C4937B816B7D3324F
+F42ECE164FEE84C8A6E31D0F16811D1FFF66FAA889C28240669A8CC40C84C547
+EF4CE28DBD4CF4FE5A93C70C707894EE6B6A85CB7D017BD2ECC11434319D2AB6
+AFE26BC9BE7150F6E8BE52E3A925DC06D4A309EE9BA0432935B095B84369AAAF
+CE1C65F9E73D867235313C9809E2B6733ABCB79BA9762FA1215BB41388854ACD
+66E5FDD73927ECBBB55C485C88BB540470C6EF6699C8C9D83EDCCCD207780DF3
+84A4EF2073813C676704C6F0C1287733007F7E05DF0FDC445B22B0315ACD75B7
+9AF8B5471A1EE52458A1E34CAAC8C78E8A01B7224BFE7774314736EC8086D7A9
+2B3A4A95C0D4ACFE4778E4827062FFDFC4A11ADC64E85722F459F9C21B4D6532
+5F7A90E3A68F55F9F4712CB1BC050DE2A04F9F49D84D4675FA5C5A0C6C747CF5
+55AD0A63587BF4BBFCF882201038DFAF873F155FD375B424191EA3FC0017B54F
+81371A667B8746EE18B794186C109949289764A353E54118448F285BAE6F364D
+39FDCE512FF45982FB9DE54FB2B13702ECEE078C0431B769DF0B42ADDE5D64A0
+A3B9B94CDEFF9CEE74B0B48E9E380324B936C6ABDB7F80503AA787200D09D0F1
+07359242E0EC0566E9DECEFC02898566C5457293E1FDA6AA2CF780DADBD2FEDB
+1610246EEDE4BD00C6B7284DF3794711E6D6EEC64AF3F61F5F45A468E400E743
+C49B543731414124EEACBD9264C76A6A58ABEC3F7292968695617E4B4F4436DC
+EA3C75B8BCFC570AF2A942769C4972B6B8A4BCABB2F6695B1E045249ECC4181C
+8EE6B49C53B38117755B95F5843A712B47B6098339C5AB733807CCEC17575439
+78CCBCBBF9D852C36062A586DB00A5EC089AF853289A9F089A08F2C7B8285844
+B2A28E5B6E4367A228E84F2A1C72B1FD37480DDFFCD28585A24D7630FA56AB02
+222A5F764029C82DD67F10986E77865AF507A2BBDA4B3D4D54E20C00816B8202
+F2EDF2A828528DD170FB0ECC605EC794EBA4E7A78B31F4A564FE4994C2B65752
+820A49B51196EB4192CA4B777D675DE57A00D23F4BEEDED6197CE8BBF6E01F26
+B045D4252CB302C57C0D076294E407A823BEB4FD7305C230D084CF7FBE7BF161
+1DE690D4765927D2B95DBEE0A1D678C4DC8F2BEDF9CB96C5945A525BCBB9F9A7
+E36D2FEB22A089E3C8A5792DB5DCA7FB46BB78DD719DED2F2B8A5314658549E8
+20F20D49296AD845FF45EC0F4395E1553DE991B2E40F2F267901CC3B3344660D
+00A4C51870835CF4A2611979826825F8EF045FCDF258353622B352C119D680FF
+857AD6DBCF66BCE00060DFA1B32A722AAC5ADF0323ED78B269EB284A4223A9BF
+896CDF2307259D21ACC80CE4E6D43736317330D00867C128D2CDFDCE2226BBD8
+1626137CFFD53D7C37946BDA99FD955ED54E25EF71C1F19CB4BEB4D3B0099E86
+42622EEB4C57E9C3D1BBAD07FDEFD3C3DA91A66FF9808F13EB4B7895CB2BFE2D
+00A238EA7240032300BF6DA66217A55C0D47344738EA21F9081FF597413C79BE
+4DBDEEAC2C93EFCBB4680EE2BEEBFC14033CC5DE5EB86D5D0E4DA274BED45366
+283BFBF9D937144CB903CCE1003325BED0EC8CD03D250B8666BFF9B33983B670
+20ED1995D24E63
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndFont
+TeXDict begin 40258431 52099146 1000 600 600 (rluserman.dvi)
+@start /Fa 134[39 3[39 39 39 39 2[39 39 39 39 2[39 39
+2[39 3[39 97[{}13 74.7198 /CMSLTT10 rf /Fb 134[39 39
+39 39 39 39 39 39 1[39 39 39 39 39 39 1[39 39 39 39 39
+39 39 39 39 39 9[39 39 39 39 2[39 1[39 1[39 2[39 1[39
+39 1[39 39 39 39 5[39 7[39 1[39 1[39 39 39 39 2[39 39
+39 39[{}48 74.7198 /CMTT9 rf /Fc 167[62 3[60 46 2[57
+1[62 76 52 1[43 1[62 65 54 1[63 60 67[{}13 83.022 /CMR10
+rf /Fd 134[65 65 1[65 68 48 48 50 1[68 61 68 102 34 65
+1[34 68 61 37 56 68 55 68 60 7[93 4[85 68 92 3[96 116
+74 96 1[46 96 1[77 81 1[89 87 93 8[61 61 61 61 61 61
+61 61 2[34 46[{}46 109.091 /CMBX12 rf /Fe 133[40 48 48
+66 48 51 35 36 36 48 51 45 51 76 25 48 1[25 51 45 28
+40 51 40 51 45 9[93 1[68 66 51 67 1[62 71 68 1[57 71
+1[33 68 1[59 62 69 66 64 68 19[30 33[53 11[{}45 90.9091
+/CMSL10 rf /Ff 137[42 1[30 37 38 3[51 74 1[42 1[28 1[42
+1[42 1[42 1[46 84[51 12[{}13 90.9091 /CMTI10 rf /Fg 134[48
+48 48 48 48 1[48 48 48 1[48 48 1[48 48 48 48 1[48 48
+48 48 1[48 48 1[48 2[48 14[48 48 1[48 1[48 2[48 48 48
+17[48 48 2[48 5[48 39[{}33 90.9091 /CMSLTT10 rf /Fh 135[56
+2[56 1[42 2[51 58 56 4[27 1[58 49 51 1[54 1[56 97[{}12
+90.9091 /CMCSC10 rf /Fi 197[25 58[{}1 90.9091 /CMMI10
+rf /Fj 197[33 58[{}1 119.552 /CMMI12 rf /Fk 135[85 2[90
+63 64 66 1[90 81 90 134 45 2[45 1[81 49 74 90 72 90 78
+11[124 112 5[126 1[97 4[127 101 106 124 117 1[122 15[81
+49[{}29 143.462 /CMBX12 rf /Fl 242[91 13[{}1 90.9091
+/CMSY10 rf /Fm 134[71 71 97 71 75 52 53 55 1[75 67 75
+112 37 2[37 75 67 41 61 75 60 75 65 9[139 1[103 1[75
+100 3[105 128 81 2[50 105 106 85 88 103 97 96 102 6[37
+3[67 67 67 67 67 67 2[37 1[37 44[{}47 119.552 /CMBX12
+rf /Fn 129[48 48 1[48 48 48 48 48 48 48 48 48 48 48 48
+48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 1[48 1[48
+48 48 1[48 3[48 48 48 48 48 48 48 48 48 48 48 1[48 48
+48 48 48 48 48 48 48 48 48 48 48 48 48 48 1[48 48 1[48
+1[48 48 48 48 48 48 48 48 1[48 48 48 48 2[48 48 48 48
+33[{}80 90.9091 /CMTT10 rf /Fo 131[91 45 40 48 48 66
+48 51 35 36 36 48 51 45 51 76 25 48 28 25 51 45 28 40
+51 40 51 45 25 2[25 45 25 56 68 68 93 68 68 66 51 67
+71 62 71 68 83 57 71 47 33 68 71 59 62 69 66 64 68 5[25
+25 45 45 45 45 45 45 45 45 45 45 45 25 30 25 2[35 35
+25 4[45 19[76 51 51 53 11[{}82 90.9091 /CMR10 rf /Fp
+134[102 4[75 76 79 3[108 1[54 2[54 2[59 88 108 86 108
+94 11[149 2[144 3[151 1[116 2[72 1[152 71[{}19 172.154
+/CMBX12 rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%BeginPaperSize: Letter
+/setpagedevice where
+{ pop << /PageSize [612 792] >> setpagedevice }
+{ /letter where { pop letter } if }
+ifelse
+%%EndPaperSize
+ end
+%%EndSetup
+%%Page: 1 1
+TeXDict begin 1 0 bop 150 1318 a Fp(GNU)65 b(Readline)g(Library)g(User)
+g(In)-5 b(terface)p 150 1418 3600 34 v 1873 1515 a Fo(Edition)30
+b(8.2,)i(for)e Fn(Readline)e(Library)h Fo(V)-8 b(ersion)31
+b(8.2.)3118 1623 y(Septem)m(b)s(er)f(2022)150 4927 y
+Fm(Chet)45 b(Ramey)-11 b(,)46 b(Case)g(W)-11 b(estern)46
+b(Reserv)l(e)g(Univ)l(ersit)l(y)150 5068 y(Brian)f(F)-11
+b(o)l(x,)45 b(F)-11 b(ree)45 b(Soft)l(w)l(are)h(F)-11
+b(oundation)p 150 5141 3600 17 v eop end
+%%Page: 2 2
+TeXDict begin 2 1 bop 150 4413 a Fo(This)29 b(man)m(ual)g(describ)s(es)
+g(the)h(end)e(user)h(in)m(terface)i(of)f(the)f(GNU)h(Readline)g
+(Library)f(\(v)m(ersion)h(8.2,)h(19)150 4523 y(Septem)m(b)s(er)36
+b(2022\),)k(a)d(library)f(whic)m(h)g(aids)g(in)g(the)h(consistency)g
+(of)g(user)e(in)m(terface)j(across)f(discrete)150 4633
+y(programs)30 b(whic)m(h)g(pro)m(vide)h(a)f(command)g(line)h(in)m
+(terface.)150 4767 y(Cop)m(yrigh)m(t)602 4764 y(c)577
+4767 y Fl(\015)f Fo(1988{2022)35 b(F)-8 b(ree)31 b(Soft)m(w)m(are)h(F)
+-8 b(oundation,)31 b(Inc.)390 4902 y(P)m(ermission)21
+b(is)f(gran)m(ted)h(to)g(cop)m(y)-8 b(,)24 b(distribute)c(and/or)h(mo)s
+(dify)e(this)i(do)s(cumen)m(t)f(under)f(the)390 5011
+y(terms)25 b(of)h(the)f(GNU)h(F)-8 b(ree)27 b(Do)s(cumen)m(tation)g
+(License,)g(V)-8 b(ersion)26 b(1.3)g(or)f(an)m(y)h(later)g(v)m(ersion)
+390 5121 y(published)43 b(b)m(y)h(the)h(F)-8 b(ree)46
+b(Soft)m(w)m(are)g(F)-8 b(oundation;)53 b(with)44 b(no)g(In)m(v)-5
+b(arian)m(t)46 b(Sections,)j(no)390 5230 y(F)-8 b(ron)m(t-Co)m(v)m(er)
+31 b(T)-8 b(exts,)30 b(and)f(no)f(Bac)m(k-Co)m(v)m(er)k(T)-8
+b(exts.)41 b(A)29 b(cop)m(y)h(of)f(the)g(license)h(is)f(included)390
+5340 y(in)h(the)h(section)g(en)m(titled)h(\\GNU)f(F)-8
+b(ree)32 b(Do)s(cumen)m(tation)g(License".)p eop end
+%%Page: -1 3
+TeXDict begin -1 2 bop 3725 -116 a Fo(i)150 299 y Fk(T)-13
+b(able)53 b(of)h(Con)l(ten)l(ts)150 649 y Fm(1)135 b(Command)45
+b(Line)g(Editing)26 b Fj(:)20 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h
+(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)39
+b Fm(1)275 786 y Fo(1.1)92 b(In)m(tro)s(duction)30 b(to)h(Line)f
+(Editing)17 b Fi(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
+f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h
+(:)f(:)h(:)f(:)g(:)31 b Fo(1)275 896 y(1.2)92 b(Readline)31
+b(In)m(teraction)19 b Fi(:)e(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
+f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h
+(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)32
+b Fo(1)399 1005 y(1.2.1)93 b(Readline)31 b(Bare)g(Essen)m(tials)18
+b Fi(:)e(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
+(:)31 b Fo(1)399 1115 y(1.2.2)93 b(Readline)31 b(Mo)m(v)m(emen)m(t)i
+(Commands)18 b Fi(:)d(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)32
+b Fo(2)399 1225 y(1.2.3)93 b(Readline)31 b(Killing)g(Commands)10
+b Fi(:)k(:)h(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)
+f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23
+b Fo(2)399 1334 y(1.2.4)93 b(Readline)31 b(Argumen)m(ts)22
+b Fi(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)36 b Fo(3)399 1444 y(1.2.5)93 b(Searc)m(hing)31
+b(for)f(Commands)f(in)h(the)h(History)20 b Fi(:)c(:)f(:)g(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)33
+b Fo(3)275 1553 y(1.3)92 b(Readline)31 b(Init)f(File)13
+b Fi(:)k(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)27
+b Fo(4)399 1663 y(1.3.1)93 b(Readline)31 b(Init)f(File)i(Syn)m(tax)26
+b Fi(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)
+39 b Fo(4)399 1773 y(1.3.2)93 b(Conditional)31 b(Init)f(Constructs)16
+b Fi(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)29
+b Fo(13)399 1882 y(1.3.3)93 b(Sample)30 b(Init)g(File)22
+b Fi(:)17 b(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)35 b Fo(14)275 1992 y(1.4)92
+b(Bindable)30 b(Readline)h(Commands)22 b Fi(:)15 b(:)g(:)g(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)35 b Fo(17)399 2101
+y(1.4.1)93 b(Commands)29 b(F)-8 b(or)31 b(Mo)m(ving)18
+b Fi(:)f(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h
+(:)31 b Fo(17)399 2211 y(1.4.2)93 b(Commands)29 b(F)-8
+b(or)31 b(Manipulating)g(The)f(History)f Fi(:)15 b(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)41 b Fo(18)399
+2320 y(1.4.3)93 b(Commands)29 b(F)-8 b(or)31 b(Changing)f(T)-8
+b(ext)12 b Fi(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)25
+b Fo(19)399 2430 y(1.4.4)93 b(Killing)31 b(And)e(Y)-8
+b(anking)13 b Fi(:)k(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)26 b Fo(21)399 2540 y(1.4.5)93
+b(Sp)s(ecifying)30 b(Numeric)g(Argumen)m(ts)e Fi(:)15
+b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)41 b Fo(22)399 2649
+y(1.4.6)93 b(Letting)31 b(Readline)g(T)m(yp)s(e)f(F)-8
+b(or)31 b(Y)-8 b(ou)22 b Fi(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)35
+b Fo(22)399 2759 y(1.4.7)93 b(Keyb)s(oard)29 b(Macros)11
+b Fi(:)17 b(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)h(:)24 b Fo(23)399 2868 y(1.4.8)93
+b(Some)30 b(Miscellaneous)j(Commands)16 b Fi(:)e(:)h(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)29 b Fo(23)275 2978 y(1.5)92 b(Readline)31
+b(vi)f(Mo)s(de)10 b Fi(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23
+b Fo(25)150 3229 y Fm(App)t(endix)44 b(A)119 b(GNU)39
+b(F)-11 b(ree)38 b(Do)t(cumen)l(tation)i(License)25 b
+Fj(:)20 b(:)32 b Fm(26)p eop end
+%%Page: 1 4
+TeXDict begin 1 3 bop 3705 -116 a Fo(1)150 299 y Fk(1)80
+b(Command)54 b(Line)f(Editing)150 527 y Fo(This)30 b(c)m(hapter)h
+(describ)s(es)e(the)i(basic)g(features)f(of)h(the)f Fh(gnu)g
+Fo(command)h(line)f(editing)h(in)m(terface.)150 766 y
+Fm(1.1)68 b(In)l(tro)t(duction)45 b(to)g(Line)h(Editing)150
+925 y Fo(The)30 b(follo)m(wing)i(paragraphs)d(describ)s(e)h(the)h
+(notation)g(used)f(to)h(represen)m(t)f(k)m(eystrok)m(es.)275
+1058 y(The)35 b(text)i Fg(C-k)f Fo(is)g(read)g(as)h(`Con)m(trol-K')g
+(and)f(describ)s(es)f(the)h(c)m(haracter)i(pro)s(duced)d(when)g(the)h
+Fn(k)150 1168 y Fo(k)m(ey)31 b(is)g(pressed)e(while)h(the)h(Con)m(trol)
+g(k)m(ey)g(is)g(depressed.)275 1301 y(The)g(text)i Fg(M-k)e
+Fo(is)h(read)f(as)i(`Meta-K')g(and)f(describ)s(es)f(the)h(c)m(haracter)
+h(pro)s(duced)e(when)f(the)i(Meta)150 1411 y(k)m(ey)i(\(if)f(y)m(ou)h
+(ha)m(v)m(e)g(one\))g(is)f(depressed,)g(and)f(the)h Fn(k)g
+Fo(k)m(ey)h(is)f(pressed.)48 b(The)32 b(Meta)j(k)m(ey)e(is)h(lab)s
+(eled)f Fn(ALT)150 1521 y Fo(on)c(man)m(y)h(k)m(eyb)s(oards.)40
+b(On)29 b(k)m(eyb)s(oards)g(with)h(t)m(w)m(o)h(k)m(eys)f(lab)s(eled)g
+Fn(ALT)e Fo(\(usually)i(to)g(either)g(side)g(of)g(the)150
+1630 y(space)h(bar\),)f(the)g Fn(ALT)f Fo(on)h(the)g(left)h(side)f(is)g
+(generally)h(set)f(to)h(w)m(ork)f(as)g(a)h(Meta)g(k)m(ey)-8
+b(.)42 b(The)29 b Fn(ALT)g Fo(k)m(ey)i(on)150 1740 y(the)c(righ)m(t)h
+(ma)m(y)g(also)g(b)s(e)f(con\014gured)f(to)i(w)m(ork)f(as)h(a)f(Meta)i
+(k)m(ey)f(or)f(ma)m(y)h(b)s(e)e(con\014gured)h(as)g(some)h(other)150
+1849 y(mo)s(di\014er,)i(suc)m(h)g(as)g(a)h(Comp)s(ose)f(k)m(ey)h(for)f
+(t)m(yping)h(accen)m(ted)h(c)m(haracters.)275 1983 y(If)23
+b(y)m(ou)i(do)f(not)h(ha)m(v)m(e)h(a)f(Meta)g(or)g Fn(ALT)e
+Fo(k)m(ey)-8 b(,)27 b(or)e(another)f(k)m(ey)i(w)m(orking)e(as)h(a)g
+(Meta)h(k)m(ey)-8 b(,)27 b(the)d(iden)m(tical)150 2092
+y(k)m(eystrok)m(e)30 b(can)f(b)s(e)f(generated)h(b)m(y)g(t)m(yping)g
+Fn(ESC)e Ff(\014rst)p Fo(,)j(and)e(then)g(t)m(yping)h
+Fn(k)p Fo(.)40 b(Either)28 b(pro)s(cess)g(is)g(kno)m(wn)150
+2202 y(as)j Fe(metafying)39 b Fo(the)30 b Fn(k)g Fo(k)m(ey)-8
+b(.)275 2335 y(The)39 b(text)j Fg(M-C-k)d Fo(is)h(read)g(as)h
+(`Meta-Con)m(trol-k')j(and)39 b(describ)s(es)h(the)g(c)m(haracter)i
+(pro)s(duced)d(b)m(y)150 2445 y Fe(metafying)g Fg(C-k)p
+Fo(.)275 2578 y(In)c(addition,)j(sev)m(eral)f(k)m(eys)g(ha)m(v)m(e)g
+(their)f(o)m(wn)g(names.)58 b(Sp)s(eci\014cally)-8 b(,)38
+b Fn(DEL)p Fo(,)f Fn(ESC)p Fo(,)g Fn(LFD)p Fo(,)g Fn(SPC)p
+Fo(,)g Fn(RET)p Fo(,)150 2688 y(and)d Fn(TAB)f Fo(all)j(stand)e(for)g
+(themselv)m(es)i(when)d(seen)i(in)f(this)g(text,)j(or)d(in)h(an)f(init)
+h(\014le)f(\(see)i(Section)f(1.3)150 2797 y([Readline)c(Init)e(File],)j
+(page)e(4\).)41 b(If)29 b(y)m(our)h(k)m(eyb)s(oard)f(lac)m(ks)i(a)f
+Fn(LFD)f Fo(k)m(ey)-8 b(,)31 b(t)m(yping)g Fn(C-j)d Fo(will)i(pro)s
+(duce)f(the)150 2907 y(desired)h(c)m(haracter.)42 b(The)30
+b Fn(RET)g Fo(k)m(ey)h(ma)m(y)g(b)s(e)e(lab)s(eled)i
+Fn(Return)e Fo(or)h Fn(Enter)f Fo(on)h(some)h(k)m(eyb)s(oards.)150
+3145 y Fm(1.2)68 b(Readline)47 b(In)l(teraction)150 3305
+y Fo(Often)32 b(during)g(an)g(in)m(teractiv)m(e)j(session)e(y)m(ou)g(t)
+m(yp)s(e)g(in)f(a)h(long)g(line)g(of)f(text,)j(only)d(to)i(notice)g
+(that)f(the)150 3414 y(\014rst)f(w)m(ord)g(on)g(the)g(line)h(is)g
+(missp)s(elled.)46 b(The)32 b(Readline)h(library)f(giv)m(es)h(y)m(ou)g
+(a)g(set)g(of)f(commands)g(for)150 3524 y(manipulating)e(the)g(text)h
+(as)f(y)m(ou)g(t)m(yp)s(e)g(it)g(in,)g(allo)m(wing)h(y)m(ou)f(to)h
+(just)e(\014x)g(y)m(our)h(t)m(yp)s(o,)g(and)g(not)g(forcing)150
+3634 y(y)m(ou)e(to)h(ret)m(yp)s(e)g(the)f(ma)5 b(jorit)m(y)29
+b(of)f(the)h(line.)40 b(Using)28 b(these)h(editing)g(commands,)f(y)m
+(ou)h(mo)m(v)m(e)g(the)g(cursor)150 3743 y(to)35 b(the)f(place)i(that)e
+(needs)g(correction,)j(and)d(delete)h(or)f(insert)h(the)f(text)h(of)g
+(the)f(corrections.)54 b(Then,)150 3853 y(when)24 b(y)m(ou)h(are)g
+(satis\014ed)g(with)g(the)g(line,)i(y)m(ou)e(simply)f(press)g
+Fn(RET)p Fo(.)39 b(Y)-8 b(ou)25 b(do)g(not)g(ha)m(v)m(e)h(to)g(b)s(e)e
+(at)h(the)h(end)150 3962 y(of)33 b(the)h(line)g(to)g(press)e
+Fn(RET)p Fo(;)i(the)g(en)m(tire)g(line)f(is)h(accepted)g(regardless)g
+(of)f(the)h(lo)s(cation)h(of)e(the)h(cursor)150 4072
+y(within)c(the)g(line.)150 4269 y Fd(1.2.1)63 b(Readline)40
+b(Bare)h(Essen)m(tials)150 4416 y Fo(In)31 b(order)h(to)h(en)m(ter)g(c)
+m(haracters)g(in)m(to)g(the)g(line,)g(simply)e(t)m(yp)s(e)i(them.)46
+b(The)31 b(t)m(yp)s(ed)h(c)m(haracter)i(app)s(ears)150
+4525 y(where)e(the)h(cursor)e(w)m(as,)j(and)e(then)g(the)h(cursor)e(mo)
+m(v)m(es)j(one)f(space)g(to)g(the)g(righ)m(t.)47 b(If)32
+b(y)m(ou)h(mist)m(yp)s(e)g(a)150 4635 y(c)m(haracter,)f(y)m(ou)f(can)g
+(use)f(y)m(our)g(erase)h(c)m(haracter)h(to)f(bac)m(k)g(up)f(and)f
+(delete)j(the)f(mist)m(yp)s(ed)e(c)m(haracter.)275 4768
+y(Sometimes)i(y)m(ou)g(ma)m(y)h(mist)m(yp)s(e)e(a)i(c)m(haracter,)g
+(and)e(not)i(notice)g(the)f(error)f(un)m(til)h(y)m(ou)g(ha)m(v)m(e)h(t)
+m(yp)s(ed)150 4878 y(sev)m(eral)e(other)f(c)m(haracters.)42
+b(In)28 b(that)i(case,)g(y)m(ou)f(can)g(t)m(yp)s(e)h
+Fg(C-b)d Fo(to)j(mo)m(v)m(e)g(the)f(cursor)g(to)g(the)g(left,)i(and)150
+4987 y(then)f(correct)i(y)m(our)e(mistak)m(e.)42 b(Afterw)m(ards,)31
+b(y)m(ou)f(can)h(mo)m(v)m(e)h(the)e(cursor)g(to)h(the)g(righ)m(t)g
+(with)f Fg(C-f)p Fo(.)275 5121 y(When)i(y)m(ou)h(add)f(text)h(in)f(the)
+h(middle)f(of)h(a)g(line,)h(y)m(ou)e(will)h(notice)h(that)f(c)m
+(haracters)h(to)g(the)e(righ)m(t)150 5230 y(of)d(the)g(cursor)f(are)h
+(`pushed)e(o)m(v)m(er')j(to)g(mak)m(e)f(ro)s(om)g(for)f(the)h(text)h
+(that)f(y)m(ou)g(ha)m(v)m(e)h(inserted.)40 b(Lik)m(ewise,)150
+5340 y(when)d(y)m(ou)g(delete)i(text)g(b)s(ehind)c(the)j(cursor,)h(c)m
+(haracters)g(to)f(the)g(righ)m(t)g(of)g(the)g(cursor)e(are)i(`pulled)p
+eop end
+%%Page: 2 5
+TeXDict begin 2 4 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(2)150 299 y(bac)m(k')24
+b(to)f(\014ll)g(in)f(the)h(blank)f(space)i(created)f(b)m(y)g(the)g
+(remo)m(v)-5 b(al)24 b(of)f(the)g(text.)39 b(A)23 b(list)g(of)g(the)g
+(bare)f(essen)m(tials)150 408 y(for)30 b(editing)h(the)g(text)g(of)g
+(an)f(input)f(line)i(follo)m(ws.)150 571 y Fg(C-b)336
+b Fo(Mo)m(v)m(e)32 b(bac)m(k)g(one)e(c)m(haracter.)150
+732 y Fg(C-f)336 b Fo(Mo)m(v)m(e)32 b(forw)m(ard)e(one)h(c)m(haracter.)
+150 893 y Fn(DEL)e Fo(or)i Fn(Backspace)630 1003 y Fo(Delete)i(the)d(c)
+m(haracter)i(to)f(the)g(left)g(of)f(the)h(cursor.)150
+1164 y Fg(C-d)336 b Fo(Delete)33 b(the)d(c)m(haracter)i(underneath)d
+(the)i(cursor.)150 1325 y(Prin)m(ting)g(c)m(haracters)630
+1435 y(Insert)f(the)g(c)m(haracter)i(in)m(to)g(the)e(line)h(at)g(the)g
+(cursor.)150 1596 y Fg(C-_)e Fo(or)i Fg(C-x)e(C-u)630
+1706 y Fo(Undo)k(the)h(last)g(editing)g(command.)50 b(Y)-8
+b(ou)34 b(can)f(undo)g(all)h(the)f(w)m(a)m(y)i(bac)m(k)f(to)g(an)g
+(empt)m(y)630 1815 y(line.)150 1977 y(\(Dep)s(ending)c(on)g(y)m(our)g
+(con\014guration,)h(the)f Fn(Backspace)d Fo(k)m(ey)k(migh)m(t)g(b)s(e)e
+(set)i(to)g(delete)g(the)f(c)m(haracter)150 2087 y(to)h(the)f(left)h
+(of)f(the)g(cursor)f(and)h(the)g Fn(DEL)f Fo(k)m(ey)i(set)g(to)f
+(delete)i(the)e(c)m(haracter)h(underneath)e(the)h(cursor,)150
+2196 y(lik)m(e)i Fg(C-d)p Fo(,)d(rather)i(than)f(the)g(c)m(haracter)i
+(to)f(the)g(left)g(of)g(the)f(cursor.\))150 2398 y Fd(1.2.2)63
+b(Readline)40 b(Mo)m(v)m(emen)m(t)h(Commands)150 2545
+y Fo(The)27 b(ab)s(o)m(v)m(e)i(table)g(describ)s(es)e(the)g(most)i
+(basic)f(k)m(eystrok)m(es)h(that)f(y)m(ou)g(need)g(in)f(order)g(to)i
+(do)e(editing)i(of)150 2654 y(the)k(input)f(line.)49
+b(F)-8 b(or)34 b(y)m(our)f(con)m(v)m(enience,)j(man)m(y)d(other)g
+(commands)f(ha)m(v)m(e)j(b)s(een)d(added)g(in)h(addition)150
+2764 y(to)j Fg(C-b)p Fo(,)f Fg(C-f)p Fo(,)g Fg(C-d)p
+Fo(,)h(and)e Fn(DEL)p Fo(.)54 b(Here)35 b(are)g(some)h(commands)e(for)h
+(mo)m(ving)h(more)f(rapidly)f(ab)s(out)h(the)150 2873
+y(line.)150 3035 y Fg(C-a)336 b Fo(Mo)m(v)m(e)32 b(to)g(the)e(start)h
+(of)g(the)f(line.)150 3197 y Fg(C-e)336 b Fo(Mo)m(v)m(e)32
+b(to)g(the)e(end)g(of)g(the)h(line.)150 3358 y Fg(M-f)336
+b Fo(Mo)m(v)m(e)32 b(forw)m(ard)e(a)h(w)m(ord,)f(where)g(a)h(w)m(ord)f
+(is)g(comp)s(osed)g(of)h(letters)h(and)d(digits.)150
+3519 y Fg(M-b)336 b Fo(Mo)m(v)m(e)32 b(bac)m(kw)m(ard)f(a)g(w)m(ord.)
+150 3680 y Fg(C-l)336 b Fo(Clear)31 b(the)f(screen,)h(reprin)m(ting)f
+(the)h(curren)m(t)f(line)h(at)g(the)f(top.)275 3843 y(Notice)c(ho)m(w)f
+Fg(C-f)e Fo(mo)m(v)m(es)j(forw)m(ard)e(a)h(c)m(haracter,)j(while)d
+Fg(M-f)e Fo(mo)m(v)m(es)j(forw)m(ard)e(a)h(w)m(ord.)39
+b(It)24 b(is)h(a)g(lo)s(ose)150 3952 y(con)m(v)m(en)m(tion)32
+b(that)f(con)m(trol)g(k)m(eystrok)m(es)h(op)s(erate)e(on)g(c)m
+(haracters)h(while)f(meta)h(k)m(eystrok)m(es)h(op)s(erate)e(on)150
+4062 y(w)m(ords.)150 4263 y Fd(1.2.3)63 b(Readline)40
+b(Killing)i(Commands)150 4410 y Fe(Killing)35 b Fo(text)28
+b(means)e(to)h(delete)h(the)f(text)g(from)g(the)f(line,)i(but)e(to)h
+(sa)m(v)m(e)h(it)g(a)m(w)m(a)m(y)g(for)e(later)i(use,)f(usually)150
+4519 y(b)m(y)g Fe(y)m(anking)35 b Fo(\(re-inserting\))28
+b(it)g(bac)m(k)f(in)m(to)h(the)f(line.)40 b(\(`Cut')27
+b(and)g(`paste')h(are)f(more)g(recen)m(t)h(jargon)f(for)150
+4629 y(`kill')32 b(and)d(`y)m(ank'.\))275 4765 y(If)g(the)i
+(description)f(for)g(a)h(command)f(sa)m(ys)g(that)h(it)g(`kills')g
+(text,)h(then)e(y)m(ou)g(can)h(b)s(e)e(sure)h(that)h(y)m(ou)150
+4875 y(can)g(get)g(the)g(text)g(bac)m(k)g(in)f(a)h(di\013eren)m(t)g
+(\(or)g(the)f(same\))h(place)h(later.)275 5011 y(When)23
+b(y)m(ou)g(use)g(a)h(kill)g(command,)g(the)g(text)g(is)f(sa)m(v)m(ed)i
+(in)e(a)g Fe(kill-ring)p Fo(.)39 b(An)m(y)24 b(n)m(um)m(b)s(er)e(of)h
+(consecutiv)m(e)150 5121 y(kills)31 b(sa)m(v)m(e)i(all)f(of)f(the)g
+(killed)h(text)g(together,)g(so)g(that)f(when)f(y)m(ou)h(y)m(ank)h(it)f
+(bac)m(k,)h(y)m(ou)g(get)g(it)f(all.)43 b(The)150 5230
+y(kill)33 b(ring)f(is)g(not)h(line)g(sp)s(eci\014c;)g(the)g(text)g
+(that)g(y)m(ou)g(killed)f(on)h(a)f(previously)g(t)m(yp)s(ed)h(line)f
+(is)h(a)m(v)-5 b(ailable)150 5340 y(to)31 b(b)s(e)f(y)m(ank)m(ed)h(bac)
+m(k)g(later,)h(when)d(y)m(ou)i(are)g(t)m(yping)f(another)h(line.)p
+eop end
+%%Page: 3 6
+TeXDict begin 3 5 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(3)275 299 y(Here)30
+b(is)h(the)f(list)h(of)g(commands)f(for)g(killing)h(text.)150
+456 y Fg(C-k)336 b Fo(Kill)31 b(the)f(text)i(from)e(the)g(curren)m(t)g
+(cursor)g(p)s(osition)h(to)g(the)f(end)g(of)g(the)h(line.)150
+614 y Fg(M-d)336 b Fo(Kill)27 b(from)f(the)g(cursor)g(to)h(the)f(end)g
+(of)h(the)f(curren)m(t)g(w)m(ord,)h(or,)h(if)e(b)s(et)m(w)m(een)h(w)m
+(ords,)g(to)g(the)630 723 y(end)j(of)g(the)h(next)f(w)m(ord.)41
+b(W)-8 b(ord)30 b(b)s(oundaries)f(are)i(the)g(same)f(as)h(those)g(used)
+f(b)m(y)g Fg(M-f)p Fo(.)150 881 y Fg(M-DEL)240 b Fo(Kill)34
+b(from)f(the)g(cursor)g(to)h(the)g(start)g(of)g(the)f(curren)m(t)g(w)m
+(ord,)h(or,)h(if)e(b)s(et)m(w)m(een)h(w)m(ords,)g(to)630
+991 y(the)28 b(start)g(of)g(the)g(previous)f(w)m(ord.)39
+b(W)-8 b(ord)28 b(b)s(oundaries)e(are)i(the)g(same)g(as)g(those)g(used)
+f(b)m(y)630 1100 y Fg(M-b)p Fo(.)150 1258 y Fg(C-w)336
+b Fo(Kill)35 b(from)g(the)g(cursor)f(to)i(the)f(previous)g(whitespace.)
+55 b(This)34 b(is)h(di\013eren)m(t)h(than)e Fg(M-DEL)630
+1367 y Fo(b)s(ecause)c(the)h(w)m(ord)f(b)s(oundaries)f(di\013er.)275
+1525 y(Here)42 b(is)f(ho)m(w)h(to)g Fe(y)m(ank)47 b Fo(the)42
+b(text)g(bac)m(k)h(in)m(to)f(the)g(line.)74 b(Y)-8 b(anking)43
+b(means)e(to)h(cop)m(y)h(the)e(most-)150 1634 y(recen)m(tly-killed)33
+b(text)e(from)f(the)g(kill)i(bu\013er.)150 1792 y Fg(C-y)336
+b Fo(Y)-8 b(ank)31 b(the)f(most)h(recen)m(tly)h(killed)f(text)g(bac)m
+(k)g(in)m(to)h(the)e(bu\013er)g(at)h(the)f(cursor.)150
+1949 y Fg(M-y)336 b Fo(Rotate)36 b(the)f(kill-ring,)i(and)d(y)m(ank)h
+(the)f(new)g(top.)54 b(Y)-8 b(ou)35 b(can)g(only)f(do)h(this)f(if)h
+(the)g(prior)630 2059 y(command)30 b(is)h Fg(C-y)e Fo(or)h
+Fg(M-y)p Fo(.)150 2256 y Fd(1.2.4)63 b(Readline)40 b(Argumen)m(ts)150
+2403 y Fo(Y)-8 b(ou)40 b(can)f(pass)g(n)m(umeric)f(argumen)m(ts)i(to)f
+(Readline)h(commands.)67 b(Sometimes)39 b(the)g(argumen)m(t)h(acts)150
+2513 y(as)g(a)h(rep)s(eat)f(coun)m(t,)j(other)e(times)f(it)h(is)f(the)g
+Ff(sign)47 b Fo(of)41 b(the)f(argumen)m(t)g(that)h(is)f(signi\014can)m
+(t.)71 b(If)40 b(y)m(ou)150 2622 y(pass)33 b(a)h(negativ)m(e)i(argumen)
+m(t)e(to)g(a)g(command)f(whic)m(h)g(normally)h(acts)g(in)f(a)h(forw)m
+(ard)f(direction,)i(that)150 2732 y(command)g(will)h(act)g(in)f(a)h
+(bac)m(kw)m(ard)f(direction.)57 b(F)-8 b(or)36 b(example,)h(to)f(kill)g
+(text)g(bac)m(k)g(to)g(the)g(start)g(of)150 2842 y(the)31
+b(line,)g(y)m(ou)f(migh)m(t)h(t)m(yp)s(e)g(`)p Fn(M--)f(C-k)p
+Fo('.)275 2975 y(The)d(general)i(w)m(a)m(y)h(to)e(pass)g(n)m(umeric)g
+(argumen)m(ts)h(to)g(a)f(command)g(is)g(to)h(t)m(yp)s(e)f(meta)i
+(digits)e(b)s(efore)150 3085 y(the)j(command.)42 b(If)30
+b(the)h(\014rst)f(`digit')i(t)m(yp)s(ed)f(is)g(a)g(min)m(us)f(sign)h
+(\(`)p Fn(-)p Fo('\),)h(then)f(the)g(sign)f(of)h(the)g(argumen)m(t)150
+3194 y(will)39 b(b)s(e)e(negativ)m(e.)66 b(Once)38 b(y)m(ou)h(ha)m(v)m
+(e)g(t)m(yp)s(ed)f(one)h(meta)g(digit)g(to)f(get)i(the)e(argumen)m(t)h
+(started,)i(y)m(ou)150 3304 y(can)29 b(t)m(yp)s(e)g(the)g(remainder)f
+(of)h(the)g(digits,)h(and)f(then)f(the)h(command.)40
+b(F)-8 b(or)30 b(example,)g(to)f(giv)m(e)i(the)e Fg(C-d)150
+3414 y Fo(command)37 b(an)g(argumen)m(t)h(of)g(10,)i(y)m(ou)e(could)f
+(t)m(yp)s(e)h(`)p Fn(M-1)29 b(0)h(C-d)p Fo(',)39 b(whic)m(h)e(will)h
+(delete)h(the)e(next)h(ten)150 3523 y(c)m(haracters)32
+b(on)e(the)h(input)e(line.)150 3720 y Fd(1.2.5)63 b(Searc)m(hing)40
+b(for)i(Commands)g(in)f(the)g(History)150 3867 y Fo(Readline)22
+b(pro)m(vides)f(commands)g(for)g(searc)m(hing)h(through)f(the)g
+(command)h(history)f(for)g(lines)g(con)m(taining)150
+3977 y(a)31 b(sp)s(eci\014ed)e(string.)41 b(There)30
+b(are)h(t)m(w)m(o)g(searc)m(h)g(mo)s(des:)41 b Fe(incremen)m(tal)35
+b Fo(and)30 b Fe(non-incremen)m(tal)p Fo(.)275 4111 y(Incremen)m(tal)c
+(searc)m(hes)h(b)s(egin)e(b)s(efore)g(the)h(user)f(has)h(\014nished)e
+(t)m(yping)i(the)g(searc)m(h)g(string.)39 b(As)26 b(eac)m(h)150
+4220 y(c)m(haracter)37 b(of)e(the)h(searc)m(h)g(string)f(is)h(t)m(yp)s
+(ed,)g(Readline)g(displa)m(ys)g(the)f(next)h(en)m(try)g(from)e(the)i
+(history)150 4330 y(matc)m(hing)25 b(the)f(string)g(t)m(yp)s(ed)g(so)g
+(far.)39 b(An)23 b(incremen)m(tal)j(searc)m(h)e(requires)g(only)g(as)g
+(man)m(y)g(c)m(haracters)i(as)150 4439 y(needed)i(to)i(\014nd)d(the)i
+(desired)f(history)h(en)m(try)-8 b(.)41 b(T)-8 b(o)29
+b(searc)m(h)h(bac)m(kw)m(ard)f(in)f(the)h(history)g(for)f(a)i
+(particular)150 4549 y(string,)g(t)m(yp)s(e)f Fg(C-r)p
+Fo(.)40 b(T)m(yping)29 b Fg(C-s)g Fo(searc)m(hes)h(forw)m(ard)f
+(through)g(the)g(history)-8 b(.)41 b(The)29 b(c)m(haracters)i(presen)m
+(t)150 4658 y(in)38 b(the)g(v)-5 b(alue)38 b(of)g(the)g
+Fn(isearch-terminators)33 b Fo(v)-5 b(ariable)39 b(are)f(used)f(to)i
+(terminate)g(an)f(incremen)m(tal)150 4768 y(searc)m(h.)71
+b(If)40 b(that)h(v)-5 b(ariable)41 b(has)f(not)h(b)s(een)e(assigned)i
+(a)f(v)-5 b(alue,)44 b(the)c Fn(ESC)g Fo(and)f Fg(C-J)h
+Fo(c)m(haracters)i(will)150 4878 y(terminate)h(an)g(incremen)m(tal)g
+(searc)m(h.)78 b Fg(C-g)41 b Fo(will)i(ab)s(ort)f(an)g(incremen)m(tal)i
+(searc)m(h)f(and)f(restore)h(the)150 4987 y(original)30
+b(line.)41 b(When)28 b(the)h(searc)m(h)h(is)f(terminated,)h(the)f
+(history)g(en)m(try)g(con)m(taining)h(the)f(searc)m(h)h(string)150
+5097 y(b)s(ecomes)h(the)f(curren)m(t)g(line.)275 5230
+y(T)-8 b(o)31 b(\014nd)e(other)j(matc)m(hing)g(en)m(tries)g(in)e(the)h
+(history)g(list,)h(t)m(yp)s(e)g Fg(C-r)e Fo(or)h Fg(C-s)f
+Fo(as)h(appropriate.)43 b(This)150 5340 y(will)26 b(searc)m(h)h(bac)m
+(kw)m(ard)g(or)f(forw)m(ard)g(in)f(the)i(history)f(for)g(the)g(next)g
+(en)m(try)h(matc)m(hing)g(the)f(searc)m(h)h(string)p
+eop end
+%%Page: 4 7
+TeXDict begin 4 6 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(4)150 299 y(t)m(yp)s(ed)37
+b(so)h(far.)63 b(An)m(y)38 b(other)f(k)m(ey)i(sequence)f(b)s(ound)e(to)
+i(a)g(Readline)h(command)e(will)h(terminate)h(the)150
+408 y(searc)m(h)26 b(and)f(execute)i(that)f(command.)39
+b(F)-8 b(or)26 b(instance,)h(a)f Fn(RET)f Fo(will)g(terminate)i(the)f
+(searc)m(h)g(and)e(accept)150 518 y(the)30 b(line,)g(thereb)m(y)f
+(executing)i(the)e(command)g(from)g(the)h(history)f(list.)41
+b(A)29 b(mo)m(v)m(emen)m(t)j(command)d(will)150 628 y(terminate)i(the)g
+(searc)m(h,)g(mak)m(e)h(the)e(last)h(line)g(found)e(the)i(curren)m(t)f
+(line,)h(and)f(b)s(egin)g(editing.)275 777 y(Readline)35
+b(remem)m(b)s(ers)f(the)h(last)h(incremen)m(tal)g(searc)m(h)f(string.)
+54 b(If)34 b(t)m(w)m(o)j Fg(C-r)p Fo(s)c(are)i(t)m(yp)s(ed)g(without)
+150 886 y(an)m(y)i(in)m(terv)m(ening)g(c)m(haracters)h(de\014ning)e(a)h
+(new)f(searc)m(h)h(string,)h(an)m(y)f(remem)m(b)s(ered)e(searc)m(h)i
+(string)g(is)150 996 y(used.)275 1145 y(Non-incremen)m(tal)48
+b(searc)m(hes)g(read)e(the)h(en)m(tire)h(searc)m(h)f(string)g(b)s
+(efore)f(starting)h(to)h(searc)m(h)f(for)150 1255 y(matc)m(hing)d
+(history)e(lines.)78 b(The)42 b(searc)m(h)h(string)g(ma)m(y)g(b)s(e)f
+(t)m(yp)s(ed)g(b)m(y)g(the)h(user)f(or)h(b)s(e)f(part)g(of)h(the)150
+1364 y(con)m(ten)m(ts)32 b(of)f(the)f(curren)m(t)g(line.)150
+1627 y Fm(1.3)68 b(Readline)47 b(Init)e(File)150 1786
+y Fo(Although)f(the)g(Readline)g(library)f(comes)i(with)e(a)h(set)h(of)
+f(Emacs-lik)m(e)h(k)m(eybindings)f(installed)g(b)m(y)150
+1896 y(default,)26 b(it)g(is)e(p)s(ossible)h(to)g(use)f(a)i(di\013eren)
+m(t)f(set)g(of)g(k)m(eybindings.)38 b(An)m(y)25 b(user)f(can)h
+(customize)h(programs)150 2005 y(that)39 b(use)g(Readline)g(b)m(y)f
+(putting)h(commands)f(in)g(an)h Fe(inputrc)k Fo(\014le,)e(con)m(v)m(en)
+m(tionally)h(in)c(their)h(home)150 2115 y(directory)-8
+b(.)39 b(The)23 b(name)h(of)f(this)h(\014le)f(is)g(tak)m(en)i(from)e
+(the)g(v)-5 b(alue)24 b(of)g(the)f(en)m(vironmen)m(t)h(v)-5
+b(ariable)25 b Fn(INPUTRC)p Fo(.)150 2224 y(If)30 b(that)g(v)-5
+b(ariable)31 b(is)f(unset,)g(the)h(default)f(is)g Fn(~/.inputrc)p
+Fo(.)38 b(If)30 b(that)g(\014le)h(do)s(es)e(not)i(exist)g(or)f(cannot)h
+(b)s(e)150 2334 y(read,)g(the)f(ultimate)i(default)e(is)h
+Fn(/etc/inputrc)p Fo(.)275 2483 y(When)e(a)h(program)f(whic)m(h)h(uses)
+f(the)h(Readline)g(library)f(starts)h(up,)f(the)h(init)g(\014le)f(is)h
+(read,)g(and)f(the)150 2593 y(k)m(ey)i(bindings)e(are)i(set.)275
+2742 y(In)26 b(addition,)i(the)f Fn(C-x)i(C-r)d Fo(command)h(re-reads)g
+(this)f(init)h(\014le,)h(th)m(us)f(incorp)s(orating)g(an)m(y)g(c)m
+(hanges)150 2851 y(that)k(y)m(ou)g(migh)m(t)g(ha)m(v)m(e)g(made)g(to)g
+(it.)150 3065 y Fd(1.3.1)63 b(Readline)40 b(Init)h(File)g(Syn)m(tax)150
+3212 y Fo(There)f(are)i(only)f(a)g(few)g(basic)g(constructs)h(allo)m(w)
+m(ed)h(in)d(the)h(Readline)h(init)f(\014le.)73 b(Blank)41
+b(lines)h(are)150 3322 y(ignored.)72 b(Lines)41 b(b)s(eginning)f(with)h
+(a)g(`)p Fn(#)p Fo(')g(are)h(commen)m(ts.)73 b(Lines)41
+b(b)s(eginning)f(with)g(a)i(`)p Fn($)p Fo(')f(indicate)150
+3431 y(conditional)i(constructs)e(\(see)i(Section)f(1.3.2)h
+([Conditional)f(Init)f(Constructs],)j(page)f(13\).)74
+b(Other)150 3541 y(lines)31 b(denote)g(v)-5 b(ariable)31
+b(settings)g(and)f(k)m(ey)h(bindings.)150 3722 y(V)-8
+b(ariable)32 b(Settings)630 3832 y(Y)-8 b(ou)41 b(can)g(mo)s(dify)e
+(the)i(run-time)f(b)s(eha)m(vior)g(of)h(Readline)g(b)m(y)f(altering)h
+(the)g(v)-5 b(alues)41 b(of)630 3941 y(v)-5 b(ariables)34
+b(in)f(Readline)i(using)e(the)g Fn(set)g Fo(command)g(within)g(the)h
+(init)g(\014le.)50 b(The)33 b(syn)m(tax)630 4051 y(is)d(simple:)870
+4193 y Fn(set)47 b Fg(variable)e(value)630 4335 y Fo(Here,)29
+b(for)e(example,)h(is)g(ho)m(w)f(to)h(c)m(hange)g(from)f(the)g(default)
+h(Emacs-lik)m(e)h(k)m(ey)f(binding)e(to)630 4444 y(use)k
+Fn(vi)g Fo(line)h(editing)g(commands:)870 4586 y Fn(set)47
+b(editing-mode)d(vi)630 4728 y Fo(V)-8 b(ariable)36 b(names)f(and)g(v)
+-5 b(alues,)36 b(where)f(appropriate,)h(are)g(recognized)g(without)f
+(regard)630 4837 y(to)c(case.)42 b(Unrecognized)31 b(v)-5
+b(ariable)31 b(names)g(are)f(ignored.)630 4979 y(Bo)s(olean)c(v)-5
+b(ariables)26 b(\(those)g(that)g(can)f(b)s(e)f(set)i(to)g(on)f(or)g
+(o\013)7 b(\))25 b(are)h(set)f(to)h(on)f(if)g(the)g(v)-5
+b(alue)26 b(is)630 5089 y(n)m(ull)e(or)g(empt)m(y)-8
+b(,)27 b Fe(on)d Fo(\(case-insensitiv)m(e\),)29 b(or)24
+b(1.)39 b(An)m(y)25 b(other)f(v)-5 b(alue)25 b(results)f(in)g(the)g(v)
+-5 b(ariable)630 5198 y(b)s(eing)30 b(set)h(to)g(o\013.)630
+5340 y(A)f(great)i(deal)f(of)g(run-time)f(b)s(eha)m(vior)g(is)g(c)m
+(hangeable)j(with)d(the)g(follo)m(wing)i(v)-5 b(ariables.)p
+eop end
+%%Page: 5 8
+TeXDict begin 5 7 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(5)630 299 y Fn
+(active-region-start-colo)o(r)1110 408 y Fo(A)27 b(string)f(v)-5
+b(ariable)27 b(that)g(con)m(trols)h(the)f(text)g(color)h(and)e(bac)m
+(kground)g(when)1110 518 y(displa)m(ying)50 b(the)f(text)h(in)f(the)h
+(activ)m(e)h(region)f(\(see)g(the)g(description)f(of)1110
+628 y Fn(enable-active-region)25 b Fo(b)s(elo)m(w\).)43
+b(This)30 b(string)h(m)m(ust)f(not)h(tak)m(e)i(up)d(an)m(y)1110
+737 y(ph)m(ysical)25 b(c)m(haracter)h(p)s(ositions)f(on)g(the)f(displa)
+m(y)-8 b(,)27 b(so)e(it)g(should)f(consist)h(only)1110
+847 y(of)37 b(terminal)g(escap)s(e)g(sequences.)61 b(It)36
+b(is)h(output)g(to)g(the)g(terminal)g(b)s(efore)1110
+956 y(displa)m(ying)h(the)f(text)i(in)e(the)h(activ)m(e)h(region.)63
+b(This)37 b(v)-5 b(ariable)38 b(is)f(reset)h(to)1110
+1066 y(the)29 b(default)g(v)-5 b(alue)29 b(whenev)m(er)f(the)h
+(terminal)g(t)m(yp)s(e)g(c)m(hanges.)41 b(The)28 b(default)1110
+1176 y(v)-5 b(alue)30 b(is)f(the)g(string)g(that)h(puts)e(the)i
+(terminal)f(in)g(standout)g(mo)s(de,)g(as)h(ob-)1110
+1285 y(tained)40 b(from)f(the)h(terminal's)g(terminfo)g(description.)68
+b(A)40 b(sample)f(v)-5 b(alue)1110 1395 y(migh)m(t)31
+b(b)s(e)f(`)p Fn(\\e[01;33m)p Fo('.)630 1570 y Fn
+(active-region-end-color)1110 1680 y Fo(A)48 b(string)g(v)-5
+b(ariable)48 b(that)h Fn(")p Fo(undo)s(es)p Fn(")d Fo(the)i(e\013ects)h
+(of)f Fn(active-region-)1110 1789 y(start-color)36 b
+Fo(and)i(restores)h Fn(")p Fo(normal)p Fn(")f Fo(terminal)h(displa)m(y)
+g(app)s(earance)1110 1899 y(after)26 b(displa)m(ying)h(text)f(in)g(the)
+g(activ)m(e)i(region.)40 b(This)25 b(string)h(m)m(ust)f(not)h(tak)m(e)
+1110 2008 y(up)e(an)m(y)h(ph)m(ysical)h(c)m(haracter)h(p)s(ositions)d
+(on)h(the)h(displa)m(y)-8 b(,)27 b(so)e(it)g(should)f(con-)1110
+2118 y(sist)29 b(only)h(of)f(terminal)h(escap)s(e)f(sequences.)41
+b(It)29 b(is)g(output)g(to)h(the)f(terminal)1110 2228
+y(after)36 b(displa)m(ying)g(the)g(text)h(in)e(the)h(activ)m(e)i
+(region.)58 b(This)34 b(v)-5 b(ariable)37 b(is)f(re-)1110
+2337 y(set)e(to)g(the)g(default)g(v)-5 b(alue)34 b(whenev)m(er)f(the)h
+(terminal)g(t)m(yp)s(e)f(c)m(hanges.)51 b(The)1110 2447
+y(default)38 b(v)-5 b(alue)39 b(is)f(the)h(string)f(that)h(restores)f
+(the)h(terminal)f(from)g(stand-)1110 2556 y(out)30 b(mo)s(de,)f(as)g
+(obtained)h(from)f(the)g(terminal's)h(terminfo)f(description.)41
+b(A)1110 2666 y(sample)31 b(v)-5 b(alue)30 b(migh)m(t)h(b)s(e)f(`)p
+Fn(\\e[0m)p Fo('.)630 2841 y Fn(bell-style)1110 2951
+y Fo(Con)m(trols)44 b(what)g(happ)s(ens)e(when)h(Readline)i(w)m(an)m
+(ts)f(to)h(ring)e(the)h(termi-)1110 3061 y(nal)37 b(b)s(ell.)61
+b(If)37 b(set)h(to)g(`)p Fn(none)p Fo(',)g(Readline)g(nev)m(er)g(rings)
+e(the)i(b)s(ell.)61 b(If)36 b(set)i(to)1110 3170 y(`)p
+Fn(visible)p Fo(',)32 b(Readline)i(uses)f(a)g(visible)g(b)s(ell)g(if)g
+(one)g(is)g(a)m(v)-5 b(ailable.)51 b(If)33 b(set)g(to)1110
+3280 y(`)p Fn(audible)p Fo(')j(\(the)i(default\),)i(Readline)e
+(attempts)g(to)h(ring)e(the)g(terminal's)1110 3389 y(b)s(ell.)630
+3565 y Fn(bind-tty-special-chars)1110 3674 y Fo(If)e(set)g(to)h(`)p
+Fn(on)p Fo(')f(\(the)g(default\),)i(Readline)f(attempts)g(to)g(bind)d
+(the)i(con)m(trol)1110 3784 y(c)m(haracters)30 b(treated)g(sp)s
+(ecially)g(b)m(y)f(the)g(k)m(ernel's)h(terminal)f(driv)m(er)g(to)h
+(their)1110 3893 y(Readline)h(equiv)-5 b(alen)m(ts.)630
+4069 y Fn(blink-matching-paren)1110 4178 y Fo(If)36 b(set)g(to)h(`)p
+Fn(on)p Fo(',)h(Readline)f(attempts)g(to)g(brie\015y)e(mo)m(v)m(e)j
+(the)f(cursor)e(to)i(an)1110 4288 y(op)s(ening)k(paren)m(thesis)h(when)
+f(a)h(closing)h(paren)m(thesis)e(is)h(inserted.)74 b(The)1110
+4398 y(default)31 b(is)f(`)p Fn(off)p Fo('.)630 4573
+y Fn(colored-completion-prefi)o(x)1110 4682 y Fo(If)f(set)h(to)g(`)p
+Fn(on)p Fo(',)g(when)e(listing)i(completions,)h(Readline)f(displa)m(ys)
+g(the)f(com-)1110 4792 y(mon)c(pre\014x)f(of)i(the)f(set)h(of)g(p)s
+(ossible)f(completions)h(using)f(a)h(di\013eren)m(t)g(color.)1110
+4902 y(The)f(color)h(de\014nitions)f(are)h(tak)m(en)g(from)f(the)g(v)-5
+b(alue)26 b(of)g(the)f Fn(LS_COLORS)e Fo(en-)1110 5011
+y(vironmen)m(t)34 b(v)-5 b(ariable.)50 b(If)33 b(there)h(is)g(a)f
+(color)i(de\014nition)e(in)g Fn(LS_COLORS)e Fo(for)1110
+5121 y(the)22 b(custom)g(su\016x)f(`)p Fn(readline-colored-complet)o
+(ion)o(-pre)o(fix)p Fo(',)c(Read-)1110 5230 y(line)24
+b(uses)e(this)i(color)g(for)f(the)h(common)f(pre\014x)f(instead)i(of)f
+(its)h(default.)38 b(The)1110 5340 y(default)31 b(is)f(`)p
+Fn(off)p Fo('.)p eop end
+%%Page: 6 9
+TeXDict begin 6 8 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(6)630 299 y Fn(colored-stats)1110
+408 y Fo(If)26 b(set)h(to)g(`)p Fn(on)p Fo(',)h(Readline)f(displa)m(ys)
+g(p)s(ossible)f(completions)h(using)f(di\013eren)m(t)1110
+518 y(colors)40 b(to)g(indicate)g(their)f(\014le)h(t)m(yp)s(e.)67
+b(The)38 b(color)j(de\014nitions)d(are)i(tak)m(en)1110
+628 y(from)24 b(the)h(v)-5 b(alue)25 b(of)g(the)g Fn(LS_COLORS)d
+Fo(en)m(vironmen)m(t)j(v)-5 b(ariable.)40 b(The)24 b(default)1110
+737 y(is)30 b(`)p Fn(off)p Fo('.)630 925 y Fn(comment-begin)1110
+1035 y Fo(The)62 b(string)g(to)h(insert)f(at)h(the)g(b)s(eginning)e(of)
+h(the)h(line)f(when)g(the)1110 1144 y Fn(insert-comment)26
+b Fo(command)31 b(is)f(executed.)42 b(The)30 b(default)g(v)-5
+b(alue)31 b(is)f Fn("#")p Fo(.)630 1332 y Fn(completion-display-width)
+1110 1442 y Fo(The)41 b(n)m(um)m(b)s(er)f(of)i(screen)g(columns)f(used)
+g(to)h(displa)m(y)g(p)s(ossible)f(matc)m(hes)1110 1551
+y(when)28 b(p)s(erforming)g(completion.)41 b(The)29 b(v)-5
+b(alue)29 b(is)g(ignored)g(if)g(it)h(is)f(less)g(than)1110
+1661 y(0)e(or)f(greater)h(than)f(the)g(terminal)h(screen)f(width.)39
+b(A)26 b(v)-5 b(alue)27 b(of)f(0)h(will)f(cause)1110
+1771 y(matc)m(hes)32 b(to)f(b)s(e)e(displa)m(y)m(ed)i(one)g(p)s(er)e
+(line.)41 b(The)30 b(default)h(v)-5 b(alue)31 b(is)f(-1.)630
+1958 y Fn(completion-ignore-case)1110 2068 y Fo(If)d(set)h(to)g(`)p
+Fn(on)p Fo(',)g(Readline)g(p)s(erforms)e(\014lename)h(matc)m(hing)i
+(and)e(completion)1110 2178 y(in)j(a)h(case-insensitiv)m(e)i(fashion.)
+40 b(The)30 b(default)h(v)-5 b(alue)30 b(is)h(`)p Fn(off)p
+Fo('.)630 2365 y Fn(completion-map-case)1110 2475 y Fo(If)22
+b(set)g(to)h(`)p Fn(on)p Fo(',)h(and)e Fe(completion-ignore-case)31
+b Fo(is)22 b(enabled,)i(Readline)f(treats)1110 2585 y(h)m(yphens)29
+b(\(`)p Fn(-)p Fo('\))j(and)e(underscores)g(\(`)p Fn(_)p
+Fo('\))i(as)f(equiv)-5 b(alen)m(t)32 b(when)e(p)s(erforming)1110
+2694 y(case-insensitiv)m(e)47 b(\014lename)e(matc)m(hing)g(and)f
+(completion.)85 b(The)44 b(default)1110 2804 y(v)-5 b(alue)31
+b(is)f(`)p Fn(off)p Fo('.)630 2992 y Fn(completion-prefix-displa)o
+(y-le)o(ngth)1110 3101 y Fo(The)h(length)g(in)g(c)m(haracters)i(of)f
+(the)f(common)h(pre\014x)e(of)h(a)h(list)g(of)f(p)s(ossible)1110
+3211 y(completions)g(that)f(is)g(displa)m(y)m(ed)g(without)g(mo)s
+(di\014cation.)41 b(When)29 b(set)h(to)h(a)1110 3320
+y(v)-5 b(alue)26 b(greater)h(than)e(zero,)j(common)e(pre\014xes)e
+(longer)j(than)e(this)g(v)-5 b(alue)27 b(are)1110 3430
+y(replaced)k(with)f(an)g(ellipsis)h(when)e(displa)m(ying)i(p)s(ossible)
+f(completions.)630 3618 y Fn(completion-query-items)1110
+3727 y Fo(The)c(n)m(um)m(b)s(er)f(of)h(p)s(ossible)g(completions)h
+(that)g(determines)f(when)f(the)i(user)1110 3837 y(is)43
+b(ask)m(ed)g(whether)f(the)g(list)h(of)g(p)s(ossibilities)g(should)f(b)
+s(e)g(displa)m(y)m(ed.)77 b(If)1110 3947 y(the)29 b(n)m(um)m(b)s(er)f
+(of)h(p)s(ossible)g(completions)h(is)f(greater)h(than)f(or)g(equal)g
+(to)h(this)1110 4056 y(v)-5 b(alue,)45 b(Readline)e(will)f(ask)g
+(whether)f(or)h(not)g(the)g(user)f(wishes)g(to)i(view)1110
+4166 y(them;)33 b(otherwise,)f(they)g(are)g(simply)g(listed.)45
+b(This)31 b(v)-5 b(ariable)33 b(m)m(ust)e(b)s(e)g(set)1110
+4275 y(to)43 b(an)e(in)m(teger)j(v)-5 b(alue)42 b(greater)h(than)f(or)g
+(equal)g(to)h(zero.)76 b(A)42 b(zero)g(v)-5 b(alue)1110
+4385 y(means)40 b(Readline)h(should)f(nev)m(er)g(ask;)46
+b(negativ)m(e)d(v)-5 b(alues)41 b(are)f(treated)i(as)1110
+4495 y(zero.)g(The)29 b(default)i(limit)g(is)g Fn(100)p
+Fo(.)630 4682 y Fn(convert-meta)1110 4792 y Fo(If)22
+b(set)g(to)h(`)p Fn(on)p Fo(',)h(Readline)f(will)f(con)m(v)m(ert)i(c)m
+(haracters)f(with)f(the)g(eigh)m(th)h(bit)f(set)1110
+4902 y(to)33 b(an)e Fh(asci)r(i)h Fo(k)m(ey)h(sequence)f(b)m(y)g
+(stripping)f(the)h(eigh)m(th)h(bit)f(and)f(pre\014xing)1110
+5011 y(an)24 b Fn(ESC)g Fo(c)m(haracter,)j(con)m(v)m(erting)f(them)f
+(to)g(a)g(meta-pre\014xed)f(k)m(ey)h(sequence.)1110 5121
+y(The)i(default)h(v)-5 b(alue)28 b(is)f(`)p Fn(on)p Fo(',)i(but)d(will)
+i(b)s(e)f(set)h(to)g(`)p Fn(off)p Fo(')g(if)f(the)h(lo)s(cale)h(is)f
+(one)1110 5230 y(that)21 b(con)m(tains)h(eigh)m(t-bit)h(c)m(haracters.)
+39 b(This)20 b(v)-5 b(ariable)21 b(is)g(dep)s(enden)m(t)f(on)h(the)1110
+5340 y Fn(LC_CTYPE)26 b Fo(lo)s(cale)31 b(category)-8
+b(,)31 b(and)d(ma)m(y)h(c)m(hange)h(if)e(the)h(lo)s(cale)h(is)f(c)m
+(hanged.)p eop end
+%%Page: 7 10
+TeXDict begin 7 9 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(7)630 299 y Fn(disable-completion)
+1110 408 y Fo(If)36 b(set)h(to)h(`)p Fn(On)p Fo(',)g(Readline)f(will)g
+(inhibit)f(w)m(ord)h(completion.)60 b(Completion)1110
+518 y(c)m(haracters)28 b(will)e(b)s(e)f(inserted)h(in)m(to)h(the)g
+(line)f(as)g(if)g(they)h(had)e(b)s(een)g(mapp)s(ed)1110
+628 y(to)31 b Fn(self-insert)p Fo(.)38 b(The)30 b(default)g(is)h(`)p
+Fn(off)p Fo('.)630 774 y Fn(echo-control-characters)1110
+883 y Fo(When)f(set)h(to)g(`)p Fn(on)p Fo(',)f(on)g(op)s(erating)h
+(systems)f(that)h(indicate)g(they)g(supp)s(ort)1110 993
+y(it,)e(Readline)g(ec)m(ho)s(es)g(a)f(c)m(haracter)i(corresp)s(onding)d
+(to)i(a)f(signal)h(generated)1110 1103 y(from)h(the)g(k)m(eyb)s(oard.)
+41 b(The)30 b(default)g(is)h(`)p Fn(on)p Fo('.)630 1249
+y Fn(editing-mode)1110 1358 y Fo(The)d Fn(editing-mode)e
+Fo(v)-5 b(ariable)29 b(con)m(trols)h(whic)m(h)e(default)h(set)h(of)e(k)
+m(ey)i(bind-)1110 1468 y(ings)25 b(is)g(used.)38 b(By)26
+b(default,)g(Readline)g(starts)f(up)f(in)h(Emacs)g(editing)h(mo)s(de,)
+1110 1577 y(where)j(the)g(k)m(eystrok)m(es)i(are)e(most)h(similar)f(to)
+h(Emacs.)40 b(This)29 b(v)-5 b(ariable)30 b(can)1110
+1687 y(b)s(e)g(set)h(to)g(either)g(`)p Fn(emacs)p Fo(')e(or)h(`)p
+Fn(vi)p Fo('.)630 1833 y Fn(emacs-mode-string)1110 1943
+y Fo(If)j(the)h Fe(sho)m(w-mo)s(de-in-prompt)h Fo(v)-5
+b(ariable)35 b(is)e(enabled,)i(this)f(string)f(is)h(dis-)1110
+2052 y(pla)m(y)m(ed)24 b(immediately)g(b)s(efore)f(the)g(last)h(line)f
+(of)h(the)f(primary)f(prompt)g(when)1110 2162 y(emacs)g(editing)h(mo)s
+(de)e(is)h(activ)m(e.)40 b(The)21 b(v)-5 b(alue)22 b(is)g(expanded)f
+(lik)m(e)h(a)h(k)m(ey)f(bind-)1110 2271 y(ing,)27 b(so)f(the)f
+(standard)g(set)h(of)f(meta-)i(and)e(con)m(trol)i(pre\014xes)d(and)h
+(bac)m(kslash)1110 2381 y(escap)s(e)f(sequences)h(is)e(a)m(v)-5
+b(ailable.)41 b(Use)25 b(the)f(`)p Fn(\\1)p Fo(')f(and)h(`)p
+Fn(\\2)p Fo(')g(escap)s(es)g(to)g(b)s(egin)1110 2491
+y(and)37 b(end)g(sequences)h(of)f(non-prin)m(ting)h(c)m(haracters,)j
+(whic)m(h)c(can)h(b)s(e)f(used)1110 2600 y(to)h(em)m(b)s(ed)f(a)g
+(terminal)h(con)m(trol)h(sequence)f(in)m(to)g(the)f(mo)s(de)g(string.)
+61 b(The)1110 2710 y(default)31 b(is)f(`)p Fn(@)p Fo('.)630
+2856 y Fn(enable-active-region)1110 2966 y Fo(The)46
+b Fe(p)s(oin)m(t)j Fo(is)e(the)g(curren)m(t)f(cursor)g(p)s(osition,)52
+b(and)46 b Fe(mark)52 b Fo(refers)46 b(to)i(a)1110 3075
+y(sa)m(v)m(ed)37 b(cursor)f(p)s(osition)g(\(see)i(Section)f(1.4.1)h
+([Commands)d(F)-8 b(or)37 b(Mo)m(ving],)1110 3185 y(page)25
+b(17\).)40 b(The)24 b(text)h(b)s(et)m(w)m(een)g(the)g(p)s(oin)m(t)f
+(and)g(mark)g(is)g(referred)g(to)h(as)g(the)1110 3294
+y Fe(region)p Fo(.)62 b(When)37 b(this)g(v)-5 b(ariable)38
+b(is)f(set)h(to)g(`)p Fn(On)p Fo(',)h(Readline)f(allo)m(ws)g(certain)
+1110 3404 y(commands)f(to)h(designate)h(the)e(region)h(as)g
+Fe(activ)m(e)p Fo(.)64 b(When)37 b(the)h(region)g(is)1110
+3513 y(activ)m(e,)43 b(Readline)38 b(highligh)m(ts)h(the)g(text)g(in)e
+(the)i(region)g(using)e(the)h(v)-5 b(alue)1110 3623 y(of)35
+b(the)g Fn(active-region-start-color)p Fo(,)30 b(whic)m(h)35
+b(defaults)g(to)h(the)f(string)1110 3733 y(that)23 b(enables)f(the)g
+(terminal's)h(standout)e(mo)s(de.)38 b(The)21 b(activ)m(e)k(region)d
+(sho)m(ws)1110 3842 y(the)32 b(text)h(inserted)f(b)m(y)g(brac)m(k)m
+(eted-paste)i(and)e(an)m(y)g(matc)m(hing)h(text)g(found)1110
+3952 y(b)m(y)f(incremen)m(tal)i(and)e(non-incremen)m(tal)i(history)e
+(searc)m(hes.)48 b(The)32 b(default)1110 4061 y(is)e(`)p
+Fn(On)p Fo('.)630 4208 y Fn(enable-bracketed-paste)1110
+4317 y Fo(When)36 b(set)h(to)g(`)p Fn(On)p Fo(',)h(Readline)f
+(con\014gures)f(the)h(terminal)f(to)i(insert)e(eac)m(h)1110
+4427 y(paste)27 b(in)m(to)g(the)f(editing)h(bu\013er)e(as)h(a)h(single)
+g(string)f(of)g(c)m(haracters,)j(instead)1110 4536 y(of)d(treating)i
+(eac)m(h)g(c)m(haracter)f(as)g(if)f(it)h(had)f(b)s(een)f(read)i(from)e
+(the)i(k)m(eyb)s(oard.)1110 4646 y(This)36 b(is)h(called)h(putting)f
+(the)h(terminal)f(in)m(to)h Fe(brac)m(k)m(eted)h(paste)e(mo)s(de)5
+b Fo(;)40 b(it)1110 4756 y(prev)m(en)m(ts)30 b(Readline)h(from)e
+(executing)i(an)m(y)f(editing)h(commands)e(b)s(ound)f(to)1110
+4865 y(k)m(ey)j(sequences)g(app)s(earing)f(in)g(the)g(pasted)h(text.)42
+b(The)29 b(default)i(is)f(`)p Fn(On)p Fo('.)630 5011
+y Fn(enable-keypad)1110 5121 y Fo(When)23 b(set)h(to)g(`)p
+Fn(on)p Fo(',)h(Readline)f(will)g(try)f(to)h(enable)g(the)f
+(application)i(k)m(eypad)1110 5230 y(when)h(it)h(is)f(called.)41
+b(Some)27 b(systems)f(need)h(this)f(to)h(enable)g(the)g(arro)m(w)g(k)m
+(eys.)1110 5340 y(The)j(default)g(is)h(`)p Fn(off)p Fo('.)p
+eop end
+%%Page: 8 11
+TeXDict begin 8 10 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(8)630 299 y Fn(enable-meta-key)
+1110 408 y Fo(When)40 b(set)g(to)g(`)p Fn(on)p Fo(',)j(Readline)d(will)
+g(try)g(to)g(enable)g(an)m(y)g(meta)h(mo)s(di\014er)1110
+518 y(k)m(ey)i(the)e(terminal)i(claims)f(to)h(supp)s(ort)d(when)h(it)h
+(is)g(called.)76 b(On)41 b(man)m(y)1110 628 y(terminals,)c(the)e(meta)h
+(k)m(ey)g(is)f(used)g(to)h(send)e(eigh)m(t-bit)j(c)m(haracters.)56
+b(The)1110 737 y(default)31 b(is)f(`)p Fn(on)p Fo('.)630
+894 y Fn(expand-tilde)1110 1003 y Fo(If)d(set)h(to)h(`)p
+Fn(on)p Fo(',)f(tilde)g(expansion)g(is)f(p)s(erformed)f(when)h
+(Readline)h(attempts)1110 1113 y(w)m(ord)i(completion.)42
+b(The)30 b(default)g(is)h(`)p Fn(off)p Fo('.)630 1270
+y Fn(history-preserve-point)1110 1379 y Fo(If)41 b(set)h(to)h(`)p
+Fn(on)p Fo(',)i(the)c(history)h(co)s(de)g(attempts)h(to)f(place)h(the)f
+(p)s(oin)m(t)f(\(the)1110 1489 y(curren)m(t)35 b(cursor)g(p)s
+(osition\))g(at)h(the)g(same)f(lo)s(cation)i(on)e(eac)m(h)h(history)g
+(line)1110 1598 y(retriev)m(ed)h(with)f Fn(previous-history)c
+Fo(or)37 b Fn(next-history)p Fo(.)55 b(The)36 b(default)1110
+1708 y(is)30 b(`)p Fn(off)p Fo('.)630 1864 y Fn(history-size)1110
+1974 y Fo(Set)39 b(the)g(maxim)m(um)g(n)m(um)m(b)s(er)f(of)h(history)g
+(en)m(tries)h(sa)m(v)m(ed)g(in)f(the)g(history)1110 2084
+y(list.)51 b(If)34 b(set)g(to)h(zero,)g(an)m(y)f(existing)h(history)f
+(en)m(tries)g(are)g(deleted)h(and)e(no)1110 2193 y(new)e(en)m(tries)i
+(are)f(sa)m(v)m(ed.)46 b(If)31 b(set)h(to)h(a)f(v)-5
+b(alue)32 b(less)g(than)f(zero,)i(the)f(n)m(um)m(b)s(er)1110
+2303 y(of)f(history)f(en)m(tries)h(is)g(not)g(limited.)42
+b(By)30 b(default,)h(the)g(n)m(um)m(b)s(er)e(of)i(history)1110
+2412 y(en)m(tries)j(is)f(not)g(limited.)49 b(If)32 b(an)h(attempt)h(is)
+f(made)g(to)h(set)f Fe(history-size)39 b Fo(to)1110 2522
+y(a)34 b(non-n)m(umeric)f(v)-5 b(alue,)34 b(the)g(maxim)m(um)f(n)m(um)m
+(b)s(er)f(of)h(history)h(en)m(tries)g(will)1110 2632
+y(b)s(e)c(set)h(to)g(500.)630 2788 y Fn(horizontal-scroll-mode)1110
+2898 y Fo(This)k(v)-5 b(ariable)37 b(can)f(b)s(e)f(set)h(to)h(either)f
+(`)p Fn(on)p Fo(')g(or)g(`)p Fn(off)p Fo('.)57 b(Setting)36
+b(it)g(to)h(`)p Fn(on)p Fo(')1110 3007 y(means)26 b(that)h(the)f(text)h
+(of)g(the)f(lines)g(b)s(eing)g(edited)h(will)f(scroll)h(horizon)m
+(tally)1110 3117 y(on)32 b(a)g(single)g(screen)g(line)g(when)e(they)i
+(are)g(longer)h(than)e(the)h(width)f(of)h(the)1110 3226
+y(screen,)c(instead)g(of)f(wrapping)f(on)m(to)i(a)g(new)e(screen)i
+(line.)40 b(This)26 b(v)-5 b(ariable)28 b(is)1110 3336
+y(automatically)k(set)e(to)g(`)p Fn(on)p Fo(')f(for)g(terminals)g(of)h
+(heigh)m(t)g(1.)41 b(By)29 b(default,)h(this)1110 3446
+y(v)-5 b(ariable)31 b(is)g(set)f(to)i(`)p Fn(off)p Fo('.)630
+3602 y Fn(input-meta)1110 3712 y Fo(If)f(set)g(to)h(`)p
+Fn(on)p Fo(',)g(Readline)g(will)f(enable)h(eigh)m(t-bit)h(input)d(\(it)
+i(will)f(not)h(clear)1110 3821 y(the)40 b(eigh)m(th)g(bit)g(in)f(the)h
+(c)m(haracters)h(it)f(reads\),)j(regardless)c(of)h(what)g(the)1110
+3931 y(terminal)k(claims)h(it)f(can)g(supp)s(ort.)79
+b(The)44 b(default)g(v)-5 b(alue)44 b(is)g(`)p Fn(off)p
+Fo(',)j(but)1110 4041 y(Readline)24 b(will)h(set)f(it)g(to)h(`)p
+Fn(on)p Fo(')e(if)h(the)g(lo)s(cale)i(con)m(tains)f(eigh)m(t-bit)g(c)m
+(haracters.)1110 4150 y(The)k(name)g Fn(meta-flag)e Fo(is)i(a)h(synon)m
+(ym)f(for)g(this)g(v)-5 b(ariable.)42 b(This)28 b(v)-5
+b(ariable)1110 4260 y(is)35 b(dep)s(enden)m(t)f(on)h(the)g
+Fn(LC_CTYPE)e Fo(lo)s(cale)k(category)-8 b(,)39 b(and)34
+b(ma)m(y)i(c)m(hange)g(if)1110 4369 y(the)31 b(lo)s(cale)h(is)e(c)m
+(hanged.)630 4526 y Fn(isearch-terminators)1110 4635
+y Fo(The)51 b(string)h(of)g(c)m(haracters)h(that)f(should)e(terminate)j
+(an)f(incremen)m(tal)1110 4745 y(searc)m(h)25 b(without)g(subsequen)m
+(tly)g(executing)h(the)f(c)m(haracter)h(as)f(a)g(command)1110
+4855 y(\(see)45 b(Section)h(1.2.5)g([Searc)m(hing],)j(page)d(3\).)84
+b(If)44 b(this)g(v)-5 b(ariable)45 b(has)g(not)1110 4964
+y(b)s(een)35 b(giv)m(en)h(a)g(v)-5 b(alue,)37 b(the)f(c)m(haracters)h
+Fn(ESC)d Fo(and)h Fg(C-J)g Fo(will)h(terminate)g(an)1110
+5074 y(incremen)m(tal)c(searc)m(h.)630 5230 y Fn(keymap)192
+b Fo(Sets)64 b(Readline's)i(idea)f(of)f(the)h(curren)m(t)f(k)m(eymap)h
+(for)f(k)m(ey)h(binding)1110 5340 y(commands.)71 b(Built-in)41
+b Fn(keymap)e Fo(names)h(are)h Fn(emacs)p Fo(,)h Fn(emacs-standard)p
+Fo(,)p eop end
+%%Page: 9 12
+TeXDict begin 9 11 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(9)1110 299 y Fn(emacs-meta)p
+Fo(,)99 b Fn(emacs-ctlx)p Fo(,)f Fn(vi)p Fo(,)j Fn(vi-move)p
+Fo(,)f Fn(vi-command)p Fo(,)f(and)1110 408 y Fn(vi-insert)p
+Fo(.)81 b Fn(vi)44 b Fo(is)h(equiv)-5 b(alen)m(t)46 b(to)g
+Fn(vi-command)c Fo(\()p Fn(vi-move)h Fo(is)i(also)h(a)1110
+518 y(synon)m(ym\);)41 b Fn(emacs)c Fo(is)h(equiv)-5
+b(alen)m(t)39 b(to)f Fn(emacs-standard)p Fo(.)59 b(Applications)1110
+628 y(ma)m(y)32 b(add)e(additional)i(names.)43 b(The)30
+b(default)h(v)-5 b(alue)32 b(is)f Fn(emacs)p Fo(.)41
+b(The)30 b(v)-5 b(alue)1110 737 y(of)31 b(the)f Fn(editing-mode)d
+Fo(v)-5 b(ariable)31 b(also)h(a\013ects)f(the)g(default)g(k)m(eymap.)
+630 909 y Fn(keyseq-timeout)1110 1019 y Fo(Sp)s(eci\014es)25
+b(the)g(duration)g(Readline)h(will)g(w)m(ait)g(for)g(a)f(c)m(haracter)i
+(when)e(read-)1110 1129 y(ing)30 b(an)g(am)m(biguous)g(k)m(ey)h
+(sequence)f(\(one)g(that)h(can)f(form)g(a)g(complete)h(k)m(ey)1110
+1238 y(sequence)j(using)e(the)i(input)e(read)h(so)g(far,)h(or)g(can)f
+(tak)m(e)i(additional)f(input)1110 1348 y(to)g(complete)g(a)f(longer)h
+(k)m(ey)f(sequence\).)49 b(If)33 b(no)f(input)g(is)h(receiv)m(ed)h
+(within)1110 1457 y(the)43 b(timeout,)48 b(Readline)43
+b(will)g(use)g(the)g(shorter)g(but)f(complete)j(k)m(ey)e(se-)1110
+1567 y(quence.)c(Readline)26 b(uses)f(this)h(v)-5 b(alue)26
+b(to)g(determine)g(whether)f(or)g(not)h(input)1110 1677
+y(is)31 b(a)m(v)-5 b(ailable)33 b(on)d(the)h(curren)m(t)f(input)g
+(source)h(\()p Fn(rl_instream)d Fo(b)m(y)i(default\).)1110
+1786 y(The)25 b(v)-5 b(alue)26 b(is)f(sp)s(eci\014ed)f(in)h
+(milliseconds,)j(so)d(a)h(v)-5 b(alue)26 b(of)f(1000)i(means)e(that)
+1110 1896 y(Readline)e(will)g(w)m(ait)g(one)g(second)f(for)g
+(additional)i(input.)37 b(If)22 b(this)g(v)-5 b(ariable)23
+b(is)1110 2005 y(set)28 b(to)h(a)f(v)-5 b(alue)29 b(less)f(than)g(or)f
+(equal)i(to)f(zero,)i(or)e(to)g(a)h(non-n)m(umeric)e(v)-5
+b(alue,)1110 2115 y(Readline)30 b(will)f(w)m(ait)i(un)m(til)e(another)h
+(k)m(ey)g(is)f(pressed)g(to)h(decide)f(whic)m(h)g(k)m(ey)1110
+2225 y(sequence)i(to)g(complete.)42 b(The)30 b(default)g(v)-5
+b(alue)31 b(is)g Fn(500)p Fo(.)630 2397 y Fn(mark-directories)1110
+2506 y Fo(If)38 b(set)g(to)h(`)p Fn(on)p Fo(',)i(completed)e(directory)
+f(names)g(ha)m(v)m(e)i(a)e(slash)g(app)s(ended.)1110
+2616 y(The)30 b(default)g(is)h(`)p Fn(on)p Fo('.)630
+2788 y Fn(mark-modified-lines)1110 2898 y Fo(This)k(v)-5
+b(ariable,)38 b(when)d(set)h(to)h(`)p Fn(on)p Fo(',)g(causes)g
+(Readline)f(to)h(displa)m(y)f(an)f(as-)1110 3007 y(terisk)f(\(`)p
+Fn(*)p Fo('\))h(at)f(the)g(start)g(of)g(history)g(lines)g(whic)m(h)f
+(ha)m(v)m(e)i(b)s(een)e(mo)s(di\014ed.)1110 3117 y(This)d(v)-5
+b(ariable)31 b(is)f(`)p Fn(off)p Fo(')g(b)m(y)g(default.)630
+3289 y Fn(mark-symlinked-directori)o(es)1110 3399 y Fo(If)59
+b(set)h(to)g(`)p Fn(on)p Fo(',)67 b(completed)60 b(names)f(whic)m(h)g
+(are)h(sym)m(b)s(olic)g(links)f(to)1110 3508 y(directories)71
+b(ha)m(v)m(e)f(a)g(slash)f(app)s(ended)f(\(sub)5 b(ject)70
+b(to)g(the)g(v)-5 b(alue)70 b(of)1110 3618 y Fn(mark-directories)p
+Fo(\).)37 b(The)30 b(default)g(is)g(`)p Fn(off)p Fo('.)630
+3790 y Fn(match-hidden-files)1110 3900 y Fo(This)21 b(v)-5
+b(ariable,)25 b(when)d(set)g(to)h(`)p Fn(on)p Fo(',)h(causes)f
+(Readline)g(to)g(matc)m(h)g(\014les)f(whose)1110 4009
+y(names)44 b(b)s(egin)g(with)g(a)g(`)p Fn(.)p Fo(')g(\(hidden)f
+(\014les\))i(when)e(p)s(erforming)g(\014lename)1110 4119
+y(completion.)75 b(If)41 b(set)g(to)h(`)p Fn(off)p Fo(',)i(the)e
+(leading)g(`)p Fn(.)p Fo(')f(m)m(ust)g(b)s(e)g(supplied)f(b)m(y)1110
+4228 y(the)34 b(user)g(in)g(the)g(\014lename)g(to)h(b)s(e)f(completed.)
+53 b(This)33 b(v)-5 b(ariable)35 b(is)f(`)p Fn(on)p Fo(')g(b)m(y)1110
+4338 y(default.)630 4510 y Fn(menu-complete-display-pr)o(efix)1110
+4620 y Fo(If)f(set)h(to)g(`)p Fn(on)p Fo(',)h(men)m(u)e(completion)i
+(displa)m(ys)e(the)h(common)g(pre\014x)e(of)i(the)1110
+4729 y(list)k(of)g(p)s(ossible)f(completions)i(\(whic)m(h)e(ma)m(y)h(b)
+s(e)f(empt)m(y\))i(b)s(efore)e(cycling)1110 4839 y(through)30
+b(the)g(list.)42 b(The)29 b(default)i(is)f(`)p Fn(off)p
+Fo('.)630 5011 y Fn(output-meta)1110 5121 y Fo(If)35
+b(set)h(to)g(`)p Fn(on)p Fo(',)h(Readline)f(will)g(displa)m(y)f(c)m
+(haracters)i(with)e(the)h(eigh)m(th)g(bit)1110 5230 y(set)h(directly)g
+(rather)f(than)g(as)h(a)g(meta-pre\014xed)f(escap)s(e)h(sequence.)59
+b(The)1110 5340 y(default)26 b(is)f(`)p Fn(off)p Fo(',)i(but)e
+(Readline)h(will)g(set)g(it)g(to)h(`)p Fn(on)p Fo(')e(if)h(the)f(lo)s
+(cale)j(con)m(tains)p eop end
+%%Page: 10 13
+TeXDict begin 10 12 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(10)1110 299 y(eigh)m(t-bit)38
+b(c)m(haracters.)61 b(This)36 b(v)-5 b(ariable)37 b(is)g(dep)s(enden)m
+(t)e(on)h(the)h Fn(LC_CTYPE)1110 408 y Fo(lo)s(cale)32
+b(category)-8 b(,)33 b(and)d(ma)m(y)h(c)m(hange)g(if)g(the)f(lo)s(cale)
+i(is)f(c)m(hanged.)630 581 y Fn(page-completions)1110
+690 y Fo(If)i(set)i(to)f(`)p Fn(on)p Fo(',)h(Readline)g(uses)e(an)h(in)
+m(ternal)h Fn(more)p Fo(-lik)m(e)f(pager)g(to)h(displa)m(y)1110
+800 y(a)e(screenful)f(of)g(p)s(ossible)g(completions)i(at)f(a)g(time.)
+47 b(This)31 b(v)-5 b(ariable)34 b(is)e(`)p Fn(on)p Fo(')1110
+909 y(b)m(y)e(default.)630 1082 y Fn(print-completions-horizo)o(ntal)o
+(ly)1110 1191 y Fo(If)23 b(set)i(to)g(`)p Fn(on)p Fo(',)g(Readline)g
+(will)f(displa)m(y)g(completions)h(with)f(matc)m(hes)h(sorted)1110
+1301 y(horizon)m(tally)45 b(in)e(alphab)s(etical)i(order,)i(rather)c
+(than)g(do)m(wn)g(the)h(screen.)1110 1410 y(The)30 b(default)g(is)h(`)p
+Fn(off)p Fo('.)630 1583 y Fn(revert-all-at-newline)1110
+1692 y Fo(If)e(set)h(to)g(`)p Fn(on)p Fo(',)g(Readline)g(will)g(undo)f
+(all)h(c)m(hanges)h(to)f(history)g(lines)f(b)s(efore)1110
+1802 y(returning)f(when)f Fn(accept-line)f Fo(is)j(executed.)41
+b(By)29 b(default,)g(history)g(lines)1110 1911 y(ma)m(y)42
+b(b)s(e)g(mo)s(di\014ed)e(and)h(retain)i(individual)e(undo)g(lists)h
+(across)g(calls)h(to)1110 2021 y Fn(readline\(\))p Fo(.)38
+b(The)30 b(default)g(is)h(`)p Fn(off)p Fo('.)630 2193
+y Fn(show-all-if-ambiguous)1110 2303 y Fo(This)e(alters)i(the)f
+(default)g(b)s(eha)m(vior)g(of)g(the)h(completion)g(functions.)40
+b(If)29 b(set)1110 2412 y(to)f(`)p Fn(on)p Fo(',)g(w)m(ords)f(whic)m(h)
+g(ha)m(v)m(e)i(more)f(than)f(one)h(p)s(ossible)f(completion)h(cause)
+1110 2522 y(the)39 b(matc)m(hes)h(to)g(b)s(e)e(listed)h(immediately)i
+(instead)e(of)g(ringing)g(the)g(b)s(ell.)1110 2632 y(The)30
+b(default)g(v)-5 b(alue)31 b(is)g(`)p Fn(off)p Fo('.)630
+2804 y Fn(show-all-if-unmodified)1110 2913 y Fo(This)38
+b(alters)h(the)g(default)g(b)s(eha)m(vior)g(of)f(the)h(completion)h
+(functions)e(in)h(a)1110 3023 y(fashion)25 b(similar)h(to)g
+Fe(sho)m(w-all-if-am)m(biguous)p Fo(.)41 b(If)25 b(set)h(to)h(`)p
+Fn(on)p Fo(',)f(w)m(ords)f(whic)m(h)1110 3133 y(ha)m(v)m(e)32
+b(more)f(than)f(one)i(p)s(ossible)e(completion)i(without)f(an)m(y)g(p)s
+(ossible)f(par-)1110 3242 y(tial)43 b(completion)h(\(the)f(p)s(ossible)
+f(completions)h(don't)f(share)g(a)h(common)1110 3352
+y(pre\014x\))30 b(cause)g(the)h(matc)m(hes)g(to)g(b)s(e)f(listed)g
+(immediately)i(instead)e(of)h(ring-)1110 3461 y(ing)g(the)f(b)s(ell.)41
+b(The)30 b(default)g(v)-5 b(alue)31 b(is)f(`)p Fn(off)p
+Fo('.)630 3634 y Fn(show-mode-in-prompt)1110 3743 y Fo(If)24
+b(set)h(to)g(`)p Fn(on)p Fo(',)g(add)f(a)h(string)f(to)h(the)f(b)s
+(eginning)g(of)g(the)h(prompt)e(indicating)1110 3853
+y(the)33 b(editing)h(mo)s(de:)46 b(emacs,)35 b(vi)e(command,)h(or)f(vi)
+h(insertion.)49 b(The)32 b(mo)s(de)1110 3962 y(strings)45
+b(are)h(user-settable)g(\(e.g.,)51 b Fe(emacs-mo)s(de-string)8
+b Fo(\).)87 b(The)45 b(default)1110 4072 y(v)-5 b(alue)31
+b(is)f(`)p Fn(off)p Fo('.)630 4244 y Fn(skip-completed-text)1110
+4354 y Fo(If)i(set)i(to)f(`)p Fn(on)p Fo(',)h(this)f(alters)g(the)g
+(default)g(completion)h(b)s(eha)m(vior)f(when)f(in-)1110
+4463 y(serting)d(a)h(single)g(matc)m(h)f(in)m(to)h(the)g(line.)40
+b(It's)30 b(only)f(activ)m(e)i(when)d(p)s(erform-)1110
+4573 y(ing)k(completion)i(in)e(the)g(middle)g(of)g(a)h(w)m(ord.)46
+b(If)32 b(enabled,)g(Readline)h(do)s(es)1110 4682 y(not)41
+b(insert)f(c)m(haracters)i(from)e(the)h(completion)h(that)f(matc)m(h)g
+(c)m(haracters)1110 4792 y(after)c(p)s(oin)m(t)g(in)g(the)g(w)m(ord)f
+(b)s(eing)g(completed,)k(so)d(p)s(ortions)f(of)h(the)g(w)m(ord)1110
+4902 y(follo)m(wing)c(the)f(cursor)f(are)h(not)g(duplicated.)45
+b(F)-8 b(or)32 b(instance,)h(if)f(this)f(is)h(en-)1110
+5011 y(abled,)43 b(attempting)f(completion)g(when)d(the)i(cursor)f(is)g
+(after)h(the)g(`)p Fn(e)p Fo(')f(in)1110 5121 y(`)p Fn(Makefile)p
+Fo(')c(will)i(result)f(in)g(`)p Fn(Makefile)p Fo(')f(rather)h(than)h(`)
+p Fn(Makefilefile)p Fo(',)1110 5230 y(assuming)d(there)g(is)h(a)f
+(single)h(p)s(ossible)f(completion.)56 b(The)35 b(default)g(v)-5
+b(alue)1110 5340 y(is)30 b(`)p Fn(off)p Fo('.)p eop end
+%%Page: 11 14
+TeXDict begin 11 13 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(11)630 299 y Fn
+(vi-cmd-mode-string)1110 408 y Fo(If)33 b(the)h Fe(sho)m(w-mo)s
+(de-in-prompt)h Fo(v)-5 b(ariable)35 b(is)e(enabled,)i(this)f(string)f
+(is)h(dis-)1110 518 y(pla)m(y)m(ed)24 b(immediately)g(b)s(efore)f(the)g
+(last)h(line)f(of)h(the)f(primary)f(prompt)g(when)1110
+628 y(vi)32 b(editing)h(mo)s(de)f(is)g(activ)m(e)j(and)c(in)h(command)g
+(mo)s(de.)46 b(The)31 b(v)-5 b(alue)33 b(is)f(ex-)1110
+737 y(panded)26 b(lik)m(e)i(a)f(k)m(ey)h(binding,)e(so)i(the)f
+(standard)f(set)h(of)g(meta-)h(and)e(con)m(trol)1110
+847 y(pre\014xes)34 b(and)g(bac)m(kslash)i(escap)s(e)g(sequences)f(is)g
+(a)m(v)-5 b(ailable.)57 b(Use)35 b(the)g(`)p Fn(\\1)p
+Fo(')1110 956 y(and)23 b(`)p Fn(\\2)p Fo(')h(escap)s(es)h(to)f(b)s
+(egin)g(and)f(end)g(sequences)i(of)f(non-prin)m(ting)f(c)m(harac-)1110
+1066 y(ters,)31 b(whic)m(h)g(can)g(b)s(e)f(used)g(to)h(em)m(b)s(ed)f(a)
+h(terminal)h(con)m(trol)g(sequence)f(in)m(to)1110 1176
+y(the)g(mo)s(de)f(string.)40 b(The)30 b(default)h(is)f(`)p
+Fn(\(cmd\))p Fo('.)630 1340 y Fn(vi-ins-mode-string)1110
+1450 y Fo(If)j(the)h Fe(sho)m(w-mo)s(de-in-prompt)h Fo(v)-5
+b(ariable)35 b(is)e(enabled,)i(this)f(string)f(is)h(dis-)1110
+1559 y(pla)m(y)m(ed)24 b(immediately)g(b)s(efore)f(the)g(last)h(line)f
+(of)h(the)f(primary)f(prompt)g(when)1110 1669 y(vi)35
+b(editing)h(mo)s(de)e(is)i(activ)m(e)h(and)d(in)h(insertion)g(mo)s(de.)
+54 b(The)35 b(v)-5 b(alue)35 b(is)g(ex-)1110 1778 y(panded)26
+b(lik)m(e)i(a)f(k)m(ey)h(binding,)e(so)i(the)f(standard)f(set)h(of)g
+(meta-)h(and)e(con)m(trol)1110 1888 y(pre\014xes)34 b(and)g(bac)m
+(kslash)i(escap)s(e)g(sequences)f(is)g(a)m(v)-5 b(ailable.)57
+b(Use)35 b(the)g(`)p Fn(\\1)p Fo(')1110 1998 y(and)23
+b(`)p Fn(\\2)p Fo(')h(escap)s(es)h(to)f(b)s(egin)g(and)f(end)g
+(sequences)i(of)f(non-prin)m(ting)f(c)m(harac-)1110 2107
+y(ters,)31 b(whic)m(h)g(can)g(b)s(e)f(used)g(to)h(em)m(b)s(ed)f(a)h
+(terminal)h(con)m(trol)g(sequence)f(in)m(to)1110 2217
+y(the)g(mo)s(de)f(string.)40 b(The)30 b(default)h(is)f(`)p
+Fn(\(ins\))p Fo('.)630 2381 y Fn(visible-stats)1110 2491
+y Fo(If)h(set)i(to)f(`)p Fn(on)p Fo(',)h(a)f(c)m(haracter)i(denoting)e
+(a)g(\014le's)g(t)m(yp)s(e)g(is)g(app)s(ended)e(to)j(the)1110
+2600 y(\014lename)e(when)e(listing)i(p)s(ossible)f(completions.)42
+b(The)30 b(default)g(is)h(`)p Fn(off)p Fo('.)150 2765
+y(Key)f(Bindings)630 2874 y(The)41 b(syn)m(tax)i(for)f(con)m(trolling)h
+(k)m(ey)g(bindings)e(in)h(the)g(init)g(\014le)g(is)g(simple.)75
+b(First)43 b(y)m(ou)630 2984 y(need)27 b(to)i(\014nd)d(the)i(name)f(of)
+h(the)g(command)f(that)i(y)m(ou)f(w)m(an)m(t)g(to)g(c)m(hange.)41
+b(The)27 b(follo)m(wing)630 3093 y(sections)37 b(con)m(tain)g(tables)g
+(of)f(the)g(command)f(name,)j(the)e(default)g(k)m(eybinding,)h(if)f(an)
+m(y)-8 b(,)630 3203 y(and)30 b(a)h(short)f(description)g(of)h(what)f
+(the)g(command)h(do)s(es.)630 3340 y(Once)36 b(y)m(ou)g(kno)m(w)g(the)g
+(name)g(of)g(the)g(command,)h(simply)f(place)h(on)e(a)i(line)f(in)g
+(the)g(init)630 3450 y(\014le)e(the)g(name)f(of)h(the)g(k)m(ey)g(y)m
+(ou)g(wish)f(to)h(bind)f(the)h(command)f(to,)i(a)f(colon,)i(and)d(then)
+630 3559 y(the)f(name)h(of)f(the)g(command.)46 b(There)32
+b(can)g(b)s(e)g(no)g(space)g(b)s(et)m(w)m(een)h(the)f(k)m(ey)h(name)g
+(and)630 3669 y(the)41 b(colon)h({)f(that)g(will)g(b)s(e)g(in)m
+(terpreted)g(as)g(part)f(of)h(the)g(k)m(ey)h(name.)72
+b(The)40 b(name)h(of)630 3778 y(the)35 b(k)m(ey)g(can)g(b)s(e)f
+(expressed)f(in)i(di\013eren)m(t)g(w)m(a)m(ys,)h(dep)s(ending)d(on)h
+(what)h(y)m(ou)g(\014nd)e(most)630 3888 y(comfortable.)630
+4025 y(In)g(addition)h(to)g(command)g(names,)g(Readline)g(allo)m(ws)h
+(k)m(eys)g(to)f(b)s(e)f(b)s(ound)f(to)i(a)g(string)630
+4134 y(that)d(is)f(inserted)h(when)e(the)i(k)m(ey)g(is)f(pressed)g(\(a)
+h Fe(macro)5 b Fo(\).)630 4299 y Fe(k)m(eyname)g Fo(:)42
+b Fe(function-name)35 b Fo(or)c Fe(macro)1110 4408 y(k)m(eyname)k
+Fo(is)29 b(the)f(name)h(of)g(a)g(k)m(ey)h(sp)s(elled)e(out)h(in)g
+(English.)39 b(F)-8 b(or)30 b(example:)1350 4545 y Fn(Control-u:)45
+b(universal-argument)1350 4655 y(Meta-Rubout:)f(backward-kill-word)1350
+4765 y(Control-o:)h(">)i(output")1110 4902 y Fo(In)94
+b(the)g(example)h(ab)s(o)m(v)m(e,)112 b Fg(C-u)94 b Fo(is)g(b)s(ound)f
+(to)i(the)f(function)1110 5011 y Fn(universal-argument)p
+Fo(,)124 b Fg(M-DEL)107 b Fo(is)i(b)s(ound)e(to)j(the)f(function)1110
+5121 y Fn(backward-kill-word)p Fo(,)75 b(and)69 b Fg(C-o)g
+Fo(is)h(b)s(ound)e(to)j(run)d(the)i(macro)1110 5230 y(expressed)45
+b(on)h(the)g(righ)m(t)g(hand)e(side)i(\(that)h(is,)i(to)e(insert)e(the)
+h(text)h(`)p Fn(>)1110 5340 y(output)p Fo(')29 b(in)m(to)i(the)g
+(line\).)p eop end
+%%Page: 12 15
+TeXDict begin 12 14 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(12)1110 299 y(A)62
+b(n)m(um)m(b)s(er)e(of)i(sym)m(b)s(olic)h(c)m(haracter)g(names)f(are)g
+(recognized)h(while)1110 408 y(pro)s(cessing)40 b(this)f(k)m(ey)i
+(binding)e(syn)m(tax:)60 b Fe(DEL)p Fo(,)42 b Fe(ESC)p
+Fo(,)g Fe(ESCAPE)p Fo(,)f Fe(LFD)p Fo(,)1110 518 y Fe(NEWLINE)p
+Fo(,)31 b Fe(RET)p Fo(,)f Fe(RETURN)p Fo(,)g Fe(R)m(UBOUT)p
+Fo(,)h Fe(SP)-8 b(A)m(CE)p Fo(,)31 b Fe(SPC)p Fo(,)e(and)h
+Fe(T)-8 b(AB)p Fo(.)630 677 y Fn(")p Fe(k)m(eyseq)r Fn(")p
+Fo(:)41 b Fe(function-name)36 b Fo(or)30 b Fe(macro)1110
+787 y(k)m(eyseq)k Fo(di\013ers)d(from)f Fe(k)m(eyname)37
+b Fo(ab)s(o)m(v)m(e)32 b(in)f(that)h(strings)f(denoting)g(an)g(en-)1110
+896 y(tire)j(k)m(ey)h(sequence)f(can)g(b)s(e)f(sp)s(eci\014ed,)h(b)m(y)
+f(placing)i(the)f(k)m(ey)g(sequence)g(in)1110 1006 y(double)29
+b(quotes.)41 b(Some)29 b Fh(gnu)h Fo(Emacs)f(st)m(yle)i(k)m(ey)f(escap)
+s(es)g(can)g(b)s(e)f(used,)g(as)1110 1115 y(in)k(the)h(follo)m(wing)i
+(example,)f(but)e(the)h(sp)s(ecial)h(c)m(haracter)g(names)f(are)g(not)
+1110 1225 y(recognized.)1350 1359 y Fn("\\C-u":)46 b
+(universal-argument)1350 1469 y("\\C-x\\C-r":)f(re-read-init-file)1350
+1578 y("\\e[11~":)g("Function)h(Key)g(1")1110 1713 y
+Fo(In)64 b(the)g(ab)s(o)m(v)m(e)i(example,)74 b Fg(C-u)64
+b Fo(is)g(again)i(b)s(ound)c(to)k(the)e(function)1110
+1822 y Fn(universal-argument)39 b Fo(\(just)k(as)h(it)g(w)m(as)g(in)g
+(the)f(\014rst)g(example\),)49 b(`)p Fg(C-x)1110 1932
+y(C-r)p Fo(')30 b(is)g(b)s(ound)e(to)j(the)g(function)f
+Fn(re-read-init-file)p Fo(,)c(and)j(`)p Fn(ESC)h([)g(1)g(1)1110
+2041 y(~)p Fo(')g(is)h(b)s(ound)d(to)j(insert)f(the)h(text)g(`)p
+Fn(Function)e(Key)g(1)p Fo('.)630 2200 y(The)g(follo)m(wing)i
+Fh(gnu)f Fo(Emacs)g(st)m(yle)h(escap)s(e)f(sequences)g(are)g(a)m(v)-5
+b(ailable)32 b(when)d(sp)s(ecifying)630 2310 y(k)m(ey)i(sequences:)630
+2469 y Fg(\\C-)336 b Fo(con)m(trol)32 b(pre\014x)630
+2628 y Fg(\\M-)336 b Fo(meta)31 b(pre\014x)630 2787 y
+Fg(\\e)384 b Fo(an)30 b(escap)s(e)h(c)m(haracter)630
+2945 y Fg(\\\\)384 b Fo(bac)m(kslash)630 3104 y Fg(\\)p
+Fn(")g(")p Fo(,)30 b(a)h(double)f(quotation)i(mark)630
+3263 y Fg(\\')384 b Fn(')p Fo(,)30 b(a)h(single)g(quote)g(or)f(ap)s
+(ostrophe)630 3422 y(In)d(addition)h(to)g(the)g Fh(gnu)f
+Fo(Emacs)h(st)m(yle)h(escap)s(e)f(sequences,)h(a)f(second)f(set)h(of)g
+(bac)m(kslash)630 3532 y(escap)s(es)j(is)f(a)m(v)-5 b(ailable:)630
+3691 y Fn(\\a)384 b Fo(alert)31 b(\(b)s(ell\))630 3850
+y Fn(\\b)384 b Fo(bac)m(kspace)630 4008 y Fn(\\d)g Fo(delete)630
+4167 y Fn(\\f)g Fo(form)30 b(feed)630 4326 y Fn(\\n)384
+b Fo(newline)630 4485 y Fn(\\r)g Fo(carriage)32 b(return)630
+4644 y Fn(\\t)384 b Fo(horizon)m(tal)32 b(tab)630 4803
+y Fn(\\v)384 b Fo(v)m(ertical)32 b(tab)630 4962 y Fn(\\)p
+Fg(nnn)288 b Fo(the)35 b(eigh)m(t-bit)h(c)m(haracter)g(whose)e(v)-5
+b(alue)35 b(is)g(the)f(o)s(ctal)i(v)-5 b(alue)35 b Fe(nnn)e
+Fo(\(one)i(to)1110 5071 y(three)c(digits\))630 5230 y
+Fn(\\x)p Fg(HH)288 b Fo(the)38 b(eigh)m(t-bit)i(c)m(haracter)g(whose)e
+(v)-5 b(alue)39 b(is)f(the)h(hexadecimal)g(v)-5 b(alue)39
+b Fe(HH)1110 5340 y Fo(\(one)31 b(or)f(t)m(w)m(o)i(hex)e(digits\))p
+eop end
+%%Page: 13 16
+TeXDict begin 13 15 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(13)630 299 y(When)37
+b(en)m(tering)h(the)g(text)g(of)g(a)g(macro,)i(single)e(or)f(double)g
+(quotes)h(m)m(ust)f(b)s(e)g(used)f(to)630 408 y(indicate)23
+b(a)e(macro)h(de\014nition.)38 b(Unquoted)21 b(text)i(is)e(assumed)g
+(to)h(b)s(e)f(a)h(function)f(name.)38 b(In)630 518 y(the)22
+b(macro)f(b)s(o)s(dy)-8 b(,)23 b(the)e(bac)m(kslash)h(escap)s(es)g
+(describ)s(ed)e(ab)s(o)m(v)m(e)j(are)e(expanded.)37 b(Bac)m(kslash)630
+628 y(will)j(quote)h(an)m(y)f(other)g(c)m(haracter)i(in)d(the)i(macro)f
+(text,)k(including)39 b(`)p Fn(")p Fo(')h(and)g(`)p Fn(')p
+Fo('.)69 b(F)-8 b(or)630 737 y(example,)28 b(the)e(follo)m(wing)h
+(binding)d(will)i(mak)m(e)h(`)p Fg(C-x)j Fn(\\)p Fo(')c(insert)f(a)h
+(single)h(`)p Fn(\\)p Fo(')f(in)m(to)g(the)g(line:)870
+873 y Fn("\\C-x\\\\":)45 b("\\\\")150 1073 y Fd(1.3.2)63
+b(Conditional)41 b(Init)g(Constructs)150 1220 y Fo(Readline)c(implemen)
+m(ts)g(a)h(facilit)m(y)g(similar)f(in)g(spirit)f(to)i(the)f
+(conditional)h(compilation)g(features)f(of)150 1330 y(the)31
+b(C)f(prepro)s(cessor)g(whic)m(h)g(allo)m(ws)i(k)m(ey)g(bindings)d(and)
+h(v)-5 b(ariable)32 b(settings)f(to)h(b)s(e)e(p)s(erformed)f(as)i(the)
+150 1440 y(result)f(of)h(tests.)41 b(There)30 b(are)h(four)f(parser)f
+(directiv)m(es)j(used.)150 1601 y Fn($if)336 b Fo(The)31
+b Fn($if)f Fo(construct)i(allo)m(ws)h(bindings)d(to)i(b)s(e)e(made)i
+(based)f(on)g(the)g(editing)h(mo)s(de,)g(the)630 1711
+y(terminal)37 b(b)s(eing)f(used,)h(or)f(the)h(application)g(using)f
+(Readline.)59 b(The)36 b(text)h(of)f(the)h(test,)630
+1821 y(after)30 b(an)m(y)g(comparison)g(op)s(erator,)g(extends)f(to)h
+(the)g(end)f(of)h(the)f(line;)i(unless)e(otherwise)630
+1930 y(noted,)i(no)f(c)m(haracters)i(are)f(required)e(to)i(isolate)i
+(it.)630 2091 y Fn(mode)288 b Fo(The)30 b Fn(mode=)e
+Fo(form)i(of)g(the)h Fn($if)e Fo(directiv)m(e)j(is)e(used)f(to)i(test)g
+(whether)e(Read-)1110 2201 y(line)44 b(is)f(in)g Fn(emacs)f
+Fo(or)h Fn(vi)g Fo(mo)s(de.)79 b(This)42 b(ma)m(y)i(b)s(e)e(used)h(in)g
+(conjunction)1110 2311 y(with)c(the)h(`)p Fn(set)29 b(keymap)p
+Fo(')38 b(command,)k(for)d(instance,)j(to)e(set)g(bindings)e(in)1110
+2420 y(the)32 b Fn(emacs-standard)c Fo(and)j Fn(emacs-ctlx)d
+Fo(k)m(eymaps)k(only)g(if)g(Readline)g(is)1110 2530 y(starting)f(out)g
+(in)f Fn(emacs)f Fo(mo)s(de.)630 2691 y Fn(term)288 b
+Fo(The)26 b Fn(term=)g Fo(form)g(ma)m(y)i(b)s(e)e(used)g(to)i(include)f
+(terminal-sp)s(eci\014c)g(k)m(ey)h(bind-)1110 2800 y(ings,)38
+b(p)s(erhaps)c(to)j(bind)e(the)h(k)m(ey)h(sequences)f(output)g(b)m(y)g
+(the)g(terminal's)1110 2910 y(function)24 b(k)m(eys.)39
+b(The)23 b(w)m(ord)h(on)f(the)i(righ)m(t)f(side)g(of)g(the)g(`)p
+Fn(=)p Fo(')g(is)g(tested)h(against)1110 3020 y(b)s(oth)k(the)h(full)g
+(name)g(of)g(the)g(terminal)h(and)e(the)i(p)s(ortion)e(of)h(the)g
+(terminal)1110 3129 y(name)k(b)s(efore)f(the)g(\014rst)g(`)p
+Fn(-)p Fo('.)50 b(This)33 b(allo)m(ws)i Fn(sun)e Fo(to)h(matc)m(h)g(b)s
+(oth)f Fn(sun)g Fo(and)1110 3239 y Fn(sun-cmd)p Fo(,)c(for)h(instance.)
+630 3400 y Fn(version)144 b Fo(The)44 b Fn(version)f
+Fo(test)i(ma)m(y)h(b)s(e)e(used)f(to)j(p)s(erform)d(comparisons)i
+(against)1110 3509 y(sp)s(eci\014c)c(Readline)i(v)m(ersions.)74
+b(The)42 b Fn(version)d Fo(expands)i(to)h(the)g(curren)m(t)1110
+3619 y(Readline)25 b(v)m(ersion.)39 b(The)23 b(set)h(of)g(comparison)h
+(op)s(erators)f(includes)f(`)p Fn(=)p Fo(')h(\(and)1110
+3729 y(`)p Fn(==)p Fo('\),)33 b(`)p Fn(!=)p Fo(',)f(`)p
+Fn(<=)p Fo(',)h(`)p Fn(>=)p Fo(',)f(`)p Fn(<)p Fo(',)h(and)e(`)p
+Fn(>)p Fo('.)46 b(The)31 b(v)m(ersion)i(n)m(um)m(b)s(er)d(supplied)h
+(on)1110 3838 y(the)j(righ)m(t)h(side)f(of)g(the)g(op)s(erator)g
+(consists)h(of)f(a)g(ma)5 b(jor)35 b(v)m(ersion)f(n)m(um)m(b)s(er,)1110
+3948 y(an)45 b(optional)i(decimal)f(p)s(oin)m(t,)k(and)44
+b(an)i(optional)g(minor)f(v)m(ersion)h(\(e.g.,)1110 4057
+y(`)p Fn(7.1)p Fo('\).)40 b(If)27 b(the)h(minor)f(v)m(ersion)h(is)g
+(omitted,)h(it)f(is)g(assumed)f(to)h(b)s(e)f(`)p Fn(0)p
+Fo('.)40 b(The)1110 4167 y(op)s(erator)34 b(ma)m(y)g(b)s(e)f(separated)
+g(from)g(the)h(string)f Fn(version)f Fo(and)h(from)g(the)1110
+4276 y(v)m(ersion)39 b(n)m(um)m(b)s(er)f(argumen)m(t)h(b)m(y)f
+(whitespace.)67 b(The)38 b(follo)m(wing)i(example)1110
+4386 y(sets)31 b(a)g(v)-5 b(ariable)31 b(if)f(the)h(Readline)g(v)m
+(ersion)f(b)s(eing)g(used)g(is)g(7.0)i(or)e(new)m(er:)1350
+4521 y Fn($if)47 b(version)f(>=)h(7.0)1350 4631 y(set)g
+(show-mode-in-prompt)42 b(on)1350 4741 y($endif)630 4902
+y(application)1110 5011 y Fo(The)21 b Fe(application)j
+Fo(construct)e(is)g(used)f(to)i(include)f(application-sp)s(eci\014c)h
+(set-)1110 5121 y(tings.)39 b(Eac)m(h)26 b(program)e(using)g(the)h
+(Readline)g(library)g(sets)g(the)g Fe(application)1110
+5230 y(name)p Fo(,)g(and)e(y)m(ou)g(can)h(test)g(for)f(a)g(particular)h
+(v)-5 b(alue.)39 b(This)22 b(could)h(b)s(e)g(used)f(to)1110
+5340 y(bind)32 b(k)m(ey)h(sequences)g(to)h(functions)e(useful)g(for)h
+(a)g(sp)s(eci\014c)f(program.)48 b(F)-8 b(or)p eop end
+%%Page: 14 17
+TeXDict begin 14 16 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(14)1110 299 y(instance,)35
+b(the)e(follo)m(wing)h(command)f(adds)f(a)i(k)m(ey)f(sequence)h(that)f
+(quotes)1110 408 y(the)e(curren)m(t)f(or)g(previous)g(w)m(ord)g(in)g
+(Bash:)1350 543 y Fn($if)47 b(Bash)1350 653 y(#)g(Quote)g(the)g
+(current)f(or)h(previous)e(word)1350 762 y("\\C-xq":)h
+("\\eb\\"\\ef\\"")1350 872 y($endif)630 1031 y(variable)96
+b Fo(The)33 b Fe(v)-5 b(ariable)39 b Fo(construct)33
+b(pro)m(vides)g(simple)g(equalit)m(y)i(tests)e(for)g(Readline)1110
+1141 y(v)-5 b(ariables)32 b(and)f(v)-5 b(alues.)45 b(The)32
+b(p)s(ermitted)f(comparison)h(op)s(erators)f(are)i(`)p
+Fn(=)p Fo(',)1110 1250 y(`)p Fn(==)p Fo(',)49 b(and)44
+b(`)p Fn(!=)p Fo('.)85 b(The)44 b(v)-5 b(ariable)46 b(name)f(m)m(ust)g
+(b)s(e)g(separated)g(from)g(the)1110 1360 y(comparison)25
+b(op)s(erator)g(b)m(y)g(whitespace;)j(the)d(op)s(erator)g(ma)m(y)g(b)s
+(e)f(separated)1110 1469 y(from)33 b(the)h(v)-5 b(alue)35
+b(on)f(the)g(righ)m(t)g(hand)f(side)h(b)m(y)f(whitespace.)52
+b(Both)35 b(string)1110 1579 y(and)i(b)s(o)s(olean)g(v)-5
+b(ariables)38 b(ma)m(y)h(b)s(e)d(tested.)63 b(Bo)s(olean)39
+b(v)-5 b(ariables)38 b(m)m(ust)g(b)s(e)1110 1689 y(tested)46
+b(against)g(the)f(v)-5 b(alues)46 b Fe(on)f Fo(and)f
+Fe(o\013)p Fo(.)85 b(The)45 b(follo)m(wing)h(example)g(is)1110
+1798 y(equiv)-5 b(alen)m(t)32 b(to)f(the)f Fn(mode=emacs)e
+Fo(test)j(describ)s(ed)f(ab)s(o)m(v)m(e:)1350 1933 y
+Fn($if)47 b(editing-mode)d(==)k(emacs)1350 2042 y(set)f
+(show-mode-in-prompt)42 b(on)1350 2152 y($endif)150 2311
+y($endif)192 b Fo(This)29 b(command,)i(as)f(seen)h(in)f(the)g(previous)
+g(example,)h(terminates)g(an)g Fn($if)e Fo(command.)150
+2471 y Fn($else)240 b Fo(Commands)29 b(in)h(this)h(branc)m(h)e(of)i
+(the)f Fn($if)g Fo(directiv)m(e)i(are)f(executed)g(if)f(the)h(test)g
+(fails.)150 2630 y Fn($include)96 b Fo(This)43 b(directiv)m(e)i(tak)m
+(es)g(a)e(single)i(\014lename)e(as)h(an)f(argumen)m(t)h(and)f(reads)g
+(commands)630 2740 y(and)38 b(bindings)f(from)h(that)i(\014le.)65
+b(F)-8 b(or)39 b(example,)j(the)d(follo)m(wing)h(directiv)m(e)g(reads)e
+(from)630 2849 y Fn(/etc/inputrc)p Fo(:)870 2984 y Fn($include)46
+b(/etc/inputrc)150 3183 y Fd(1.3.3)63 b(Sample)41 b(Init)g(File)150
+3330 y Fo(Here)27 b(is)f(an)h(example)g(of)f(an)h Fe(inputrc)k
+Fo(\014le.)39 b(This)26 b(illustrates)h(k)m(ey)h(binding,)e(v)-5
+b(ariable)27 b(assignmen)m(t,)i(and)150 3440 y(conditional)j(syn)m
+(tax.)p eop end
+%%Page: 15 18
+TeXDict begin 15 17 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(15)390 408 y Fn(#)47
+b(This)g(file)g(controls)e(the)i(behaviour)e(of)j(line)e(input)h
+(editing)e(for)390 518 y(#)i(programs)f(that)h(use)g(the)f(GNU)h
+(Readline)f(library.)93 b(Existing)390 628 y(#)47 b(programs)f(include)
+g(FTP,)g(Bash,)h(and)g(GDB.)390 737 y(#)390 847 y(#)g(You)g(can)g
+(re-read)f(the)h(inputrc)f(file)g(with)h(C-x)g(C-r.)390
+956 y(#)g(Lines)g(beginning)e(with)i('#')g(are)g(comments.)390
+1066 y(#)390 1176 y(#)g(First,)g(include)e(any)i(system-wide)e
+(bindings)h(and)g(variable)390 1285 y(#)h(assignments)e(from)i
+(/etc/Inputrc)390 1395 y($include)f(/etc/Inputrc)390
+1614 y(#)390 1724 y(#)h(Set)g(various)f(bindings)g(for)h(emacs)f(mode.)
+390 1943 y(set)h(editing-mode)d(emacs)390 2162 y($if)j(mode=emacs)390
+2381 y(Meta-Control-h:)91 b(backward-kill-word)43 b(Text)k(after)f(the)
+h(function)f(name)g(is)h(ignored)p 3970 2401 42 76 v
+390 2600 a(#)390 2710 y(#)g(Arrow)g(keys)f(in)i(keypad)e(mode)390
+2819 y(#)390 2929 y(#"\\M-OD":)379 b(backward-char)390
+3039 y(#"\\M-OC":)g(forward-char)390 3148 y(#"\\M-OA":)g
+(previous-history)390 3258 y(#"\\M-OB":)g(next-history)390
+3367 y(#)390 3477 y(#)47 b(Arrow)g(keys)f(in)i(ANSI)e(mode)390
+3587 y(#)390 3696 y("\\M-[D":)380 b(backward-char)390
+3806 y("\\M-[C":)g(forward-char)390 3915 y("\\M-[A":)g
+(previous-history)390 4025 y("\\M-[B":)g(next-history)390
+4134 y(#)390 4244 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(keypad)f(mode)
+390 4354 y(#)390 4463 y(#"\\M-\\C-OD":)331 b(backward-char)390
+4573 y(#"\\M-\\C-OC":)g(forward-char)390 4682 y(#"\\M-\\C-OA":)g
+(previous-history)390 4792 y(#"\\M-\\C-OB":)g(next-history)390
+4902 y(#)390 5011 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(ANSI)g(mode)
+390 5121 y(#)390 5230 y(#"\\M-\\C-[D":)331 b(backward-char)390
+5340 y(#"\\M-\\C-[C":)g(forward-char)p eop end
+%%Page: 16 19
+TeXDict begin 16 18 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(16)390 299 y Fn(#"\\M-\\C-[A":)331
+b(previous-history)390 408 y(#"\\M-\\C-[B":)g(next-history)390
+628 y(C-q:)47 b(quoted-insert)390 847 y($endif)390 1066
+y(#)g(An)h(old-style)d(binding.)93 b(This)47 b(happens)f(to)h(be)g(the)
+g(default.)390 1176 y(TAB:)g(complete)390 1395 y(#)g(Macros)g(that)f
+(are)h(convenient)e(for)i(shell)f(interaction)390 1504
+y($if)h(Bash)390 1614 y(#)g(edit)g(the)g(path)390 1724
+y("\\C-xp":)f("PATH=${PATH}\\e\\C-e\\C-a)o(\\ef)o(\\C-f)o(")390
+1833 y(#)h(prepare)f(to)h(type)g(a)h(quoted)e(word)g(--)390
+1943 y(#)h(insert)g(open)f(and)h(close)f(double)h(quotes)390
+2052 y(#)g(and)g(move)g(to)g(just)g(after)f(the)h(open)g(quote)390
+2162 y("\\C-x\\"":)e("\\"\\"\\C-b")390 2271 y(#)i(insert)g(a)g
+(backslash)e(\(testing)h(backslash)f(escapes)390 2381
+y(#)i(in)h(sequences)d(and)i(macros\))390 2491 y("\\C-x\\\\":)e("\\\\")
+390 2600 y(#)i(Quote)g(the)g(current)f(or)h(previous)e(word)390
+2710 y("\\C-xq":)h("\\eb\\"\\ef\\"")390 2819 y(#)h(Add)g(a)h(binding)e
+(to)h(refresh)f(the)h(line,)f(which)g(is)h(unbound)390
+2929 y("\\C-xr":)f(redraw-current-line)390 3039 y(#)h(Edit)g(variable)f
+(on)h(current)f(line.)390 3148 y("\\M-\\C-v":)f
+("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-)o(a\\C-)o(y=")390 3258
+y($endif)390 3477 y(#)i(use)g(a)h(visible)e(bell)g(if)h(one)g(is)h
+(available)390 3587 y(set)f(bell-style)e(visible)390
+3806 y(#)i(don't)g(strip)f(characters)f(to)i(7)h(bits)e(when)h(reading)
+390 3915 y(set)g(input-meta)e(on)390 4134 y(#)i(allow)g(iso-latin1)e
+(characters)g(to)i(be)g(inserted)f(rather)390 4244 y(#)h(than)g
+(converted)e(to)j(prefix-meta)c(sequences)390 4354 y(set)j
+(convert-meta)d(off)390 4573 y(#)j(display)f(characters)f(with)i(the)g
+(eighth)f(bit)h(set)g(directly)390 4682 y(#)g(rather)g(than)f(as)h
+(meta-prefixed)e(characters)390 4792 y(set)i(output-meta)e(on)390
+5011 y(#)i(if)h(there)e(are)h(150)g(or)g(more)g(possible)e(completions)
+g(for)i(a)g(word,)390 5121 y(#)g(ask)g(whether)f(or)h(not)g(the)g(user)
+g(wants)f(to)h(see)g(all)g(of)g(them)390 5230 y(set)g
+(completion-query-items)42 b(150)p eop end
+%%Page: 17 20
+TeXDict begin 17 19 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(17)390 299 y Fn(#)47
+b(For)g(FTP)390 408 y($if)g(Ftp)390 518 y("\\C-xg":)f("get)g(\\M-?")390
+628 y("\\C-xt":)g("put)g(\\M-?")390 737 y("\\M-.":)g(yank-last-arg)390
+847 y($endif)150 1089 y Fm(1.4)68 b(Bindable)45 b(Readline)i(Commands)
+150 1248 y Fo(This)25 b(section)i(describ)s(es)d(Readline)j(commands)e
+(that)h(ma)m(y)g(b)s(e)f(b)s(ound)f(to)i(k)m(ey)h(sequences.)39
+b(Command)150 1358 y(names)30 b(without)h(an)f(accompan)m(ying)i(k)m
+(ey)f(sequence)g(are)g(un)m(b)s(ound)c(b)m(y)k(default.)275
+1493 y(In)25 b(the)h(follo)m(wing)i(descriptions,)f Fe(p)s(oin)m(t)h
+Fo(refers)e(to)h(the)f(curren)m(t)g(cursor)g(p)s(osition,)h(and)f
+Fe(mark)31 b Fo(refers)150 1603 y(to)40 b(a)f(cursor)f(p)s(osition)h
+(sa)m(v)m(ed)h(b)m(y)f(the)g Fn(set-mark)d Fo(command.)66
+b(The)38 b(text)i(b)s(et)m(w)m(een)g(the)f(p)s(oin)m(t)g(and)150
+1713 y(mark)30 b(is)h(referred)e(to)i(as)g(the)f Fe(region)p
+Fo(.)150 1913 y Fd(1.4.1)63 b(Commands)42 b(F)-10 b(or)41
+b(Mo)m(ving)150 2085 y Fn(beginning-of-line)26 b(\(C-a\))630
+2195 y Fo(Mo)m(v)m(e)32 b(to)g(the)e(start)h(of)g(the)f(curren)m(t)g
+(line.)150 2355 y Fn(end-of-line)d(\(C-e\))630 2464 y
+Fo(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(line.)150
+2625 y Fn(forward-char)c(\(C-f\))630 2734 y Fo(Mo)m(v)m(e)32
+b(forw)m(ard)e(a)h(c)m(haracter.)150 2895 y Fn(backward-char)c(\(C-b\))
+630 3004 y Fo(Mo)m(v)m(e)32 b(bac)m(k)g(a)e(c)m(haracter.)150
+3165 y Fn(forward-word)d(\(M-f\))630 3274 y Fo(Mo)m(v)m(e)32
+b(forw)m(ard)e(to)h(the)f(end)g(of)g(the)h(next)f(w)m(ord.)41
+b(W)-8 b(ords)30 b(are)h(comp)s(osed)f(of)g(letters)i(and)630
+3384 y(digits.)150 3544 y Fn(backward-word)27 b(\(M-b\))630
+3654 y Fo(Mo)m(v)m(e)36 b(bac)m(k)e(to)g(the)g(start)g(of)g(the)g
+(curren)m(t)f(or)g(previous)g(w)m(ord.)50 b(W)-8 b(ords)34
+b(are)g(comp)s(osed)630 3763 y(of)d(letters)g(and)f(digits.)150
+3923 y Fn(previous-screen-line)25 b(\(\))630 4033 y Fo(A)m(ttempt)41
+b(to)g(mo)m(v)m(e)h(p)s(oin)m(t)e(to)h(the)f(same)h(ph)m(ysical)g
+(screen)f(column)g(on)g(the)g(previous)630 4143 y(ph)m(ysical)26
+b(screen)f(line.)39 b(This)24 b(will)i(not)f(ha)m(v)m(e)h(the)f
+(desired)g(e\013ect)h(if)f(the)h(curren)m(t)e(Readline)630
+4252 y(line)k(do)s(es)f(not)g(tak)m(e)i(up)d(more)i(than)f(one)g(ph)m
+(ysical)h(line)g(or)f(if)g(p)s(oin)m(t)h(is)f(not)h(greater)g(than)630
+4362 y(the)j(length)f(of)h(the)f(prompt)g(plus)f(the)i(screen)f(width.)
+150 4522 y Fn(next-screen-line)c(\(\))630 4632 y Fo(A)m(ttempt)g(to)f
+(mo)m(v)m(e)i(p)s(oin)m(t)d(to)i(the)e(same)i(ph)m(ysical)f(screen)g
+(column)f(on)h(the)f(next)h(ph)m(ysical)630 4741 y(screen)e(line.)39
+b(This)23 b(will)g(not)h(ha)m(v)m(e)h(the)e(desired)g(e\013ect)i(if)e
+(the)g(curren)m(t)h(Readline)g(line)f(do)s(es)630 4851
+y(not)k(tak)m(e)i(up)e(more)g(than)g(one)g(ph)m(ysical)h(line)g(or)f
+(if)g(the)h(length)f(of)h(the)f(curren)m(t)g(Readline)630
+4960 y(line)k(is)f(not)h(greater)g(than)f(the)h(length)g(of)f(the)h
+(prompt)e(plus)h(the)g(screen)h(width.)150 5121 y Fn(clear-display)c
+(\(M-C-l\))630 5230 y Fo(Clear)33 b(the)g(screen)g(and,)h(if)e(p)s
+(ossible,)i(the)f(terminal's)g(scrollbac)m(k)i(bu\013er,)e(then)f
+(redra)m(w)630 5340 y(the)f(curren)m(t)f(line,)h(lea)m(ving)h(the)e
+(curren)m(t)h(line)f(at)h(the)g(top)g(of)f(the)h(screen.)p
+eop end
+%%Page: 18 21
+TeXDict begin 18 20 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(18)150 299 y Fn(clear-screen)27
+b(\(C-l\))630 408 y Fo(Clear)35 b(the)f(screen,)i(then)e(redra)m(w)g
+(the)h(curren)m(t)f(line,)i(lea)m(ving)g(the)f(curren)m(t)f(line)h(at)g
+(the)630 518 y(top)c(of)f(the)h(screen.)150 665 y Fn
+(redraw-current-line)25 b(\(\))630 775 y Fo(Refresh)30
+b(the)g(curren)m(t)h(line.)41 b(By)30 b(default,)h(this)f(is)h(un)m(b)s
+(ound.)150 962 y Fd(1.4.2)63 b(Commands)42 b(F)-10 b(or)41
+b(Manipulating)h(The)f(History)150 1128 y Fn(accept-line)27
+b(\(Newline)h(or)i(Return\))630 1237 y Fo(Accept)36 b(the)g(line)f
+(regardless)h(of)f(where)g(the)g(cursor)g(is.)55 b(If)34
+b(this)h(line)h(is)f(non-empt)m(y)-8 b(,)37 b(it)630
+1347 y(ma)m(y)32 b(b)s(e)g(added)f(to)h(the)g(history)g(list)h(for)e
+(future)g(recall)j(with)d Fn(add_history\(\))p Fo(.)42
+b(If)31 b(this)630 1457 y(line)g(is)f(a)h(mo)s(di\014ed)e(history)h
+(line,)h(the)g(history)f(line)h(is)f(restored)h(to)g(its)g(original)g
+(state.)150 1604 y Fn(previous-history)26 b(\(C-p\))630
+1713 y Fo(Mo)m(v)m(e)32 b(`bac)m(k')g(through)e(the)g(history)h(list,)g
+(fetc)m(hing)g(the)g(previous)f(command.)150 1861 y Fn(next-history)d
+(\(C-n\))630 1970 y Fo(Mo)m(v)m(e)32 b(`forw)m(ard')f(through)e(the)i
+(history)f(list,)i(fetc)m(hing)f(the)g(next)f(command.)150
+2117 y Fn(beginning-of-history)25 b(\(M-<\))630 2227
+y Fo(Mo)m(v)m(e)32 b(to)g(the)e(\014rst)g(line)g(in)h(the)f(history)-8
+b(.)150 2374 y Fn(end-of-history)26 b(\(M->\))630 2484
+y Fo(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(input)e(history)-8
+b(,)31 b(i.e.,)h(the)f(line)f(curren)m(tly)h(b)s(eing)f(en)m(tered.)150
+2631 y Fn(reverse-search-history)24 b(\(C-r\))630 2741
+y Fo(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g(the)f(curren)m(t)g
+(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g(his-)630
+2850 y(tory)26 b(as)h(necessary)-8 b(.)40 b(This)25 b(is)i(an)f
+(incremen)m(tal)h(searc)m(h.)40 b(This)25 b(command)h(sets)h(the)f
+(region)630 2960 y(to)31 b(the)g(matc)m(hed)g(text)g(and)f(activ)-5
+b(ates)33 b(the)d(mark.)150 3107 y Fn(forward-search-history)24
+b(\(C-s\))630 3217 y Fo(Searc)m(h)44 b(forw)m(ard)f(starting)h(at)h
+(the)e(curren)m(t)h(line)g(and)f(mo)m(ving)h(`do)m(wn')g(through)f(the)
+630 3326 y(history)38 b(as)g(necessary)-8 b(.)65 b(This)38
+b(is)g(an)g(incremen)m(tal)h(searc)m(h.)65 b(This)37
+b(command)h(sets)h(the)630 3436 y(region)31 b(to)g(the)g(matc)m(hed)g
+(text)g(and)f(activ)-5 b(ates)33 b(the)d(mark.)150 3583
+y Fn(non-incremental-reverse-)o(sear)o(ch-h)o(ist)o(ory)24
+b(\(M-p\))630 3693 y Fo(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g
+(the)f(curren)m(t)g(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g
+(his-)630 3802 y(tory)36 b(as)g(necessary)h(using)e(a)i(non-incremen)m
+(tal)g(searc)m(h)f(for)g(a)g(string)g(supplied)f(b)m(y)h(the)630
+3912 y(user.)k(The)30 b(searc)m(h)h(string)f(ma)m(y)h(matc)m(h)g(an)m
+(ywhere)g(in)f(a)h(history)f(line.)150 4059 y Fn
+(non-incremental-forward-)o(sear)o(ch-h)o(ist)o(ory)24
+b(\(M-n\))630 4169 y Fo(Searc)m(h)44 b(forw)m(ard)f(starting)h(at)h
+(the)e(curren)m(t)h(line)g(and)f(mo)m(ving)h(`do)m(wn')g(through)f(the)
+630 4278 y(history)27 b(as)f(necessary)i(using)e(a)h(non-incremen)m
+(tal)g(searc)m(h)h(for)e(a)h(string)g(supplied)e(b)m(y)i(the)630
+4388 y(user.)40 b(The)30 b(searc)m(h)h(string)f(ma)m(y)h(matc)m(h)g(an)
+m(ywhere)g(in)f(a)h(history)f(line.)150 4535 y Fn
+(history-search-forward)24 b(\(\))630 4645 y Fo(Searc)m(h)42
+b(forw)m(ard)f(through)f(the)i(history)f(for)g(the)h(string)f(of)h(c)m
+(haracters)h(b)s(et)m(w)m(een)f(the)630 4754 y(start)36
+b(of)h(the)f(curren)m(t)f(line)i(and)e(the)h(p)s(oin)m(t.)58
+b(The)35 b(searc)m(h)i(string)e(m)m(ust)h(matc)m(h)h(at)g(the)630
+4864 y(b)s(eginning)32 b(of)g(a)h(history)g(line.)47
+b(This)32 b(is)h(a)f(non-incremen)m(tal)i(searc)m(h.)48
+b(By)33 b(default,)g(this)630 4974 y(command)d(is)h(un)m(b)s(ound.)150
+5121 y Fn(history-search-backward)24 b(\(\))630 5230
+y Fo(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h(history)g(for)g
+(the)f(string)h(of)g(c)m(haracters)h(b)s(et)m(w)m(een)g(the)630
+5340 y(start)g(of)h(the)f(curren)m(t)f(line)i(and)e(the)h(p)s(oin)m(t.)
+58 b(The)35 b(searc)m(h)i(string)e(m)m(ust)h(matc)m(h)h(at)g(the)p
+eop end
+%%Page: 19 22
+TeXDict begin 19 21 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(19)630 299 y(b)s(eginning)32
+b(of)g(a)h(history)g(line.)47 b(This)32 b(is)h(a)f(non-incremen)m(tal)i
+(searc)m(h.)48 b(By)33 b(default,)g(this)630 408 y(command)d(is)h(un)m
+(b)s(ound.)150 566 y Fn(history-substring-search)o(-for)o(ward)24
+b(\(\))630 676 y Fo(Searc)m(h)42 b(forw)m(ard)f(through)f(the)i
+(history)f(for)g(the)h(string)f(of)h(c)m(haracters)h(b)s(et)m(w)m(een)f
+(the)630 785 y(start)29 b(of)g(the)g(curren)m(t)g(line)g(and)f(the)h(p)
+s(oin)m(t.)40 b(The)29 b(searc)m(h)g(string)g(ma)m(y)g(matc)m(h)h(an)m
+(ywhere)630 895 y(in)i(a)h(history)g(line.)47 b(This)32
+b(is)g(a)h(non-incremen)m(tal)h(searc)m(h.)47 b(By)33
+b(default,)h(this)e(command)630 1005 y(is)e(un)m(b)s(ound.)150
+1162 y Fn(history-substring-search)o(-bac)o(kwar)o(d)24
+b(\(\))630 1272 y Fo(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h
+(history)g(for)g(the)f(string)h(of)g(c)m(haracters)h(b)s(et)m(w)m(een)g
+(the)630 1381 y(start)29 b(of)g(the)g(curren)m(t)g(line)g(and)f(the)h
+(p)s(oin)m(t.)40 b(The)29 b(searc)m(h)g(string)g(ma)m(y)g(matc)m(h)h
+(an)m(ywhere)630 1491 y(in)i(a)h(history)g(line.)47 b(This)32
+b(is)g(a)h(non-incremen)m(tal)h(searc)m(h.)47 b(By)33
+b(default,)h(this)e(command)630 1601 y(is)e(un)m(b)s(ound.)150
+1758 y Fn(yank-nth-arg)d(\(M-C-y\))630 1868 y Fo(Insert)37
+b(the)g(\014rst)f(argumen)m(t)i(to)f(the)h(previous)e(command)h
+(\(usually)g(the)g(second)g(w)m(ord)630 1978 y(on)32
+b(the)g(previous)f(line\))i(at)f(p)s(oin)m(t.)46 b(With)32
+b(an)g(argumen)m(t)g Fe(n)p Fo(,)g(insert)g(the)g Fe(n)p
+Fo(th)f(w)m(ord)g(from)630 2087 y(the)k(previous)f(command)h(\(the)g(w)
+m(ords)g(in)f(the)h(previous)g(command)f(b)s(egin)h(with)f(w)m(ord)630
+2197 y(0\).)69 b(A)40 b(negativ)m(e)h(argumen)m(t)f(inserts)g(the)f
+Fe(n)p Fo(th)g(w)m(ord)g(from)g(the)h(end)f(of)h(the)f(previous)630
+2306 y(command.)48 b(Once)33 b(the)g(argumen)m(t)h Fe(n)e
+Fo(is)h(computed,)h(the)f(argumen)m(t)g(is)g(extracted)i(as)e(if)630
+2416 y(the)e(`)p Fn(!)p Fg(n)p Fo(')f(history)g(expansion)g(had)g(b)s
+(een)g(sp)s(eci\014ed.)150 2574 y Fn(yank-last-arg)d(\(M-.)i(or)h
+(M-_\))630 2683 y Fo(Insert)k(last)i(argumen)m(t)g(to)g(the)f(previous)
+f(command)h(\(the)h(last)f(w)m(ord)g(of)g(the)g(previous)630
+2793 y(history)e(en)m(try\).)51 b(With)34 b(a)g(n)m(umeric)g(argumen)m
+(t,)h(b)s(eha)m(v)m(e)f(exactly)h(lik)m(e)g Fn(yank-nth-arg)p
+Fo(.)630 2902 y(Successiv)m(e)26 b(calls)g(to)f Fn(yank-last-arg)c
+Fo(mo)m(v)m(e)27 b(bac)m(k)e(through)f(the)h(history)g(list,)i
+(inserting)630 3012 y(the)c(last)g(w)m(ord)f(\(or)h(the)g(w)m(ord)f(sp)
+s(eci\014ed)g(b)m(y)g(the)h(argumen)m(t)g(to)g(the)g(\014rst)f(call\))i
+(of)f(eac)m(h)h(line)630 3122 y(in)36 b(turn.)58 b(An)m(y)36
+b(n)m(umeric)h(argumen)m(t)f(supplied)g(to)h(these)g(successiv)m(e)g
+(calls)h(determines)630 3231 y(the)d(direction)g(to)h(mo)m(v)m(e)g
+(through)e(the)h(history)-8 b(.)54 b(A)35 b(negativ)m(e)i(argumen)m(t)e
+(switc)m(hes)h(the)630 3341 y(direction)23 b(through)g(the)g(history)f
+(\(bac)m(k)i(or)f(forw)m(ard\).)38 b(The)22 b(history)h(expansion)g
+(facilities)630 3450 y(are)28 b(used)f(to)h(extract)h(the)f(last)g
+(argumen)m(t,)h(as)e(if)h(the)g(`)p Fn(!$)p Fo(')f(history)g(expansion)
+h(had)f(b)s(een)630 3560 y(sp)s(eci\014ed.)150 3718 y
+Fn(operate-and-get-next)e(\(C-o\))630 3827 y Fo(Accept)30
+b(the)g(curren)m(t)e(line)i(for)f(return)f(to)h(the)h(calling)g
+(application)h(as)e(if)g(a)h(newline)f(had)630 3937 y(b)s(een)22
+b(en)m(tered,)k(and)d(fetc)m(h)h(the)f(next)g(line)h(relativ)m(e)h(to)f
+(the)f(curren)m(t)g(line)h(from)f(the)g(history)630 4046
+y(for)31 b(editing.)43 b(A)31 b(n)m(umeric)f(argumen)m(t,)i(if)f
+(supplied,)f(sp)s(eci\014es)h(the)g(history)f(en)m(try)i(to)f(use)630
+4156 y(instead)g(of)f(the)h(curren)m(t)f(line.)150 4314
+y Fn(fetch-history)d(\(\))630 4423 y Fo(With)e(a)f(n)m(umeric)g
+(argumen)m(t,)i(fetc)m(h)f(that)g(en)m(try)f(from)g(the)g(history)g
+(list)h(and)e(mak)m(e)i(it)g(the)630 4533 y(curren)m(t)30
+b(line.)41 b(Without)30 b(an)g(argumen)m(t,)h(mo)m(v)m(e)g(bac)m(k)g
+(to)f(the)g(\014rst)f(en)m(try)h(in)g(the)g(history)630
+4643 y(list.)150 4840 y Fd(1.4.3)63 b(Commands)42 b(F)-10
+b(or)41 b(Changing)g(T)-10 b(ext)150 5011 y Fg(end-of-file)27
+b Fn(\(usually)h(C-d\))630 5121 y Fo(The)e(c)m(haracter)h(indicating)h
+(end-of-\014le)e(as)h(set,)g(for)f(example,)i(b)m(y)e
+Fn(stty)p Fo(.)39 b(If)25 b(this)h(c)m(harac-)630 5230
+y(ter)c(is)g(read)g(when)e(there)i(are)h(no)e(c)m(haracters)j(on)d(the)
+h(line,)i(and)d(p)s(oin)m(t)h(is)g(at)h(the)f(b)s(eginning)630
+5340 y(of)31 b(the)f(line,)h(Readline)g(in)m(terprets)g(it)g(as)f(the)h
+(end)f(of)g(input)f(and)h(returns)f Fh(eof)p Fo(.)p eop
+end
+%%Page: 20 23
+TeXDict begin 20 22 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(20)150 299 y Fn(delete-char)27
+b(\(C-d\))630 408 y Fo(Delete)35 b(the)f(c)m(haracter)h(at)f(p)s(oin)m
+(t.)49 b(If)33 b(this)g(function)g(is)g(b)s(ound)e(to)j(the)g(same)f(c)
+m(haracter)630 518 y(as)e(the)f(tt)m(y)i Fh(eof)d Fo(c)m(haracter,)j
+(as)f Fg(C-d)e Fo(commonly)i(is,)g(see)g(ab)s(o)m(v)m(e)h(for)e(the)g
+(e\013ects.)150 669 y Fn(backward-delete-char)25 b(\(Rubout\))630
+779 y Fo(Delete)32 b(the)f(c)m(haracter)g(b)s(ehind)e(the)h(cursor.)40
+b(A)30 b(n)m(umeric)g(argumen)m(t)h(means)f(to)h(kill)g(the)630
+889 y(c)m(haracters)h(instead)e(of)h(deleting)g(them.)150
+1040 y Fn(forward-backward-delete-)o(char)24 b(\(\))630
+1149 y Fo(Delete)40 b(the)f(c)m(haracter)h(under)c(the)j(cursor,)h
+(unless)d(the)i(cursor)e(is)h(at)h(the)g(end)e(of)i(the)630
+1259 y(line,)33 b(in)e(whic)m(h)g(case)i(the)f(c)m(haracter)h(b)s
+(ehind)d(the)i(cursor)f(is)g(deleted.)46 b(By)32 b(default,)g(this)630
+1369 y(is)e(not)h(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150
+1520 y Fn(quoted-insert)27 b(\(C-q)i(or)h(C-v\))630 1630
+y Fo(Add)j(the)i(next)f(c)m(haracter)i(t)m(yp)s(ed)e(to)h(the)f(line)h
+(v)m(erbatim.)53 b(This)33 b(is)i(ho)m(w)f(to)h(insert)f(k)m(ey)630
+1739 y(sequences)d(lik)m(e)g Fg(C-q)p Fo(,)f(for)g(example.)150
+1891 y Fn(tab-insert)e(\(M-TAB\))630 2000 y Fo(Insert)i(a)h(tab)f(c)m
+(haracter.)150 2151 y Fn(self-insert)d(\(a,)j(b,)g(A,)f(1,)h(!,)g(...)o
+(\))630 2261 y Fo(Insert)g(y)m(ourself.)150 2412 y Fn
+(bracketed-paste-begin)25 b(\(\))630 2522 y Fo(This)f(function)h(is)f
+(in)m(tended)h(to)h(b)s(e)e(b)s(ound)f(to)i(the)g Fn(")p
+Fo(brac)m(k)m(eted)h(paste)p Fn(")f Fo(escap)s(e)h(sequence)630
+2632 y(sen)m(t)38 b(b)m(y)f(some)h(terminals,)i(and)d(suc)m(h)g(a)h
+(binding)e(is)i(assigned)f(b)m(y)h(default.)62 b(It)38
+b(allo)m(ws)630 2741 y(Readline)33 b(to)g(insert)g(the)f(pasted)h(text)
+g(as)g(a)g(single)g(unit)f(without)h(treating)h(eac)m(h)f(c)m(har-)630
+2851 y(acter)40 b(as)f(if)g(it)g(had)f(b)s(een)g(read)h(from)f(the)h(k)
+m(eyb)s(oard.)66 b(The)39 b(c)m(haracters)h(are)f(inserted)630
+2960 y(as)44 b(if)g(eac)m(h)i(one)e(w)m(as)g(b)s(ound)e(to)j
+Fn(self-insert)c Fo(instead)j(of)h(executing)g(an)m(y)f(editing)630
+3070 y(commands.)630 3200 y(Brac)m(k)m(eted)38 b(paste)f(sets)f(the)h
+(region)f(\(the)h(c)m(haracters)g(b)s(et)m(w)m(een)g(p)s(oin)m(t)f(and)
+g(the)g(mark\))630 3310 y(to)j(the)g(inserted)f(text.)65
+b(It)39 b(uses)f(the)g(concept)h(of)g(an)f Ff(active)i(mark)10
+b Fo(:)57 b(when)38 b(the)g(mark)630 3420 y(is)d(activ)m(e,)k(Readline)
+c(redispla)m(y)h(uses)e(the)h(terminal's)h(standout)f(mo)s(de)f(to)i
+(denote)g(the)630 3529 y(region.)150 3680 y Fn(transpose-chars)26
+b(\(C-t\))630 3790 y Fo(Drag)33 b(the)f(c)m(haracter)h(b)s(efore)f(the)
+g(cursor)f(forw)m(ard)h(o)m(v)m(er)h(the)f(c)m(haracter)i(at)e(the)g
+(cursor,)630 3900 y(mo)m(ving)k(the)g(cursor)f(forw)m(ard)g(as)g(w)m
+(ell.)57 b(If)35 b(the)h(insertion)g(p)s(oin)m(t)f(is)g(at)i(the)e(end)
+g(of)h(the)630 4009 y(line,)24 b(then)e(this)g(transp)s(oses)f(the)h
+(last)h(t)m(w)m(o)g(c)m(haracters)g(of)f(the)h(line.)38
+b(Negativ)m(e)25 b(argumen)m(ts)630 4119 y(ha)m(v)m(e)32
+b(no)e(e\013ect.)150 4270 y Fn(transpose-words)c(\(M-t\))630
+4380 y Fo(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)g(past)g
+(the)h(w)m(ord)f(after)g(p)s(oin)m(t,)i(mo)m(ving)f(p)s(oin)m(t)f(past)
+g(that)630 4489 y(w)m(ord)c(as)h(w)m(ell.)41 b(If)27
+b(the)i(insertion)f(p)s(oin)m(t)h(is)f(at)h(the)g(end)e(of)i(the)f
+(line,)i(this)e(transp)s(oses)g(the)630 4599 y(last)j(t)m(w)m(o)h(w)m
+(ords)e(on)g(the)h(line.)150 4750 y Fn(upcase-word)c(\(M-u\))630
+4860 y Fo(Upp)s(ercase)32 b(the)g(curren)m(t)g(\(or)g(follo)m(wing\))i
+(w)m(ord.)45 b(With)32 b(a)g(negativ)m(e)j(argumen)m(t,)e(upp)s(er-)630
+4969 y(case)e(the)g(previous)f(w)m(ord,)g(but)g(do)g(not)h(mo)m(v)m(e)h
+(the)e(cursor.)150 5121 y Fn(downcase-word)d(\(M-l\))630
+5230 y Fo(Lo)m(w)m(ercase)c(the)f(curren)m(t)f(\(or)h(follo)m(wing\))i
+(w)m(ord.)37 b(With)22 b(a)g(negativ)m(e)i(argumen)m(t,)g(lo)m(w)m
+(ercase)630 5340 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f(mo)m
+(v)m(e)i(the)f(cursor.)p eop end
+%%Page: 21 24
+TeXDict begin 21 23 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(21)150 299 y Fn(capitalize-word)26
+b(\(M-c\))630 408 y Fo(Capitalize)d(the)f(curren)m(t)f(\(or)g(follo)m
+(wing\))i(w)m(ord.)38 b(With)21 b(a)h(negativ)m(e)h(argumen)m(t,)h
+(capitalize)630 518 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f
+(mo)m(v)m(e)i(the)f(cursor.)150 678 y Fn(overwrite-mode)26
+b(\(\))630 788 y Fo(T)-8 b(oggle)35 b(o)m(v)m(erwrite)g(mo)s(de.)48
+b(With)33 b(an)g(explicit)h(p)s(ositiv)m(e)g(n)m(umeric)f(argumen)m(t,)
+h(switc)m(hes)630 897 y(to)22 b(o)m(v)m(erwrite)i(mo)s(de.)37
+b(With)22 b(an)g(explicit)h(non-p)s(ositiv)m(e)f(n)m(umeric)g(argumen)m
+(t,)i(switc)m(hes)e(to)630 1007 y(insert)30 b(mo)s(de.)41
+b(This)30 b(command)h(a\013ects)h(only)e Fn(emacs)f Fo(mo)s(de;)i
+Fn(vi)f Fo(mo)s(de)g(do)s(es)g(o)m(v)m(erwrite)630 1116
+y(di\013eren)m(tly)-8 b(.)42 b(Eac)m(h)31 b(call)h(to)f
+Fn(readline\(\))c Fo(starts)k(in)f(insert)g(mo)s(de.)630
+1251 y(In)52 b(o)m(v)m(erwrite)h(mo)s(de,)58 b(c)m(haracters)c(b)s
+(ound)c(to)j Fn(self-insert)c Fo(replace)k(the)g(text)g(at)630
+1361 y(p)s(oin)m(t)59 b(rather)f(than)h(pushing)e(the)i(text)g(to)h
+(the)f(righ)m(t.)126 b(Characters)59 b(b)s(ound)d(to)630
+1470 y Fn(backward-delete-char)25 b Fo(replace)31 b(the)g(c)m(haracter)
+h(b)s(efore)e(p)s(oin)m(t)g(with)g(a)h(space.)630 1605
+y(By)g(default,)f(this)h(command)f(is)g(un)m(b)s(ound.)150
+1805 y Fd(1.4.4)63 b(Killing)42 b(And)e(Y)-10 b(anking)150
+1977 y Fn(kill-line)28 b(\(C-k\))630 2087 y Fo(Kill)k(the)f(text)i
+(from)d(p)s(oin)m(t)i(to)g(the)f(end)g(of)g(the)h(line.)44
+b(With)31 b(a)h(negativ)m(e)i(n)m(umeric)d(argu-)630
+2197 y(men)m(t,)g(kill)g(bac)m(kw)m(ard)g(from)f(the)g(cursor)g(to)h
+(the)g(b)s(eginning)e(of)i(the)g(curren)m(t)f(line.)150
+2357 y Fn(backward-kill-line)25 b(\(C-x)30 b(Rubout\))630
+2466 y Fo(Kill)40 b(bac)m(kw)m(ard)h(from)e(the)h(cursor)g(to)g(the)g
+(b)s(eginning)g(of)g(the)g(curren)m(t)f(line.)70 b(With)41
+b(a)630 2576 y(negativ)m(e)47 b(n)m(umeric)e(argumen)m(t,)50
+b(kill)c(forw)m(ard)e(from)h(the)g(cursor)g(to)h(the)f(end)f(of)i(the)
+630 2685 y(curren)m(t)30 b(line.)150 2845 y Fn(unix-line-discard)c
+(\(C-u\))630 2955 y Fo(Kill)31 b(bac)m(kw)m(ard)g(from)e(the)i(cursor)f
+(to)h(the)f(b)s(eginning)g(of)h(the)f(curren)m(t)g(line.)150
+3115 y Fn(kill-whole-line)c(\(\))630 3225 y Fo(Kill)37
+b(all)g(c)m(haracters)h(on)f(the)f(curren)m(t)h(line,)h(no)f(matter)g
+(where)f(p)s(oin)m(t)h(is.)59 b(By)36 b(default,)630
+3334 y(this)30 b(is)h(un)m(b)s(ound.)150 3494 y Fn(kill-word)d(\(M-d\))
+630 3604 y Fo(Kill)i(from)f(p)s(oin)m(t)g(to)h(the)g(end)e(of)i(the)f
+(curren)m(t)h(w)m(ord,)f(or)g(if)h(b)s(et)m(w)m(een)g(w)m(ords,)f(to)h
+(the)g(end)630 3713 y(of)h(the)f(next)h(w)m(ord.)40 b(W)-8
+b(ord)31 b(b)s(oundaries)e(are)h(the)h(same)g(as)f Fn(forward-word)p
+Fo(.)150 3874 y Fn(backward-kill-word)25 b(\(M-DEL\))630
+3983 y Fo(Kill)k(the)g(w)m(ord)g(b)s(ehind)e(p)s(oin)m(t.)40
+b(W)-8 b(ord)29 b(b)s(oundaries)f(are)h(the)g(same)g(as)g
+Fn(backward-word)p Fo(.)150 4143 y Fn(shell-transpose-words)c
+(\(M-C-t\))630 4253 y Fo(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin)
+m(t)g(past)g(the)h(w)m(ord)f(after)g(p)s(oin)m(t,)i(mo)m(ving)f(p)s
+(oin)m(t)f(past)g(that)630 4362 y(w)m(ord)c(as)h(w)m(ell.)41
+b(If)27 b(the)i(insertion)f(p)s(oin)m(t)h(is)f(at)h(the)g(end)e(of)i
+(the)f(line,)i(this)e(transp)s(oses)g(the)630 4472 y(last)j(t)m(w)m(o)h
+(w)m(ords)d(on)i(the)f(line.)41 b(W)-8 b(ord)31 b(b)s(oundaries)e(are)h
+(the)h(same)f(as)h Fn(shell-forward-)630 4582 y(word)e
+Fo(and)h Fn(shell-backward-word)p Fo(.)150 4742 y Fn(unix-word-rubout)c
+(\(C-w\))630 4851 y Fo(Kill)32 b(the)g(w)m(ord)f(b)s(ehind)f(p)s(oin)m
+(t,)i(using)f(white)h(space)g(as)g(a)g(w)m(ord)f(b)s(oundary)-8
+b(.)43 b(The)31 b(killed)630 4961 y(text)g(is)g(sa)m(v)m(ed)g(on)g(the)
+f(kill-ring.)150 5121 y Fn(unix-filename-rubout)25 b(\(\))630
+5230 y Fo(Kill)37 b(the)f(w)m(ord)g(b)s(ehind)f(p)s(oin)m(t,)j(using)e
+(white)g(space)h(and)f(the)g(slash)g(c)m(haracter)i(as)f(the)630
+5340 y(w)m(ord)30 b(b)s(oundaries.)39 b(The)30 b(killed)h(text)g(is)g
+(sa)m(v)m(ed)g(on)g(the)f(kill-ring.)p eop end
+%%Page: 22 25
+TeXDict begin 22 24 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(22)150 299 y Fn
+(delete-horizontal-space)24 b(\(\))630 408 y Fo(Delete)33
+b(all)e(spaces)g(and)e(tabs)i(around)e(p)s(oin)m(t.)41
+b(By)31 b(default,)f(this)h(is)f(un)m(b)s(ound.)150 564
+y Fn(kill-region)d(\(\))630 673 y Fo(Kill)k(the)f(text)i(in)e(the)g
+(curren)m(t)h(region.)41 b(By)31 b(default,)f(this)h(command)f(is)g(un)
+m(b)s(ound.)150 829 y Fn(copy-region-as-kill)25 b(\(\))630
+938 y Fo(Cop)m(y)34 b(the)g(text)h(in)f(the)g(region)g(to)h(the)f(kill)
+h(bu\013er,)f(so)g(it)h(can)f(b)s(e)f(y)m(ank)m(ed)i(righ)m(t)f(a)m(w)m
+(a)m(y)-8 b(.)630 1048 y(By)31 b(default,)f(this)h(command)f(is)g(un)m
+(b)s(ound.)150 1203 y Fn(copy-backward-word)25 b(\(\))630
+1313 y Fo(Cop)m(y)38 b(the)h(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)g(to)i
+(the)e(kill)h(bu\013er.)64 b(The)38 b(w)m(ord)g(b)s(oundaries)f(are)i
+(the)630 1422 y(same)31 b(as)f Fn(backward-word)p Fo(.)38
+b(By)30 b(default,)h(this)f(command)g(is)h(un)m(b)s(ound.)150
+1578 y Fn(copy-forward-word)26 b(\(\))630 1687 y Fo(Cop)m(y)31
+b(the)g(w)m(ord)g(follo)m(wing)h(p)s(oin)m(t)f(to)h(the)f(kill)h
+(bu\013er.)42 b(The)30 b(w)m(ord)h(b)s(oundaries)e(are)j(the)630
+1797 y(same)f(as)f Fn(forward-word)p Fo(.)38 b(By)30
+b(default,)h(this)g(command)f(is)g(un)m(b)s(ound.)150
+1952 y Fn(yank)f(\(C-y\))630 2062 y Fo(Y)-8 b(ank)31
+b(the)f(top)h(of)g(the)f(kill)h(ring)f(in)m(to)i(the)e(bu\013er)g(at)h
+(p)s(oin)m(t.)150 2217 y Fn(yank-pop)d(\(M-y\))630 2327
+y Fo(Rotate)36 b(the)f(kill-ring,)i(and)d(y)m(ank)h(the)f(new)g(top.)54
+b(Y)-8 b(ou)35 b(can)g(only)f(do)h(this)f(if)h(the)g(prior)630
+2436 y(command)30 b(is)h Fn(yank)e Fo(or)h Fn(yank-pop)p
+Fo(.)150 2631 y Fd(1.4.5)63 b(Sp)s(ecifying)42 b(Numeric)f(Argumen)m
+(ts)150 2801 y Fn(digit-argument)26 b(\()p Fg(M-0)p Fn(,)j
+Fg(M-1)p Fn(,)h(...)f Fg(M--)p Fn(\))630 2911 y Fo(Add)d(this)h(digit)g
+(to)h(the)f(argumen)m(t)g(already)h(accum)m(ulating,)h(or)e(start)h(a)f
+(new)f(argumen)m(t.)630 3020 y Fg(M--)j Fo(starts)i(a)g(negativ)m(e)i
+(argumen)m(t.)150 3176 y Fn(universal-argument)25 b(\(\))630
+3285 y Fo(This)g(is)g(another)h(w)m(a)m(y)g(to)h(sp)s(ecify)e(an)g
+(argumen)m(t.)40 b(If)25 b(this)g(command)h(is)f(follo)m(w)m(ed)i(b)m
+(y)f(one)630 3395 y(or)k(more)f(digits,)i(optionally)g(with)e(a)h
+(leading)h(min)m(us)e(sign,)h(those)g(digits)g(de\014ne)f(the)h(ar-)630
+3505 y(gumen)m(t.)41 b(If)28 b(the)i(command)f(is)g(follo)m(w)m(ed)h(b)
+m(y)f(digits,)i(executing)f Fn(universal-argument)630
+3614 y Fo(again)j(ends)e(the)h(n)m(umeric)f(argumen)m(t,)i(but)e(is)h
+(otherwise)g(ignored.)45 b(As)32 b(a)g(sp)s(ecial)h(case,)630
+3724 y(if)g(this)g(command)f(is)h(immediately)h(follo)m(w)m(ed)h(b)m(y)
+d(a)h(c)m(haracter)i(that)e(is)g(neither)g(a)g(digit)630
+3833 y(nor)41 b(min)m(us)f(sign,)k(the)e(argumen)m(t)f(coun)m(t)h(for)f
+(the)h(next)f(command)g(is)g(m)m(ultiplied)h(b)m(y)630
+3943 y(four.)54 b(The)35 b(argumen)m(t)g(coun)m(t)h(is)f(initially)h
+(one,)h(so)e(executing)i(this)e(function)f(the)i(\014rst)630
+4053 y(time)29 b(mak)m(es)h(the)e(argumen)m(t)i(coun)m(t)f(four,)f(a)h
+(second)g(time)g(mak)m(es)h(the)e(argumen)m(t)h(coun)m(t)630
+4162 y(sixteen,)i(and)f(so)h(on.)40 b(By)31 b(default,)g(this)f(is)g
+(not)h(b)s(ound)d(to)k(a)e(k)m(ey)-8 b(.)150 4357 y Fd(1.4.6)63
+b(Letting)40 b(Readline)h(T)m(yp)s(e)g(F)-10 b(or)42
+b(Y)-10 b(ou)150 4527 y Fn(complete)28 b(\(TAB\))630
+4637 y Fo(A)m(ttempt)c(to)f(p)s(erform)e(completion)j(on)f(the)g(text)g
+(b)s(efore)f(p)s(oin)m(t.)39 b(The)22 b(actual)i(completion)630
+4746 y(p)s(erformed)29 b(is)h(application-sp)s(eci\014c.)42
+b(The)30 b(default)h(is)f(\014lename)h(completion.)150
+4902 y Fn(possible-completions)25 b(\(M-?\))630 5011
+y Fo(List)35 b(the)g(p)s(ossible)f(completions)i(of)e(the)h(text)h(b)s
+(efore)e(p)s(oin)m(t.)54 b(When)34 b(displa)m(ying)h(com-)630
+5121 y(pletions,)f(Readline)f(sets)f(the)h(n)m(um)m(b)s(er)e(of)i
+(columns)f(used)f(for)i(displa)m(y)f(to)h(the)g(v)-5
+b(alue)33 b(of)630 5230 y Fn(completion-display-width)o
+Fo(,)g(the)j(v)-5 b(alue)37 b(of)g(the)f(en)m(vironmen)m(t)h(v)-5
+b(ariable)38 b Fn(COLUMNS)p Fo(,)630 5340 y(or)30 b(the)h(screen)f
+(width,)g(in)g(that)h(order.)p eop end
+%%Page: 23 26
+TeXDict begin 23 25 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(23)150 299 y Fn
+(insert-completions)25 b(\(M-*\))630 408 y Fo(Insert)30
+b(all)h(completions)h(of)f(the)g(text)g(b)s(efore)f(p)s(oin)m(t)h(that)
+g(w)m(ould)f(ha)m(v)m(e)i(b)s(een)e(generated)630 518
+y(b)m(y)g Fn(possible-completions)p Fo(.)150 673 y Fn(menu-complete)d
+(\(\))630 783 y Fo(Similar)d(to)g Fn(complete)p Fo(,)f(but)h(replaces)g
+(the)g(w)m(ord)g(to)g(b)s(e)f(completed)i(with)e(a)i(single)f(matc)m(h)
+630 893 y(from)37 b(the)h(list)h(of)f(p)s(ossible)f(completions.)64
+b(Rep)s(eated)39 b(execution)g(of)f Fn(menu-complete)630
+1002 y Fo(steps)i(through)g(the)g(list)h(of)f(p)s(ossible)g
+(completions,)k(inserting)c(eac)m(h)i(matc)m(h)f(in)f(turn.)630
+1112 y(A)m(t)e(the)f(end)f(of)h(the)g(list)g(of)g(completions,)i(the)e
+(b)s(ell)g(is)g(rung)f(\(sub)5 b(ject)36 b(to)i(the)f(setting)630
+1221 y(of)f Fn(bell-style)p Fo(\))e(and)h(the)h(original)i(text)f(is)f
+(restored.)57 b(An)36 b(argumen)m(t)h(of)f Fe(n)f Fo(mo)m(v)m(es)i
+Fe(n)630 1331 y Fo(p)s(ositions)e(forw)m(ard)f(in)g(the)h(list)h(of)e
+(matc)m(hes;)39 b(a)c(negativ)m(e)i(argumen)m(t)e(ma)m(y)g(b)s(e)f
+(used)g(to)630 1441 y(mo)m(v)m(e)40 b(bac)m(kw)m(ard)e(through)g(the)g
+(list.)65 b(This)38 b(command)g(is)g(in)m(tended)g(to)h(b)s(e)f(b)s
+(ound)e(to)630 1550 y Fn(TAB)p Fo(,)30 b(but)f(is)i(un)m(b)s(ound)d(b)m
+(y)i(default.)150 1705 y Fn(menu-complete-backward)24
+b(\(\))630 1815 y Fo(Iden)m(tical)36 b(to)g Fn(menu-complete)p
+Fo(,)d(but)h(mo)m(v)m(es)j(bac)m(kw)m(ard)e(through)f(the)i(list)f(of)g
+(p)s(ossible)630 1925 y(completions,)d(as)e(if)h Fn(menu-complete)26
+b Fo(had)k(b)s(een)g(giv)m(en)h(a)g(negativ)m(e)i(argumen)m(t.)150
+2080 y Fn(delete-char-or-list)25 b(\(\))630 2190 y Fo(Deletes)41
+b(the)e(c)m(haracter)h(under)e(the)h(cursor)f(if)h(not)g(at)g(the)h(b)s
+(eginning)e(or)h(end)f(of)h(the)630 2299 y(line)50 b(\(lik)m(e)h
+Fn(delete-char)p Fo(\).)96 b(If)49 b(at)h(the)g(end)f(of)h(the)f(line,)
+55 b(b)s(eha)m(v)m(es)c(iden)m(tically)g(to)630 2409
+y Fn(possible-completions)p Fo(.)35 b(This)30 b(command)g(is)g(un)m(b)s
+(ound)e(b)m(y)i(default.)150 2604 y Fd(1.4.7)63 b(Keyb)s(oard)41
+b(Macros)150 2774 y Fn(start-kbd-macro)26 b(\(C-x)j(\(\))630
+2883 y Fo(Begin)i(sa)m(ving)h(the)e(c)m(haracters)i(t)m(yp)s(ed)e(in)m
+(to)h(the)g(curren)m(t)f(k)m(eyb)s(oard)g(macro.)150
+3039 y Fn(end-kbd-macro)d(\(C-x)i(\)\))630 3148 y Fo(Stop)e(sa)m(ving)h
+(the)g(c)m(haracters)g(t)m(yp)s(ed)f(in)m(to)i(the)e(curren)m(t)g(k)m
+(eyb)s(oard)g(macro)h(and)f(sa)m(v)m(e)i(the)630 3258
+y(de\014nition.)150 3413 y Fn(call-last-kbd-macro)c(\(C-x)k(e\))630
+3523 y Fo(Re-execute)37 b(the)e(last)h(k)m(eyb)s(oard)f(macro)h
+(de\014ned,)f(b)m(y)h(making)f(the)g(c)m(haracters)i(in)e(the)630
+3632 y(macro)c(app)s(ear)f(as)g(if)h(t)m(yp)s(ed)f(at)h(the)f(k)m(eyb)s
+(oard.)150 3788 y Fn(print-last-kbd-macro)25 b(\(\))630
+3897 y Fo(Prin)m(t)30 b(the)g(last)h(k)m(eyb)s(oard)f(macro)h
+(de\014ned)e(in)h(a)g(format)h(suitable)g(for)f(the)g
+Fe(inputrc)35 b Fo(\014le.)150 4092 y Fd(1.4.8)63 b(Some)41
+b(Miscellaneous)i(Commands)150 4262 y Fn(re-read-init-file)26
+b(\(C-x)j(C-r\))630 4372 y Fo(Read)22 b(in)g(the)g(con)m(ten)m(ts)h(of)
+f(the)g Fe(inputrc)27 b Fo(\014le,)d(and)d(incorp)s(orate)h(an)m(y)h
+(bindings)d(or)i(v)-5 b(ariable)630 4481 y(assignmen)m(ts)31
+b(found)e(there.)150 4637 y Fn(abort)g(\(C-g\))630 4746
+y Fo(Ab)s(ort)d(the)h(curren)m(t)f(editing)h(command)f(and)g(ring)h
+(the)f(terminal's)h(b)s(ell)g(\(sub)5 b(ject)26 b(to)i(the)630
+4856 y(setting)j(of)g Fn(bell-style)p Fo(\).)150 5011
+y Fn(do-lowercase-version)25 b(\(M-A,)k(M-B,)g(M-)p Fg(x)p
+Fn(,)g(...)o(\))630 5121 y Fo(If)35 b(the)g(meta\014ed)g(c)m(haracter)i
+Fe(x)k Fo(is)35 b(upp)s(er)e(case,)k(run)d(the)h(command)g(that)g(is)g
+(b)s(ound)e(to)630 5230 y(the)g(corresp)s(onding)f(meta\014ed)h(lo)m(w)
+m(er)i(case)f(c)m(haracter.)50 b(The)32 b(b)s(eha)m(vior)h(is)g
+(unde\014ned)e(if)630 5340 y Fe(x)37 b Fo(is)30 b(already)h(lo)m(w)m
+(er)h(case.)p eop end
+%%Page: 24 27
+TeXDict begin 24 26 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(24)150 299 y Fn(prefix-meta)27
+b(\(ESC\))630 408 y Fo(Metafy)39 b(the)e(next)h(c)m(haracter)h(t)m(yp)s
+(ed.)62 b(This)37 b(is)g(for)h(k)m(eyb)s(oards)f(without)g(a)h(meta)g
+(k)m(ey)-8 b(.)630 518 y(T)m(yping)30 b(`)p Fn(ESC)g(f)p
+Fo(')g(is)h(equiv)-5 b(alen)m(t)31 b(to)g(t)m(yping)g
+Fg(M-f)p Fo(.)150 704 y Fn(undo)e(\(C-_)g(or)h(C-x)g(C-u\))630
+814 y Fo(Incremen)m(tal)h(undo,)f(separately)h(remem)m(b)s(ered)f(for)g
+(eac)m(h)i(line.)150 1000 y Fn(revert-line)27 b(\(M-r\))630
+1110 y Fo(Undo)33 b(all)h(c)m(hanges)g(made)f(to)h(this)f(line.)49
+b(This)32 b(is)h(lik)m(e)i(executing)f(the)f Fn(undo)f
+Fo(command)630 1219 y(enough)e(times)h(to)g(get)h(bac)m(k)f(to)g(the)f
+(b)s(eginning.)150 1406 y Fn(tilde-expand)d(\(M-~\))630
+1515 y Fo(P)m(erform)j(tilde)h(expansion)g(on)f(the)g(curren)m(t)h(w)m
+(ord.)150 1702 y Fn(set-mark)d(\(C-@\))630 1811 y Fo(Set)33
+b(the)g(mark)f(to)i(the)f(p)s(oin)m(t.)48 b(If)32 b(a)h(n)m(umeric)g
+(argumen)m(t)g(is)g(supplied,)f(the)h(mark)g(is)f(set)630
+1921 y(to)f(that)g(p)s(osition.)150 2107 y Fn(exchange-point-and-mark)
+24 b(\(C-x)29 b(C-x\))630 2217 y Fo(Sw)m(ap)i(the)g(p)s(oin)m(t)g(with)
+g(the)g(mark.)43 b(The)31 b(curren)m(t)g(cursor)f(p)s(osition)i(is)f
+(set)h(to)f(the)h(sa)m(v)m(ed)630 2326 y(p)s(osition,)f(and)e(the)i
+(old)g(cursor)e(p)s(osition)i(is)f(sa)m(v)m(ed)i(as)e(the)h(mark.)150
+2513 y Fn(character-search)26 b(\(C-]\))630 2622 y Fo(A)f(c)m(haracter)
+h(is)f(read)g(and)f(p)s(oin)m(t)h(is)g(mo)m(v)m(ed)h(to)g(the)f(next)g
+(o)s(ccurrence)g(of)g(that)g(c)m(haracter.)630 2732 y(A)30
+b(negativ)m(e)j(argumen)m(t)e(searc)m(hes)g(for)f(previous)g(o)s
+(ccurrences.)150 2918 y Fn(character-search-backwar)o(d)24
+b(\(M-C-]\))630 3028 y Fo(A)45 b(c)m(haracter)h(is)f(read)g(and)f(p)s
+(oin)m(t)h(is)g(mo)m(v)m(ed)h(to)f(the)g(previous)f(o)s(ccurrence)h(of)
+g(that)630 3137 y(c)m(haracter.)d(A)31 b(negativ)m(e)h(argumen)m(t)f
+(searc)m(hes)g(for)g(subsequen)m(t)e(o)s(ccurrences.)150
+3324 y Fn(skip-csi-sequence)d(\(\))630 3433 y Fo(Read)i(enough)f(c)m
+(haracters)h(to)g(consume)f(a)h(m)m(ulti-k)m(ey)h(sequence)f(suc)m(h)f
+(as)g(those)h(de\014ned)630 3543 y(for)37 b(k)m(eys)h(lik)m(e)g(Home)g
+(and)f(End.)60 b(Suc)m(h)37 b(sequences)g(b)s(egin)g(with)g(a)h(Con)m
+(trol)g(Sequence)630 3652 y(Indicator)f(\(CSI\),)f(usually)h(ESC-[.)59
+b(If)36 b(this)g(sequence)h(is)g(b)s(ound)d(to)k Fn("\\)p
+Fo(e[)p Fn(")p Fo(,)g(k)m(eys)f(pro-)630 3762 y(ducing)29
+b(suc)m(h)g(sequences)g(will)h(ha)m(v)m(e)h(no)e(e\013ect)i(unless)d
+(explicitly)j(b)s(ound)d(to)i(a)f(Readline)630 3871 y(command,)j
+(instead)g(of)g(inserting)g(stra)m(y)h(c)m(haracters)g(in)m(to)g(the)f
+(editing)h(bu\013er.)44 b(This)31 b(is)630 3981 y(un)m(b)s(ound)d(b)m
+(y)i(default,)h(but)f(usually)g(b)s(ound)e(to)j(ESC-[.)150
+4167 y Fn(insert-comment)26 b(\(M-#\))630 4277 y Fo(Without)36
+b(a)g(n)m(umeric)g(argumen)m(t,)h(the)f(v)-5 b(alue)36
+b(of)g(the)g Fn(comment-begin)c Fo(v)-5 b(ariable)36
+b(is)g(in-)630 4387 y(serted)c(at)g(the)g(b)s(eginning)f(of)h(the)f
+(curren)m(t)h(line.)45 b(If)31 b(a)h(n)m(umeric)f(argumen)m(t)h(is)g
+(supplied,)630 4496 y(this)k(command)h(acts)g(as)g(a)g(toggle:)55
+b(if)37 b(the)f(c)m(haracters)i(at)g(the)e(b)s(eginning)g(of)h(the)g
+(line)630 4606 y(do)30 b(not)h(matc)m(h)h(the)f(v)-5
+b(alue)31 b(of)f Fn(comment-begin)p Fo(,)e(the)i(v)-5
+b(alue)31 b(is)g(inserted,)g(otherwise)g(the)630 4715
+y(c)m(haracters)42 b(in)d Fn(comment-begin)e Fo(are)j(deleted)h(from)f
+(the)g(b)s(eginning)g(of)g(the)g(line.)71 b(In)630 4825
+y(either)31 b(case,)h(the)e(line)h(is)f(accepted)i(as)f(if)f(a)h
+(newline)f(had)g(b)s(een)f(t)m(yp)s(ed.)150 5011 y Fn(dump-functions)d
+(\(\))630 5121 y Fo(Prin)m(t)g(all)i(of)e(the)h(functions)f(and)g
+(their)g(k)m(ey)h(bindings)e(to)j(the)e(Readline)h(output)f(stream.)630
+5230 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)g(supplied,)f(the)h
+(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)m(y)g(that)630
+5340 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h Fe(inputrc)k
+Fo(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c(b)m(y)k
+(default.)p eop end
+%%Page: 25 28
+TeXDict begin 25 27 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(25)150 299 y Fn(dump-variables)26
+b(\(\))630 408 y Fo(Prin)m(t)21 b(all)h(of)g(the)f(settable)i(v)-5
+b(ariables)22 b(and)f(their)g(v)-5 b(alues)22 b(to)g(the)f(Readline)h
+(output)f(stream.)630 518 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)g
+(supplied,)f(the)h(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)m
+(y)g(that)630 628 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h
+Fe(inputrc)k Fo(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c
+(b)m(y)k(default.)150 787 y Fn(dump-macros)c(\(\))630
+897 y Fo(Prin)m(t)34 b(all)g(of)g(the)g(Readline)g(k)m(ey)h(sequences)f
+(b)s(ound)e(to)i(macros)g(and)f(the)h(strings)g(they)630
+1006 y(output.)53 b(If)35 b(a)g(n)m(umeric)f(argumen)m(t)i(is)e
+(supplied,)h(the)g(output)g(is)f(formatted)i(in)e(suc)m(h)h(a)630
+1116 y(w)m(a)m(y)c(that)g(it)f(can)g(b)s(e)g(made)g(part)f(of)i(an)e
+Fe(inputrc)35 b Fo(\014le.)41 b(This)29 b(command)h(is)g(un)m(b)s(ound)
+d(b)m(y)630 1225 y(default.)150 1385 y Fn(emacs-editing-mode)e(\(C-e\))
+630 1494 y Fo(When)30 b(in)g Fn(vi)g Fo(command)g(mo)s(de,)g(this)h
+(causes)f(a)h(switc)m(h)g(to)g Fn(emacs)e Fo(editing)i(mo)s(de.)150
+1654 y Fn(vi-editing-mode)26 b(\(M-C-j\))630 1763 y Fo(When)k(in)g
+Fn(emacs)f Fo(editing)i(mo)s(de,)f(this)h(causes)f(a)h(switc)m(h)g(to)g
+Fn(vi)f Fo(editing)h(mo)s(de.)150 2004 y Fm(1.5)68 b(Readline)47
+b(vi)e(Mo)t(de)150 2164 y Fo(While)32 b(the)g(Readline)g(library)f(do)s
+(es)g(not)h(ha)m(v)m(e)h(a)f(full)f(set)h(of)g Fn(vi)f
+Fo(editing)h(functions,)f(it)h(do)s(es)g(con)m(tain)150
+2273 y(enough)i(to)h(allo)m(w)g(simple)f(editing)h(of)f(the)g(line.)52
+b(The)34 b(Readline)g Fn(vi)g Fo(mo)s(de)f(b)s(eha)m(v)m(es)i(as)f(sp)s
+(eci\014ed)f(in)150 2383 y(the)e Fh(posix)e Fo(standard.)275
+2517 y(In)f(order)g(to)i(switc)m(h)g(in)m(teractiv)m(ely)i(b)s(et)m(w)m
+(een)d Fn(emacs)f Fo(and)g Fn(vi)h Fo(editing)g(mo)s(des,)g(use)g(the)g
+(command)150 2627 y Fg(M-C-j)36 b Fo(\(b)s(ound)h(to)h
+(emacs-editing-mo)s(de)i(when)d(in)g Fn(vi)h Fo(mo)s(de)f(and)g(to)i
+(vi-editing-mo)s(de)g(in)e Fn(emacs)150 2736 y Fo(mo)s(de\).)k(The)30
+b(Readline)h(default)f(is)g Fn(emacs)f Fo(mo)s(de.)275
+2871 y(When)g(y)m(ou)i(en)m(ter)f(a)h(line)f(in)g Fn(vi)f
+Fo(mo)s(de,)h(y)m(ou)h(are)f(already)h(placed)f(in)g(`insertion')g(mo)s
+(de,)g(as)h(if)f(y)m(ou)150 2980 y(had)f(t)m(yp)s(ed)g(an)g(`)p
+Fn(i)p Fo('.)41 b(Pressing)29 b Fn(ESC)f Fo(switc)m(hes)i(y)m(ou)g(in)m
+(to)h(`command')e(mo)s(de,)h(where)e(y)m(ou)i(can)g(edit)g(the)150
+3090 y(text)35 b(of)f(the)g(line)g(with)f(the)h(standard)f
+Fn(vi)g Fo(mo)m(v)m(emen)m(t)j(k)m(eys,)g(mo)m(v)m(e)f(to)f(previous)g
+(history)f(lines)h(with)150 3200 y(`)p Fn(k)p Fo(')d(and)e(subsequen)m
+(t)h(lines)h(with)f(`)p Fn(j)p Fo(',)g(and)g(so)h(forth.)p
+eop end
+%%Page: 26 29
+TeXDict begin 26 28 bop 3659 -116 a Fo(26)150 299 y Fk(App)t(endix)52
+b(A)81 b(GNU)54 b(F)-13 b(ree)53 b(Do)t(cumen)l(tation)e(License)1359
+502 y Fo(V)-8 b(ersion)31 b(1.3,)g(3)g(No)m(v)m(em)m(b)s(er)h(2008)390
+635 y(Cop)m(yrigh)m(t)842 632 y(c)817 635 y Fl(\015)e
+Fo(2000,)j(2001,)f(2002,)g(2007,)h(2008)f(F)-8 b(ree)31
+b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 745
+y Fn(http://fsf.org/)390 964 y Fo(Ev)m(ery)m(one)g(is)g(p)s(ermitted)f
+(to)h(cop)m(y)g(and)f(distribute)g(v)m(erbatim)h(copies)390
+1074 y(of)g(this)f(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f
+(is)f(not)h(allo)m(w)m(ed.)199 1207 y(0.)61 b(PREAMBLE)330
+1340 y(The)37 b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g
+(a)g(man)m(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330
+1450 y(useful)29 b(do)s(cumen)m(t)h Fe(free)36 b Fo(in)29
+b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j
+(the)e(e\013ectiv)m(e)j(freedom)330 1559 y(to)f(cop)m(y)g(and)f
+(redistribute)g(it,)h(with)g(or)f(without)g(mo)s(difying)g(it,)i
+(either)f(commercially)h(or)e(non-)330 1669 y(commercially)-8
+b(.)56 b(Secondarily)-8 b(,)36 b(this)f(License)g(preserv)m(es)g(for)f
+(the)h(author)f(and)g(publisher)f(a)i(w)m(a)m(y)330 1778
+y(to)i(get)g(credit)g(for)f(their)g(w)m(ork,)i(while)e(not)g(b)s(eing)g
+(considered)g(resp)s(onsible)f(for)h(mo)s(di\014cations)330
+1888 y(made)30 b(b)m(y)h(others.)330 2021 y(This)22 b(License)i(is)f(a)
+h(kind)e(of)i(\\cop)m(yleft",)j(whic)m(h)c(means)g(that)h(deriv)-5
+b(ativ)m(e)24 b(w)m(orks)f(of)h(the)f(do)s(cumen)m(t)330
+2131 y(m)m(ust)34 b(themselv)m(es)h(b)s(e)e(free)h(in)g(the)g(same)g
+(sense.)51 b(It)34 b(complemen)m(ts)h(the)f(GNU)g(General)h(Public)330
+2240 y(License,)c(whic)m(h)f(is)h(a)f(cop)m(yleft)i(license)g(designed)
+e(for)g(free)h(soft)m(w)m(are.)330 2373 y(W)-8 b(e)31
+b(ha)m(v)m(e)f(designed)g(this)f(License)h(in)f(order)g(to)i(use)e(it)h
+(for)f(man)m(uals)h(for)f(free)h(soft)m(w)m(are,)h(b)s(ecause)330
+2483 y(free)42 b(soft)m(w)m(are)i(needs)e(free)g(do)s(cumen)m(tation:)
+65 b(a)42 b(free)h(program)f(should)f(come)i(with)f(man)m(uals)330
+2592 y(pro)m(viding)29 b(the)g(same)g(freedoms)f(that)i(the)f(soft)m(w)
+m(are)h(do)s(es.)40 b(But)29 b(this)f(License)i(is)f(not)g(limited)g
+(to)330 2702 y(soft)m(w)m(are)j(man)m(uals;)f(it)g(can)g(b)s(e)f(used)g
+(for)g(an)m(y)h(textual)h(w)m(ork,)f(regardless)g(of)g(sub)5
+b(ject)30 b(matter)i(or)330 2812 y(whether)f(it)h(is)f(published)f(as)i
+(a)f(prin)m(ted)g(b)s(o)s(ok.)44 b(W)-8 b(e)32 b(recommend)f(this)h
+(License)g(principally)f(for)330 2921 y(w)m(orks)f(whose)h(purp)s(ose)d
+(is)j(instruction)f(or)g(reference.)199 3054 y(1.)61
+b(APPLICABILITY)29 b(AND)j(DEFINITIONS)330 3187 y(This)39
+b(License)i(applies)f(to)g(an)m(y)h(man)m(ual)f(or)g(other)g(w)m(ork,)i
+(in)e(an)m(y)g(medium,)i(that)e(con)m(tains)i(a)330 3297
+y(notice)h(placed)f(b)m(y)f(the)h(cop)m(yrigh)m(t)h(holder)e(sa)m(ying)
+h(it)g(can)g(b)s(e)f(distributed)f(under)g(the)i(terms)330
+3407 y(of)c(this)f(License.)62 b(Suc)m(h)37 b(a)h(notice)h(gran)m(ts)f
+(a)g(w)m(orld-wide,)h(ro)m(y)m(alt)m(y-free)i(license,)f(unlimited)d
+(in)330 3516 y(duration,)49 b(to)d(use)f(that)g(w)m(ork)h(under)d(the)j
+(conditions)f(stated)h(herein.)85 b(The)45 b(\\Do)s(cumen)m(t",)330
+3626 y(b)s(elo)m(w,)29 b(refers)f(to)h(an)m(y)g(suc)m(h)f(man)m(ual)h
+(or)f(w)m(ork.)40 b(An)m(y)29 b(mem)m(b)s(er)e(of)i(the)f(public)g(is)g
+(a)h(licensee,)i(and)330 3735 y(is)25 b(addressed)f(as)h(\\y)m(ou".)40
+b(Y)-8 b(ou)26 b(accept)g(the)f(license)h(if)f(y)m(ou)h(cop)m(y)-8
+b(,)27 b(mo)s(dify)d(or)h(distribute)g(the)g(w)m(ork)330
+3845 y(in)30 b(a)h(w)m(a)m(y)g(requiring)f(p)s(ermission)f(under)g(cop)
+m(yrigh)m(t)j(la)m(w.)330 3978 y(A)i(\\Mo)s(di\014ed)f(V)-8
+b(ersion")35 b(of)f(the)g(Do)s(cumen)m(t)g(means)g(an)m(y)g(w)m(ork)f
+(con)m(taining)j(the)e(Do)s(cumen)m(t)g(or)330 4088 y(a)k(p)s(ortion)f
+(of)h(it,)i(either)e(copied)g(v)m(erbatim,)i(or)d(with)h(mo)s
+(di\014cations)f(and/or)h(translated)g(in)m(to)330 4197
+y(another)31 b(language.)330 4330 y(A)26 b(\\Secondary)g(Section")h(is)
+f(a)h(named)e(app)s(endix)f(or)i(a)h(fron)m(t-matter)g(section)g(of)f
+(the)g(Do)s(cumen)m(t)330 4440 y(that)c(deals)g(exclusiv)m(ely)h(with)e
+(the)g(relationship)h(of)f(the)h(publishers)d(or)i(authors)g(of)h(the)f
+(Do)s(cumen)m(t)330 4549 y(to)38 b(the)f(Do)s(cumen)m(t's)i(o)m(v)m
+(erall)g(sub)5 b(ject)37 b(\(or)h(to)g(related)g(matters\))g(and)f(con)
+m(tains)h(nothing)f(that)330 4659 y(could)j(fall)h(directly)g(within)f
+(that)h(o)m(v)m(erall)i(sub)5 b(ject.)70 b(\(Th)m(us,)42
+b(if)e(the)h(Do)s(cumen)m(t)g(is)f(in)g(part)h(a)330
+4769 y(textb)s(o)s(ok)24 b(of)g(mathematics,)j(a)d(Secondary)f(Section)
+h(ma)m(y)g(not)g(explain)g(an)m(y)g(mathematics.\))40
+b(The)330 4878 y(relationship)28 b(could)f(b)s(e)g(a)g(matter)i(of)e
+(historical)i(connection)f(with)f(the)h(sub)5 b(ject)27
+b(or)g(with)g(related)330 4988 y(matters,)38 b(or)d(of)h(legal,)i
+(commercial,)h(philosophical,)f(ethical)f(or)e(p)s(olitical)i(p)s
+(osition)f(regarding)330 5097 y(them.)330 5230 y(The)25
+b(\\In)m(v)-5 b(arian)m(t)27 b(Sections")g(are)f(certain)g(Secondary)g
+(Sections)g(whose)f(titles)i(are)f(designated,)i(as)330
+5340 y(b)s(eing)e(those)h(of)g(In)m(v)-5 b(arian)m(t)27
+b(Sections,)i(in)d(the)h(notice)h(that)f(sa)m(ys)g(that)g(the)g(Do)s
+(cumen)m(t)g(is)g(released)p eop end
+%%Page: 27 30
+TeXDict begin 27 29 bop 150 -116 a Fo(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(27)330 299 y(under)26 b(this)i(License.)40 b(If)27
+b(a)h(section)h(do)s(es)f(not)f(\014t)h(the)g(ab)s(o)m(v)m(e)h
+(de\014nition)e(of)h(Secondary)f(then)h(it)g(is)330 408
+y(not)k(allo)m(w)m(ed)i(to)e(b)s(e)g(designated)g(as)g(In)m(v)-5
+b(arian)m(t.)46 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f(con)m(tain)i(zero)
+e(In)m(v)-5 b(arian)m(t)330 518 y(Sections.)39 b(If)25
+b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)g(an)m(y)g(In)m(v)
+-5 b(arian)m(t)25 b(Sections)h(then)e(there)h(are)g(none.)330
+669 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g(short)
+g(passages)g(of)g(text)g(that)h(are)f(listed,)i(as)d(F)-8
+b(ron)m(t-Co)m(v)m(er)330 778 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m(er)
+j(T)-8 b(exts,)27 b(in)d(the)h(notice)i(that)e(sa)m(ys)h(that)g(the)f
+(Do)s(cumen)m(t)h(is)f(released)g(under)330 888 y(this)h(License.)40
+b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29 b(T)-8 b(ext)26
+b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)g(Bac)m(k-Co)m
+(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 998 y(b)s(e)k(at)h(most)g(25)g(w)m
+(ords.)330 1148 y(A)36 b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g
+(the)f(Do)s(cumen)m(t)h(means)g(a)g(mac)m(hine-readable)h(cop)m(y)-8
+b(,)38 b(represen)m(ted)330 1258 y(in)d(a)h(format)g(whose)g(sp)s
+(eci\014cation)g(is)g(a)m(v)-5 b(ailable)38 b(to)f(the)f(general)g
+(public,)h(that)f(is)g(suitable)g(for)330 1367 y(revising)c(the)g(do)s
+(cumen)m(t)f(straigh)m(tforw)m(ardly)i(with)e(generic)i(text)g(editors)
+f(or)f(\(for)h(images)h(com-)330 1477 y(p)s(osed)23 b(of)h(pixels\))g
+(generic)h(pain)m(t)f(programs)g(or)f(\(for)h(dra)m(wings\))g(some)g
+(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 1587
+y(editor,)k(and)f(that)g(is)g(suitable)h(for)f(input)f(to)i(text)g
+(formatters)f(or)g(for)g(automatic)i(translation)f(to)330
+1696 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input)
+g(to)i(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)g(an)g
+(otherwise)330 1806 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g
+(whose)f(markup,)i(or)e(absence)h(of)g(markup,)g(has)g(b)s(een)f
+(arranged)g(to)330 1915 y(th)m(w)m(art)27 b(or)g(discourage)g
+(subsequen)m(t)f(mo)s(di\014cation)h(b)m(y)g(readers)f(is)g(not)h(T)-8
+b(ransparen)m(t.)39 b(An)27 b(image)330 2025 y(format)35
+b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g
+(substan)m(tial)h(amoun)m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g
+(is)330 2134 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i
+(\\Opaque".)330 2285 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T)
+-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fh(asci)r(i)g
+Fo(without)330 2395 y(markup,)37 b(T)-8 b(exinfo)36 b(input)f(format,)j
+(LaT)1759 2414 y(E)1810 2395 y(X)e(input)f(format,)j
+Fc(SGML)f Fo(or)f Fc(XML)g Fo(using)g(a)g(publicly)330
+2504 y(a)m(v)-5 b(ailable)42 b Fc(DTD)p Fo(,)h(and)c
+(standard-conforming)g(simple)h Fc(HTML)p Fo(,)i(P)m(ostScript)e(or)f
+Fc(PDF)h Fo(designed)330 2614 y(for)e(h)m(uman)f(mo)s(di\014cation.)65
+b(Examples)38 b(of)h(transparen)m(t)f(image)h(formats)g(include)f
+Fc(PNG)p Fo(,)i Fc(X)n(CF)330 2724 y Fo(and)e Fc(JPG)p
+Fo(.)64 b(Opaque)38 b(formats)h(include)f(proprietary)h(formats)f(that)
+h(can)g(b)s(e)f(read)h(and)f(edited)330 2833 y(only)54
+b(b)m(y)f(proprietary)h(w)m(ord)f(pro)s(cessors,)59 b
+Fc(SGML)54 b Fo(or)f Fc(XML)h Fo(for)g(whic)m(h)f(the)h
+Fc(DTD)g Fo(and/or)330 2943 y(pro)s(cessing)61 b(to)s(ols)h(are)f(not)g
+(generally)i(a)m(v)-5 b(ailable,)71 b(and)60 b(the)h(mac)m
+(hine-generated)j Fc(HTML)p Fo(,)330 3052 y(P)m(ostScript)31
+b(or)f Fc(PDF)h Fo(pro)s(duced)d(b)m(y)j(some)f(w)m(ord)g(pro)s
+(cessors)g(for)g(output)g(purp)s(oses)f(only)-8 b(.)330
+3203 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m(ted)f(b)
+s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f(follo)m
+(wing)330 3313 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g(legibly)-8
+b(,)30 b(the)e(material)h(this)e(License)i(requires)e(to)h(app)s(ear)f
+(in)h(the)330 3422 y(title)g(page.)40 b(F)-8 b(or)28
+b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h(an)m(y)e
+(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330
+3532 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s
+(earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330
+3641 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330
+3792 y(The)j(\\publisher")g(means)h(an)m(y)f(p)s(erson)g(or)h(en)m(tit)
+m(y)h(that)f(distributes)f(copies)i(of)e(the)h(Do)s(cumen)m(t)330
+3902 y(to)c(the)g(public.)330 4052 y(A)f(section)h(\\En)m(titled)g
+(XYZ")f(means)f(a)h(named)g(subunit)e(of)h(the)h(Do)s(cumen)m(t)h
+(whose)e(title)i(either)330 4162 y(is)d(precisely)g(XYZ)g(or)f(con)m
+(tains)i(XYZ)f(in)f(paren)m(theses)i(follo)m(wing)g(text)g(that)f
+(translates)h(XYZ)e(in)330 4271 y(another)e(language.)40
+b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g(sp)s(eci\014c)g(section)h(name)f
+(men)m(tioned)h(b)s(elo)m(w,)g(suc)m(h)330 4381 y(as)i(\\Ac)m(kno)m
+(wledgemen)m(ts",)33 b(\\Dedications",)e(\\Endorsemen)m(ts",)e(or)f
+(\\History".\))42 b(T)-8 b(o)29 b(\\Preserv)m(e)330 4491
+y(the)34 b(Title")h(of)e(suc)m(h)h(a)g(section)g(when)f(y)m(ou)h(mo)s
+(dify)e(the)i(Do)s(cumen)m(t)h(means)e(that)h(it)g(remains)g(a)330
+4600 y(section)e(\\En)m(titled)f(XYZ")g(according)g(to)g(this)g
+(de\014nition.)330 4751 y(The)c(Do)s(cumen)m(t)i(ma)m(y)f(include)f(W)
+-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)g(the)g(notice)h(whic)m
+(h)e(states)i(that)330 4861 y(this)34 b(License)g(applies)g(to)h(the)f
+(Do)s(cumen)m(t.)52 b(These)33 b(W)-8 b(arran)m(t)m(y)36
+b(Disclaimers)f(are)g(considered)e(to)330 4970 y(b)s(e)k(included)g(b)m
+(y)g(reference)h(in)g(this)f(License,)j(but)d(only)h(as)g(regards)f
+(disclaiming)i(w)m(arran)m(ties:)330 5080 y(an)m(y)e(other)g
+(implication)i(that)e(these)g(W)-8 b(arran)m(t)m(y)39
+b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g(and)f(has)h(no)330
+5189 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h(this)f(License.)199
+5340 y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)p eop end
+%%Page: 28 31
+TeXDict begin 28 30 bop 150 -116 a Fo(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(28)330 299 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h
+(the)g(Do)s(cumen)m(t)h(in)f(an)m(y)g(medium,)h(either)g(commercially)h
+(or)330 408 y(noncommercially)-8 b(,)48 b(pro)m(vided)42
+b(that)h(this)f(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j
+(and)42 b(the)h(license)330 518 y(notice)37 b(sa)m(ying)g(this)e
+(License)i(applies)e(to)i(the)f(Do)s(cumen)m(t)g(are)g(repro)s(duced)e
+(in)i(all)g(copies,)j(and)330 628 y(that)27 b(y)m(ou)g(add)f(no)h
+(other)f(conditions)h(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f
+(License.)40 b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330
+737 y(tec)m(hnical)35 b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h
+(the)f(reading)g(or)g(further)e(cop)m(ying)j(of)f(the)g(copies)330
+847 y(y)m(ou)25 b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28
+b(y)m(ou)d(ma)m(y)g(accept)h(comp)s(ensation)f(in)f(exc)m(hange)j(for)d
+(copies.)330 956 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f
+(n)m(um)m(b)s(er)f(of)h(copies)h(y)m(ou)f(m)m(ust)h(also)g(follo)m(w)g
+(the)f(conditions)330 1066 y(in)e(section)i(3.)330 1200
+y(Y)-8 b(ou)21 b(ma)m(y)h(also)f(lend)g(copies,)i(under)d(the)h(same)g
+(conditions)g(stated)h(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g
+(publicly)330 1310 y(displa)m(y)31 b(copies.)199 1443
+y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1577 y(If)25
+b(y)m(ou)g(publish)f(prin)m(ted)g(copies)i(\(or)g(copies)g(in)f(media)g
+(that)h(commonly)g(ha)m(v)m(e)g(prin)m(ted)f(co)m(v)m(ers\))i(of)330
+1687 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f
+(100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)f(notice)h(requires)330
+1797 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i
+(the)e(copies)h(in)f(co)m(v)m(ers)i(that)f(carry)-8 b(,)36
+b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 1906 y(these)j(Co)m(v)m
+(er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41
+b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44
+b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330
+2016 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m)
+m(ust)e(also)h(clearly)g(and)f(legibly)h(iden)m(tify)f(y)m(ou)h(as)f
+(the)h(publisher)330 2125 y(of)k(these)h(copies.)53 b(The)34
+b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)f(title)i
+(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 2235 y(equally)e
+(prominen)m(t)e(and)g(visible.)43 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g
+(other)g(material)h(on)f(the)g(co)m(v)m(ers)h(in)e(addition.)330
+2345 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v)
+m(ers,)i(as)d(long)h(as)g(they)f(preserv)m(e)g(the)h(title)g(of)g(the)
+330 2454 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d
+(b)s(e)g(treated)h(as)f(v)m(erbatim)h(cop)m(ying)g(in)f(other)330
+2564 y(resp)s(ects.)330 2698 y(If)32 b(the)h(required)f(texts)i(for)e
+(either)h(co)m(v)m(er)i(are)e(to)s(o)g(v)m(oluminous)g(to)g(\014t)g
+(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 2807 y(the)h(\014rst)f
+(ones)h(listed)g(\(as)h(man)m(y)f(as)g(\014t)g(reasonably\))g(on)g(the)
+g(actual)h(co)m(v)m(er,)h(and)e(con)m(tin)m(ue)h(the)330
+2917 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 3051
+y(If)27 b(y)m(ou)g(publish)e(or)i(distribute)g(Opaque)f(copies)i(of)f
+(the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)f(more)i(than)e(100,)330
+3160 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g
+(T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)g(with)e(eac)m(h)i(Opaque)
+330 3270 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h
+(Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)h(from)d
+(whic)m(h)330 3380 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e
+(has)h(access)i(to)f(do)m(wnload)f(using)g(public-standard)f(net)m(w)m
+(ork)330 3489 y(proto)s(cols)40 b(a)f(complete)h(T)-8
+b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g
+(added)f(material.)67 b(If)330 3599 y(y)m(ou)39 b(use)g(the)g(latter)h
+(option,)h(y)m(ou)f(m)m(ust)e(tak)m(e)j(reasonably)e(pruden)m(t)e
+(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3708 y(distribution)f(of)g
+(Opaque)g(copies)h(in)e(quan)m(tit)m(y)-8 b(,)43 b(to)38
+b(ensure)g(that)h(this)f(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330
+3818 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s
+(cation)h(un)m(til)e(at)h(least)h(one)e(y)m(ear)h(after)g(the)f(last)h
+(time)330 3927 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i
+(\(directly)g(or)e(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))h
+(of)f(that)330 4037 y(edition)31 b(to)g(the)g(public.)330
+4171 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g
+(con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330
+4281 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s
+(er)d(of)i(copies,)h(to)f(giv)m(e)h(them)f(a)g(c)m(hance)h(to)f(pro)m
+(vide)g(y)m(ou)330 4390 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g
+(the)f(Do)s(cumen)m(t.)199 4524 y(4.)61 b(MODIFICA)-8
+b(TIONS)330 4658 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a)
+h(Mo)s(di\014ed)f(V)-8 b(ersion)26 b(of)g(the)g(Do)s(cumen)m(t)g(under)
+e(the)h(conditions)330 4768 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v)
+m(e,)k(pro)m(vided)20 b(that)i(y)m(ou)f(release)i(the)e(Mo)s(di\014ed)f
+(V)-8 b(ersion)22 b(under)d(precisely)330 4877 y(this)29
+b(License,)h(with)f(the)g(Mo)s(di\014ed)f(V)-8 b(ersion)30
+b(\014lling)f(the)g(role)h(of)f(the)g(Do)s(cumen)m(t,)h(th)m(us)f
+(licensing)330 4987 y(distribution)k(and)h(mo)s(di\014cation)g(of)h
+(the)f(Mo)s(di\014ed)f(V)-8 b(ersion)35 b(to)g(who)s(ev)m(er)f(p)s
+(ossesses)f(a)i(cop)m(y)g(of)330 5096 y(it.)41 b(In)30
+b(addition,)h(y)m(ou)f(m)m(ust)h(do)f(these)h(things)f(in)g(the)h(Mo)s
+(di\014ed)e(V)-8 b(ersion:)357 5230 y(A.)60 b(Use)33
+b(in)f(the)h(Title)h(P)m(age)g(\(and)f(on)f(the)h(co)m(v)m(ers,)i(if)e
+(an)m(y\))g(a)g(title)h(distinct)f(from)g(that)g(of)g(the)510
+5340 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f(previous)f(v)m
+(ersions)h(\(whic)m(h)g(should,)g(if)g(there)g(w)m(ere)g(an)m(y)-8
+b(,)p eop end
+%%Page: 29 32
+TeXDict begin 29 31 bop 150 -116 a Fo(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(29)510 299 y(b)s(e)31 b(listed)h(in)f(the)g(History)h(section)g(of)g
+(the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same)
+h(title)h(as)510 408 y(a)e(previous)f(v)m(ersion)g(if)h(the)f(original)
+i(publisher)d(of)h(that)h(v)m(ersion)g(giv)m(es)h(p)s(ermission.)360
+545 y(B.)61 b(List)31 b(on)f(the)h(Title)g(P)m(age,)i(as)d(authors,)h
+(one)g(or)f(more)h(p)s(ersons)e(or)h(en)m(tities)j(resp)s(onsible)c
+(for)510 655 y(authorship)c(of)h(the)h(mo)s(di\014cations)f(in)g(the)g
+(Mo)s(di\014ed)f(V)-8 b(ersion,)28 b(together)g(with)d(at)i(least)h
+(\014v)m(e)510 765 y(of)c(the)g(principal)g(authors)f(of)i(the)f(Do)s
+(cumen)m(t)g(\(all)h(of)g(its)f(principal)g(authors,)h(if)f(it)g(has)g
+(few)m(er)510 874 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g
+(y)m(ou)g(from)f(this)g(requiremen)m(t.)359 1011 y(C.)60
+b(State)32 b(on)e(the)h(Title)h(page)f(the)g(name)g(of)g(the)g
+(publisher)e(of)i(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)32
+b(as)f(the)510 1121 y(publisher.)355 1258 y(D.)61 b(Preserv)m(e)31
+b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f(of)g(the)f(Do)s(cumen)m(t.)
+363 1395 y(E.)60 b(Add)30 b(an)i(appropriate)f(cop)m(yrigh)m(t)i
+(notice)f(for)g(y)m(our)f(mo)s(di\014cations)g(adjacen)m(t)i(to)f(the)g
+(other)510 1504 y(cop)m(yrigh)m(t)g(notices.)365 1641
+y(F.)61 b(Include,)28 b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g
+(notices,)h(a)e(license)h(notice)g(giving)g(the)f(public)510
+1751 y(p)s(ermission)23 b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8
+b(ersion)25 b(under)e(the)i(terms)f(of)h(this)f(License,)j(in)d(the)g
+(form)510 1861 y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353
+1998 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f
+(full)g(lists)g(of)g(In)m(v)-5 b(arian)m(t)23 b(Sections)h(and)e
+(required)g(Co)m(v)m(er)510 2107 y(T)-8 b(exts)31 b(giv)m(en)g(in)f
+(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2244
+y(H.)60 b(Include)30 b(an)g(unaltered)g(cop)m(y)h(of)g(this)f(License.)
+392 2381 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g
+(\\History",)h(Preserv)m(e)f(its)f(Title,)i(and)d(add)h(to)h(it)f(an)g
+(item)510 2491 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d
+(authors,)i(and)e(publisher)f(of)j(the)f(Mo)s(di\014ed)f(V)-8
+b(ersion)510 2600 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45
+b(If)31 b(there)h(is)f(no)g(section)i(En)m(titled)f(\\History")h(in)e
+(the)g(Do)s(cu-)510 2710 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f
+(title,)i(y)m(ear,)g(authors,)f(and)e(publisher)f(of)i(the)g(Do)s
+(cumen)m(t)510 2819 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i
+(then)d(add)g(an)g(item)g(describing)g(the)g(Mo)s(di\014ed)g(V)-8
+b(ersion)37 b(as)510 2929 y(stated)31 b(in)f(the)h(previous)f(sen)m
+(tence.)378 3066 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s
+(cation,)i(if)d(an)m(y)-8 b(,)34 b(giv)m(en)f(in)g(the)f(Do)s(cumen)m
+(t)h(for)g(public)e(access)j(to)510 3176 y(a)e(T)-8 b(ransparen)m(t)30
+b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m(ewise)h(the)g(net)
+m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3285 y(the)g(Do)s(cumen)m
+(t)g(for)g(previous)f(v)m(ersions)h(it)g(w)m(as)g(based)f(on.)45
+b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3395
+y(\\History")27 b(section.)40 b(Y)-8 b(ou)25 b(ma)m(y)h(omit)g(a)f(net)
+m(w)m(ork)h(lo)s(cation)g(for)f(a)h(w)m(ork)f(that)g(w)m(as)h
+(published)510 3504 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e
+(the)h(Do)s(cumen)m(t)h(itself,)h(or)d(if)h(the)g(original)h(publisher)
+d(of)i(the)510 3614 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s
+(ermission.)354 3751 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m
+(titled)h(\\Ac)m(kno)m(wledgemen)m(ts")i(or)d(\\Dedications",)k
+(Preserv)m(e)c(the)g(Title)510 3861 y(of)j(the)f(section,)j(and)d
+(preserv)m(e)h(in)f(the)h(section)g(all)h(the)e(substance)h(and)f(tone)
+h(of)f(eac)m(h)i(of)f(the)510 3970 y(con)m(tributor)k(ac)m(kno)m
+(wledgemen)m(ts)i(and/or)d(dedications)h(giv)m(en)h(therein.)368
+4107 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5
+b(arian)m(t)36 b(Sections)g(of)f(the)h(Do)s(cumen)m(t,)h(unaltered)f
+(in)f(their)g(text)i(and)510 4217 y(in)f(their)g(titles.)58
+b(Section)37 b(n)m(um)m(b)s(ers)d(or)i(the)g(equiv)-5
+b(alen)m(t)38 b(are)e(not)g(considered)g(part)g(of)g(the)510
+4326 y(section)c(titles.)341 4463 y(M.)61 b(Delete)33
+b(an)m(y)e(section)h(En)m(titled)f(\\Endorsemen)m(ts".)42
+b(Suc)m(h)30 b(a)i(section)f(ma)m(y)h(not)f(b)s(e)f(included)510
+4573 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357
+4710 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f
+(to)g(b)s(e)f(En)m(titled)h(\\Endorsemen)m(ts")g(or)f(to)h(con\015ict)g
+(in)510 4819 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31
+b(Section.)354 4956 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 5121 y(If)h(the)g(Mo)s(di\014ed)g
+(V)-8 b(ersion)34 b(includes)f(new)g(fron)m(t-matter)i(sections)f(or)f
+(app)s(endices)g(that)h(qualify)330 5230 y(as)28 b(Secondary)g
+(Sections)g(and)f(con)m(tain)j(no)d(material)j(copied)e(from)f(the)h
+(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)330 5340 y(y)m(our)k(option)h
+(designate)h(some)e(or)h(all)g(of)f(these)h(sections)h(as)e(in)m(v)-5
+b(arian)m(t.)48 b(T)-8 b(o)33 b(do)f(this,)h(add)f(their)p
+eop end
+%%Page: 30 33
+TeXDict begin 30 32 bop 150 -116 a Fo(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(30)330 299 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5
+b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8
+b(ersion's)36 b(license)g(notice.)57 b(These)330 408
+y(titles)32 b(m)m(ust)e(b)s(e)g(distinct)h(from)e(an)m(y)i(other)g
+(section)g(titles.)330 551 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section)
+i(En)m(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g
+(nothing)g(but)330 661 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s
+(di\014ed)g(V)-8 b(ersion)31 b(b)m(y)e(v)-5 b(arious)30
+b(parties|for)g(example,)g(statemen)m(ts)i(of)330 770
+y(p)s(eer)27 b(review)g(or)g(that)h(the)f(text)i(has)d(b)s(een)h(appro)
+m(v)m(ed)g(b)m(y)g(an)h(organization)h(as)e(the)h(authoritativ)m(e)330
+880 y(de\014nition)i(of)h(a)f(standard.)330 1022 y(Y)-8
+b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g(up)e(to)i(\014v)m(e)g(w)m
+(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er)30 b(T)-8
+b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 1132 y(to)g(25)g(w)m(ords)e
+(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext,)29 b(to)f(the)f(end)f(of)i
+(the)f(list)h(of)f(Co)m(v)m(er)h(T)-8 b(exts)27 b(in)g(the)h(Mo)s
+(di\014ed)330 1241 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f
+(F)-8 b(ron)m(t-Co)m(v)m(er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m
+(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1351
+y(added)27 b(b)m(y)g(\(or)h(through)f(arrangemen)m(ts)h(made)g(b)m(y\))
+g(an)m(y)g(one)f(en)m(tit)m(y)-8 b(.)42 b(If)27 b(the)h(Do)s(cumen)m(t)
+g(already)330 1461 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g
+(same)h(co)m(v)m(er,)h(previously)e(added)f(b)m(y)h(y)m(ou)g(or)g(b)m
+(y)g(arrangemen)m(t)330 1570 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m
+(y)i(y)m(ou)f(are)f(acting)i(on)e(b)s(ehalf)f(of,)j(y)m(ou)f(ma)m(y)g
+(not)f(add)g(another;)j(but)330 1680 y(y)m(ou)c(ma)m(y)h(replace)g(the)
+f(old)g(one,)i(on)e(explicit)h(p)s(ermission)e(from)g(the)i(previous)e
+(publisher)f(that)330 1789 y(added)e(the)g(old)h(one.)330
+1932 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s
+(cumen)m(t)h(do)g(not)f(b)m(y)h(this)f(License)h(giv)m(e)h(p)s
+(ermission)330 2041 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g
+(for)h(or)f(to)h(assert)g(or)f(imply)g(endorsemen)m(t)g(of)h(an)m(y)g
+(Mo)s(di\014ed)330 2151 y(V)-8 b(ersion.)199 2293 y(5.)61
+b(COMBINING)31 b(DOCUMENTS)330 2436 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m
+(bine)h(the)f(Do)s(cumen)m(t)g(with)g(other)f(do)s(cumen)m(ts)h
+(released)g(under)f(this)g(License,)330 2545 y(under)f(the)h(terms)g
+(de\014ned)f(in)h(section)h(4)g(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)f
+(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2655
+y(include)25 b(in)g(the)g(com)m(bination)i(all)f(of)g(the)f(In)m(v)-5
+b(arian)m(t)26 b(Sections)g(of)g(all)g(of)f(the)h(original)g(do)s
+(cumen)m(ts,)330 2765 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g
+(as)g(In)m(v)-5 b(arian)m(t)28 b(Sections)f(of)g(y)m(our)g(com)m(bined)
+g(w)m(ork)f(in)h(its)g(license)330 2874 y(notice,)32
+b(and)e(that)h(y)m(ou)f(preserv)m(e)h(all)g(their)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 3017 y(The)e(com)m(bined)g(w)m
+(ork)h(need)e(only)i(con)m(tain)g(one)g(cop)m(y)g(of)f(this)g(License,)
+i(and)d(m)m(ultiple)i(iden)m(tical)330 3126 y(In)m(v)-5
+b(arian)m(t)33 b(Sections)g(ma)m(y)g(b)s(e)f(replaced)h(with)f(a)h
+(single)g(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)g(In)m
+(v)-5 b(arian)m(t)330 3236 y(Sections)27 b(with)g(the)g(same)g(name)g
+(but)f(di\013eren)m(t)h(con)m(ten)m(ts,)i(mak)m(e)f(the)f(title)h(of)f
+(eac)m(h)h(suc)m(h)f(section)330 3345 y(unique)33 b(b)m(y)h(adding)f
+(at)i(the)f(end)g(of)g(it,)h(in)f(paren)m(theses,)i(the)e(name)g(of)g
+(the)g(original)h(author)f(or)330 3455 y(publisher)23
+b(of)i(that)h(section)g(if)f(kno)m(wn,)h(or)f(else)h(a)f(unique)f(n)m
+(um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330
+3565 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5
+b(arian)m(t)26 b(Sections)f(in)f(the)g(license)i(notice)g(of)e(the)h
+(com)m(bined)330 3674 y(w)m(ork.)330 3817 y(In)41 b(the)g(com)m
+(bination,)46 b(y)m(ou)41 b(m)m(ust)g(com)m(bine)h(an)m(y)g(sections)g
+(En)m(titled)g(\\History")h(in)e(the)g(v)-5 b(ari-)330
+3926 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h
+(En)m(titled)g(\\History";)i(lik)m(ewise)f(com)m(bine)f(an)m(y)330
+4036 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31
+b(an)m(y)h(sections)h(En)m(titled)g(\\Dedications".)47
+b(Y)-8 b(ou)330 4145 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m
+(titled)f(\\Endorsemen)m(ts.")199 4288 y(6.)61 b(COLLECTIONS)28
+b(OF)i(DOCUMENTS)330 4430 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f
+(collection)i(consisting)f(of)f(the)g(Do)s(cumen)m(t)g(and)g(other)g
+(do)s(cumen)m(ts)f(released)330 4540 y(under)41 b(this)h(License,)k
+(and)c(replace)h(the)g(individual)f(copies)h(of)f(this)g(License)h(in)f
+(the)h(v)-5 b(arious)330 4650 y(do)s(cumen)m(ts)42 b(with)g(a)h(single)
+g(cop)m(y)h(that)f(is)f(included)g(in)g(the)h(collection,)48
+b(pro)m(vided)42 b(that)i(y)m(ou)330 4759 y(follo)m(w)38
+b(the)g(rules)e(of)h(this)g(License)h(for)f(v)m(erbatim)h(cop)m(ying)g
+(of)f(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)h(all)330
+4869 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32
+b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h
+(collection,)i(and)d(distribute)g(it)h(individu-)330
+5121 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g
+(a)g(cop)m(y)h(of)f(this)g(License)g(in)m(to)h(the)g(extracted)330
+5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g
+(other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330
+5340 y(that)d(do)s(cumen)m(t.)p eop end
+%%Page: 31 34
+TeXDict begin 31 33 bop 150 -116 a Fo(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(31)199 299 y(7.)61 b(A)m(GGREGA)-8 b(TION)32 b(WITH)e(INDEPENDENT)h
+(W)m(ORKS)330 441 y(A)d(compilation)i(of)e(the)g(Do)s(cumen)m(t)h(or)f
+(its)g(deriv)-5 b(ativ)m(es)30 b(with)d(other)i(separate)g(and)e(indep)
+s(enden)m(t)330 551 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h
+(on)f(a)g(v)m(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g
+(is)h(called)330 661 y(an)c(\\aggregate")k(if)c(the)g(cop)m(yrigh)m(t)i
+(resulting)e(from)f(the)i(compilation)g(is)f(not)h(used)e(to)i(limit)g
+(the)330 770 y(legal)d(righ)m(ts)f(of)g(the)g(compilation's)h(users)e
+(b)s(ey)m(ond)g(what)g(the)h(individual)f(w)m(orks)g(p)s(ermit.)39
+b(When)330 880 y(the)g(Do)s(cumen)m(t)g(is)f(included)g(in)g(an)g
+(aggregate,)44 b(this)38 b(License)h(do)s(es)f(not)h(apply)f(to)h(the)g
+(other)330 989 y(w)m(orks)30 b(in)g(the)h(aggregate)i(whic)m(h)d(are)h
+(not)g(themselv)m(es)g(deriv)-5 b(ativ)m(e)32 b(w)m(orks)f(of)f(the)h
+(Do)s(cumen)m(t.)330 1132 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8
+b(ext)23 b(requiremen)m(t)g(of)g(section)h(3)f(is)g(applicable)h(to)f
+(these)h(copies)f(of)g(the)g(Do)s(cumen)m(t,)330 1241
+y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f(than)g(one)h(half)f
+(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s(cumen)m(t's)g(Co)m(v)m
+(er)330 1351 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)h(on)g(co)m(v)m
+(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)f(the)h
+(aggregate,)j(or)d(the)330 1461 y(electronic)37 b(equiv)-5
+b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m(t)h(is)f
+(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330
+1570 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f
+(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1713 y(8.)61
+b(TRANSLA)-8 b(TION)330 1855 y(T)g(ranslation)41 b(is)f(considered)f(a)
+i(kind)e(of)h(mo)s(di\014cation,)j(so)d(y)m(ou)g(ma)m(y)h(distribute)e
+(translations)330 1965 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h
+(terms)h(of)f(section)i(4.)83 b(Replacing)45 b(In)m(v)-5
+b(arian)m(t)45 b(Sections)g(with)330 2074 y(translations)h(requires)f
+(sp)s(ecial)h(p)s(ermission)f(from)g(their)g(cop)m(yrigh)m(t)i
+(holders,)i(but)c(y)m(ou)g(ma)m(y)330 2184 y(include)24
+b(translations)i(of)e(some)h(or)g(all)g(In)m(v)-5 b(arian)m(t)25
+b(Sections)g(in)f(addition)h(to)g(the)g(original)h(v)m(ersions)330
+2293 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44
+b(Y)-8 b(ou)32 b(ma)m(y)g(include)f(a)h(translation)g(of)g(this)f
+(License,)i(and)d(all)j(the)330 2403 y(license)42 b(notices)g(in)f(the)
+h(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42
+b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2513
+y(also)f(include)f(the)g(original)h(English)f(v)m(ersion)g(of)g(this)g
+(License)h(and)e(the)h(original)h(v)m(ersions)g(of)330
+2622 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33
+b(case)i(of)g(a)f(disagreemen)m(t)h(b)s(et)m(w)m(een)g(the)f
+(translation)i(and)330 2732 y(the)f(original)i(v)m(ersion)e(of)h(this)f
+(License)h(or)f(a)g(notice)i(or)e(disclaimer,)i(the)f(original)g(v)m
+(ersion)g(will)330 2841 y(prev)-5 b(ail.)330 2984 y(If)28
+b(a)h(section)h(in)e(the)h(Do)s(cumen)m(t)h(is)e(En)m(titled)i(\\Ac)m
+(kno)m(wledgemen)m(ts",)i(\\Dedications",)g(or)d(\\His-)330
+3093 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m
+(e)g(its)f(Title)i(\(section)f(1\))g(will)g(t)m(ypically)h(require)330
+3203 y(c)m(hanging)j(the)g(actual)h(title.)199 3345 y(9.)61
+b(TERMINA)-8 b(TION)330 3488 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8
+b(,)31 b(mo)s(dify)-8 b(,)30 b(sublicense,)g(or)g(distribute)f(the)h
+(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3598 y(pro)m(vided)38
+b(under)f(this)i(License.)65 b(An)m(y)39 b(attempt)h(otherwise)f(to)g
+(cop)m(y)-8 b(,)42 b(mo)s(dify)-8 b(,)40 b(sublicense,)h(or)330
+3707 y(distribute)30 b(it)h(is)f(v)m(oid,)h(and)f(will)h(automatically)
+i(terminate)f(y)m(our)e(righ)m(ts)h(under)e(this)h(License.)330
+3850 y(Ho)m(w)m(ev)m(er,)35 b(if)e(y)m(ou)f(cease)i(all)f(violation)i
+(of)d(this)g(License,)i(then)e(y)m(our)h(license)g(from)f(a)h
+(particular)330 3959 y(cop)m(yrigh)m(t)k(holder)e(is)h(reinstated)h
+(\(a\))f(pro)m(visionally)-8 b(,)39 b(unless)c(and)g(un)m(til)h(the)g
+(cop)m(yrigh)m(t)h(holder)330 4069 y(explicitly)42 b(and)e(\014nally)h
+(terminates)g(y)m(our)g(license,)j(and)c(\(b\))h(p)s(ermanen)m(tly)-8
+b(,)43 b(if)e(the)g(cop)m(yrigh)m(t)330 4178 y(holder)34
+b(fails)h(to)g(notify)g(y)m(ou)g(of)f(the)h(violation)h(b)m(y)e(some)h
+(reasonable)g(means)g(prior)e(to)i(60)h(da)m(ys)330 4288
+y(after)31 b(the)f(cessation.)330 4430 y(Moreo)m(v)m(er,)k(y)m(our)d
+(license)i(from)e(a)h(particular)f(cop)m(yrigh)m(t)i(holder)e(is)h
+(reinstated)g(p)s(ermanen)m(tly)f(if)330 4540 y(the)d(cop)m(yrigh)m(t)h
+(holder)f(noti\014es)g(y)m(ou)g(of)g(the)g(violation)h(b)m(y)f(some)g
+(reasonable)h(means,)f(this)g(is)g(the)330 4650 y(\014rst)f(time)i(y)m
+(ou)f(ha)m(v)m(e)h(receiv)m(ed)g(notice)g(of)f(violation)i(of)e(this)f
+(License)i(\(for)f(an)m(y)g(w)m(ork\))g(from)f(that)330
+4759 y(cop)m(yrigh)m(t)33 b(holder,)g(and)e(y)m(ou)h(cure)g(the)g
+(violation)i(prior)d(to)i(30)f(da)m(ys)h(after)f(y)m(our)g(receipt)h
+(of)f(the)330 4869 y(notice.)330 5011 y(T)-8 b(ermination)28
+b(of)g(y)m(our)f(righ)m(ts)h(under)e(this)i(section)g(do)s(es)f(not)h
+(terminate)h(the)e(licenses)i(of)f(parties)330 5121 y(who)38
+b(ha)m(v)m(e)h(receiv)m(ed)h(copies)e(or)h(righ)m(ts)f(from)g(y)m(ou)g
+(under)f(this)h(License.)64 b(If)38 b(y)m(our)g(righ)m(ts)h(ha)m(v)m(e)
+330 5230 y(b)s(een)25 b(terminated)i(and)e(not)h(p)s(ermanen)m(tly)g
+(reinstated,)i(receipt)f(of)f(a)g(cop)m(y)h(of)f(some)h(or)f(all)h(of)f
+(the)330 5340 y(same)31 b(material)h(do)s(es)e(not)g(giv)m(e)i(y)m(ou)f
+(an)m(y)g(righ)m(ts)f(to)i(use)e(it.)p eop end
+%%Page: 32 35
+TeXDict begin 32 34 bop 150 -116 a Fo(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(32)154 299 y(10.)61 b(FUTURE)30 b(REVISIONS)f(OF)i(THIS)e(LICENSE)330
+433 y(The)41 b(F)-8 b(ree)43 b(Soft)m(w)m(are)f(F)-8
+b(oundation)43 b(ma)m(y)f(publish)e(new,)k(revised)d(v)m(ersions)h(of)g
+(the)g(GNU)g(F)-8 b(ree)330 543 y(Do)s(cumen)m(tation)34
+b(License)e(from)g(time)h(to)g(time.)46 b(Suc)m(h)31
+b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h(in)g(spirit)330
+653 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)m(y)h(di\013er)f
+(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i(concerns.)330
+762 y(See)c Fn(http://www.gnu.org/copy)o(left)o(/)p Fo(.)330
+897 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m(en)g(a)g
+(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39 b(If)29
+b(the)g(Do)s(cumen)m(t)330 1006 y(sp)s(eci\014es)45 b(that)h(a)g
+(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g(License)h
+(\\or)g(an)m(y)g(later)g(v)m(ersion")330 1116 y(applies)33
+b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f(follo)m(wing)i
+(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330
+1225 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m
+(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g
+(b)m(y)330 1335 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8
+b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s
+(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 1445
+y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m
+(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the)
+h(F)-8 b(ree)330 1554 y(Soft)m(w)m(are)33 b(F)-8 b(oundation.)46
+b(If)32 b(the)g(Do)s(cumen)m(t)g(sp)s(eci\014es)g(that)g(a)h(pro)m(xy)f
+(can)g(decide)g(whic)m(h)g(future)330 1664 y(v)m(ersions)h(of)g(this)f
+(License)h(can)g(b)s(e)f(used,)g(that)i(pro)m(xy's)e(public)g(statemen)
+m(t)i(of)f(acceptance)i(of)e(a)330 1773 y(v)m(ersion)e(p)s(ermanen)m
+(tly)f(authorizes)h(y)m(ou)g(to)g(c)m(ho)s(ose)g(that)g(v)m(ersion)g
+(for)f(the)h(Do)s(cumen)m(t.)154 1908 y(11.)61 b(RELICENSING)330
+2042 y(\\Massiv)m(e)39 b(Multiauthor)f(Collab)s(oration)g(Site")h(\(or)
+e(\\MMC)h(Site"\))h(means)e(an)m(y)h(W)-8 b(orld)37 b(Wide)330
+2152 y(W)-8 b(eb)36 b(serv)m(er)g(that)h(publishes)d(cop)m(yrigh)m
+(table)k(w)m(orks)e(and)f(also)i(pro)m(vides)e(prominen)m(t)h
+(facilities)330 2262 y(for)27 b(an)m(yb)s(o)s(dy)g(to)h(edit)g(those)g
+(w)m(orks.)39 b(A)28 b(public)f(wiki)h(that)g(an)m(yb)s(o)s(dy)e(can)i
+(edit)g(is)f(an)h(example)g(of)330 2371 y(suc)m(h)33
+b(a)h(serv)m(er.)51 b(A)34 b(\\Massiv)m(e)i(Multiauthor)e(Collab)s
+(oration")h(\(or)f(\\MMC"\))h(con)m(tained)g(in)f(the)330
+2481 y(site)d(means)f(an)m(y)h(set)g(of)g(cop)m(yrigh)m(table)h(w)m
+(orks)e(th)m(us)g(published)f(on)h(the)h(MMC)f(site.)330
+2615 y(\\CC-BY-SA")36 b(means)f(the)g(Creativ)m(e)i(Commons)e(A)m
+(ttribution-Share)g(Alik)m(e)i(3.0)f(license)g(pub-)330
+2725 y(lished)27 b(b)m(y)f(Creativ)m(e)j(Commons)d(Corp)s(oration,)h(a)
+g(not-for-pro\014t)g(corp)s(oration)h(with)e(a)h(principal)330
+2834 y(place)g(of)f(business)e(in)i(San)f(F)-8 b(rancisco,)29
+b(California,)f(as)e(w)m(ell)h(as)f(future)f(cop)m(yleft)i(v)m(ersions)
+f(of)g(that)330 2944 y(license)31 b(published)e(b)m(y)h(that)h(same)g
+(organization.)330 3078 y(\\Incorp)s(orate")h(means)e(to)h(publish)e
+(or)i(republish)e(a)i(Do)s(cumen)m(t,)g(in)g(whole)g(or)f(in)g(part,)h
+(as)g(part)330 3188 y(of)g(another)f(Do)s(cumen)m(t.)330
+3323 y(An)c(MMC)g(is)h(\\eligible)h(for)e(relicensing")h(if)g(it)f(is)h
+(licensed)f(under)f(this)h(License,)i(and)e(if)g(all)h(w)m(orks)330
+3432 y(that)43 b(w)m(ere)f(\014rst)f(published)f(under)h(this)h
+(License)g(somewhere)g(other)g(than)g(this)g(MMC,)h(and)330
+3542 y(subsequen)m(tly)34 b(incorp)s(orated)h(in)f(whole)h(or)g(in)f
+(part)h(in)m(to)h(the)f(MMC,)g(\(1\))h(had)e(no)h(co)m(v)m(er)h(texts)
+330 3651 y(or)30 b(in)m(v)-5 b(arian)m(t)32 b(sections,)g(and)d(\(2\))j
+(w)m(ere)f(th)m(us)f(incorp)s(orated)g(prior)g(to)h(No)m(v)m(em)m(b)s
+(er)g(1,)g(2008.)330 3786 y(The)40 b(op)s(erator)h(of)g(an)f(MMC)h
+(Site)g(ma)m(y)g(republish)e(an)h(MMC)h(con)m(tained)h(in)e(the)h(site)
+g(under)330 3895 y(CC-BY-SA)30 b(on)g(the)h(same)f(site)h(at)g(an)m(y)g
+(time)g(b)s(efore)e(August)h(1,)h(2009,)h(pro)m(vided)e(the)g(MMC)h(is)
+330 4005 y(eligible)h(for)e(relicensing.)p eop end
+%%Page: 33 36
+TeXDict begin 33 35 bop 150 -116 a Fo(App)s(endix)29
+b(A:)h(GNU)h(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)1603
+b(33)150 299 y Fm(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g(this)h(License)f
+(for)g(y)l(our)g(do)t(cumen)l(ts)150 458 y Fo(T)-8 b(o)35
+b(use)f(this)h(License)g(in)f(a)h(do)s(cumen)m(t)g(y)m(ou)f(ha)m(v)m(e)
+i(written,)g(include)f(a)f(cop)m(y)i(of)f(the)f(License)h(in)g(the)150
+568 y(do)s(cumen)m(t)30 b(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh)
+m(t)g(and)e(license)h(notices)g(just)f(after)h(the)g(title)h(page:)468
+680 y Fb(Copyright)42 b(\(C\))79 b Fa(year)g(your)40
+b(name)p Fb(.)468 767 y(Permission)i(is)e(granted)g(to)g(copy,)h
+(distribute)g(and/or)g(modify)f(this)g(document)468 854
+y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i
+(License,)f(Version)g(1.3)468 941 y(or)f(any)g(later)g(version)h
+(published)h(by)d(the)h(Free)g(Software)h(Foundation;)468
+1029 y(with)g(no)e(Invariant)j(Sections,)f(no)f(Front-Cover)h(Texts,)g
+(and)f(no)f(Back-Cover)468 1116 y(Texts.)80 b(A)40 b(copy)g(of)g(the)f
+(license)i(is)f(included)h(in)f(the)g(section)g(entitled)h(``GNU)468
+1203 y(Free)g(Documentation)h(License''.)275 1337 y Fo(If)d(y)m(ou)h
+(ha)m(v)m(e)h(In)m(v)-5 b(arian)m(t)41 b(Sections,)i(F)-8
+b(ron)m(t-Co)m(v)m(er)42 b(T)-8 b(exts)41 b(and)e(Bac)m(k-Co)m(v)m(er)k
+(T)-8 b(exts,)43 b(replace)e(the)150 1447 y(\\with)6
+b(.)22 b(.)g(.)12 b(T)-8 b(exts.")41 b(line)31 b(with)f(this:)547
+1559 y Fb(with)40 b(the)g(Invariant)h(Sections)g(being)g
+Fa(list)f(their)g(titles)p Fb(,)h(with)547 1646 y(the)f(Front-Cover)i
+(Texts)e(being)g Fa(list)p Fb(,)h(and)f(with)g(the)g(Back-Cover)h
+(Texts)547 1733 y(being)f Fa(list)p Fb(.)275 1868 y Fo(If)34
+b(y)m(ou)i(ha)m(v)m(e)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(without)f
+(Co)m(v)m(er)h(T)-8 b(exts,)38 b(or)d(some)g(other)h(com)m(bination)g
+(of)g(the)150 1978 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g
+(alternativ)m(es)i(to)e(suit)f(the)h(situation.)275 2112
+y(If)23 b(y)m(our)h(do)s(cumen)m(t)f(con)m(tains)i(non)m(trivial)g
+(examples)g(of)f(program)f(co)s(de,)j(w)m(e)e(recommend)g(releasing)150
+2222 y(these)44 b(examples)f(in)g(parallel)h(under)e(y)m(our)h(c)m
+(hoice)i(of)e(free)g(soft)m(w)m(are)h(license,)k(suc)m(h)43
+b(as)g(the)g(GNU)150 2331 y(General)31 b(Public)f(License,)i(to)f(p)s
+(ermit)e(their)i(use)f(in)g(free)g(soft)m(w)m(are.)p
+eop end
+%%Trailer
+
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/doc/rluserman.texi b/doc/rluserman.texi
new file mode 100644
index 0000000..ae9ec6e
--- /dev/null
+++ b/doc/rluserman.texi
@@ -0,0 +1,70 @@
+\input texinfo @c -*-texinfo-*-
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename rluserman.info
+@settitle GNU Readline Library
+@include version.texi
+
+@comment %**end of header (This is for running Texinfo on a region.)
+
+@copying
+This manual describes the end user interface of the GNU Readline Library
+(version @value{VERSION}, @value{UPDATED}), a library which aids in the
+consistency of user interface across discrete programs which provide
+a command line interface.
+
+Copyright @copyright{} 1988--2022 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+
+@end quotation
+@end copying
+
+@dircategory Libraries
+@direntry
+* RLuserman: (rluserman). The GNU readline library User's Manual.
+@end direntry
+
+@titlepage
+@title GNU Readline Library User Interface
+@subtitle Edition @value{EDITION}, for @code{Readline Library} Version @value{VERSION}.
+@subtitle @value{UPDATED-MONTH}
+@author Chet Ramey, Case Western Reserve University
+@author Brian Fox, Free Software Foundation
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top GNU Readline Library
+
+This document describes the end user interface of the GNU Readline Library,
+a utility which aids in the consistency of user interface across discrete
+programs which provide a command line interface.
+The Readline home page is @url{http://www.gnu.org/software/readline/}.
+
+@menu
+* Command Line Editing:: GNU Readline User's Manual.
+* GNU Free Documentation License:: License for copying this manual.
+@end menu
+@end ifnottex
+
+@include rluser.texi
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+
+@include fdl.texi
+
+@bye
diff --git a/doc/texi2dvi b/doc/texi2dvi
new file mode 100644
index 0000000..17f4355
--- /dev/null
+++ b/doc/texi2dvi
@@ -0,0 +1,1996 @@
+#! /bin/sh
+# texi2dvi --- produce DVI (or PDF) files from Texinfo (or (La)TeX) sources.
+#
+# Copyright 1992-2019 Free Software Foundation, Inc.
+#
+# 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/>.
+#
+# Originally written by Noah Friedman.
+#
+# Please send bug reports, etc. to bug-texinfo@gnu.org.
+# If possible, please send a copy of the output of the script called with
+# the `--debug' option when making a bug report.
+
+test -f /bin/ksh && test -z "$RUNNING_KSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_KSH=true; export RUNNING_KSH; exec /bin/ksh $0 ${1+"$@"}; }
+unset RUNNING_KSH
+
+# No failure shall remain unpunished.
+set -e
+
+# In case the default sed doesn't suffice.
+: ${SED=sed}
+
+program=`echo $0 | $SED -e 's!.*/!!'`
+
+build_mode=${TEXI2DVI_BUILD_MODE:-local}
+build_dir=${TEXI2DVI_BUILD_DIRECTORY:-.}
+
+orig_pwd=`pwd`
+
+# Initialize variables for option overriding and otherwise.
+# Don't use `unset' since old bourne shells don't have this command.
+# Instead, assign them an empty value.
+action=compile
+debug=false
+escape="\\"
+expand=false # true for expansion via makeinfo
+includes=
+line_error=true # pass --file-line-error to TeX
+max_iters=7 # when to quit
+oname= # --output
+out_lang=dvi
+quiet=false # let the tools' message be displayed
+set_language=
+src_specials=
+shell_escape=
+latex2html=hevea # or set to tex4ht
+textra= # Extra TeX commands to insert in the input file.
+txiprereq=19990129 # minimum texinfo.tex version with macro expansion
+verb=false # true for verbose mode
+translate_file= # name of charset translation file
+
+# We have to initialize IFS to space tab newline since we save and
+# restore IFS and apparently POSIX allows stupid/broken behavior with
+# empty-but-set IFS.
+# http://lists.gnu.org/archive/html/automake-patches/2006-05/msg00008.html
+# We need space, tab and newline, in precisely that order. And don't leave
+# trailing blanks.
+space=' '
+tab=' '
+newline='
+'
+IFS="$space$tab$newline"
+
+: ${EGREP=egrep}
+
+# Systems which define $COMSPEC or $ComSpec use semicolons to separate
+# directories in TEXINPUTS -- except for Cygwin and Msys, where COMSPEC
+# might be inherited, but : is used.
+
+# In the case of Msys, uname returns a value derived from MSYSTEM, as
+# MSYSTEM is user configurable, it is not so safe to use it to detect
+# Msys. It is safer to use OSTYPE, this is why we set MSYSTEM to
+# $OSTYPE before calling uname
+if test -n "$COMSPEC$ComSpec" \
+ && MSYSTEM=$OSTYPE uname | $EGREP -iv 'cygwin|msys' >/dev/null; then
+ path_sep=";"
+else
+ path_sep=":"
+fi
+
+
+# Pacify verbose cds.
+CDPATH=${ZSH_VERSION+.}$path_sep
+
+
+# Now we define numerous functions, with no other executable code.
+# The main program is at the end of the file.
+
+
+# Standard help and version functions.
+#
+# usage - display usage and exit successfully.
+usage ()
+{
+ cat <<EOF
+Usage: $program [OPTION]... FILE...
+ or: texi2pdf [OPTION]... FILE...
+ or: pdftexi2dvi [OPTION]... FILE...
+
+Run each Texinfo or (La)TeX FILE through TeX in turn until all
+cross-references are resolved, building all indices. The directory
+containing each FILE is searched for included files. The suffix of FILE
+is used to determine its language ((La)TeX or Texinfo). To process
+(e)plain TeX files, set the environment variable LATEX=tex.
+
+When invoked as \`texi2pdf' or given the option --pdf generate PDF output.
+Otherwise, generate DVI.
+
+General options:
+ -D, --debug turn on shell debugging (set -x)
+ -h, --help display this help and exit successfully
+ -o, --output=OFILE leave output in OFILE; only one input FILE is allowed
+ -q, --quiet no output unless errors
+ -v, --version display version information and exit successfully
+ -V, --verbose report on what is done
+ --max-iterations=N don't process files more than N times [$max_iters]
+ --mostly-clean remove auxiliary files or directories from
+ previous runs (but not the output)
+
+Output format:
+ --dvi output a DVI file [default]
+ --dvipdf output a PDF file via DVI (using a dvi-to-pdf program)
+ --html output an HTML file from LaTeX, using HeVeA
+ --info output an Info file from LaTeX, using HeVeA
+ -p, --pdf use pdftex or pdflatex for processing
+ --ps output a PostScript file via DVI (using dvips)
+ --text output a plain text file from LaTeX, using HeVeA
+
+TeX tuning:
+ -E, --expand macro expansion using makeinfo
+ -I DIR search DIR for Texinfo files
+ -l, --language=LANG specify LANG for FILE, either latex or texinfo
+ --no-line-error do not pass --file-line-error to TeX
+ --shell-escape pass --shell-escape to TeX
+ --src-specials pass --src-specials to TeX
+ --translate-file=FILE use given charset translation file for TeX
+ -t, --command=CMD insert CMD in copy of input file
+
+Build modes:
+ --build=MODE specify the treatment of auxiliary files [$build_mode]
+ --tidy same as --build=tidy
+ -c, --clean same as --build=clean
+ --build-dir=DIR specify where the tidy compilation is performed;
+ implies --tidy;
+ defaults to TEXI2DVI_BUILD_DIRECTORY [$build_dir]
+
+The MODE specifies where the TeX compilation takes place, and, as a
+consequence, how auxiliary files are treated. The build mode can also
+be set using the environment variable TEXI2DVI_BUILD_MODE.
+
+Valid values of MODE are:
+ \`local' compile in the current directory, leaving all the auxiliary
+ files around. This is the traditional TeX use.
+ \`tidy' compile in a local *.t2d directory, where the auxiliary files
+ are left. Output files are copied back to the original file.
+ \`clean' same as \`tidy', but remove the auxiliary directory afterwards.
+ Every compilation therefore requires the full cycle.
+
+The values of these environment variables are used to run the
+corresponding commands, if they are set:
+
+ BIBER BIBTEX DVIPDF DVIPS EGREP HEVEA LATEX MAKEINDEX MAKEINFO
+ PDFLATEX PDFTEX SED T4HT TEX TEX4HT TEXINDEX TEXINDY THUMBPDF_CMD
+
+Regarding --dvipdf, if DVIPDF is not set in the environment, the
+following programs are looked for (in this order): dvipdfmx dvipdfm
+dvipdf dvi2pdf dvitopdf.
+
+If Texinfo is installed on your site, then the command
+
+ info texi2dvi
+
+should give you access to more documentation.
+
+Report bugs to bug-texinfo@gnu.org,
+general questions and discussion to help-texinfo@gnu.org.
+GNU Texinfo home page: <http://www.gnu.org/software/texinfo/>
+General help using GNU software: <http://www.gnu.org/gethelp/>
+EOF
+ exit 0
+}
+
+
+# version - Display version info and exit successfully.
+version ()
+{
+ cat <<EOF
+texi2dvi (GNU Texinfo 6.7)
+
+Copyright (C) 2019 Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+EOF
+ exit 0
+}
+
+
+# Generic auxiliary functions.
+
+# Used to access files and directories after we have changed directory
+# (for --tidy).
+rel=
+
+# Change directory, updating some relative paths.
+cd_dir ()
+{
+ cd "$1"
+
+ # Check if argument or input file is absolute, and if so, make all the path
+ # variables absolute.
+ use_absolute=false
+ case $1 in
+ [\\/]* | ?:[\\/]*) # absolute path
+ use_absolute=true ;;
+ esac
+ case $in_input in
+ [\\/]* | ?:[\\/]*)
+ use_absolute=true ;;
+ esac
+
+ if $use_absolute ; then
+ for cdd_dir in work_build workdir t2ddir work_bak in_input in_dir; do
+ eval "$cdd_dir=\`absolute \$$cdd_dir\`"
+ done
+ return
+ fi
+
+ # Replace each path component with ".." and add a single trailing slash.
+ rel=`echo "$1" | \$SED -e 's/[^/\\][^/\\]*/../g' -e 's/[/\\]*$/\//'`
+}
+
+# cd_orig - Return to the original directory.
+cd_orig ()
+{
+ # In case $orig_pwd is on a different drive (for DOS).
+ cd /
+
+ # Return to the original directory so that
+ # - the next file is processed in correct conditions
+ # - the temporary file can be removed
+ cd "$orig_pwd" || exit 1
+
+ rel=
+}
+
+
+# func_dirname FILE - Return the directory part of FILE.
+func_dirname ()
+{
+ dirname "$1" 2>/dev/null \
+ || { echo "$1" | $SED 's!/[^/]*$!!;s!^$!.!'; }
+}
+
+
+# noext FILE - Return FILE with one extension removed:
+# foo.bar.baz -> foo.bar
+noext ()
+{
+ echo "$1" | $SED -e 's/\.[^/.][^/.]*$//'
+}
+
+
+# absolute NAME - Return an absolute path to NAME.
+absolute ()
+{
+ case $1 in
+ [\\/]* | ?:[\\/]*)
+ # Absolute paths don't need to be expanded.
+ echo "$1"
+ ;;
+ *) absolute_slashes=`echo "$1" | $SED -n 's,.*[^/]\(/*\)$,\1,p'`
+ absolute_rel=$orig_pwd/`func_dirname "$1"`
+ if test -d "$absolute_rel"; then
+ (cd "$absolute_rel" 2>/dev/null \
+ && absolute_name=`pwd`/`basename "$1"`"$absolute_slashes"
+ echo "$absolute_name")
+ else
+ error 1 "not a directory: $absolute_rel"
+ fi
+ ;;
+ esac
+}
+
+
+# ensure_dir DIR1 DIR2... - Make sure given directories exist.
+ensure_dir ()
+{
+ for dir
+ do
+ # Beware that in parallel builds we may have several concurrent
+ # attempts to create the directory. So fail only if "mkdir"
+ # failed *and* the directory still does not exist.
+ test -d "$dir" \
+ || mkdir "$dir" \
+ || test -d "$dir" \
+ || error 1 "cannot create directory: $dir"
+ done
+}
+
+
+# error EXIT_STATUS LINE1 LINE2... - Report an error and exit with
+# failure if EXIT_STATUS is non-null.
+error ()
+{
+ error_status="$1"
+ shift
+ report "$@"
+ if test "$error_status" != 0; then
+ exit $error_status
+ fi
+}
+
+
+# findprog PROG - Return true if PROG is somewhere in PATH, else false.
+findprog ()
+{
+ saveIFS="$IFS"
+ IFS=$path_sep # break path components at the path separator
+ for dir in $PATH; do
+ IFS=$saveIFS
+ # The basic test for an executable is `test -f $f && test -x $f'.
+ # (`test -x' is not enough, because it can also be true for directories.)
+ # We have to try this both for $1 and $1.exe.
+ #
+ # Note: On Cygwin and DJGPP, `test -x' also looks for .exe. On Cygwin,
+ # also `test -f' has this enhancement, but not on DJGPP. (Both are
+ # design decisions, so there is little chance to make them consistent.)
+ # Thusly, it seems to be difficult to make use of these enhancements.
+ #
+ if { test -f "$dir/$1" && test -x "$dir/$1"; } \
+ || { test -f "$dir/$1.exe" && test -x "$dir/$1.exe"; }; then
+ return 0
+ fi
+ done
+ return 1
+}
+
+# report LINE1 LINE2... - Echo each argument to stderr.
+report ()
+{
+ for i in "$@"
+ do
+ echo >&2 "$0: $i"
+ done
+}
+
+
+# run COMMAND-LINE - Run COMMAND-LINE verbosely, catching errors as failures.
+run ()
+{
+ verbose "Running $@"
+ "$@" 2>&5 1>&2 \
+ || error 1 "$1 failed"
+}
+
+
+# verbose WORD1 WORD2... - Echo concatenated WORDs to stderr, if $verb.
+verbose ()
+{
+ if $verb; then
+ echo >&2 "$0: $@"
+ fi
+}
+
+
+# Handling lists.
+#
+# list_append LIST-NAME ELEM - Append ELEM to (the contents of) LIST-NAME.
+list_append ()
+{
+ list_name="$1"
+ shift
+ eval set X \$$list_name "$@"
+ shift
+ eval $list_name=\""$@"\"
+}
+
+
+# list_concat_dirs LIST-NAME DIR-LIST - Append to LIST-NAME all the
+# components (including empty ones) from the $path_sep-separated list
+# DIR-LIST. Make the paths absolute.
+list_concat_dirs ()
+{
+ lcd_list="$1"
+ # Empty path components are meaningful to tex. We rewrite them as
+ # `EMPTY' so they don't get lost when we split on $path_sep.
+ # Hopefully no one will have an actual directory named EMPTY.
+ lcd_replace_EMPTY="-e 's/^$path_sep/EMPTY$path_sep/g' \
+ -e 's/$path_sep\$/${path_sep}EMPTY/g' \
+ -e 's/$path_sep$path_sep/${path_sep}EMPTY${path_sep}/g'"
+ save_IFS=$IFS
+ IFS=$path_sep
+ set x `echo "$2" | eval $SED $lcd_replace_EMPTY`; shift
+ IFS=$save_IFS
+ for lcd_dir
+ do
+ case $lcd_dir in
+ EMPTY)
+ list_append $lcd_list ""
+ ;;
+ *)
+ if test -d $lcd_dir; then
+ dir=`absolute "$lcd_dir"`
+ list_append $lcd_list "$lcd_dir"
+ fi
+ ;;
+ esac
+ done
+}
+
+
+# list_prefix LIST-NAME SEP -> STRING - Return string with each element
+# of LIST-NAME preceded by SEP.
+list_prefix ()
+{
+ lp_separator="$2"
+ eval set X \$$1
+ shift
+ lp_result=''
+ for i
+ do
+ lp_result="$lp_result \"$lp_separator\" \"$i\""
+ done
+ echo "$lp_result"
+}
+
+# list_infix LIST-NAME SEP -> STRING - Same as list_prefix, but a separator.
+list_infix ()
+{
+ eval set X \$$1
+ shift
+ save_IFS="$IFS"
+ IFS=$path_sep
+ echo "$*"
+ IFS=$save_IFS
+}
+
+# list_dir_to_abs LIST-NAME - Convert list to using only absolute dir names.
+# Currently unused, but should replace absolute_filenames some day.
+list_dir_to_abs ()
+{
+ ldta_list="$1"
+ eval set X \$$ldta_list
+ shift
+ ldta_result=''
+ for dir
+ do
+ dir=`absolute "$dir"`
+ test -d "$dir" || continue
+ ldta_result="$ldata_result \"$dir\""
+ done
+ set X $ldta_result; shift
+ eval $ldta_list=\"$@\"
+}
+
+
+# Language auxiliary functions.
+#
+# out_lang_set LANG - set $out_lang to LANG (dvi, pdf, etc.), or error.
+out_lang_set ()
+{
+ case $1 in
+ dvi|dvipdf|html|info|pdf|ps|text) out_lang=$1;;
+ *) error 1 "invalid output format: $1";;
+ esac
+}
+
+# out_lang_tex - Return the tex output language (DVI or PDF) for $out_lang.
+out_lang_tex ()
+{
+ case $out_lang in
+ dvi | ps | dvipdf ) echo dvi;;
+ pdf ) echo $out_lang;;
+ html | info | text ) echo $out_lang;;
+ *) error 1 "invalid out_lang: $1";;
+ esac
+}
+
+# out_lang_ext - Return the extension for $out_lang (pdf, dvi, etc.).
+out_lang_ext ()
+{
+ case $out_lang in
+ dvipdf ) echo pdf;;
+ dvi | html | info | pdf | ps | text ) echo $out_lang;;
+ *) error 1 "invalid out_lang: $1";;
+ esac
+}
+
+
+# TeX file auxiliary functions.
+#
+# absolute_filenames TEX-PATH -> TEX-PATH - Convert relative paths to
+# absolute, so we can run in another directory (e.g., in tidy build
+# mode, or during the macro-support detection).
+absolute_filenames ()
+{
+ # Empty path components are meaningful to tex. We rewrite them as
+ # `EMPTY' so they don't get lost when we split on $path_sep.
+ # Hopefully no one will have an actual directory named EMPTY.
+ af_replace_empty="-e 's/^$path_sep/EMPTY$path_sep/g' \
+ -e 's/$path_sep\$/${path_sep}EMPTY/g' \
+ -e 's/$path_sep$path_sep/${path_sep}EMPTY${path_sep}/g'"
+ af_result=`echo "$1" | eval $SED $af_replace_empty`
+ save_IFS=$IFS
+ IFS=$path_sep
+ set x $af_result; shift
+ af_result=
+ af_path_sep=
+ for dir
+ do
+ case $dir in
+ EMPTY)
+ af_result=$af_result$af_path_sep
+ ;;
+ *)
+ if test -d "$dir"; then
+ af_result=$af_result$af_path_sep`absolute "$dir"`
+ else
+ # Even if $dir is not a directory, preserve it in the path.
+ # It might contain metacharacters that TeX will expand in
+ # turn, e.g., /some/path/{a,b,c}. This will not get the
+ # implicit absolutification of the path, but we can't help that.
+ af_result=$af_result$af_path_sep$dir
+ fi
+ ;;
+ esac
+ af_path_sep=$path_sep
+ done
+ echo "$af_result"
+}
+
+
+# output_base_name FILE - Return the name of FILE, possibly renamed to
+# satisfy --output. FILE is local, i.e., without any directory part.
+output_base_name ()
+{
+ case $oname in
+ '') echo "$1";;
+ *) obn_out_noext=`noext "$oname"`
+ obn_file_ext=`echo "$1" | $SED 's/^.*\.//'`
+ echo "$obn_out_noext.$obn_file_ext"
+ ;;
+ esac
+}
+
+
+# destdir - Return the directory where the output is expected.
+destdir ()
+{
+ case $oname in
+ '') echo "$orig_pwd";;
+ *) dirname "$oname";;
+ esac
+}
+
+
+# move_to_dest FILE... - Move FILE(s) to the place where the user expects.
+# Truly move it, that is, it must not remain in its build location
+# unless that is also the output location. (Otherwise it might appear
+# as an extra file in make distcheck.)
+#
+# FILE can be the principal output (in which case -o directly applies),
+# or an auxiliary file with the same base name.
+move_to_dest ()
+{
+# echo "move_to_dest $*, tidy=$tidy, oname=$oname"
+
+ # If we built in place and have no output name, there is nothing to
+ # do, so just return.
+ case $tidy:$oname in
+ false:) return;;
+ esac
+
+ for file
+ do
+ test -f "$file" \
+ || error 1 "no such file or directory: $file"
+ case $tidy:$oname in
+ true:) mtd_destdir=$orig_pwd
+ mtd_destfile=$mtd_destdir/$file;;
+ true:*) mtd_destfile=`output_base_name "$file"`
+ mtd_destdir=`dirname "$mtd_destfile"`;;
+ false:*) mtd_destfile=$oname
+ mtd_destdir=`dirname "$mtd_destfile"`;;
+ esac
+
+ # We want to compare the source location and the output location,
+ # and if they are different, do the move. But if they are the
+ # same, we must preserve the source. Since we can't assume
+ # stat(1) or test -ef is available, resort to comparing the
+ # directory names, canonicalized with pwd. We can't use cmp -s
+ # since the output file might not actually change from run to run;
+ # e.g., TeX DVI output is timestamped to only the nearest minute.
+ mtd_destdir=`cd "$mtd_destdir" && pwd`
+ mtd_destbase=`basename "$mtd_destfile"`
+
+ mtd_sourcedir=`dirname "$file"`
+ mtd_sourcedir=`cd "$mtd_sourcedir" && pwd`
+ mtd_sourcebase=`basename "$file"`
+
+ if test "$mtd_sourcedir/$mtd_sourcebase" != "$mtd_destdir/$mtd_destbase"
+ then
+ verbose "Moving $file to $mtd_destfile"
+ rm -f "$mtd_destfile"
+ mv "$file" "$mtd_destfile"
+ fi
+ done
+}
+
+
+# Managing xref files.
+#
+# aux_file_p FILE - Echo FILE if FILE is an aux file.
+aux_file_p ()
+{
+ test -f "$1" || return 0
+ case $1 in
+ *.aux) echo "$1";;
+ *) return 0;;
+ esac
+}
+
+# bibaux_file_p FILE - Echo FILE if FILE contains citation requests.
+bibaux_file_p ()
+{
+ test -s "$1" || return 0
+ if (grep '^\\bibstyle[{]' "$1" \
+ && grep '^\\bibdata[{]' "$1" \
+ ## The following line is suspicious: fails when there
+ ## are citations in sub aux files. We need to be
+ ## smarter in this case.
+ ## && grep '^\\citation[{]' "$f"
+ ) >&6 2>&1;
+ then
+ echo "$1"
+ fi
+ return 0
+}
+
+# index_file_p FILE - Echo FILE if FILE is an index file.
+index_file_p ()
+{
+ test -f "$1" || return 0
+ case $in_lang:$latex2html:`out_lang_tex`:`$SED '1q' "$1"` in
+ # When working with TeX4HT, *.idx are created by LaTeX. They must
+ # be processed to produce *.4ix, *.4dx files. The *.4dx file is
+ # passed to makeindex to produce the *.ind file. This sequence is
+ # handled by run_index, so we are only interested in the *.idx
+ # files, which have each "\indexentry" preceded by a
+ # "\beforeentry".
+ latex:tex4ht:html:"\\beforeentry {"*) echo $1;;
+
+ # When index.sty is used, there is a space before the brace.
+ latex:*:*:"\\indexentry{"*|latex:*:*:"\\indexentry {"*) echo $1;;
+
+ texinfo:*:*:"\\entry{"*) echo $1;;
+ texinfo:*:*:"@entry{"*) echo $1;;
+ # @entry is output from newer versions of texinfo.tex
+ esac
+ return 0
+}
+
+########### not used currently
+# xref_file_p FILE - Return success if FILE is an xref file (indexes,
+# tables and lists).
+xref_file_p ()
+{
+ test -f "$1" || return 1
+ # If the file is not suitable to be an index or xref file, don't
+ # process it. It's suitable if the first character is a
+ # backslash or right quote or at, as long as the first line isn't
+ # \input texinfo.
+ case `$SED '1q' "$1"` in
+ "\\input texinfo"*) return 1;;
+ [\\''@]*) return 0;;
+ *) return 1;;
+ esac
+}
+
+
+# Used in generated_files_get
+generated_files_get_from_log ()
+{
+ if test -f "$1.log"; then
+ # Usually the output is like: \openout1 = `foobar.tex'.
+ # (including the final period)
+ # but luatex outputs: \openout1 = foobar.tex
+ # (no quotes, no period).
+ # So we have to make the punctuation optional.
+ grep '^\\openout[0-9]' "$1.log" \
+ | $SED -e "s/\\\\openout[^=]*= *[\`']*//" \
+ -e "s/'\.$//"
+ fi
+}
+
+# Used in generated_files_get
+generated_files_get_from_fls ()
+{
+ if test -f "$1.fls"; then
+ grep '^OUTPUT ' "$1.fls" | cut -b 8- \
+ | grep -v '\.dvi$' | grep -v '\.log$' | grep -v '\.pdf$' || true
+ fi
+}
+
+# generated_files_get - Output the list of files generated by the TeX
+# compilation.
+generated_files_get ()
+{
+ $generated_files_get_method "$in_noext"
+ if test $generated_files_get_method = generated_files_get_from_fls; then
+ if test -r "$in_noext.fl"; then
+ report 'WARNING!! The fl index may typeset as garbage!' # goes to stderr
+ report 'Try upgrading your version of texinfo.tex, or else try setting'
+ report 'the environment variable TEXI2DVI_USE_RECORDER to '\''no'\''.'
+report 'Once you'\''ve done that, delete the file with an '\''fl'\'' extension.'
+ fi
+ fi
+}
+
+
+# xref_files_save - set xref_files_orig from xref_files_new, and save xref
+# files in $work_bak.
+xref_files_save ()
+{
+ # Save copies of auxiliary files for later comparison.
+ xref_files_orig=$xref_files_new
+ if test -n "$xref_files_orig"; then
+ verbose "Backing up xref files: $xref_files_orig"
+ # The following line improves `cp $xref_files_orig "$work_bak"'
+ # by preserving the directory parts. Think of
+ # cp chap1/main.aux chap2/main.aux $work_bak.
+ #
+ # Users may have, e.g., --keep-old-files. Don't let this interfere.
+ # (Don't use unset for the sake of ancient shells.)
+ TAR_OPTIONS=; export TAR_OPTIONS
+ tar cf - $xref_files_orig | (cd "$rel$work_bak" && tar xf -)
+ fi
+
+ # Remove auxiliary files in same directory as main input file. Otherwise,
+ # these will likely be read instead of those in the build dir.
+ if $tidy ; then
+ secondary_xref_files=`sorted_index_files`
+ for f in $xref_files_new $secondary_xref_files ; do
+ if test -f "$rel$in_dir/$f" ; then
+ remove $rel$in_dir/$f
+ fi
+ done
+ fi
+}
+
+
+# xref_files_changed - Return success if the xref files have changed
+# since the previous run.
+xref_files_changed ()
+{
+ # LaTeX (and the package changebar) report in the LOG file if it
+ # should be rerun. This is needed for files included from
+ # subdirs, since texi2dvi does not try to compare xref files in
+ # subdirs. Performing xref files test is still good since LaTeX
+ # does not report changes in xref files.
+ if grep "Rerun to get" "$in_noext.log" >&6 2>&1; then
+ return 0
+ fi
+ # Similarly, check for biblatex report of whether rerunning is needed.
+ if grep "biblatex.*(re)run" "$in_noext.log" >&6 2>&1; then
+ return 0
+ fi
+
+ # If old and new lists don't have the same file list,
+ # then something has definitely changed.
+ xref_files_new=`generated_files_get`
+ verbose "Original xref files = $xref_files_orig"
+ verbose "New xref files = $xref_files_new"
+ if test "x$xref_files_orig" != "x$xref_files_new"; then
+ return 0
+ fi
+
+ # Compare each file until we find a difference.
+ for this_file in $xref_files_new; do
+ verbose "Comparing xref file `echo $this_file | $SED 's|\./||g'` ..."
+ # cmp -s returns nonzero exit status if files differ.
+ if cmp -s "$this_file" "$rel$work_bak/$this_file"; then :; else
+ verbose "xref file `echo $this_file | $SED 's|\./||g'` differed ..."
+ if $debug; then
+ diff -u "$rel$work_bak/$this_file" "$this_file"
+ fi
+ return 0
+ fi
+ done
+
+ secondary_xref_files=`sorted_index_files`
+ verbose "Secondary xref files = $secondary_xref_files"
+ for this_file in $secondary_xref_files; do
+ if test -f $this_file; then :; else
+ verbose "$this_file missing ..."
+ return 0
+ fi
+ done
+
+ # No change.
+ return 1
+}
+
+# Running the TeX suite.
+#
+# Set tex_cmd variable, for running TeX.
+make_tex_cmd ()
+{
+ case $in_lang:$latex2html:`out_lang_tex` in
+ latex:*:dvi|latex:tex4ht:html)
+ tex=${LATEX:-latex};;
+ latex:*:pdf)
+ tex=${PDFLATEX:-pdflatex};;
+ texinfo:*:dvi)
+ # MetaPost also uses the TEX environment variable. If the user
+ # has set TEX=latex for that reason, don't bomb out.
+ case $TEX in
+ *latex) tex=tex;; # don't bother trying to find etex
+ *) tex=$TEX
+ esac;;
+ texinfo:*:pdf) tex=$PDFTEX;;
+ *) error 1 "$out_lang not supported for $in_lang";;
+ esac
+
+ # Beware of aux files in subdirectories that require the
+ # subdirectory to exist.
+ case $in_lang:$tidy in
+ latex:true)
+ $SED -n 's|^[ ]*\\include{\(.*\)/.*}.*|\1|p' "$in_input" |
+ sort -u |
+ while read d
+ do
+ ensure_dir "$work_build/$d"
+ done
+ ;;
+ esac
+
+ # Note that this will be used via an eval: quote properly.
+ tex_cmd="$tex"
+
+ # If possible, make TeX report error locations in GNU format.
+ if $line_error; then
+ if test "${tex_help:+set}" != set; then
+ # Go to a temporary directory to try --help, since old versions that
+ # don't accept --help will generate a texput.log.
+ tex_help_dir=$t2ddir/tex_help
+ ensure_dir "$tex_help_dir"
+ tex_help=`cd "$tex_help_dir" >&6 && $tex --help </dev/null 2>&1 || true`
+ fi
+ # The mk program and perhaps others want to parse TeX's
+ # original error messages.
+ case $tex_help in
+ *file-line-error*) tex_cmd="$tex_cmd --file-line-error";;
+ esac
+ fi
+
+ # Tell TeX about -recorder option, if specified
+ # recorder_option_maybe is in { " -recorder", "" }
+ tex_cmd="$tex_cmd$recorder_option_maybe"
+
+
+ # Tell TeX about TCX file, if specified.
+ test -n "$translate_file" \
+ && tex_cmd="$tex_cmd --translate-file=$translate_file"
+
+ # Tell TeX to make source specials (for backtracking from output to
+ # source, given a sufficiently smart editor), if specified.
+ test -n "$src_specials" && tex_cmd="$tex_cmd $src_specials"
+
+ # Tell TeX to allow running external executables
+ test -n "$shell_escape" && tex_cmd="$tex_cmd $shell_escape"
+
+ # Run without interaction.
+ # \batchmode does not show terminal output at all, so we don't
+ # want that. And even in batch mode, TeX insists on having input
+ # from the user. Close its stdin to make it impossible.
+ tex_cmd="$tex_cmd </dev/null '${escape}nonstopmode'"
+}
+
+
+# run_tex - Run TeX, taking care of errors and logs.
+run_tex ()
+{
+ # Check for any unusual characters in the filename.
+ # However, >, \ and any whitespace characters are not supported
+ # filenames.
+ in_input_funnies=`echo "$in_input" \
+ | $SED -e 's![^}#$%&^_{~]!!g' -e 's!\(.\)!\1\''
+!g' | uniq`
+
+ if test -n "$in_input_funnies" ; then
+ # Make > an end group character, as it's unlikely to appear in
+ # a filename.
+ tex_cmd="$tex_cmd '${escape}bgroup${escape}catcode62=2${escape}relax'"
+
+ # If the filename has funny characters, change the TeX category codes of
+ # some characters within a group, and use \expandafter to input the file
+ # outside of the group.
+ for w in $in_input_funnies ; do
+ tex_cmd="$tex_cmd '${escape}catcode\`${escape}$w=12${escape}relax'"
+ done
+
+ # Set \toks0 to "\input FILENAME\relax"
+ tex_cmd="$tex_cmd '${escape}toks0${escape}bgroup${escape}input' '$rel$in_input' '${escape}relax>"
+
+ # Expand \toks0 after the end of the group
+ tex_cmd="$tex_cmd${escape}expandafter${escape}egroup"
+ tex_cmd="$tex_cmd${escape}the${escape}toks0${escape}relax'"
+ else
+ # In the case of a simple filename, just pass the filename
+ # with no funny tricks.
+ tex_cmd="$tex_cmd '${escape}input' '$rel$in_input'"
+ fi
+
+ verbose "$0: Running $tex_cmd ..."
+ if (eval "$tex_cmd" >&5); then
+ case $out_lang in
+ dvi | pdf ) move_to_dest "$in_noext.$out_lang";;
+ esac
+ else
+ tex_failed=true
+ fi
+}
+
+
+# run_bibtex - Run bibtex (or biber) on current file
+# - if its input (AUX) exists,
+# - or if some citations are missing (LOG contains `Citation'),
+# - or if the LOG complains of a missing .bbl.
+#
+# Don't try to be too smart:
+# 1. Running bibtex only if the bbl file exists and is older than
+# the LaTeX file is wrong, since the document might include files
+# that have changed.
+#
+# 2. Because there can be several AUX (if there are \include's),
+# but a single LOG, looking for missing citations in LOG is
+# easier, though we take the risk of matching false messages.
+run_bibtex ()
+{
+ case $in_lang in
+ latex) bibtex=${BIBTEX:-bibtex};;
+ texinfo) return;;
+ esac
+
+ # "Citation undefined" is for LaTeX, "Undefined citation" for btxmac.tex.
+ # The no .aux && \bibdata test is also for btxmac, in case it was the
+ # first run of a bibtex-using document. Otherwise, it's possible that
+ # bibtex would never be run.
+ if test -r "$in_noext.aux" \
+ && test -r "$in_noext.log" \
+ && ( (grep 'Warning:.*Citation.*undefined' "$in_noext.log" \
+ || grep '.*Undefined citation' "$in_noext.log" \
+ || grep 'No file .*\.bbl\.' "$in_noext.log") \
+ || (grep 'No \.aux file' "$in_noext.log" \
+ && grep '^\\bibdata' "$in_noext.aux") ) \
+ >&6 2>&1; \
+ then
+ bibtex_aux=`filter_files bibaux_file_p`
+ for f in $bibtex_aux; do
+ run $bibtex "$f"
+ done
+ fi
+
+ # biber(+biblatex) check.
+ if test -r "$in_noext.bcf" \
+ && grep '</bcf:controlfile>' "$in_noext.bcf" >/dev/null; then
+ run ${BIBER:-biber} "$in_noext"
+ fi
+}
+
+
+# filter_file PREDICATE - Go through the list of files in xref_files_new
+# and use PREDICATE on each one to optionally print it or print other files
+# based on the filename.
+filter_files ()
+{
+ test -n "$xref_files_new" || return 0
+ echo "$xref_files_new" |
+ # Filter existing files matching the criterion.
+ #
+ while read file; do
+ $1 "$file"
+ done |
+ sort |
+ # Some files are opened several times, e.g., listings.sty's *.vrb.
+ uniq
+}
+
+# run_index - Run texindex (or makeindex or texindy) on current index
+# files. If they already exist, and after running TeX a first time the
+# index files don't change, then there's no reason to run TeX again.
+# But we won't know that if the index files are out of date or nonexistent.
+run_index ()
+{
+ index_files=`filter_files index_file_p`
+ test -n "$index_files" \
+ || return 0
+
+ : ${MAKEINDEX:=makeindex}
+ : ${TEXINDEX:=texindex}
+ : ${TEXINDY:=texindy}
+
+ case $in_lang:$latex2html:`out_lang_tex` in
+ latex:tex4ht:html)
+ for index_file in $index_files
+ do
+ index_noext=`noext "$index_file"`
+ run tex \
+ '\def\filename{{'"$index_noext"'}{idx}{4dx}{ind}}
+ \input idxmake.4ht'
+ run $MAKEINDEX -o $index_noext.ind $index_noext.4dx
+ done
+ ;;
+
+ latex:*)
+ if $TEXINDY --version >&6 2>&1; then
+ run $TEXINDY $index_files
+ else
+ run $MAKEINDEX $index_files
+ fi
+ ;;
+
+ texinfo:*)
+ run $TEXINDEX $index_files
+ ;;
+ esac
+}
+
+
+# run_tex4ht - Run the last two phases of TeX4HT: tex4ht extracts the
+# HTML from the instrumented DVI file, and t4ht converts the figures and
+# installs the files when given -d.
+#
+# Because knowing exactly which files are created is complex (in
+# addition the names are not simple to compute), which makes it
+# difficult to install the output files in a second step, we
+# tell t4ht to install the output files.
+run_tex4ht ()
+{
+ case $in_lang:$latex2html:`out_lang_tex` in
+ latex:tex4ht:html)
+ : ${TEX4HT:=tex4ht} ${T4HT:=t4ht}
+ run "$TEX4HT" "-f/$in_noext"
+ # Do not remove the / after the destdir.
+ run "$T4HT" "-d`destdir`/" "-f/$in_noext"
+ ;;
+ esac
+}
+
+
+# run_thumbpdf - Run thumbpdf.
+run_thumbpdf ()
+{
+ if test `out_lang_tex` = pdf \
+ && test -r "$in_noext.log" \
+ && grep 'thumbpdf\.sty' "$in_noext.log" >&6 2>&1; \
+ then
+ thumbpdf=${THUMBPDF_CMD:-thumbpdf}
+ thumbcmd="$thumbpdf $in_dir/$in_noext"
+ verbose "Running $thumbcmd ..."
+ if $thumbcmd >&5; then
+ run_tex
+ else
+ report "$thumbpdf exited with bad status." \
+ "Ignoring its output."
+ fi
+ fi
+}
+
+
+# run_dvipdf FILE.dvi - Convert FILE.dvi to FILE.pdf.
+run_dvipdf ()
+{
+ # Find which dvi->pdf program is available.
+ if test -n "$DVIPDF"; then
+ dvipdf=$DVIPDF # user envvar, use it without checking
+
+ elif test -z "$dvipdf"; then
+ for i in dvipdfmx dvipdfm dvipdf dvi2pdf dvitopdf; do
+ if findprog $i; then
+ dvipdf=$i
+ fi
+ done
+ fi
+ # These tools have varying interfaces, some 'input output', others
+ # 'input -o output'. They all seem to accept 'input' only,
+ # outputting using the expected file name.
+ run $dvipdf "$1"
+ if test ! -f `echo "$1" | $SED -e 's/\.dvi$/.pdf/'`; then
+ error 1 "cannot find output file"
+ fi
+}
+
+# run_tex_suite - Run the TeX tools until a stable point is reached.
+run_tex_suite ()
+{
+ make_tex_cmd
+
+ # Move to the working directory.
+ if $tidy; then
+ verbose "cd $work_build"
+ cd_dir "$work_build" || exit 1
+ fi
+
+ # Count the number of cycles.
+ suite_cycle=0
+
+ # Start by checking the log files for what files were created last
+ # time. This will mean that if they don't change, we finish in 1 cycle.
+ xref_files_new=`generated_files_get`
+ xref_files_save
+
+ while :; do
+ # check for (probably) LaTeX loop (e.g. varioref)
+ if test $suite_cycle -eq "$max_iters"; then
+ error 0 "Maximum of $max_iters cycles exceeded"
+ break
+ fi
+
+ # report progress
+ suite_cycle=`expr $suite_cycle + 1`
+ verbose "Cycle $suite_cycle for $command_line_filename"
+
+ tex_failed=false
+ run_core_conversion
+ xref_files_changed || break
+ xref_files_save
+
+ # We run bibtex first, because it's more likely for the indexes
+ # to change after bibtex is run than the reverse, though either
+ # would be rare.
+ run_bibtex
+ run_index
+ done
+
+ if $tex_failed ; then
+ # TeX failed, and the xref files did not change.
+ error 1 "$tex exited with bad status, quitting."
+ fi
+
+ # If we were using thumbpdf and producing PDF, then run thumbpdf
+ # and TeX one last time.
+ run_thumbpdf
+
+ # If we are using tex4ht, call it.
+ run_tex4ht
+
+ # Install the result if we didn't already (i.e., if the output is
+ # dvipdf or ps).
+ case $latex2html:$out_lang in
+ *:dvipdf)
+ run_dvipdf "$in_noext.`out_lang_tex`"
+ move_to_dest "$in_noext.`out_lang_ext`"
+ ;;
+ *:ps)
+ : ${DVIPS:=dvips}
+ run $DVIPS -o "$in_noext.`out_lang_ext`" "$in_noext.`out_lang_tex`"
+ move_to_dest "$in_noext.`out_lang_ext`"
+ ;;
+ esac
+
+ cd_orig
+}
+
+
+# TeX processing auxiliary tools.
+#
+# run_makeinfo - Expand macro commands in the original source file using
+# Makeinfo. Always use `end' footnote style, since the `separate' style
+# generates different output (arguably this is a bug in -E). Discard
+# main info output, the user asked to run TeX, not makeinfo.
+run_makeinfo ()
+{
+ test $in_lang = texinfo \
+ || return 0
+
+ # Unless required by the user, makeinfo expansion is wanted only
+ # if texinfo.tex is too old.
+ if $expand; then
+ makeinfo=${MAKEINFO:-makeinfo}
+ else
+ # Check if texinfo.tex performs macro expansion by looking for
+ # its version. The version is a date of the form YEAR-MO-DA.
+ # We don't need to use [0-9] to match the digits since anyway
+ # the comparison with $txiprereq, a number, will fail with non-digits.
+ # Run in a temporary directory to avoid leaving files.
+ version_test_dir=$t2ddir/version_test
+ ensure_dir "$version_test_dir"
+ if (
+ cd "$version_test_dir"
+ echo '\input texinfo.tex @bye' >txiversion.tex
+ # Be sure that if tex wants to fail, it is not interactive:
+ # close stdin.
+ $TEX txiversion.tex </dev/null >txiversion.out 2>txiversion.err
+ ); then :; else
+ report "texinfo.tex appears to be broken.
+This may be due to the environment variable TEX set to something
+other than (plain) tex, a corrupt texinfo.tex file, or
+to tex itself simply not working."
+ cat "$version_test_dir/txiversion.out"
+ cat "$version_test_dir/txiversion.err" >&2
+ error 1 "quitting."
+ fi
+ eval `$SED -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p' "$version_test_dir/txiversion.out"`
+ verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..."
+ if test "$txiprereq" -le "$txiversion" >&6 2>&1; then
+ makeinfo=
+ else
+ makeinfo=${MAKEINFO:-makeinfo}
+ fi
+ # If TeX is preloaded, offer the user this convenience:
+ if test "$txiformat" = Texinfo; then
+ escape=@
+ fi
+ fi
+
+ if test -n "$makeinfo"; then
+ # in_src: the file with macros expanded.
+ # Use the same basename to generate the same aux file names.
+ work_src=$workdir/src
+ ensure_dir "$work_src"
+ in_src=$work_src/$in_base
+ run_mi_includes=`list_prefix includes -I`
+ verbose "Macro-expanding $command_line_filename to $in_src ..."
+ # eval $makeinfo because it might be defined as something complex
+ # (running missing) and then we end up with things like '"-I"',
+ # and "-I" (including the quotes) is not an option name. This
+ # happens with gettext 0.14.5, at least.
+ $SED "$comment_iftex" "$command_line_filename" \
+ | eval $makeinfo --footnote-style=end -I "$in_dir" $run_mi_includes \
+ -o /dev/null --macro-expand=- \
+ | $SED "$uncomment_iftex" >"$in_src"
+ # Continue only if everything succeeded.
+ if test $? -ne 0 \
+ || test ! -r "$in_src"; then
+ verbose "Expansion failed, ignored...";
+ else
+ in_input=$in_src
+ fi
+ fi
+}
+
+# Unfortunately, makeinfo --iftex --no-ifinfo doesn't work well enough
+# in versions before 5.0, as makeinfo can't parse the TeX commands
+# inside @tex blocks, so work around with sed.
+#
+# This sed script preprocesses Texinfo sources in order to keep the
+# iftex sections only. We want to remove non-TeX sections, and comment
+# (with `@c _texi2dvi') TeX sections so that makeinfo does not try to
+# parse them. Nevertheless, while commenting TeX sections, don't
+# comment @macro/@end macro so that makeinfo does propagate them.
+# Similarly, preserve the @top node to avoid makeinfo complaining about
+# it being missed. Comment it out after preprocessing, so that it does
+# not appear in the generated document.
+#
+# We assume that `@c _texi2dvi' or `@c (_texi2dvi)' starting a line is
+# not present in the document. Additionally, conditionally defined
+# macros inside the @top node may end up with the wrong value, although
+# this is unlikely in practice.
+#
+comment_iftex=\
+'/^@tex/,/^@end tex/{
+ s/^/@c _texi2dvi/
+}
+/^@iftex/,/^@end iftex/{
+ s/^/@c _texi2dvi/
+ /^@c _texi2dvi@macro/,/^@c _texi2dvi@end macro/{
+ s/^@c _texi2dvi//
+ }
+}
+/^@ifnottex/,/^@end ifnottex/{
+ s/^/@c (_texi2dvi)/
+ /^@c (_texi2dvi)@node Top/,/^@c (_texi2dvi)@end ifnottex/ {
+ /^@c (_texi2dvi)@end ifnottex/b
+ s/^@c (_texi2dvi)//
+ }
+}
+/^@ifinfo/,/^@end ifinfo/{
+ /^@node/p
+ /^@menu/,/^@end menu/p
+ t
+ s/^/@c (_texi2dvi)/
+}
+s/^@ifnotinfo/@c _texi2dvi@ifnotinfo/
+s/^@end ifnotinfo/@c _texi2dvi@end ifnotinfo/'
+
+# Uncomment @iftex blocks by removing any leading `@c texi2dvi' (repeated
+# copies can sneak in via macro invocations). Likewise, comment out
+# the @top node inside a @ifnottex block.
+uncomment_iftex=\
+'s/^@c _texi2dvi\(@c _texi2dvi\)*//
+/^@c (_texi2dvi)@ifnottex/,/^@c (_texi2dvi)@end ifnottex/{
+ s/^/@c (_texi2dvi)/
+}'
+
+
+# insert_commands - Insert $textra commands at the beginning of the file.
+# Recommended to be used for @finalout, @smallbook, etc.
+insert_commands ()
+{
+ if test -n "$textra"; then
+ # _xtr. The file with the user's extra commands.
+ work_xtr=$workdir/xtr
+ in_xtr=$work_xtr/$in_base
+ ensure_dir "$work_xtr"
+ verbose "Inserting extra commands: $textra"
+ case $in_lang in
+ latex) textra_cmd=1i;;
+ texinfo)
+ textra_cmd='/^\\input texinfo/a'
+ # insert after @setfilename line if present
+ if head -n 10 $in_input | grep '^@setfilename' ; then
+ textra_cmd='/^@setfilename/a'
+ fi
+ ;;
+ *) error 1 "internal error, unknown language: $in_lang";;
+ esac
+ $SED "$textra_cmd\\
+$textra" "$in_input" >"$in_xtr"
+ in_input=$in_xtr
+ fi
+
+ case $in_lang:$latex2html:`out_lang_tex` in
+ latex:tex4ht:html)
+ # _tex4ht. The file with the added \usepackage{tex4ht}.
+ work_tex4ht=$workdir/tex4ht
+ in_tex4ht=$work_tex4ht/$in_base
+ ensure_dir "$work_tex4ht"
+ verbose "Inserting \\usepackage{tex4ht}"
+ perl -pe 's<\\documentclass(?:\[.*\])?{.*}>
+ <$&\\usepackage[xhtml]{tex4ht}>' \
+ "$in_input" >"$in_tex4ht"
+ in_input=$in_tex4ht
+ ;;
+ esac
+}
+
+
+# compute_language FILENAME - Return the short string for the language
+# in which FILENAME is written: `texinfo' or `latex'.
+compute_language ()
+{
+ # If the user explicitly specified the language, use that.
+ # Otherwise, if the first line is \input texinfo, assume it's texinfo.
+ # Otherwise, guess from the file extension.
+ if test -n "$set_language"; then
+ echo $set_language
+ elif $SED 1q "$1" | grep 'input texinfo' >&6; then
+ echo texinfo
+ else
+ # Get the type of the file (latex or texinfo) from the given language
+ # we just guessed, or from the file extension if not set yet.
+ case $1 in
+ *.ltx | *.tex | *.drv | *.dtx) echo latex;;
+ *) echo texinfo;;
+ esac
+ fi
+}
+
+
+# run_hevea (MODE) - Convert to HTML/INFO/TEXT.
+#
+# Don't pass `-noiso' to hevea: it's useless in HTML since anyway the
+# charset is set to latin1, and troublesome in other modes since
+# accented characters loose their accents.
+#
+# Don't pass `-o DEST' to hevea because in that case it leaves all its
+# auxiliary files there too... Too bad, because it means we will need
+# to handle images some day.
+run_hevea ()
+{
+ run_hevea_name="${HEVEA:-hevea}"
+ run_hevea_cmd="$run_hevea_name"
+
+ case $1 in
+ html) ;;
+ text|info) run_hevea_cmd="$run_hevea_cmd -$1";;
+ *) error 1 "run_hevea_cmd: invalid argument: $1";;
+ esac
+
+ # Compiling to the tmp directory enables to preserve a previous
+ # successful compilation.
+ run_hevea_cmd="$run_hevea_cmd -fix -O -o '$out_base'"
+ run_hevea_cmd="$run_hevea_cmd `list_prefix includes -I` -I '$orig_pwd' "
+ run_hevea_cmd="$run_hevea_cmd '$rel$in_input'"
+
+ if $debug; then
+ run_hevea_cmd="$run_hevea_cmd -v -v"
+ fi
+
+ verbose "running $run_hevea_cmd"
+ if eval "$run_hevea_cmd" >&5; then
+ # hevea leaves trailing white spaces, this is annoying.
+ case $1 in text|info)
+ perl -pi -e 's/[ \t]+$//g' "$out_base"*;;
+ esac
+ case $1 in
+ html|text) move_to_dest "$out_base";;
+ info) # There can be foo.info-1, foo.info-2 etc.
+ move_to_dest "$out_base"*;;
+ esac
+ else
+ error 1 "$run_hevea_name exited with bad status, quitting."
+ fi
+}
+
+
+# run_core_conversion - Run TeX (or HeVeA).
+run_core_conversion ()
+{
+ case $in_lang:$latex2html:`out_lang_tex` in
+ *:dvi|*:pdf|latex:tex4ht:html)
+ run_tex;;
+ latex:*:html|latex:*:text|latex:*:info)
+ run_hevea $out_lang;;
+ *)
+ error 1 "invalid input/output combination: $in_lang/$out_lang";;
+ esac
+}
+
+
+# compile - Run the full compilation chain, from pre-processing to
+# installation of the output at its expected location.
+compile ()
+{
+ # Set include path for tools:
+ # . Include current directory in case there are files there already, so
+ # we don't have more TeX runs than necessary. orig_pwd is used in case
+ # we are in clean build mode, where we have cd'd to a temp directory.
+ # . Include directory containing file, in case there are other
+ # files @include'd.
+ # . Keep a final path_sep to get the default (system) TeX
+ # directories included.
+ # . If we have any includes, put those at the end.
+
+ common="$orig_pwd$path_sep$in_dir$path_sep"
+ #
+ txincludes=`list_infix includes $path_sep`
+ test -n "$txincludes" && common="$common$txincludes$path_sep"
+ #
+ for var in $tex_envvars; do
+ eval val="\$common\$${var}_orig"
+ # Convert relative paths to absolute paths, so we can run in another
+ # directory (e.g., in clean build mode, or during the macro-support
+ # detection).
+ val=`absolute_filenames "$val"`
+ eval $var="\"$val\""
+ export $var
+ eval verbose \"$var=\'\$${var}\'\"
+ done
+
+ # --expand
+ run_makeinfo
+
+ # --command, --texinfo
+ insert_commands
+
+ # Run until a fixed point is reached.
+ run_tex_suite
+}
+
+# make_openout_test FLAGS EXTENSION
+# - Run TeX with an input file that performs an \openout. Pass FLAGS to TeX.
+#
+make_openout_test ()
+{
+ recorder_option_maybe="$1"
+ make_tex_cmd
+
+ ensure_dir "$workdir"/check_recorder
+ cd_dir "$workdir"/check_recorder
+
+ cat > openout.tex <<EOF
+\newwrite\ourwrite
+\immediate\openout\ourwrite dum.dum
+\bye
+EOF
+ # \bye doesn't work for LaTeX, but it will cause latex
+ # to exit with an input error.
+ tex_cmd="$tex_cmd '${escape}input' ./openout.tex"
+ # ./ in case . isn't in path
+ verbose "$0: running $tex_cmd ..."
+ rm -fr "openout.$2"
+ (eval "$tex_cmd" >/dev/null 2>&1)
+}
+
+# Check tex supports -recorder option
+check_recorder_support ()
+{
+ verbose "Checking TeX recorder support..."
+ make_openout_test " -recorder" fls
+ if test -f openout.fls && grep '^OUTPUT dum.dum$' openout.fls > /dev/null
+ then
+ cd_orig
+ verbose "Checking TeX recorder support... yes"
+ return 0
+ else
+ cd_orig
+ verbose "Checking TeX recorder support... no"
+ return 1
+ fi
+}
+
+# Check tex supports \openout traces in log
+check_openout_in_log_support ()
+{
+ verbose "Checking TeX \openout in log support..."
+ make_openout_test "" log
+ if test -f openout.log \
+ && grep '^\\openout..\? *= *`\?dum\.dum'\''\?' openout.log >/dev/null
+ then
+ cd_orig
+ verbose "Checking TeX \openout in log support... yes"
+ return 0
+ else
+ cd_orig
+ verbose "Checking TeX \openout in log support... no"
+ return 1
+ fi
+}
+
+# Set that output auxiliary files are detected with the -recorder option,
+# which creates a file JOBNAME.fls which is a machine-readable listing of
+# files read and written during the job.
+set_aux_files_from_fls ()
+{
+ recorder_option_maybe=" -recorder"
+ generated_files_get_method=generated_files_get_from_fls
+}
+
+# Set that output auxiliary files are detected with searching for \openout
+# in the log file.
+set_aux_files_from_log ()
+{
+ recorder_option_maybe=''
+ generated_files_get_method=generated_files_get_from_log
+}
+
+# Decide whether output auxiliary files are detected with the -recorder
+# option, or by searching for \openout in the log file.
+decide_aux_files_method ()
+{
+ # Select output file detection method
+ # Valid values of TEXI2DVI_USE_RECORDER are:
+ # yes use the -recorder option, no checks.
+ # no scan for \openout in the log file, no checks.
+ # yesmaybe check whether -recorder option is supported, and if yes
+ # use it, otherwise check for tracing \openout in the
+ # log file is supported, and if yes use it, else it is an
+ # error.
+ # nomaybe same as `yesmaybe', except that the \openout trace in
+ # log file is checked first.
+ #
+ # The default behaviour is `nomaybe'.
+
+ test -n "$TEXI2DVI_USE_RECORDER" || TEXI2DVI_USE_RECORDER=nomaybe
+
+ case $TEXI2DVI_USE_RECORDER in
+ yes) set_aux_files_from_fls;;
+
+ no) set_aux_files_from_log;;
+
+ yesmaybe)
+ if check_recorder_support; then
+ set_aux_files_from_fls
+ elif check_openout_in_log_support; then
+ set_aux_files_from_log
+ else
+ error 1 "TeX neither supports -recorder nor outputs \\openout lines in its log file"
+ fi
+ ;;
+
+ nomaybe)
+ if check_openout_in_log_support; then
+ set_aux_files_from_log
+ elif check_recorder_support; then
+ set_aux_files_from_fls
+ else
+ error 1 "TeX neither supports -recorder nor outputs \\openout lines in its log file"
+ fi
+ ;;
+
+ *) error 1 "Invalid value of TEXI2DVI_USE_RECORDER environment variable : $TEXI2DVI_USE_RECORDER.";;
+
+ esac
+}
+
+# remove FILE...
+remove ()
+{
+ verbose "Removing" "$@"
+ rm -rf "$@"
+}
+
+
+# all_files - Echo the names of all files generated, including those by
+# auxiliary tools like texindex.
+all_files ()
+{
+ echo $in_noext.log
+ echo $in_noext.fls
+ echo $xref_files_new
+ echo `sorted_index_files`
+}
+
+sorted_index_files ()
+{
+ filter_files sorted_index_filter
+}
+
+# Print the name of a generated file based on FILE if there is one.
+sorted_index_filter ()
+{
+ case $in_lang in
+ texinfo)
+ # texindex: texinfo.cp -> texinfo.cps
+ if test -n "`index_file_p $1`" ; then
+ echo $1s
+ fi
+ ;;
+ esac
+}
+
+
+# Not currently used - use with filter_files to add secondary files created by
+# bibtex
+bibtex_secondary_files ()
+{
+ case $in_lang in
+ latex)
+ if test -n "`aux_file_p $1`"; then
+ # bibtex: *.aux -> *.bbl and *.blg.
+ echo $1 | $SED 's/^\(.*\)\.aux$/\1.bbl/'
+ echo $1 | $SED 's/^\(.*\)\.aux$/\1.blg/'
+ fi
+ ;;
+ esac
+}
+
+# mostly_clean - Remove auxiliary files and directories. Changes back to
+# the original directory.
+mostly_clean ()
+{
+ cd_orig
+ set X "$t2ddir"
+ shift
+ $tidy || {
+ set X ${1+"$@"} `all_files`
+ shift
+ }
+ remove ${1+"$@"}
+}
+
+
+# cleanup - Remove what should be removed according to options.
+# Called at the end of each compilation cycle, and at the end of
+# the script. Changes the current directory.
+cleanup ()
+{
+ case $clean:$tidy in
+ true:true) mostly_clean ;; # build mode is "clean"
+ false:false) cd_orig; remove "$t2ddir";; # build mode is "local"
+ esac
+}
+
+
+# input_file_name_decode - Decode COMMAND_LINE_FILENAME, and set the
+# following shell variables:
+#
+# - COMMAND_LINE_FILENAME
+# The filename given on the commmand line, but cleaned of TeX commands.
+# - IN_DIR
+# The directory containing the input file.
+# - IN_BASE
+# The input file base name (no directory part).
+# - IN_NOEXT
+# The input file name with neither file extensions nor directory part.
+# - IN_INPUT
+# The path to the input file for passing as a command-line argument
+# to TeX. Defaults to COMMAND_LINE_FILENAME, but might change if the
+# input is preprocessed.
+input_file_name_decode ()
+{
+ case $command_line_filename in
+ *\\input{*}*)
+ # Let AUC-TeX error parser deal with line numbers.
+ line_error=false
+ command_line_filename=`\
+ expr X"$command_line_filename" : X'.*input{\([^}]*\)}'`
+ ;;
+ esac
+
+ # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex),
+ # prepend `./' in order to avoid that the tools take it as an option.
+ echo "$command_line_filename" | LC_ALL=C $EGREP '^(/|[A-Za-z]:/)' >&6 \
+ || command_line_filename="./$command_line_filename"
+
+ # See if the file exists. If it doesn't we're in trouble since, even
+ # though the user may be able to reenter a valid filename at the tex
+ # prompt (assuming they're attending the terminal), this script won't
+ # be able to find the right xref files and so forth.
+ test -r "$command_line_filename" \
+ || error 1 "cannot read $command_line_filename, skipping."
+
+ # Get the name of the current directory.
+ in_dir=`func_dirname "$command_line_filename"`
+
+ # Strip directory part but leave extension.
+ in_base=`basename "$command_line_filename"`
+ # Strip extension.
+ in_noext=`noext "$in_base"`
+
+ # The normalized file name to compile. Must always point to the
+ # file to actually compile (in case of recoding, macro-expansion etc.).
+ in_input=$in_dir/$in_base
+
+
+ # Compute the output file name.
+ if test x"$oname" != x; then
+ out_name=$oname
+ else
+ out_name=$in_noext.`out_lang_ext`
+ fi
+ out_dir=`func_dirname "$out_name"`
+ out_dir_abs=`absolute "$out_dir"`
+ out_base=`basename "$out_name"`
+ out_noext=`noext "$out_base"`
+}
+
+
+#
+#################### Main program starts ##########################
+
+# Initialize more variables.
+#
+# Save TEXINPUTS so we can construct a new TEXINPUTS path for each file.
+# Likewise for bibtex and makeindex.
+tex_envvars="BIBINPUTS BSTINPUTS DVIPSHEADERS INDEXSTYLE MFINPUTS MPINPUTS \
+TEXINPUTS TFMFONTS"
+for var in $tex_envvars; do
+ eval ${var}_orig=\$$var
+ export $var
+done
+
+# Push a token among the arguments that will be used to notice when we
+# ended options/arguments parsing.
+# Use "set dummy ...; shift" rather than 'set - ..." because on
+# Solaris set - turns off set -x (but keeps set -e).
+# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3
+# still expand "$@" to a single argument (the empty string) rather
+# than nothing at all.
+arg_sep="$$--$$"
+set dummy ${1+"$@"} "$arg_sep"; shift
+
+while test x"$1" != x"$arg_sep"; do
+ # Handle --option=value by splitting apart and putting back on argv.
+ case "$1" in
+ --*=*)
+ opt=`echo "$1" | $SED -e 's/=.*//'`
+ val=`echo "$1" | $SED -e 's/[^=]*=//'`
+ shift
+ set dummy "$opt" "$val" ${1+"$@"}; shift
+ ;;
+ esac
+
+ case "$1" in
+ -@ ) escape=@;;
+ -~ ) verbose "Option -~ is obsolete: texi2dvi ignores it.";;
+ -b | --batch) ;; # Obsolete
+ --build) shift; build_mode=$1;;
+ --build-dir) shift; build_dir=$1; build_mode=tidy;;
+ -c | --clean) build_mode=clean;;
+ -D | --debug) debug=true;;
+ -e | -E | --expand) expand=true;;
+ -h | --help) usage;;
+ -I) shift; list_concat_dirs includes "$1";;
+ -l | --lang | --language) shift; set_language=$1;;
+ --mostly-clean) action=mostly-clean;;
+ --no-line-error) line_error=false;;
+ --max-iterations) shift; max_iters=$1;;
+ -o | --out | --output)
+ shift
+ # Make it absolute, just in case we also have --clean, or whatever.
+ oname=`absolute "$1"`;;
+
+ # Output formats.
+ -O|--output-format) shift; out_lang_set "$1";;
+ --dvi|--dvipdf|--html|--info|--pdf|--ps|--text)
+ out_lang_set `echo "x$1" | $SED 's/^x--//'`;;
+
+ -p) out_lang_set pdf;;
+ -q | -s | --quiet | --silent) quiet=true;;
+ --src-specials) src_specials=--src-specials;;
+ --shell-escape) shell_escape=--shell-escape;;
+ --tex4ht) latex2html=tex4ht;;
+ -t | --texinfo | --command ) shift; textra="$textra\\
+"`echo "$1" | $SED 's/\\\\/\\\\\\\\/g'`;;
+ --translate-file ) shift; translate_file="$1";;
+ --tidy) build_mode=tidy;;
+ -v | --vers*) version;;
+ -V | --verb*) verb=true;;
+ --) # What remains are not options.
+ shift
+ while test x"$1" != x"$arg_sep"; do
+ set dummy ${1+"$@"} "$1"; shift
+ shift
+ done
+ break;;
+ -*)
+ error 1 "Unknown or ambiguous option \`$1'." \
+ "Try \`--help' for more information."
+ ;;
+ *) set dummy ${1+"$@"} "$1"; shift;;
+ esac
+ shift
+done
+# Pop the token
+shift
+
+# $tidy: compile in a t2d directory.
+# $clean: remove all the aux files.
+case $build_mode in
+ local) clean=false; tidy=false;;
+ tidy) clean=false; tidy=true;;
+ clean) clean=true; tidy=true;;
+ *) error 1 "invalid build mode: $build_mode";;
+esac
+
+# Interpret remaining command line args as filenames.
+case $# in
+ 0)
+ error 2 "Missing file arguments." "Try \`--help' for more information."
+ ;;
+ 1) ;;
+ *)
+ if test -n "$oname"; then
+ error 2 "Can't use option \`--output' with more than one argument."
+ fi
+ ;;
+esac
+
+
+# We can't do much without tex.
+# End up with the TEX and PDFTEX variables set to what we are going to use.
+#
+# If $TEX is set to a directory, don't use it.
+test -n "$TEX" && test -d "$TEX" && unset TEX
+
+# But otherwise, use $TEX if it is set.
+if test -z "$TEX"; then
+ if findprog tex; then :; else cat <<EOM >&2
+You don't have a working TeX binary (tex) installed anywhere in
+your PATH, and texi2dvi cannot proceed without one. If you want to use
+this script, you'll need to install TeX (if you don't have it) or change
+your PATH or TEX environment variable (if you do). See the --help
+output for more details.
+
+For information about obtaining TeX, please see http://tug.org/texlive,
+or do a web search for TeX and your operating system or distro.
+EOM
+ exit 1
+ fi
+
+ # We want to use etex (or pdftex) if they are available, and the user
+ # didn't explicitly specify. We don't check for elatex and pdfelatex
+ # because (as of 2003), the LaTeX team has asked that new distributions
+ # use etex by default anyway.
+ #
+ if findprog etex; then TEX=etex; else TEX=tex; fi
+fi
+
+# For many years, the pdftex binary has included the e-tex extensions,
+# but for those people with ancient TeX distributions ...
+if test -z "$PDFTEX"; then
+ if findprog pdfetex; then PDFTEX=pdfetex; else PDFTEX=pdftex; fi
+fi
+
+
+# File descriptor usage:
+# 0 standard input
+# 1 standard output (--verbose messages)
+# 2 standard error
+# 5 tools output (turned off by --quiet)
+# 6 tracing/debugging (set -x output, etc.)
+
+# Main tools' output (TeX, etc.) that TeX users are used to seeing.
+#
+# If quiet, discard, else redirect to the message flow.
+if $quiet; then
+ exec 5>/dev/null
+else
+ exec 5>&1
+fi
+
+
+# Enable tracing, and auxiliary tools output.
+#
+# This fd should be used where you'd typically use /dev/null to throw
+# output away. But sometimes it is convenient to see that output (e.g.,
+# from a grep) to aid debugging. Especially debugging at distance, via
+# the user.
+#
+if $debug; then
+ exec 6>&1
+ set -vx
+else
+ exec 6>/dev/null
+fi
+
+
+# Main program main loop - TeXify each file in turn.
+for command_line_filename
+do
+ verbose "Processing $command_line_filename ..."
+
+ input_file_name_decode
+
+ # `texinfo' or `latex'?
+ in_lang=`compute_language "$command_line_filename"`
+
+ # An auxiliary directory used for all the auxiliary tasks involved
+ # in compiling this document.
+ case $build_dir in
+ '' | . ) t2ddir=$out_noext.t2d ;;
+ *) # Avoid collisions between multiple occurrences of the same
+ # file, so depend on the output path. Remove leading `./',
+ # at least to avoid creating a file starting with `.!', i.e.,
+ # an invisible file. The sed expression is fragile if the cwd
+ # has active characters. Transform / into ! so that we don't
+ # need `mkdir -p'. It might be something to reconsider.
+ t2ddir=$build_dir/`echo "$out_dir_abs/$out_noext.t2d" |
+ $SED "s,^$orig_pwd/,,;s,^\./,,;s,/,!,g"`
+ esac
+ # Remove it at exit if clean mode.
+ trap "cleanup" 0 1 2 15
+
+ ensure_dir "$build_dir" "$t2ddir"
+
+ # Sometimes there are incompatibilities between auxiliary files for
+ # DVI and PDF. The contents can also change whether we work on PDF
+ # and/or DVI. So keep separate spaces for each.
+ workdir=$t2ddir/`out_lang_tex`
+ ensure_dir "$workdir"
+
+ # _build. In a tidy build, where the auxiliary files are output.
+ if $tidy; then
+ work_build=$workdir/build
+ else
+ work_build=.
+ fi
+
+ # _bak. Copies of the previous auxiliary files (another round is
+ # run if they differ from the new ones).
+ work_bak=$workdir/bak
+
+ # Make those directories.
+ ensure_dir "$work_build" "$work_bak"
+
+ # Decide how to find auxiliary files created by TeX.
+ decide_aux_files_method
+
+ case $action in
+ compile)
+ # Compile the document.
+ compile
+ cleanup
+ ;;
+
+ mostly-clean)
+ xref_files_new=`generated_files_get`
+ mostly_clean
+ ;;
+ esac
+done
+
+verbose "done."
+exit 0 # exit successfully, not however we ended the loop.
+# Local Variables:
+# sh-basic-offset: 2
+# sh-indentation: 2
+# End:
diff --git a/doc/texi2html b/doc/texi2html
new file mode 100644
index 0000000..13b5588
--- /dev/null
+++ b/doc/texi2html
@@ -0,0 +1,5428 @@
+#! /usr/bin/perl
+'di ';
+'ig 00 ';
+#+##############################################################################
+#
+# texi2html: Program to transform Texinfo documents to HTML
+#
+# Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+#
+# 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/>.
+#
+#-##############################################################################
+
+# This requires perl version 5 or higher
+require 5.0;
+
+#++##############################################################################
+#
+# NOTE FOR DEBUGGING THIS SCRIPT:
+# You can run 'perl texi2html.pl' directly, provided you have
+# the environment variable T2H_HOME set to the directory containing
+# the texi2html.init file
+#
+#--##############################################################################
+
+# CVS version:
+# $Id: texi2html.pl,v 1.55 2000/07/27 14:39:41 obachman Exp $
+
+# Homepage:
+$T2H_HOMEPAGE = <<EOT;
+http://www.mathematik.uni-kl.de/~obachman/Texi2html
+EOT
+
+# Authors:
+$T2H_AUTHORS = <<EOT;
+Written by: Lionel Cons <Lionel.Cons\@cern.ch> (original author)
+ Karl Berry <karl\@freefriends.org>
+ Olaf Bachmann <obachman\@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Olaf Bachmann <obachman\@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html\@mathematik.uni-kl.de>
+EOT
+
+# Version: set in configure.in
+$THISVERSION = '1.64';
+$THISPROG = "texi2html $THISVERSION"; # program name and version
+
+# The man page for this program is included at the end of this file and can be
+# viewed using the command 'nroff -man texi2html'.
+
+# Identity:
+
+$T2H_TODAY = &pretty_date; # like "20 September 1993"
+# the eval prevents this from breaking on system which do not have
+# a proper getpwuid implemented
+eval { ($T2H_USER = (getpwuid ($<))[6]) =~ s/,.*//;}; # Who am i
+
+#+++############################################################################
+# #
+# Initialization #
+# Pasted content of File $(srcdir)/texi2html.init: Default initializations #
+# #
+#---############################################################################
+
+# leave this within comments, and keep the require statement
+# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init
+# exists.
+
+#
+# -*-perl-*-
+######################################################################
+# File: texi2html.init
+#
+# Sets default values for command-line arguments and for various customizable
+# procedures
+#
+# A copy of this file is pasted into the beginning of texi2html by
+# 'make texi2html'
+#
+# Copy this file and make changes to it, if you like.
+# Afterwards, either, load it with command-line option -init_file <your_init_file>
+#
+# $Id: texi2html.init,v 1.34 2000/07/27 14:09:02 obachman Exp $
+
+######################################################################
+# stuff which can also be set by command-line options
+#
+#
+# Note: values set here, overwrite values set by the command-line
+# options before -init_file and might still be overwritten by
+# command-line arguments following the -init_file option
+#
+
+# T2H_OPTIONS is a hash whose keys are the (long) names of valid
+# command-line options and whose values are a hash with the following keys:
+# type ==> one of !|=i|:i|=s|:s (see GetOpt::Long for more info)
+# linkage ==> ref to scalar, array, or subroutine (see GetOpt::Long for more info)
+# verbose ==> short description of option (displayed by -h)
+# noHelp ==> if 1 -> for "not so important options": only print description on -h 1
+# 2 -> for obsolete options: only print description on -h 2
+
+$T2H_DEBUG = 0;
+$T2H_OPTIONS -> {debug} =
+{
+ type => '=i',
+ linkage => \$main::T2H_DEBUG,
+ verbose => 'output HTML with debuging information',
+};
+
+$T2H_DOCTYPE = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">';
+$T2H_OPTIONS -> {doctype} =
+{
+ type => '=s',
+ linkage => \$main::T2H_DOCTYPE,
+ verbose => 'document type which is output in header of HTML files',
+ noHelp => 1
+};
+
+$T2H_CHECK = 0;
+$T2H_OPTIONS -> {check} =
+{
+ type => '!',
+ linkage => \$main::T2H_CHECK,
+ verbose => 'if set, only check files and output all things that may be Texinfo commands',
+ noHelp => 1
+};
+
+# -expand
+# if set to "tex" (or, "info") expand @iftex and @tex (or, @ifinfo) sections
+# else, neither expand @iftex, @tex, nor @ifinfo sections
+$T2H_EXPAND = "info";
+$T2H_OPTIONS -> {expand} =
+{
+ type => '=s',
+ linkage => \$T2H_EXPAND,
+ verbose => 'Expand info|tex|none section of texinfo source',
+};
+
+# - glossary
+#if set, uses section named `Footnotes' for glossary
+$T2H_USE_GLOSSARY = 0;
+T2H_OPTIONS -> {glossary} =
+{
+ type => '!',
+ linkage => \$T2H_USE_GLOSSARY,
+ verbose => "if set, uses section named `Footnotes' for glossary",
+ noHelp => 1,
+};
+
+
+# -invisible
+# $T2H_INVISIBLE_MARK is the text used to create invisible destination
+# anchors for index links (you can for instance use the invisible.xbm
+# file shipped with this program). This is a workaround for a known
+# bug of many WWW browsers, including netscape.
+# For me, it works fine without it -- on the contrary: if there, it
+# inserts space between headers and start of text (obachman 3/99)
+$T2H_INVISIBLE_MARK = '';
+# $T2H_INVISIBLE_MARK = '&#160;';
+$T2H_OPTIONS -> {invisible} =
+{
+ type => '=s',
+ linkage => \$T2H_INVISIBLE_MARK,
+ verbose => 'use text in invisble anchot',
+ noHelp => 1,
+};
+
+# -iso
+# if set, ISO8879 characters are used for special symbols (like copyright, etc)
+$T2H_USE_ISO = 0;
+$T2H_OPTIONS -> {iso} =
+{
+ type => 'iso',
+ linkage => \$T2H_USE_ISO,
+ verbose => 'if set, ISO8879 characters are used for special symbols (like copyright, etc)',
+ noHelp => 1,
+};
+
+# -I
+# list directories where @include files are searched for (besides the
+# directory of the doc file) additional '-I' args add to this list
+@T2H_INCLUDE_DIRS = (".");
+$T2H_OPTIONS -> {I} =
+{
+ type => '=s',
+ linkage => \@T2H_INCLUDE_DIRS,
+ verbose => 'append $s to the @include search path',
+};
+
+# -top_file
+# uses file of this name for top-level file
+# extension is manipulated appropriately, if necessary.
+# If empty, <basename of document>.html is used
+# Typically, you would set this to "index.html".
+$T2H_TOP_FILE = '';
+$T2H_OPTIONS -> {top_file} =
+{
+ type => '=s',
+ linkage => \$T2H_TOP_FILE,
+ verbose => 'use $s as top file, instead of <docname>.html',
+};
+
+
+# -toc_file
+# uses file of this name for table of contents file
+# extension is manipulated appropriately, if necessary.
+# If empty, <basename of document>_toc.html is used
+$T2H_TOC_FILE = '';
+$T2H_OPTIONS -> {toc_file} =
+{
+ type => '=s',
+ linkage => \$T2H_TOC_FILE,
+ verbose => 'use $s as ToC file, instead of <docname>_toc.html',
+};
+
+# -frames
+# if set, output two additional files which use HTML 4.0 "frames".
+$T2H_FRAMES = 0;
+$T2H_OPTIONS -> {frames} =
+{
+ type => '!',
+ linkage => \$T2H_FRAMES,
+ verbose => 'output files which use HTML 4.0 frames (experimental)',
+ noHelp => 1,
+};
+
+
+# -menu | -nomenu
+# if set, show the Texinfo menus
+$T2H_SHOW_MENU = 1;
+$T2H_OPTIONS -> {menu} =
+{
+ type => '!',
+ linkage => \$T2H_SHOW_MENU,
+ verbose => 'ouput Texinfo menus',
+};
+
+# -number | -nonumber
+# if set, number sections and show section names and numbers in references
+# and menus
+$T2H_NUMBER_SECTIONS = 1;
+$T2H_OPTIONS -> {number} =
+{
+ type => '!',
+ linkage => \$T2H_NUMBER_SECTIONS,
+ verbose => 'use numbered sections'
+};
+
+# if set, and T2H_NUMBER_SECTIONS is set, then use node names in menu
+# entries, instead of section names
+$T2H_NODE_NAME_IN_MENU = 0;
+
+# if set and menu entry equals menu descr, then do not print menu descr.
+# Likewise, if node name equals entry name, do not print entry name.
+$T2H_AVOID_MENU_REDUNDANCY = 1;
+
+# -split section|chapter|none
+# if set to 'section' (resp. 'chapter') create one html file per (sub)section
+# (resp. chapter) and separate pages for Top, ToC, Overview, Index,
+# Glossary, About.
+# otherwise, create monolithic html file which contains whole document
+#$T2H_SPLIT = 'section';
+$T2H_SPLIT = '';
+$T2H_OPTIONS -> {split} =
+{
+ type => '=s',
+ linkage => \$T2H_SPLIT,
+ verbose => 'split document on section|chapter else no splitting',
+};
+
+# -section_navigation|-no-section_navigation
+# if set, then navigation panels are printed at the beginning of each section
+# and, possibly at the end (depending on whether or not there were more than
+# $T2H_WORDS_IN_PAGE words on page
+# This is most useful if you do not want to have section navigation
+# on -split chapter
+$T2H_SECTION_NAVIGATION = 1;
+$T2H_OPTIONS -> {sec_nav} =
+{
+ type => '!',
+ linkage => \$T2H_SECTION_NAVIGATION,
+ verbose => 'output navigation panels for each section',
+};
+
+# -subdir
+# if set put result files in this directory
+# if not set result files are put into current directory
+#$T2H_SUBDIR = 'html';
+$T2H_SUBDIR = '';
+$T2H_OPTIONS -> {subdir} =
+{
+ type => '=s',
+ linkage => \$T2H_SUBDIR,
+ verbose => 'put HTML files in directory $s, instead of $cwd',
+};
+
+# -short_extn
+# If this is set all HTML file will have extension ".htm" instead of
+# ".html". This is helpful when shipping the document to PC systems.
+$T2H_SHORTEXTN = 0;
+$T2H_OPTIONS -> {short_ext} =
+{
+ type => '!',
+ linkage => \$T2H_SHORTEXTN,
+ verbose => 'use "htm" extension for output HTML files',
+};
+
+
+# -prefix
+# Set the output file prefix, prepended to all .html, .gif and .pl files.
+# By default, this is the basename of the document
+$T2H_PREFIX = '';
+$T2H_OPTIONS -> {prefix} =
+{
+ type => '=s',
+ linkage => \$T2H_PREFIX,
+ verbose => 'use as prefix for output files, instead of <docname>',
+};
+
+# -o filename
+# If set, generate monolithic document output html into $filename
+$T2H_OUT = '';
+$T2H_OPTIONS -> {out_file} =
+{
+ type => '=s',
+ linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';},
+ verbose => 'if set, all HTML output goes into file $s',
+};
+
+# -short_ref
+#if set cross-references are given without section numbers
+$T2H_SHORT_REF = '';
+$T2H_OPTIONS -> {short_ref} =
+{
+ type => '!',
+ linkage => \$T2H_SHORT_REF,
+ verbose => 'if set, references are without section numbers',
+};
+
+# -idx_sum
+# if value is set, then for each @prinindex $what
+# $docu_name_$what.idx is created which contains lines of the form
+# $key\t$ref sorted alphabetically (case matters)
+$T2H_IDX_SUMMARY = 0;
+$T2H_OPTIONS -> {idx_sum} =
+{
+ type => '!',
+ linkage => \$T2H_IDX_SUMMARY,
+ verbose => 'if set, also output index summary',
+ noHelp => 1,
+};
+
+# -verbose
+# if set, chatter about what we are doing
+$T2H_VERBOSE = '';
+$T2H_OPTIONS -> {Verbose} =
+{
+ type => '!',
+ linkage => \$T2H_VERBOSE,
+ verbose => 'print progress info to stdout',
+};
+
+# -lang
+# For page titles use $T2H_WORDS->{$T2H_LANG}->{...} as title.
+# To add a new language, supply list of titles (see $T2H_WORDS below).
+# and use ISO 639 language codes (see e.g. perl module Locale-Codes-1.02
+# for definitions)
+# Default's to 'en' if not set or no @documentlanguage is specified
+$T2H_LANG = '';
+$T2H_OPTIONS -> {lang} =
+{
+ type => '=s',
+ linkage => sub {SetDocumentLanguage($_[1])},
+ verbose => 'use $s as document language (ISO 639 encoding)',
+};
+
+# -l2h
+# if set, uses latex2html for generation of math content
+$T2H_L2H = '';
+$T2H_OPTIONS -> {l2h} =
+{
+ type => '!',
+ linkage => \$T2H_L2H,
+ verbose => 'if set, uses latex2html for @math and @tex',
+};
+
+######################
+# The following options are only relevant if $T2H_L2H is set
+#
+# -l2h_l2h
+# name/location of latex2html progam
+$T2H_L2H_L2H = "latex2html";
+$T2H_OPTIONS -> {l2h_l2h} =
+{
+ type => '=s',
+ linkage => \$T2H_L2H_L2H,
+ verbose => 'program to use for latex2html translation',
+ noHelp => 1,
+};
+
+# -l2h_skip
+# if set, skips actual call to latex2html tries to reuse previously generated
+# content, instead
+$T2H_L2H_SKIP = '';
+$T2H_OPTIONS -> {l2h_skip} =
+{
+ type => '!',
+ linkage => \$T2H_L2H_SKIP,
+ verbose => 'if set, tries to reuse previously latex2html output',
+ noHelp => 1,
+};
+
+# -l2h_tmp
+# if set, l2h uses this directory for temporarary files. The path
+# leading to this directory may not contain a dot (i.e., a "."),
+# otherwise, l2h will fail
+$T2H_L2H_TMP = '';
+$T2H_OPTIONS -> {l2h_tmp} =
+{
+ type => '=s',
+ linkage => \$T2H_L2H_TMP,
+ verbose => 'if set, uses $s as temporary latex2html directory',
+ noHelp => 1,
+};
+
+# if set, cleans intermediate files (they all have the prefix $doc_l2h_)
+# of l2h
+$T2H_L2H_CLEAN = 1;
+$T2H_OPTIONS -> {l2h_clean} =
+{
+ type => '!',
+ linkage => \$T2H_L2H_CLEAN,
+ verbose => 'if set, do not keep intermediate latex2html files for later reuse',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {D} =
+{
+ type => '=s',
+ linkage => sub {$main::value{@_[1]} = 1;},
+ verbose => 'equivalent to Texinfo "@set $s 1"',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {init_file} =
+{
+ type => '=s',
+ linkage => \&LoadInitFile,
+ verbose => 'load init file $s'
+};
+
+
+##############################################################################
+#
+# The following can only be set in the init file
+#
+##############################################################################
+
+# if set, center @image by default
+# otherwise, do not center by default
+$T2H_CENTER_IMAGE = 1;
+
+# used as identation for block enclosing command @example, etc
+# If not empty, must be enclosed in <td></td>
+$T2H_EXAMPLE_INDENT_CELL = '<td>&nbsp;</td>';
+# same as above, only for @small
+$T2H_SMALL_EXAMPLE_INDENT_CELL = '<td>&nbsp;</td>';
+# font size for @small
+$T2H_SMALL_FONT_SIZE = '-1';
+
+# if non-empty, and no @..heading appeared in Top node, then
+# use this as header for top node/section, otherwise use value of
+# @settitle or @shorttitle (in that order)
+$T2H_TOP_HEADING = '';
+
+# if set, use this chapter for 'Index' button, else
+# use first chapter whose name matches 'index' (case insensitive)
+$T2H_INDEX_CHAPTER = '';
+
+# if set and $T2H_SPLIT is set, then split index pages at the next letter
+# after they have more than that many entries
+$T2H_SPLIT_INDEX = 100;
+
+# if set (e.g., to index.html) replace hrefs to this file
+# (i.e., to index.html) by ./
+$T2H_HREF_DIR_INSTEAD_FILE = '';
+
+########################################################################
+# Language dependencies:
+# To add a new language extend T2H_WORDS hash and create $T2H_<...>_WORDS hash
+# To redefine one word, simply do:
+# $T2H_WORDS->{<language>}->{<word>} = 'whatever' in your personal init file.
+#
+$T2H_WORDS_EN =
+{
+ # titles of pages
+ 'ToC_Title' => 'Table of Contents',
+ 'Overview_Title' => 'Short Table of Contents',
+ 'Index_Title' => 'Index',
+ 'About_Title' => 'About this document',
+ 'Footnotes_Title' => 'Footnotes',
+ 'See' => 'See',
+ 'see' => 'see',
+ 'section' => 'section',
+# If necessary, we could extend this as follows:
+# # text for buttons
+# 'Top_Button' => 'Top',
+# 'ToC_Button' => 'Contents',
+# 'Overview_Button' => 'Overview',
+# 'Index_button' => 'Index',
+# 'Back_Button' => 'Back',
+# 'FastBack_Button' => 'FastBack',
+# 'Prev_Button' => 'Prev',
+# 'Up_Button' => 'Up',
+# 'Next_Button' => 'Next',
+# 'Forward_Button' =>'Forward',
+# 'FastWorward_Button' => 'FastForward',
+# 'First_Button' => 'First',
+# 'Last_Button' => 'Last',
+# 'About_Button' => 'About'
+};
+
+$T2H_WORD_DE =
+{
+ 'ToC_Title' => 'Inhaltsverzeichniss',
+ 'Overview_Title' => 'Kurzes Inhaltsverzeichniss',
+ 'Index_Title' => 'Index',
+ 'About_Title' => '&Uuml;ber dieses Dokument',
+ 'Footnotes_Title' => 'Fu&szlig;noten',
+ 'See' => 'Siehe',
+ 'see' => 'siehe',
+ 'section' => 'Abschnitt',
+};
+
+$T2H_WORD_NL =
+{
+ 'ToC_Title' => 'Inhoudsopgave',
+ 'Overview_Title' => 'Korte inhoudsopgave',
+ 'Index_Title' => 'Index', #Not sure ;-)
+ 'About_Title' => 'No translation available!', #No translation available!
+ 'Footnotes_Title' => 'No translation available!', #No translation available!
+ 'See' => 'Zie',
+ 'see' => 'zie',
+ 'section' => 'sectie',
+};
+
+$T2H_WORD_ES =
+{
+ 'ToC_Title' => '&iacute;ndice General',
+ 'Overview_Title' => 'Resumen del Contenido',
+ 'Index_Title' => 'Index', #Not sure ;-)
+ 'About_Title' => 'No translation available!', #No translation available!
+ 'Footnotes_Title' => 'Fu&szlig;noten',
+ 'See' => 'V&eacute;ase',
+ 'see' => 'v&eacute;ase',
+ 'section' => 'secci&oacute;n',
+};
+
+$T2H_WORD_NO =
+{
+ 'ToC_Title' => 'Innholdsfortegnelse',
+ 'Overview_Title' => 'Kort innholdsfortegnelse',
+ 'Index_Title' => 'Indeks', #Not sure ;-)
+ 'About_Title' => 'No translation available!', #No translation available!
+ 'Footnotes_Title' => 'No translation available!',
+ 'See' => 'Se',
+ 'see' => 'se',
+ 'section' => 'avsnitt',
+};
+
+$T2H_WORD_PT =
+{
+ 'ToC_Title' => 'Sum&aacute;rio',
+ 'Overview_Title' => 'Breve Sum&aacute;rio',
+ 'Index_Title' => '&Iacute;ndice', #Not sure ;-)
+ 'About_Title' => 'No translation available!', #No translation available!
+ 'Footnotes_Title' => 'No translation available!',
+ 'See' => 'Veja',
+ 'see' => 'veja',
+ 'section' => 'Se&ccedil;&atilde;o',
+};
+
+$T2H_WORDS =
+{
+ 'en' => $T2H_WORDS_EN,
+ 'de' => $T2H_WORDS_DE,
+ 'nl' => $T2H_WORDS_NL,
+ 'es' => $T2H_WORDS_ES,
+ 'no' => $T2H_WORDS_NO,
+ 'pt' => $T2H_WORDS_PT
+};
+
+@MONTH_NAMES_EN =
+(
+ 'January', 'February', 'March', 'April', 'May',
+ 'June', 'July', 'August', 'September', 'October',
+ 'November', 'December'
+);
+
+@MONTH_NAMES_DE =
+(
+ 'Januar', 'Februar', 'M&auml;rz', 'April', 'Mai',
+ 'Juni', 'Juli', 'August', 'September', 'Oktober',
+ 'November', 'Dezember'
+);
+
+@MONTH_NAMES_NL =
+(
+ 'Januari', 'Februari', 'Maart', 'April', 'Mei',
+ 'Juni', 'Juli', 'Augustus', 'September', 'Oktober',
+ 'November', 'December'
+);
+
+@MONTH_NAMES_ES =
+(
+ 'enero', 'febrero', 'marzo', 'abril', 'mayo',
+ 'junio', 'julio', 'agosto', 'septiembre', 'octubre',
+ 'noviembre', 'diciembre'
+);
+
+@MONTH_NAMES_NO =
+(
+
+ 'januar', 'februar', 'mars', 'april', 'mai',
+ 'juni', 'juli', 'august', 'september', 'oktober',
+ 'november', 'desember'
+);
+
+@MONTH_NAMES_PT =
+(
+ 'Janeiro', 'Fevereiro', 'Mar&ccedil;o', 'Abril', 'Maio',
+ 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro',
+ 'Novembro', 'Dezembro'
+);
+
+
+$MONTH_NAMES =
+{
+ 'en' => \@MONTH_NAMES_EN,
+ 'de' => \@MONTH_NAMES_DE,
+ 'es' => \@MONTH_NAMES_ES,
+ 'nl' => \@MONTH_NAMES_NL,
+ 'no' => \@MONTH_NAMES_NO,
+ 'pt' => \@MONTH_NAMES_PT
+};
+########################################################################
+# Control of Page layout:
+# You can make changes of the Page layout at two levels:
+# 1.) For small changes, it is often enough to change the value of
+# some global string/hash/array variables
+# 2.) For larger changes, reimplement one of the T2H_DEFAULT_<fnc>* routines,
+# give them another name, and assign them to the respective
+# $T2H_<fnc> variable.
+
+# As a general interface, the hashes T2H_HREF, T2H_NAME, T2H_NODE hold
+# href, html-name, node-name of
+# This -- current section (resp. html page)
+# Top -- top page ($T2H_TOP_FILE)
+# Contents -- Table of contents
+# Overview -- Short table of contents
+# Index -- Index page
+# About -- page which explain "navigation buttons"
+# First -- first node
+# Last -- last node
+#
+# Whether or not the following hash values are set, depends on the context
+# (all values are w.r.t. 'This' section)
+# Next -- next node of texinfo
+# Prev -- previous node of texinfo
+# Up -- up node of texinfo
+# Forward -- next node in reading order
+# Back -- previous node in reading order
+# FastForward -- if leave node, up and next, else next node
+# FastBackward-- if leave node, up and prev, else prev node
+#
+# Furthermore, the following global variabels are set:
+# $T2H_THISDOC{title} -- title as set by @setttile
+# $T2H_THISDOC{fulltitle} -- full title as set by @title...
+# $T2H_THISDOC{subtitle} -- subtitle as set by @subtitle
+# $T2H_THISDOC{author} -- author as set by @author
+#
+# and pointer to arrays of lines which need to be printed by t2h_print_lines
+# $T2H_OVERVIEW -- lines of short table of contents
+# $T2H_TOC -- lines of table of contents
+# $T2H_TOP -- lines of Top texinfo node
+# $T2H_THIS_SECTION -- lines of 'This' section
+
+#
+# There are the following subs which control the layout:
+#
+$T2H_print_section = \&T2H_DEFAULT_print_section;
+$T2H_print_Top_header = \&T2H_DEFAULT_print_Top_header;
+$T2H_print_Top_footer = \&T2H_DEFAULT_print_Top_footer;
+$T2H_print_Top = \&T2H_DEFAULT_print_Top;
+$T2H_print_Toc = \&T2H_DEFAULT_print_Toc;
+$T2H_print_Overview = \&T2H_DEFAULT_print_Overview;
+$T2H_print_Footnotes = \&T2H_DEFAULT_print_Footnotes;
+$T2H_print_About = \&T2H_DEFAULT_print_About;
+$T2H_print_misc_header = \&T2H_DEFAULT_print_misc_header;
+$T2H_print_misc_footer = \&T2H_DEFAULT_print_misc_footer;
+$T2H_print_misc = \&T2H_DEFAULT_print_misc;
+$T2H_print_chapter_header = \&T2H_DEFAULT_print_chapter_header;
+$T2H_print_chapter_footer = \&T2H_DEFAULT_print_chapter_footer;
+$T2H_print_page_head = \&T2H_DEFAULT_print_page_head;
+$T2H_print_page_foot = \&T2H_DEFAULT_print_page_foot;
+$T2H_print_head_navigation = \&T2H_DEFAULT_print_head_navigation;
+$T2H_print_foot_navigation = \&T2H_DEFAULT_print_foot_navigation;
+$T2H_button_icon_img = \&T2H_DEFAULT_button_icon_img;
+$T2H_print_navigation = \&T2H_DEFAULT_print_navigation;
+$T2H_about_body = \&T2H_DEFAULT_about_body;
+$T2H_print_frame = \&T2H_DEFAULT_print_frame;
+$T2H_print_toc_frame = \&T2H_DEFAULT_print_toc_frame;
+
+########################################################################
+# Layout for html for every sections
+#
+sub T2H_DEFAULT_print_section
+{
+ my $fh = shift;
+ local $T2H_BUTTONS = \@T2H_SECTION_BUTTONS;
+ &$T2H_print_head_navigation($fh) if $T2H_SECTION_NAVIGATION;
+ my $nw = t2h_print_lines($fh);
+ if ($T2H_SPLIT eq 'section' && $T2H_SECTION_NAVIGATION)
+ {
+ &$T2H_print_foot_navigation($fh, $nw);
+ }
+ else
+ {
+ print $fh '<HR SIZE="6">' . "\n";
+ }
+}
+
+###################################################################
+# Layout of top-page I recommend that you use @ifnothtml, @ifhtml,
+# @html within the Top texinfo node to specify content of top-level
+# page.
+#
+# If you enclose everything in @ifnothtml, then title, subtitle,
+# author and overview is printed
+# T2H_HREF of Next, Prev, Up, Forward, Back are not defined
+# if $T2H_SPLIT then Top page is in its own html file
+sub T2H_DEFAULT_print_Top_header
+{
+ &$T2H_print_page_head(@_) if $T2H_SPLIT;
+ t2h_print_label(@_); # this needs to be called, otherwise no label set
+ &$T2H_print_head_navigation(@_);
+}
+sub T2H_DEFAULT_print_Top_footer
+{
+ &$T2H_print_foot_navigation(@_);
+ &$T2H_print_page_foot(@_) if $T2H_SPLIT;
+}
+sub T2H_DEFAULT_print_Top
+{
+ my $fh = shift;
+
+ # for redefining navigation buttons use:
+ # local $T2H_BUTTONS = [...];
+ # as it is, 'Top', 'Contents', 'Index', 'About' are printed
+ local $T2H_BUTTONS = \@T2H_MISC_BUTTONS;
+ &$T2H_print_Top_header($fh);
+ if ($T2H_THIS_SECTION)
+ {
+ # if top-level node has content, then print it with extra header
+ print $fh "<H1>$T2H_NAME{Top}</H1>"
+ unless ($T2H_HAS_TOP_HEADING);
+ t2h_print_lines($fh, $T2H_THIS_SECTION)
+ }
+ else
+ {
+ # top-level node is fully enclosed in @ifnothtml
+ # print fulltitle, subtitle, author, Overview
+ print $fh
+ "<CENTER>\n<H1>" .
+ join("</H1>\n<H1>", split(/\n/, $T2H_THISDOC{fulltitle})) .
+ "</H1>\n";
+ print $fh "<H2>$T2H_THISDOC{subtitle}</H2>\n" if $T2H_THISDOC{subtitle};
+ print $fh "$T2H_THISDOC{author}\n" if $T2H_THISDOC{author};
+ print $fh <<EOT;
+</CENTER>
+<HR>
+<P></P>
+<H2> Overview: </H2>
+<BLOCKQUOTE>
+EOT
+ t2h_print_lines($fh, $T2H_OVERVIEW);
+ print $fh "</BLOCKQUOTE>\n";
+ }
+ &$T2H_print_Top_footer($fh);
+}
+
+###################################################################
+# Layout of Toc, Overview, and Footnotes pages
+# By default, we use "normal" layout
+# T2H_HREF of Next, Prev, Up, Forward, Back, etc are not defined
+# use: local $T2H_BUTTONS = [...] to redefine navigation buttons
+sub T2H_DEFAULT_print_Toc
+{
+ return &$T2H_print_misc(@_);
+}
+sub T2H_DEFAULT_print_Overview
+{
+ return &$T2H_print_misc(@_);
+}
+sub T2H_DEFAULT_print_Footnotes
+{
+ return &$T2H_print_misc(@_);
+}
+sub T2H_DEFAULT_print_About
+{
+ return &$T2H_print_misc(@_);
+}
+
+sub T2H_DEFAULT_print_misc_header
+{
+ &$T2H_print_page_head(@_) if $T2H_SPLIT;
+ # this needs to be called, otherwise, no labels are set
+ t2h_print_label(@_);
+ &$T2H_print_head_navigation(@_);
+}
+sub T2H_DEFAULT_print_misc_footer
+{
+ &$T2H_print_foot_navigation(@_);
+ &$T2H_print_page_foot(@_) if $T2H_SPLIT;
+}
+sub T2H_DEFAULT_print_misc
+{
+ my $fh = shift;
+ local $T2H_BUTTONS = \@T2H_MISC_BUTTONS;
+ &$T2H_print_misc_header($fh);
+ print $fh "<H1>$T2H_NAME{This}</H1>\n";
+ t2h_print_lines($fh);
+ &$T2H_print_misc_footer($fh);
+}
+
+###################################################################
+# chapter_header and chapter_footer are only called if
+# T2H_SPLIT eq 'chapter'
+# chapter_header: after print_page_header, before print_section
+# chapter_footer: after print_section of last section, before print_page_footer
+#
+# If you want to get rid of navigation stuff after each section,
+# redefine print_section such that it does not call print_navigation,
+# and put print_navigation into print_chapter_header
+@T2H_CHAPTER_BUTTONS =
+ (
+ 'FastBack', 'FastForward', ' ',
+ ' ', ' ', ' ', ' ',
+ 'Top', 'Contents', 'Index', 'About',
+ );
+
+sub T2H_DEFAULT_print_chapter_header
+{
+ # nothing to do there, by default
+ if (! $T2H_SECTION_NAVIGATION)
+ {
+ my $fh = shift;
+ local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS;
+ &$T2H_print_navigation($fh);
+ print $fh "\n<HR SIZE=2>\n";
+ }
+}
+
+sub T2H_DEFAULT_print_chapter_footer
+{
+ local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS;
+ &$T2H_print_navigation(@_);
+}
+###################################################################
+$T2H_TODAY = &pretty_date; # like "20 September 1993"
+
+sub pretty_date {
+ local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
+
+ ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
+ $year += ($year < 70) ? 2000 : 1900;
+ # obachman: Let's do it as the Americans do
+ return($MONTH_NAMES->{$T2H_LANG}[$mon] . ", " . $mday . " " . $year);
+}
+
+
+###################################################################
+# Layout of standard header and footer
+#
+
+# Set the default body text, inserted between <BODY ... >
+###$T2H_BODYTEXT = 'LANG="EN" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"';
+$T2H_BODYTEXT = 'LANG="' . $T2H_LANG . '" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"';
+# text inserted after <BODY ...>
+$T2H_AFTER_BODY_OPEN = '';
+#text inserted before </BODY>
+$T2H_PRE_BODY_CLOSE = '';
+# this is used in footer
+$T2H_ADDRESS = "by <I>$T2H_USER</I> " if $T2H_USER;
+$T2H_ADDRESS .= "on <I>$T2H_TODAY</I>";
+# this is added inside <HEAD></HEAD> after <TITLE> and some META NAME stuff
+# can be used for <style> <script>, <meta> tags
+$T2H_EXTRA_HEAD = '';
+
+sub T2H_DEFAULT_print_page_head
+{
+ my $fh = shift;
+ my $longtitle = "$T2H_THISDOC{title}: $T2H_NAME{This}";
+ print $fh <<EOT;
+<HTML>
+$T2H_DOCTYPE
+<!-- Created on $T2H_TODAY by $THISPROG -->
+<!--
+$T2H_AUTHORS
+-->
+<HEAD>
+<TITLE>$longtitle</TITLE>
+
+<META NAME="description" CONTENT="$longtitle">
+<META NAME="keywords" CONTENT="$longtitle">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="$THISPROG">
+$T2H_EXTRA_HEAD
+</HEAD>
+
+<BODY $T2H_BODYTEXT>
+$T2H_AFTER_BODY_OPEN
+EOT
+}
+
+sub T2H_DEFAULT_print_page_foot
+{
+ my $fh = shift;
+ print $fh <<EOT;
+<BR>
+<FONT SIZE="-1">
+This document was generated
+$T2H_ADDRESS
+using <A HREF="$T2H_HOMEPAGE"><I>texi2html</I></A>
+$T2H_PRE_BODY_CLOSE
+</BODY>
+</HTML>
+EOT
+}
+
+###################################################################
+# Layout of navigation panel
+
+# if this is set, then a vertical navigation panel is used
+$T2H_VERTICAL_HEAD_NAVIGATION = 0;
+sub T2H_DEFAULT_print_head_navigation
+{
+ my $fh = shift;
+ if ($T2H_VERTICAL_HEAD_NAVIGATION)
+ {
+ print $fh <<EOT;
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
+<TR VALIGN="TOP">
+<TD ALIGN="LEFT">
+EOT
+ }
+ &$T2H_print_navigation($fh, $T2H_VERTICAL_HEAD_NAVIGATION);
+ if ($T2H_VERTICAL_HEAD_NAVIGATION)
+ {
+ print $fh <<EOT;
+</TD>
+<TD ALIGN="LEFT">
+EOT
+ }
+ elsif ($T2H_SPLIT eq 'section')
+ {
+ print $fh "<HR SIZE=1>\n";
+ }
+}
+
+# Specifies the minimum page length required before a navigation panel
+# is placed at the bottom of a page (the default is that of latex2html)
+# T2H_THIS_WORDS_IN_PAGE holds number of words of current page
+$T2H_WORDS_IN_PAGE = 300;
+sub T2H_DEFAULT_print_foot_navigation
+{
+ my $fh = shift;
+ my $nwords = shift;
+ if ($T2H_VERTICAL_HEAD_NAVIGATION)
+ {
+ print $fh <<EOT;
+</TD>
+</TR>
+</TABLE>
+EOT
+ }
+ print $fh "<HR SIZE=1>\n";
+ &$T2H_print_navigation($fh) if ($nwords >= $T2H_WORDS_IN_PAGE)
+}
+
+######################################################################
+# navigation panel
+#
+# specify in this array which "buttons" should appear in which order
+# in the navigation panel for sections; use ' ' for empty buttons (space)
+@T2H_SECTION_BUTTONS =
+ (
+ 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward',
+ ' ', ' ', ' ', ' ',
+ 'Top', 'Contents', 'Index', 'About',
+ );
+
+# buttons for misc stuff
+@T2H_MISC_BUTTONS = ('Top', 'Contents', 'Index', 'About');
+
+# insert here name of icon images for buttons
+# Icons are used, if $T2H_ICONS and resp. value are set
+%T2H_ACTIVE_ICONS =
+ (
+ 'Top', '',
+ 'Contents', '',
+ 'Overview', '',
+ 'Index', '',
+ 'Back', '',
+ 'FastBack', '',
+ 'Prev', '',
+ 'Up', '',
+ 'Next', '',
+ 'Forward', '',
+ 'FastForward', '',
+ 'About' , '',
+ 'First', '',
+ 'Last', '',
+ ' ', ''
+ );
+
+# insert here name of icon images for these, if button is inactive
+%T2H_PASSIVE_ICONS =
+ (
+ 'Top', '',
+ 'Contents', '',
+ 'Overview', '',
+ 'Index', '',
+ 'Back', '',
+ 'FastBack', '',
+ 'Prev', '',
+ 'Up', '',
+ 'Next', '',
+ 'Forward', '',
+ 'FastForward', '',
+ 'About', '',
+ 'First', '',
+ 'Last', '',
+ );
+
+# how to create IMG tag
+sub T2H_DEFAULT_button_icon_img
+{
+ my $button = shift;
+ my $icon = shift;
+ my $name = shift;
+ return qq{<IMG SRC="$icon" BORDER="0" ALT="$button: $name" ALIGN="MIDDLE">};
+}
+
+# Names of text as alternative for icons
+%T2H_NAVIGATION_TEXT =
+ (
+ 'Top', 'Top',
+ 'Contents', 'Contents',
+ 'Overview', 'Overview',
+ 'Index', 'Index',
+ ' ', ' &nbsp; ',
+ 'Back', ' &lt; ',
+ 'FastBack', ' &lt;&lt; ',
+ 'Prev', 'Prev',
+ 'Up', ' Up ',
+ 'Next', 'Next',
+ 'Forward', ' &gt; ',
+ 'FastForward', ' &gt;&gt; ',
+ 'About', ' ? ',
+ 'First', ' |&lt; ',
+ 'Last', ' &gt;| '
+ );
+
+sub T2H_DEFAULT_print_navigation
+{
+ my $fh = shift;
+ my $vertical = shift;
+ my $spacing = 1;
+ print $fh "<TABLE CELLPADDING=$spacing CELLSPACING=$spacing BORDER=0>\n";
+
+ print $fh "<TR>" unless $vertical;
+ for $button (@$T2H_BUTTONS)
+ {
+ print $fh qq{<TR VALIGN="TOP" ALIGN="LEFT">\n} if $vertical;
+ print $fh qq{<TD VALIGN="MIDDLE" ALIGN="LEFT">};
+
+ if (ref($button) eq 'CODE')
+ {
+ &$button($fh, $vertical);
+ }
+ elsif ($button eq ' ')
+ { # handle space button
+ print $fh
+ $T2H_ICONS && $T2H_ACTIVE_ICONS{' '} ?
+ &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{' '}) :
+ $T2H_NAVIGATION_TEXT{' '};
+ next;
+ }
+ elsif ($T2H_HREF{$button})
+ { # button is active
+ print $fh
+ $T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ? # use icon ?
+ t2h_anchor('', $T2H_HREF{$button}, # yes
+ &$T2H_button_icon_img($button,
+ $T2H_ACTIVE_ICONS{$button},
+ $T2H_NAME{$button}))
+ : # use text
+ "[" .
+ t2h_anchor('', $T2H_HREF{$button}, $T2H_NAVIGATION_TEXT{$button}) .
+ "]";
+ }
+ else
+ { # button is passive
+ print $fh
+ $T2H_ICONS && $T2H_PASSIVE_ICONS{$button} ?
+ &$T2H_button_icon_img($button,
+ $T2H_PASSIVE_ICONS{$button},
+ $T2H_NAME{$button}) :
+
+ "[" . $T2H_NAVIGATION_TEXT{$button} . "]";
+ }
+ print $fh "</TD>\n";
+ print $fh "</TR>\n" if $vertical;
+ }
+ print $fh "</TR>" unless $vertical;
+ print $fh "</TABLE>\n";
+}
+
+######################################################################
+# Frames: this is from "Richard Y. Kim" <ryk@coho.net>
+# Should be improved to be more conforming to other _print* functions
+
+sub T2H_DEFAULT_print_frame
+{
+ my $fh = shift;
+ print $fh <<EOT;
+<HTML>
+<HEAD><TITLE>$T2H_THISDOC{title}</TITLE></HEAD>
+<FRAMESET cols="140,*">
+ <FRAME name=toc src="$docu_toc_frame_file">
+ <FRAME name=main src="$docu_doc">
+</FRAMESET>
+</HTML>
+EOT
+}
+
+sub T2H_DEFAULT_print_toc_frame
+{
+ my $fh = shift;
+ &$T2H_print_page_head($fh);
+ print $fh <<EOT;
+<H2>Content</H2>
+EOT
+ print $fh map {s/HREF=/target=\"main\" HREF=/; $_;} @stoc_lines;
+ print $fh "</BODY></HTML>\n";
+}
+
+######################################################################
+# About page
+#
+
+# T2H_PRE_ABOUT might be a function
+$T2H_PRE_ABOUT = <<EOT;
+This document was generated $T2H_ADDRESS
+using <A HREF="$T2H_HOMEPAGE"><I>texi2html</I></A>
+<P></P>
+EOT
+$T2H_AFTER_ABOUT = '';
+
+sub T2H_DEFAULT_about_body
+{
+ my $about;
+ if (ref($T2H_PRE_ABOUT) eq 'CODE')
+ {
+ $about = &$T2H_PRE_ABOUT();
+ }
+ else
+ {
+ $about = $T2H_PRE_ABOUT;
+ }
+ $about .= <<EOT;
+The buttons in the navigation panels have the following meaning:
+<P></P>
+<table border = "1">
+<TR>
+<TH> Button </TH>
+<TH> Name </TH>
+<TH> Go to </TH>
+<TH> From 1.2.3 go to</TH>
+</TR>
+EOT
+
+ for $button (@T2H_SECTION_BUTTONS)
+ {
+ next if $button eq ' ' || ref($button) eq 'CODE';
+ $about .= <<EOT;
+<TR>
+<TD ALIGN="CENTER">
+EOT
+ $about .=
+ ($T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ?
+ &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{$button}) :
+ " [" . $T2H_NAVIGATION_TEXT{$button} . "] ");
+ $about .= <<EOT;
+</TD>
+<TD ALIGN="CENTER">
+$button
+</TD>
+<TD>
+$T2H_BUTTONS_GOTO{$button}
+</TD>
+<TD>
+$T2H_BUTTONS_EXAMPLE{$button}
+</TD>
+</TR>
+EOT
+ }
+
+ $about .= <<EOT;
+</TABLE>
+<P></P>
+where the <STRONG> Example </STRONG> assumes that the current position
+is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of
+the following structure:
+<UL>
+<LI> 1. Section One </LI>
+<UL>
+<LI>1.1 Subsection One-One</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.2 Subsection One-Two</LI>
+<UL>
+<LI>1.2.1 Subsubsection One-Two-One
+</LI><LI>1.2.2 Subsubsection One-Two-Two
+</LI><LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp; <STRONG>
+&lt;== Current Position </STRONG>
+</LI><LI>1.2.4 Subsubsection One-Two-Four
+</LI></UL>
+<LI>1.3 Subsection One-Three</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.4 Subsection One-Four</LI>
+</UL>
+</UL>
+$T2H_AFTER_ABOUT
+EOT
+ return $about;
+}
+
+
+%T2H_BUTTONS_GOTO =
+ (
+ 'Top', 'cover (top) of document',
+ 'Contents', 'table of contents',
+ 'Overview', 'short table of contents',
+ 'Index', 'concept index',
+ 'Back', 'previous section in reading order',
+ 'FastBack', 'previous or up-and-previous section ',
+ 'Prev', 'previous section same level',
+ 'Up', 'up section',
+ 'Next', 'next section same level',
+ 'Forward', 'next section in reading order',
+ 'FastForward', 'next or up-and-next section',
+ 'About' , 'this page',
+ 'First', 'first section in reading order',
+ 'Last', 'last section in reading order',
+ );
+
+%T2H_BUTTONS_EXAMPLE =
+(
+ 'Top', ' &nbsp; ',
+ 'Contents', ' &nbsp; ',
+ 'Overview', ' &nbsp; ',
+ 'Index', ' &nbsp; ',
+ 'Back', '1.2.2',
+ 'FastBack', '1.1',
+ 'Prev', '1.2.2',
+ 'Up', '1.2',
+ 'Next', '1.2.4',
+ 'Forward', '1.2.4',
+ 'FastForward', '1.3',
+ 'About', ' &nbsp; ',
+ 'First', '1.',
+ 'Last', '1.2.4',
+);
+
+
+######################################################################
+# from here on, its l2h init stuff
+#
+
+## initialization for latex2html as for Singular manual generation
+## obachman 3/99
+
+#
+# Options controlling Titles, File-Names, Tracing and Sectioning
+#
+$TITLE = '';
+
+$SHORTEXTN = 0;
+
+$LONG_TITLES = 0;
+
+$DESTDIR = ''; # should be overwritten by cmd-line argument
+
+$NO_SUBDIR = 0;# should be overwritten by cmd-line argument
+
+$PREFIX = ''; # should be overwritten by cmd-line argument
+
+$AUTO_PREFIX = 0; # this is needed, so that prefix settings are used
+
+$AUTO_LINK = 0;
+
+$SPLIT = 0;
+
+$MAX_LINK_DEPTH = 0;
+
+$TMP = ''; # should be overwritten by cmd-line argument
+
+$DEBUG = 0;
+
+$VERBOSE = 1;
+
+#
+# Options controlling Extensions and Special Features
+#
+$HTML_VERSION = "3.2";
+
+$TEXDEFS = 1; # we absolutely need that
+
+$EXTERNAL_FILE = '';
+
+$SCALABLE_FONTS = 1;
+
+$NO_SIMPLE_MATH = 1;
+
+$LOCAL_ICONS = 1;
+
+$SHORT_INDEX = 0;
+
+$NO_FOOTNODE = 1;
+
+$ADDRESS = '';
+
+$INFO = '';
+
+#
+# Switches controlling Image Generation
+#
+$ASCII_MODE = 0;
+
+$NOLATEX = 0;
+
+$EXTERNAL_IMAGES = 0;
+
+$PS_IMAGES = 0;
+
+$NO_IMAGES = 0;
+
+$IMAGES_ONLY = 0;
+
+$REUSE = 2;
+
+$ANTI_ALIAS = 1;
+
+$ANTI_ALIAS_TEXT = 1;
+
+#
+#Switches controlling Navigation Panels
+#
+$NO_NAVIGATION = 1;
+$ADDRESS = '';
+$INFO = 0; # 0 = do not make a "About this document..." section
+
+#
+#Switches for Linking to other documents
+#
+# actuall -- we don't care
+
+$MAX_SPLIT_DEPTH = 0; # Stop making separate files at this depth
+
+$MAX_LINK_DEPTH = 0; # Stop showing child nodes at this depth
+
+$NOLATEX = 0; # 1 = do not pass unknown environments to Latex
+
+$EXTERNAL_IMAGES = 0; # 1 = leave the images outside the document
+
+$ASCII_MODE = 0; # 1 = do not use any icons or internal images
+
+# 1 = use links to external postscript images rather than inlined bitmap
+# images.
+$PS_IMAGES = 0;
+$SHOW_SECTION_NUMBERS = 0;
+
+### Other global variables ###############################################
+$CHILDLINE = "";
+
+# This is the line width measured in pixels and it is used to right justify
+# equations and equation arrays;
+$LINE_WIDTH = 500;
+
+# Used in conjunction with AUTO_NAVIGATION
+$WORDS_IN_PAGE = 300;
+
+# Affects ONLY the way accents are processed
+$default_language = 'english';
+
+# The value of this variable determines how many words to use in each
+# title that is added to the navigation panel (see below)
+#
+$WORDS_IN_NAVIGATION_PANEL_TITLES = 0;
+
+# This number will determine the size of the equations, special characters,
+# and anything which will be converted into an inlined image
+# *except* "image generating environments" such as "figure", "table"
+# or "minipage".
+# Effective values are those greater than 0.
+# Sensible values are between 0.1 - 4.
+$MATH_SCALE_FACTOR = 1.5;
+
+# This number will determine the size of
+# image generating environments such as "figure", "table" or "minipage".
+# Effective values are those greater than 0.
+# Sensible values are between 0.1 - 4.
+$FIGURE_SCALE_FACTOR = 1.6;
+
+
+# If both of the following two variables are set then the "Up" button
+# of the navigation panel in the first node/page of a converted document
+# will point to $EXTERNAL_UP_LINK. $EXTERNAL_UP_TITLE should be set
+# to some text which describes this external link.
+$EXTERNAL_UP_LINK = "";
+$EXTERNAL_UP_TITLE = "";
+
+# If this is set then the resulting HTML will look marginally better if viewed
+# with Netscape.
+$NETSCAPE_HTML = 1;
+
+# Valid paper sizes are "letter", "legal", "a4","a3","a2" and "a0"
+# Paper sizes has no effect other than in the time it takes to create inlined
+# images and in whether large images can be created at all ie
+# - larger paper sizes *MAY* help with large image problems
+# - smaller paper sizes are quicker to handle
+$PAPERSIZE = "a4";
+
+# Replace "english" with another language in order to tell LaTeX2HTML that you
+# want some generated section titles (eg "Table of Contents" or "References")
+# to appear in a different language. Currently only "english" and "french"
+# is supported but it is very easy to add your own. See the example in the
+# file "latex2html.config"
+$TITLES_LANGUAGE = "english";
+
+1; # This must be the last non-comment line
+
+# End File texi2html.init
+######################################################################
+
+
+require "$ENV{T2H_HOME}/texi2html.init"
+ if ($0 =~ /\.pl$/ &&
+ -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init");
+
+#+++############################################################################
+# #
+# Initialization #
+# Pasted content of File $(srcdir)/MySimple.pm: Command-line processing #
+# #
+#---############################################################################
+
+# leave this within comments, and keep the require statement
+# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init
+# exists.
+
+#
+package Getopt::MySimple;
+
+# Name:
+# Getopt::MySimple.
+#
+# Documentation:
+# POD-style (incomplete) documentation is in file MySimple.pod
+#
+# Tabs:
+# 4 spaces || die.
+#
+# Author:
+# Ron Savage rpsavage@ozemail.com.au.
+# 1.00 19-Aug-97 Initial version.
+# 1.10 13-Oct-97 Add arrays of switches (eg '=s@').
+# 1.20 3-Dec-97 Add 'Help' on a per-switch basis.
+# 1.30 11-Dec-97 Change 'Help' to 'verbose'. Make all hash keys lowercase.
+# 1.40 10-Nov-98 Change width of help report. Restructure tests.
+# 1-Jul-00 Modifications for Texi2html
+
+# --------------------------------------------------------------------------
+# Locally modified by obachman (Display type instead of env, order by cmp)
+# $Id: MySimple.pm,v 1.1 2000/07/03 08:44:13 obachman Exp $
+
+# use strict;
+# no strict 'refs';
+
+use vars qw(@EXPORT @EXPORT_OK @ISA);
+use vars qw($fieldWidth $opt $VERSION);
+
+use Exporter();
+use Getopt::Long;
+
+@ISA = qw(Exporter);
+@EXPORT = qw();
+@EXPORT_OK = qw($opt); # An alias for $self -> {'opt'}.
+
+# --------------------------------------------------------------------------
+
+$fieldWidth = 20;
+$VERSION = '1.41';
+
+# --------------------------------------------------------------------------
+
+sub byOrder
+{
+ my($self) = @_;
+
+ return uc($a) cmp (uc($b));
+}
+
+# --------------------------------------------------------------------------
+
+sub dumpOptions
+{
+ my($self) = @_;
+
+ print 'Option', ' ' x ($fieldWidth - length('Option') ), "Value\n";
+
+ for (sort byOrder keys(%{$self -> {'opt'} }) )
+ {
+ print "-$_", ' ' x ($fieldWidth - (1 + length) ), "${$self->{'opt'} }{$_}\n";
+ }
+
+ print "\n";
+
+} # End of dumpOptions.
+
+# --------------------------------------------------------------------------
+# Return:
+# 0 -> Error.
+# 1 -> Ok.
+
+sub getOptions
+{
+ push(@_, 0) if ($#_ == 2); # Default for $ignoreCase is 0.
+ push(@_, 1) if ($#_ == 3); # Default for $helpThenExit is 1.
+
+ my($self, $default, $helpText, $versionText,
+ $helpThenExit, $versionThenExit, $ignoreCase) = @_;
+
+ $helpThenExit = 1 unless (defined($helpThenExit));
+ $versionThenExit = 1 unless (defined($versionThenExit));
+ $ignoreCase = 0 unless (defined($ignoreCase));
+
+ $self -> {'default'} = $default;
+ $self -> {'helpText'} = $helpText;
+ $self -> {'versionText'} = $versionText;
+ $Getopt::Long::ignorecase = $ignoreCase;
+
+ unless (defined($self -> {'default'}{'help'}))
+ {
+ $self -> {'default'}{'help'} =
+ {
+ type => ':i',
+ default => '',
+ linkage => sub {$self->helpOptions($_[1]); exit (0) if $helpThenExit;},
+ verbose => "print help and exit"
+ };
+ }
+
+ unless (defined($self -> {'default'}{'version'}))
+ {
+ $self -> {'default'}{'version'} =
+ {
+ type => '',
+ default => '',
+ linkage => sub {print $self->{'versionText'}; exit (0) if versionTheExit;},
+ verbose => "print version and exit"
+ };
+ }
+
+ for (keys(%{$self -> {'default'} }) )
+ {
+ my $type = ${$self -> {'default'} }{$_}{'type'};
+ push(@{$self -> {'type'} }, "$_$type");
+ $self->{'opt'}->{$_} = ${$self -> {'default'} }{$_}{'linkage'}
+ if ${$self -> {'default'} }{$_}{'linkage'};
+ }
+
+ my($result) = &GetOptions($self -> {'opt'}, @{$self -> {'type'} });
+
+ return $result unless $result;
+
+ for (keys(%{$self -> {'default'} }) )
+ {
+ if (! defined(${$self -> {'opt'} }{$_})) #{
+ {
+ ${$self -> {'opt'} }{$_} = ${$self -> {'default'} }{$_}{'default'};
+ }
+ }
+
+ $result;
+} # End of getOptions.
+
+# --------------------------------------------------------------------------
+
+sub helpOptions
+{
+ my($self) = shift;
+ my($noHelp) = shift;
+ $noHelp = 0 unless $noHelp;
+ my($optwidth, $typewidth, $defaultwidth, $maxlinewidth, $valind, $valwidth)
+ = (10, 5, 9, 78, 4, 11);
+
+ print "$self->{'helpText'}" if ($self -> {'helpText'});
+
+ print ' Option', ' ' x ($optwidth - length('Option') -1 ),
+ 'Type', ' ' x ($typewidth - length('Type') + 1),
+ 'Default', ' ' x ($defaultwidth - length('Default') ),
+ "Description\n";
+
+ for (sort byOrder keys(%{$self -> {'default'} }) )
+ {
+ my($line, $help, $option, $val);
+ $option = $_;
+ next if ${$self->{'default'} }{$_}{'noHelp'} && ${$self->{'default'} }{$_}{'noHelp'} > $noHelp;
+ $line = " -$_ " . ' ' x ($optwidth - (2 + length) ) .
+ "${$self->{'default'} }{$_}{'type'} ".
+ ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) ));
+
+ $val = ${$self->{'default'} }{$_}{'linkage'};
+ if ($val)
+ {
+ if (ref($val) eq 'SCALAR')
+ {
+ $val = $$val;
+ }
+ else
+ {
+ $val = '';
+ }
+ }
+ else
+ {
+ $val = ${$self->{'default'} }{$_}{'default'};
+ }
+ $line .= "$val ";
+ $line .= ' ' x ($optwidth + $typewidth + $defaultwidth + 1 - length($line));
+
+ if (defined(${$self -> {'default'} }{$_}{'verbose'}) &&
+ ${$self -> {'default'} }{$_}{'verbose'} ne '')
+ {
+ $help = "${$self->{'default'} }{$_}{'verbose'}";
+ }
+ else
+ {
+ $help = ' ';
+ }
+ if ((length("$line") + length($help)) < $maxlinewidth)
+ {
+ print $line , $help, "\n";
+ }
+ else
+ {
+ print $line, "\n", ' ' x $valind, $help, "\n";
+ }
+ for $val (sort byOrder keys(%{${$self->{'default'}}{$option}{'values'}}))
+ {
+ print ' ' x ($valind + 2);
+ print $val, ' ', ' ' x ($valwidth - length($val) - 2);
+ print ${$self->{'default'}}{$option}{'values'}{$val}, "\n";
+ }
+ }
+
+ print <<EOT;
+Note: 'Options' may be abbreviated. 'Type' specifications mean:
+ <none>| ! no argument: variable is set to 1 on -foo (or, to 0 on -nofoo)
+ =s | :s mandatory (or, optional) string argument
+ =i | :i mandatory (or, optional) integer argument
+EOT
+} # End of helpOptions.
+
+#-------------------------------------------------------------------
+
+sub new
+{
+ my($class) = @_;
+ my($self) = {};
+ $self -> {'default'} = {};
+ $self -> {'helpText'} = '';
+ $self -> {'opt'} = {};
+ $opt = $self -> {'opt'}; # An alias for $self -> {'opt'}.
+ $self -> {'type'} = ();
+
+ return bless $self, $class;
+
+} # End of new.
+
+# --------------------------------------------------------------------------
+
+1;
+
+# End MySimple.pm
+
+require "$ENV{T2H_HOME}/MySimple.pm"
+ if ($0 =~ /\.pl$/ &&
+ -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init");
+
+package main;
+
+#+++############################################################################
+# #
+# Constants #
+# #
+#---############################################################################
+
+$DEBUG_TOC = 1;
+$DEBUG_INDEX = 2;
+$DEBUG_BIB = 4;
+$DEBUG_GLOSS = 8;
+$DEBUG_DEF = 16;
+$DEBUG_HTML = 32;
+$DEBUG_USER = 64;
+$DEBUG_L2H = 128;
+
+
+$BIBRE = '\[[\w\/-]+\]'; # RE for a bibliography reference
+$FILERE = '[\/\w.+-]+'; # RE for a file name
+$VARRE = '[^\s\{\}]+'; # RE for a variable name
+$NODERE = '[^,:]+'; # RE for a node name
+$NODESRE = '[^:]+'; # RE for a list of node names
+
+$ERROR = "***"; # prefix for errors
+$WARN = "**"; # prefix for warnings
+
+ # program home page
+$PROTECTTAG = "_ThisIsProtected_"; # tag to recognize protected sections
+
+$CHAPTEREND = "<!-- End chapter -->\n"; # to know where a chpater ends
+$SECTIONEND = "<!-- End section -->\n"; # to know where section ends
+$TOPEND = "<!-- End top -->\n"; # to know where top ends
+
+
+
+#
+# pre-defined indices
+#
+$index_properties =
+{
+ 'c' => { name => 'cp'},
+ 'f' => { name => 'fn', code => 1},
+ 'v' => { name => 'vr', code => 1},
+ 'k' => { name => 'ky', code => 1},
+ 'p' => { name => 'pg', code => 1},
+ 't' => { name => 'tp', code => 1}
+};
+
+
+%predefined_index = (
+ 'cp', 'c',
+ 'fn', 'f',
+ 'vr', 'v',
+ 'ky', 'k',
+ 'pg', 'p',
+ 'tp', 't',
+ );
+
+#
+# valid indices
+#
+%valid_index = (
+ 'c', 1,
+ 'f', 1,
+ 'v', 1,
+ 'k', 1,
+ 'p', 1,
+ 't', 1,
+ );
+
+#
+# texinfo section names to level
+#
+%sec2level = (
+ 'top', 0,
+ 'chapter', 1,
+ 'unnumbered', 1,
+ 'majorheading', 1,
+ 'chapheading', 1,
+ 'appendix', 1,
+ 'section', 2,
+ 'unnumberedsec', 2,
+ 'heading', 2,
+ 'appendixsec', 2,
+ 'appendixsection', 2,
+ 'subsection', 3,
+ 'unnumberedsubsec', 3,
+ 'subheading', 3,
+ 'appendixsubsec', 3,
+ 'subsubsection', 4,
+ 'unnumberedsubsubsec', 4,
+ 'subsubheading', 4,
+ 'appendixsubsubsec', 4,
+ );
+
+#
+# accent map, TeX command to ISO name
+#
+%accent_map = (
+ '"', 'uml',
+ '~', 'tilde',
+ '^', 'circ',
+ '`', 'grave',
+ '\'', 'acute',
+ );
+
+#
+# texinfo "simple things" (@foo) to HTML ones
+#
+%simple_map = (
+ # cf. makeinfo.c
+ "*", "<BR>", # HTML+
+ " ", " ",
+ "\t", " ",
+ "-", "&#173;", # soft hyphen
+ "\n", "\n",
+ "|", "",
+ 'tab', '<\/TD><TD>',
+ # spacing commands
+ ":", "",
+ "!", "!",
+ "?", "?",
+ ".", ".",
+ "-", "",
+ );
+
+#
+# texinfo "things" (@foo{}) to HTML ones
+#
+%things_map = (
+ 'TeX', 'TeX',
+ 'br', '<P>', # paragraph break
+ 'bullet', '*',
+ 'copyright', '(C)',
+ 'dots', '<small>...<\/small>',
+ 'enddots', '<small>....<\/small>',
+ 'equiv', '==',
+ 'error', 'error-->',
+ 'expansion', '==>',
+ 'minus', '-',
+ 'point', '-!-',
+ 'print', '-|',
+ 'result', '=>',
+ 'today', $T2H_TODAY,
+ 'aa', '&aring;',
+ 'AA', '&Aring;',
+ 'ae', '&aelig;',
+ 'oe', '&#156;',
+ 'AE', '&AElig;',
+ 'OE', '&#140;',
+ 'o', '&oslash;',
+ 'O', '&Oslash;',
+ 'ss', '&szlig;',
+ 'l', '\/l',
+ 'L', '\/L',
+ 'exclamdown', '&iexcl;',
+ 'questiondown', '&iquest;',
+ 'pounds', '&pound;'
+ );
+
+#
+# texinfo styles (@foo{bar}) to HTML ones
+#
+%style_map = (
+ 'acronym', '&do_acronym',
+ 'asis', '',
+ 'b', 'B',
+ 'cite', 'CITE',
+ 'code', 'CODE',
+ 'command', 'CODE',
+ 'ctrl', '&do_ctrl', # special case
+ 'dfn', 'EM', # DFN tag is illegal in the standard
+ 'dmn', '', # useless
+ 'email', '&do_email', # insert a clickable email address
+ 'emph', 'EM',
+ 'env', 'CODE',
+ 'file', '"TT', # will put quotes, cf. &apply_style
+ 'i', 'I',
+ 'kbd', 'KBD',
+ 'key', 'KBD',
+ 'math', '&do_math',
+ 'option', '"SAMP', # will put quotes, cf. &apply_style
+ 'r', '', # unsupported
+ 'samp', '"SAMP', # will put quotes, cf. &apply_style
+ 'sc', '&do_sc', # special case
+ 'strong', 'STRONG',
+ 't', 'TT',
+ 'titlefont', '', # useless
+ 'uref', '&do_uref', # insert a clickable URL
+ 'url', '&do_url', # insert a clickable URL
+ 'var', 'VAR',
+ 'w', '', # unsupported
+ 'H', '&do_accent',
+ 'dotaccent', '&do_accent',
+ 'ringaccent','&do_accent',
+ 'tieaccent', '&do_accent',
+ 'u','&do_accent',
+ 'ubaraccent','&do_accent',
+ 'udotaccent','&do_accent',
+ 'v', '&do_accent',
+ ',', '&do_accent',
+ 'dotless', '&do_accent'
+ );
+
+#
+# texinfo format (@foo/@end foo) to HTML ones
+#
+%format_map = (
+ 'quotation', 'BLOCKQUOTE',
+ # lists
+ 'itemize', 'UL',
+ 'enumerate', 'OL',
+ # poorly supported
+ 'flushleft', 'PRE',
+ 'flushright', 'PRE',
+ );
+
+#
+# an eval of these $complex_format_map->{what}->[0] yields beginning
+# an eval of these $complex_format_map->{what}->[1] yieleds end
+$complex_format_map =
+{
+ example =>
+ [
+ q{"<TABLE><tr>$T2H_EXAMPLE_INDENT_CELL<td class=example><pre>"},
+ q{'</pre></td></tr></table>'}
+ ],
+ smallexample =>
+ [
+ q{"<TABLE><tr>$T2H_SMALL_EXAMPLE_INDENT_CELL<td class=smallexample><FONT SIZE=$T2H_SMALL_FONT_SIZE><pre>"},
+ q{'</FONT></pre></td></tr></table>'}
+ ],
+ display =>
+ [
+ q{"<TABLE><tr>$T2H_EXAMPLE_INDENT_CELL<td class=display><pre " . 'style="font-family: serif">'},
+ q{'</pre></td></tr></table>'}
+ ],
+ smalldisplay =>
+ [
+ q{"<TABLE><tr>$T2H_SMALL_EXAMPLE_INDENT_CELL<td class=smalldisplay><FONT SIZE=$T2H_SMALL_FONT_SIZE><pre " . 'style="font-family: serif">'},
+ q{'</pre></FONT></td></tr></table>'}
+ ]
+};
+
+$complex_format_map->{lisp} = $complex_format_map->{example};
+$complex_format_map->{smalllisp} = $complex_format_map->{smallexample};
+$complex_format_map->{format} = $complex_format_map->{display};
+$complex_format_map->{smallformat} = $complex_format_map->{smalldisplay};
+
+#
+# texinfo definition shortcuts to real ones
+#
+%def_map = (
+ # basic commands
+ 'deffn', 0,
+ 'defvr', 0,
+ 'deftypefn', 0,
+ 'deftypevr', 0,
+ 'defcv', 0,
+ 'defop', 0,
+ 'deftp', 0,
+ # basic x commands
+ 'deffnx', 0,
+ 'defvrx', 0,
+ 'deftypefnx', 0,
+ 'deftypevrx', 0,
+ 'defcvx', 0,
+ 'defopx', 0,
+ 'deftpx', 0,
+ # shortcuts
+ 'defun', 'deffn Function',
+ 'defmac', 'deffn Macro',
+ 'defspec', 'deffn {Special Form}',
+ 'defvar', 'defvr Variable',
+ 'defopt', 'defvr {User Option}',
+ 'deftypefun', 'deftypefn Function',
+ 'deftypevar', 'deftypevr Variable',
+ 'defivar', 'defcv {Instance Variable}',
+ 'deftypeivar', 'defcv {Instance Variable}', # NEW: FIXME
+ 'defmethod', 'defop Method',
+ 'deftypemethod', 'defop Method', # NEW:FIXME
+ # x shortcuts
+ 'defunx', 'deffnx Function',
+ 'defmacx', 'deffnx Macro',
+ 'defspecx', 'deffnx {Special Form}',
+ 'defvarx', 'defvrx Variable',
+ 'defoptx', 'defvrx {User Option}',
+ 'deftypefunx', 'deftypefnx Function',
+ 'deftypevarx', 'deftypevrx Variable',
+ 'defivarx', 'defcvx {Instance Variable}',
+ 'defmethodx', 'defopx Method',
+ );
+
+#
+# things to skip
+#
+%to_skip = (
+ # comments
+ 'c', 1,
+ 'comment', 1,
+ 'ifnotinfo', 1,
+ 'ifnottex', 1,
+ 'ifhtml', 1,
+ 'end ifhtml', 1,
+ 'end ifnotinfo', 1,
+ 'end ifnottex', 1,
+ # useless
+ 'detailmenu', 1,
+ 'direntry', 1,
+ 'contents', 1,
+ 'shortcontents', 1,
+ 'summarycontents', 1,
+ 'footnotestyle', 1,
+ 'end ifclear', 1,
+ 'end ifset', 1,
+ 'titlepage', 1,
+ 'end titlepage', 1,
+ # unsupported commands (formatting)
+ 'afourpaper', 1,
+ 'cropmarks', 1,
+ 'finalout', 1,
+ 'headings', 1,
+ 'sp', 1,
+ 'need', 1,
+ 'page', 1,
+ 'setchapternewpage', 1,
+ 'everyheading', 1,
+ 'everyfooting', 1,
+ 'evenheading', 1,
+ 'evenfooting', 1,
+ 'oddheading', 1,
+ 'oddfooting', 1,
+ 'smallbook', 1,
+ 'vskip', 1,
+ 'filbreak', 1,
+ 'paragraphindent', 1,
+ # unsupported formats
+ 'cartouche', 1,
+ 'end cartouche', 1,
+ 'group', 1,
+ 'end group', 1,
+ );
+
+#+++############################################################################
+# #
+# Argument parsing, initialisation #
+# #
+#---############################################################################
+
+#
+# flush stdout and stderr after every write
+#
+select(STDERR);
+$| = 1;
+select(STDOUT);
+$| = 1;
+
+
+%value = (); # hold texinfo variables, see also -D
+$use_bibliography = 1;
+$use_acc = 1;
+
+#
+# called on -init-file
+sub LoadInitFile
+{
+ my $init_file = shift;
+ # second argument is value of options
+ $init_file = shift;
+ if (-f $init_file)
+ {
+ print "# reading initialization file from $init_file\n"
+ if ($T2H_VERBOSE);
+ require($init_file);
+ }
+ else
+ {
+ print "$ERROR Error: can't read init file $int_file\n";
+ $init_file = '';
+ }
+}
+
+#
+# called on -lang
+sub SetDocumentLanguage
+{
+ my $lang = shift;
+ if (! exists($T2H_WORDS->{$lang}))
+ {
+ warn "$ERROR: Language specs for '$lang' do not exists. Reverting to '" .
+ ($T2H_LANG ? T2H_LANG : "en") . "'\n";
+ }
+ else
+ {
+ print "# using '$lang' as document language\n" if ($T2H_VERBOSE);
+ $T2H_LANG = $lang;
+ }
+}
+
+##
+## obsolete cmd line options
+##
+$T2H_OBSOLETE_OPTIONS -> {'no-section_navigation'} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_SECTION_NAVIGATION = 0;},
+ verbose => 'obsolete, use -nosec_nav',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {use_acc} =
+{
+ type => '!',
+ linkage => \$use_acc,
+ verbose => 'obsolete',
+ noHelp => 2
+};
+$T2H_OBSOLETE_OPTIONS -> {expandinfo} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_EXPAND = 'info';},
+ verbose => 'obsolete, use "-expand info" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {expandtex} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_EXPAND = 'tex';},
+ verbose => 'obsolete, use "-expand tex" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {monolithic} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_SPLIT = '';},
+ verbose => 'obsolete, use "-split no" instead',
+ noHelp => 2
+};
+$T2H_OBSOLETE_OPTIONS -> {split_node} =
+{
+ type => '!',
+ linkage => sub{$main::T2H_SPLIT = 'section';},
+ verbose => 'obsolete, use "-split section" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {split_chapter} =
+{
+ type => '!',
+ linkage => sub{$main::T2H_SPLIT = 'chapter';},
+ verbose => 'obsolete, use "-split chapter" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {no_verbose} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_VERBOSE = 0;},
+ verbose => 'obsolete, use -noverbose instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {output_file} =
+{
+ type => '=s',
+ linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';},
+ verbose => 'obsolete, use -out_file instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {section_navigation} =
+{
+ type => '!',
+ linkage => \$T2H_SECTION_NAVIGATION,
+ verbose => 'obsolete, use -sec_nav instead',
+ noHelp => 2,
+};
+
+$T2H_OBSOLETE_OPTIONS -> {verbose} =
+{
+ type => '!',
+ linkage => \$T2H_VERBOSE,
+ verbose => 'obsolete, use -Verbose instead',
+ noHelp => 2
+};
+
+# read initialzation from $sysconfdir/texi2htmlrc or $HOME/.texi2htmlrc
+my $home = $ENV{HOME};
+defined($home) or $home = '';
+foreach $i ('/usr/local/etc/texi2htmlrc', "$home/.texi2htmlrc") {
+ if (-f $i) {
+ print "# reading initialization file from $i\n"
+ if ($T2H_VERBOSE);
+ require($i);
+ }
+}
+
+
+#+++############################################################################
+# #
+# parse command-line options
+# #
+#---############################################################################
+$T2H_USAGE_TEXT = <<EOT;
+Usage: texi2html [OPTIONS] TEXINFO-FILE
+Translates Texinfo source documentation to HTML.
+EOT
+$T2H_FAILURE_TEXT = <<EOT;
+Try 'texi2html -help' for usage instructions.
+EOT
+$options = new Getopt::MySimple;
+
+# some older version of GetOpt::Long don't have
+# Getopt::Long::Configure("pass_through")
+eval {Getopt::Long::Configure("pass_through");};
+$Configure_failed = $@ && <<EOT;
+**WARNING: Parsing of obsolete command-line options could have failed.
+ Consider to use only documented command-line options (run
+ 'texi2html -help 2' for a complete list) or upgrade to perl
+ version 5.005 or higher.
+EOT
+
+if (! $options->getOptions($T2H_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
+{
+ print $Configure_failed if $Configure_failed;
+ die $T2H_FAILURE_TEXT;
+}
+
+if (@ARGV > 1)
+{
+ eval {Getopt::Long::Configure("no_pass_through");};
+ if (! $options->getOptions($T2H_OBSOLETE_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
+ {
+ print $Configure_failed if $Configure_failed;
+ die $T2H_FAILURE_TEXT;
+ }
+}
+
+if ($T2H_CHECK) {
+ die "Need file to check\n$T2H_FAILURE_TEXT" unless @ARGV > 0;
+ &check;
+ exit;
+}
+
+#+++############################################################################
+# #
+# evaluation of cmd line options
+# #
+#---############################################################################
+
+if ($T2H_EXPAND eq 'info')
+{
+ $to_skip{'ifinfo'} = 1;
+ $to_skip{'end ifinfo'} = 1;
+}
+elsif ($T2H_EXPAND eq 'tex')
+{
+ $to_skip{'iftex'} = 1;
+ $to_skip{'end iftex'} = 1;
+
+}
+
+$T2H_INVISIBLE_MARK = '<IMG SRC="invisible.xbm">' if $T2H_INVISIBLE_MARK eq 'xbm';
+
+#
+# file name buisness
+#
+die "Need exactly one file to translate\n$T2H_FAILURE_TEXT" unless @ARGV == 1;
+$docu = shift(@ARGV);
+if ($docu =~ /.*\//) {
+ chop($docu_dir = $&);
+ $docu_name = $';
+} else {
+ $docu_dir = '.';
+ $docu_name = $docu;
+}
+unshift(@T2H_INCLUDE_DIRS, $docu_dir);
+$docu_name =~ s/\.te?x(i|info)?$//; # basename of the document
+$docu_name = $T2H_PREFIX if ($T2H_PREFIX);
+
+# subdir
+if ($T2H_SUBDIR && ! $T2H_OUT)
+{
+ $T2H_SUBDIR =~ s|/*$||;
+ unless (-d "$T2H_SUBDIR" && -w "$T2H_SUBDIR")
+ {
+ if ( mkdir($T2H_SUBDIR, oct(755)))
+ {
+ print "# created directory $T2H_SUBDIR\n" if ($T2H_VERBOSE);
+ }
+ else
+ {
+ warn "$ERROR can't create directory $T2H_SUBDIR. Put results into current directory\n";
+ $T2H_SUBDIR = '';
+ }
+ }
+}
+
+if ($T2H_SUBDIR && ! $T2H_OUT)
+{
+ $docu_rdir = "$T2H_SUBDIR/";
+ print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
+}
+else
+{
+ if ($T2H_OUT && $T2H_OUT =~ m|(.*)/|)
+ {
+ $docu_rdir = "$1/";
+ print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
+ }
+ else
+ {
+ print "# putting result files into current directory \n" if ($T2H_VERBOSE);
+ $docu_rdir = '';
+ }
+}
+
+# extension
+if ($T2H_SHORTEXTN)
+{
+ $docu_ext = "htm";
+}
+else
+{
+ $docu_ext = "html";
+}
+if ($T2H_TOP_FILE =~ /\..*$/)
+{
+ $T2H_TOP_FILE = $`.".$docu_ext";
+}
+
+# result files
+if (! $T2H_OUT && ($T2H_SPLIT =~ /section/i || $T2H_SPLIT =~ /node/i))
+{
+ $T2H_SPLIT = 'section';
+}
+elsif (! $T2H_OUT && $T2H_SPLIT =~ /chapter/i)
+{
+ $T2H_SPLIT = 'chapter'
+}
+else
+{
+ undef $T2H_SPLIT;
+}
+
+$docu_doc = "$docu_name.$docu_ext"; # document's contents
+$docu_doc_file = "$docu_rdir$docu_doc";
+if ($T2H_SPLIT)
+{
+ $docu_toc = $T2H_TOC_FILE || "${docu_name}_toc.$docu_ext"; # document's table of contents
+ $docu_stoc = "${docu_name}_ovr.$docu_ext"; # document's short toc
+ $docu_foot = "${docu_name}_fot.$docu_ext"; # document's footnotes
+ $docu_about = "${docu_name}_abt.$docu_ext"; # about this document
+ $docu_top = $T2H_TOP_FILE || $docu_doc;
+}
+else
+{
+ if ($T2H_OUT)
+ {
+ $docu_doc = $T2H_OUT;
+ $docu_doc =~ s|.*/||;
+ }
+ $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc;
+}
+
+$docu_toc_file = "$docu_rdir$docu_toc";
+$docu_stoc_file = "$docu_rdir$docu_stoc";
+$docu_foot_file = "$docu_rdir$docu_foot";
+$docu_about_file = "$docu_rdir$docu_about";
+$docu_top_file = "$docu_rdir$docu_top";
+
+$docu_frame_file = "$docu_rdir${docu_name}_frame.$docu_ext";
+$docu_toc_frame_file = "$docu_rdir${docu_name}_toc_frame.$docu_ext";
+
+#
+# variables
+#
+$value{'html'} = 1; # predefine html (the output format)
+$value{'texi2html'} = $THISVERSION; # predefine texi2html (the translator)
+# _foo: internal to track @foo
+foreach ('_author', '_title', '_subtitle',
+ '_settitle', '_setfilename', '_shorttitle') {
+ $value{$_} = ''; # prevent -w warnings
+}
+%node2sec = (); # node to section name
+%sec2node = (); # section to node name
+%sec2number = (); # section to number
+%number2sec = (); # number to section
+%idx2node = (); # index keys to node
+%node2href = (); # node to HREF
+%node2next = (); # node to next
+%node2prev = (); # node to prev
+%node2up = (); # node to up
+%bib2href = (); # bibliography reference to HREF
+%gloss2href = (); # glossary term to HREF
+@sections = (); # list of sections
+%tag2pro = (); # protected sections
+
+#
+# initial indexes
+#
+$bib_num = 0;
+$foot_num = 0;
+$gloss_num = 0;
+$idx_num = 0;
+$sec_num = 0;
+$doc_num = 0;
+$html_num = 0;
+
+#
+# can I use ISO8879 characters? (HTML+)
+#
+if ($T2H_USE_ISO) {
+ $things_map{'bullet'} = "&bull;";
+ $things_map{'copyright'} = "&copy;";
+ $things_map{'dots'} = "&hellip;";
+ $things_map{'equiv'} = "&equiv;";
+ $things_map{'expansion'} = "&rarr;";
+ $things_map{'point'} = "&lowast;";
+ $things_map{'result'} = "&rArr;";
+}
+
+#
+# read texi2html extensions (if any)
+#
+$extensions = 'texi2html.ext'; # extensions in working directory
+if (-f $extensions) {
+ print "# reading extensions from $extensions\n" if $T2H_VERBOSE;
+ require($extensions);
+}
+($progdir = $0) =~ s/[^\/]+$//;
+if ($progdir && ($progdir ne './')) {
+ $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory
+ if (-f $extensions) {
+ print "# reading extensions from $extensions\n" if $T2H_VERBOSE;
+ require($extensions);
+ }
+}
+
+
+print "# reading from $docu\n" if $T2H_VERBOSE;
+
+#########################################################################
+#
+# latex2html stuff
+#
+# latex2html conversions consist of three stages:
+# 1) ToLatex: Put "latex" code into a latex file
+# 2) ToHtml: Use latex2html to generate corresponding html code and images
+# 3) FromHtml: Extract generated code and images from latex2html run
+#
+
+##########################
+# default settings
+#
+
+# defaults for files and names
+
+sub l2h_Init
+{
+ local($root) = @_;
+
+ return 0 unless ($root);
+
+ $l2h_name = "${root}_l2h";
+
+ $l2h_latex_file = "$docu_rdir${l2h_name}.tex";
+ $l2h_cache_file = "${docu_rdir}l2h_cache.pm";
+ $T2H_L2H_L2H = "latex2html" unless ($T2H_L2H_L2H);
+
+ # destination dir -- generated images are put there, should be the same
+ # as dir of enclosing html document --
+ $l2h_html_file = "$docu_rdir${l2h_name}.html";
+ $l2h_prefix = "${l2h_name}_";
+ return 1;
+}
+
+
+##########################
+#
+# First stage: Generation of Latex file
+# Initialize with: l2h_InitToLatex
+# Add content with: l2h_ToLatex($text) --> HTML placeholder comment
+# Finish with: l2h_FinishToLatex
+#
+
+$l2h_latex_preample = <<EOT;
+% This document was automatically generated by the l2h extenstion of texi2html
+% DO NOT EDIT !!!
+\\documentclass{article}
+\\usepackage{html}
+\\begin{document}
+EOT
+
+$l2h_latex_closing = <<EOT;
+\\end{document}
+EOT
+
+# return used latex 1, if l2h could be initalized properly, 0 otherwise
+sub l2h_InitToLatex
+{
+ %l2h_to_latex = ();
+ unless ($T2H_L2H_SKIP)
+ {
+ unless (open(L2H_LATEX, ">$l2h_latex_file"))
+ {
+ warn "$ERROR Error l2h: Can't open latex file '$latex_file' for writing\n";
+ return 0;
+ }
+ print "# l2h: use ${l2h_latex_file} as latex file\n" if ($T2H_VERBOSE);
+ print L2H_LATEX $l2h_latex_preample;
+ }
+ # open database for caching
+ l2h_InitCache();
+ $l2h_latex_count = 0;
+ $l2h_to_latex_count = 0;
+ $l2h_cached_count = 0;
+ return 1;
+}
+
+# print text (1st arg) into latex file (if not already there), return
+# HTML commentary which can be later on replaced by the latex2html
+# generated text
+sub l2h_ToLatex
+{
+ my($text) = @_;
+ my($count);
+
+ $l2h_to_latex_count++;
+ $text =~ s/(\s*)$//;
+
+ # try whether we can cache it
+ my $cached_text = l2h_FromCache($text);
+ if ($cached_text)
+ {
+ $l2h_cached_count++;
+ return $cached_text;
+ }
+
+ # try whether we have text already on things to do
+ unless ($count = $l2h_to_latex{$text})
+ {
+ $count = $l2h_latex_count;
+ $l2h_latex_count++;
+ $l2h_to_latex{$text} = $count;
+ $l2h_to_latex[$count] = $text;
+ unless ($T2H_L2H_SKIP)
+ {
+ print L2H_LATEX "\\begin{rawhtml}\n";
+ print L2H_LATEX "<!-- l2h_begin ${l2h_name} ${count} -->\n";
+ print L2H_LATEX "\\end{rawhtml}\n";
+
+ print L2H_LATEX "$text\n";
+
+ print L2H_LATEX "\\begin{rawhtml}\n";
+ print L2H_LATEX "<!-- l2h_end ${l2h_name} ${count} -->\n";
+ print L2H_LATEX "\\end{rawhtml}\n";
+ }
+ }
+ return "<!-- l2h_replace ${l2h_name} ${count} -->";
+}
+
+# print closing into latex file and close it
+sub l2h_FinishToLatex
+{
+ local ($reused);
+
+ $reused = $l2h_to_latex_count - $l2h_latex_count - $l2h_cached_count;
+ unless ($T2H_L2H_SKIP)
+ {
+ print L2H_LATEX $l2h_latex_closing;
+ close(L2H_LATEX);
+ }
+ print "# l2h: finished to latex ($l2h_cached_count cached, $reused reused, $l2h_latex_count contents)\n" if ($T2H_VERBOSE);
+ unless ($l2h_latex_count)
+ {
+ l2h_Finish();
+ return 0;
+ }
+ return 1;
+}
+
+###################################
+# Second stage: Use latex2html to generate corresponding html code and images
+#
+# l2h_ToHtml([$l2h_latex_file, [$l2h_html_dir]]):
+# Call latex2html on $l2h_latex_file
+# Put images (prefixed with $l2h_name."_") and html file(s) in $l2h_html_dir
+# Return 1, on success
+# 0, otherwise
+#
+sub l2h_ToHtml
+{
+ local($call, $ext, $root, $dotbug);
+
+ if ($T2H_L2H_SKIP)
+ {
+ print "# l2h: skipping latex2html run\n" if ($T2H_VERBOSE);
+ return 1;
+ }
+
+ # Check for dot in directory where dvips will work
+ if ($T2H_L2H_TMP)
+ {
+ if ($T2H_L2H_TMP =~ /\./)
+ {
+ warn "$ERROR Warning l2h: l2h_tmp dir contains a dot. Use /tmp, instead\n";
+ $dotbug = 1;
+ }
+ }
+ else
+ {
+ if (&getcwd =~ /\./)
+ {
+ warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n";
+ $dotbug = 1;
+ }
+ }
+ # fix it, if necessary and hope that it works
+ $T2H_L2H_TMP = "/tmp" if ($dotbug);
+
+ $call = $T2H_L2H_L2H;
+ # use init file, if specified
+ $call = $call . " -init_file " . $init_file if ($init_file && -f $init_file);
+ # set output dir
+ $call .= ($docu_rdir ? " -dir $docu_rdir" : " -no_subdir");
+ # use l2h_tmp, if specified
+ $call = $call . " -tmp $T2H_L2H_TMP" if ($T2H_L2H_TMP);
+ # options we want to be sure of
+ $call = $call ." -address 0 -info 0 -split 0 -no_navigation -no_auto_link";
+ $call = $call ." -prefix ${l2h_prefix} $l2h_latex_file";
+
+ print "# l2h: executing '$call'\n" if ($T2H_VERBOSE);
+ if (system($call))
+ {
+ warn "l2h ***Error: '${call}' did not succeed\n";
+ return 0;
+ }
+ else
+ {
+ print "# l2h: latex2html finished successfully\n" if ($T2H_VERBOSE);
+ return 1;
+ }
+}
+
+# this is directly pasted over from latex2html
+sub getcwd {
+ local($_) = `pwd`;
+
+ die "'pwd' failed (out of memory?)\n"
+ unless length;
+ chop;
+ $_;
+}
+
+
+##########################
+# Third stage: Extract generated contents from latex2html run
+# Initialize with: l2h_InitFromHtml
+# open $l2h_html_file for reading
+# reads in contents into array indexed by numbers
+# return 1, on success -- 0, otherwise
+# Extract Html code with: l2h_FromHtml($text)
+# replaces in $text all previosuly inserted comments by generated html code
+# returns (possibly changed) $text
+# Finish with: l2h_FinishFromHtml
+# closes $l2h_html_dir/$l2h_name.".$docu_ext"
+
+sub l2h_InitFromHtml
+{
+ local($h_line, $h_content, $count, %l2h_img);
+
+ if (! open(L2H_HTML, "<${l2h_html_file}"))
+ {
+ print "$ERROR Error l2h: Can't open ${l2h_html_file} for reading\n";
+ return 0;
+ }
+ print "# l2h: use ${l2h_html_file} as html file\n" if ($T2H_VERBOSE);
+
+ $l2h_html_count = 0;
+
+ while ($h_line = <L2H_HTML>)
+ {
+ if ($h_line =~ /^<!-- l2h_begin $l2h_name ([0-9]+) -->/)
+ {
+ $count = $1;
+ $h_content = "";
+ while ($h_line = <L2H_HTML>)
+ {
+ if ($h_line =~ /^<!-- l2h_end $l2h_name $count -->/)
+ {
+ chomp $h_content;
+ chomp $h_content;
+ $l2h_html_count++;
+ $h_content = l2h_ToCache($count, $h_content);
+ $l2h_from_html[$count] = $h_content;
+ $h_content = '';
+ last;
+ }
+ $h_content = $h_content.$h_line;
+ }
+ if ($hcontent)
+ {
+ print "$ERROR Warning l2h: l2h_end $l2h_name $count not found\n"
+ if ($T2H_VERBOSE);
+ close(L2H_HTML);
+ return 0;
+ }
+ }
+ }
+ print "# l2h: Got $l2h_html_count of $l2h_latex_count html contents\n"
+ if ($T2H_VERBOSE);
+
+ close(L2H_HTML);
+ return 1;
+}
+
+sub l2h_FromHtml
+{
+ local($text) = @_;
+ local($done, $to_do, $count);
+
+ $to_do = $text;
+
+ while ($to_do =~ /([^\000]*)<!-- l2h_replace $l2h_name ([0-9]+) -->([^\000]*)/)
+ {
+ $to_do = $1;
+ $count = $2;
+ $done = $3.$done;
+
+ $done = "<!-- l2h_end $l2h_name $count -->".$done
+ if ($T2H_DEBUG & $DEBUG_L2H);
+
+ $done = &l2h_ExtractFromHtml($count) . $done;
+
+ $done = "<!-- l2h_begin $l2h_name $count -->".$done
+ if ($T2H_DEBUG & $DEBUG_L2H);
+ }
+ return $to_do.$done;
+}
+
+
+sub l2h_ExtractFromHtml
+{
+ local($count) = @_;
+
+ return $l2h_from_html[$count] if ($l2h_from_html[$count]);
+
+ if ($count >= 0 && $count < $l2h_latex_count)
+ {
+ # now we are in trouble
+ local($l_l2h, $_);
+
+ $l2h_extract_error++;
+ print "$ERROR l2h: can't extract content $count from html\n"
+ if ($T2H_VERBOSE);
+ # try simple (ordinary) substition (without l2h)
+ $l_l2h = $T2H_L2H;
+ $T2H_L2H = 0;
+ $_ = $l2h_to_latex{$count};
+ $_ = &substitute_style($_);
+ &unprotect_texi;
+ $_ = "<!-- l2h: ". __LINE__ . " use texi2html -->" . $_
+ if ($T2H_DEBUG & $DEBUG_L2H);
+ $T2H_L2H = $l_l2h;
+ return $_;
+ }
+ else
+ {
+ # now we have been incorrectly called
+ $l2h_range_error++;
+ print "$ERROR l2h: Request of $count content which is out of valide range [0,$l2h_latex_count)\n";
+ return "<!-- l2h: ". __LINE__ . " out of range count $count -->"
+ if ($T2H_DEBUG & $DEBUG_L2H);
+ return "<!-- l2h: out of range count $count -->";
+ }
+}
+
+sub l2h_FinishFromHtml
+{
+ if ($T2H_VERBOSE)
+ {
+ if ($l2h_extract_error + $l2h_range_error)
+ {
+ print "# l2h: finished from html ($l2h_extract_error extract and $l2h_range_error errors)\n";
+ }
+ else
+ {
+ print "# l2h: finished from html (no errors)\n";
+ }
+ }
+}
+
+sub l2h_Finish
+{
+ l2h_StoreCache();
+ if ($T2H_L2H_CLEAN)
+ {
+ print "# l2h: removing temporary files generated by l2h extension\n"
+ if $T2H_VERBOSE;
+ while (<"$docu_rdir$l2h_name"*>)
+ {
+ unlink $_;
+ }
+ }
+ print "# l2h: Finished\n" if $T2H_VERBOSE;
+ return 1;
+}
+
+##############################
+# stuff for l2h caching
+#
+
+# I tried doing this with a dbm data base, but it did not store all
+# keys/values. Hence, I did as latex2html does it
+sub l2h_InitCache
+{
+ if (-r "$l2h_cache_file")
+ {
+ my $rdo = do "$l2h_cache_file";
+ warn("$ERROR l2h Error: could not load $docu_rdir$l2h_cache_file: $@\n")
+ unless ($rdo);
+ }
+}
+
+sub l2h_StoreCache
+{
+ return unless $l2h_latex_count;
+
+ my ($key, $value);
+ open(FH, ">$l2h_cache_file") || return warn"$ERROR l2h Error: could not open $docu_rdir$l2h_cache_file for writing: $!\n";
+
+
+ while (($key, $value) = each %l2h_cache)
+ {
+ # escape stuff
+ $key =~ s|/|\\/|g;
+ $key =~ s|\\\\/|\\/|g;
+ # weird, a \ at the end of the key results in an error
+ # maybe this also broke the dbm database stuff
+ $key =~ s|\\$|\\\\|;
+ $value =~ s/\|/\\\|/g;
+ $value =~ s/\\\\\|/\\\|/g;
+ $value =~ s|\\\\|\\\\\\\\|g;
+ print FH "\n\$l2h_cache_key = q/$key/;\n";
+ print FH "\$l2h_cache{\$l2h_cache_key} = q|$value|;\n";
+ }
+ print FH "1;";
+ close(FH);
+}
+
+# return cached html, if it exists for text, and if all pictures
+# are there, as well
+sub l2h_FromCache
+{
+ my $text = shift;
+ my $cached = $l2h_cache{$text};
+ if ($cached)
+ {
+ while ($cached =~ m/SRC="(.*?)"/g)
+ {
+ unless (-e "$docu_rdir$1")
+ {
+ return undef;
+ }
+ }
+ return $cached;
+ }
+ return undef;
+}
+
+# insert generated html into cache, move away images,
+# return transformed html
+$maximage = 1;
+sub l2h_ToCache
+{
+ my $count = shift;
+ my $content = shift;
+ my @images = ($content =~ /SRC="(.*?)"/g);
+ my ($src, $dest);
+
+ for $src (@images)
+ {
+ $dest = $l2h_img{$src};
+ unless ($dest)
+ {
+ my $ext;
+ if ($src =~ /.*\.(.*)$/ && $1 ne $docu_ext)
+ {
+ $ext = $1;
+ }
+ else
+ {
+ warn "$ERROR: L2h image $src has invalid extension\n";
+ next;
+ }
+ while (-e "$docu_rdir${docu_name}_$maximage.$ext") { $maximage++;}
+ $dest = "${docu_name}_$maximage.$ext";
+ system("cp -f $docu_rdir$src $docu_rdir$dest");
+ $l2h_img{$src} = $dest;
+ unlink "$docu_rdir$src" unless ($DEBUG & DEBUG_L2H);
+ }
+ $content =~ s/$src/$dest/g;
+ }
+ $l2h_cache{$l2h_to_latex[$count]} = $content;
+ return $content;
+}
+
+
+#+++############################################################################
+# #
+# Pass 1: read source, handle command, variable, simple substitution #
+# #
+#---############################################################################
+
+@lines = (); # whole document
+@toc_lines = (); # table of contents
+@stoc_lines = (); # table of contents
+$curlevel = 0; # current level in TOC
+$node = ''; # current node name
+$node_next = ''; # current node next name
+$node_prev = ''; # current node prev name
+$node_up = ''; # current node up name
+$in_table = 0; # am I inside a table
+$table_type = ''; # type of table ('', 'f', 'v', 'multi')
+@tables = (); # nested table support
+$in_bibliography = 0; # am I inside a bibliography
+$in_glossary = 0; # am I inside a glossary
+$in_top = 0; # am I inside the top node
+$has_top = 0; # did I see a top node?
+$has_top_command = 0; # did I see @top for automatic pointers?
+$in_pre = 0; # am I inside a preformatted section
+$in_list = 0; # am I inside a list
+$in_html = 0; # am I inside an HTML section
+$first_line = 1; # is it the first line
+$dont_html = 0; # don't protect HTML on this line
+$deferred_ref = ''; # deferred reference for indexes
+@html_stack = (); # HTML elements stack
+$html_element = ''; # current HTML element
+&html_reset;
+%macros = (); # macros
+
+# init l2h
+$T2H_L2H = &l2h_Init($docu_name) if ($T2H_L2H);
+$T2H_L2H = &l2h_InitToLatex if ($T2H_L2H);
+
+# build code for simple substitutions
+# the maps used (%simple_map and %things_map) MUST be aware of this
+# watch out for regexps, / and escaped characters!
+$subst_code = '';
+foreach (keys(%simple_map)) {
+ ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars
+ $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n";
+}
+foreach (keys(%things_map)) {
+ $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n";
+}
+if ($use_acc) {
+ # accentuated characters
+ foreach (keys(%accent_map)) {
+ if ($_ eq "`") {
+ $subst_code .= "s/$;3";
+ } elsif ($_ eq "'") {
+ $subst_code .= "s/$;4";
+ } else {
+ $subst_code .= "s/\\\@\\$_";
+ }
+ $subst_code .= "([a-z])/&\${1}$accent_map{$_};/gi;\n";
+ }
+}
+eval("sub simple_substitutions { $subst_code }");
+
+&init_input;
+INPUT_LINE: while ($_ = &next_line) {
+ #
+ # remove \input on the first lines only
+ #
+ if ($first_line) {
+ next if /^\\input/;
+ $first_line = 0;
+ }
+ # non-@ substitutions cf. texinfmt.el
+ #
+ # parse texinfo tags
+ #
+ $tag = '';
+ $end_tag = '';
+ if (/^\s*\@end\s+(\w+)\b/) {
+ $end_tag = $1;
+ } elsif (/^\s*\@(\w+)\b/) {
+ $tag = $1;
+ }
+ #
+ # handle @html / @end html
+ #
+ if ($in_html) {
+ if ($end_tag eq 'html') {
+ $in_html = 0;
+ } else {
+ $tag2pro{$in_html} .= $_;
+ }
+ next;
+ } elsif ($tag eq 'html') {
+ $in_html = $PROTECTTAG . ++$html_num;
+ push(@lines, $in_html);
+ next;
+ }
+
+ #
+ # try to remove inlined comments
+ # syntax from tex-mode.el comment-start-skip
+ #
+ s/((^|[^\@])(\@\@)*)\@c(omment | |\{|$).*/$1/;
+
+# Sometimes I use @c right at the end of a line ( to suppress the line feed )
+# s/((^|[^\@])(\@\@)*)\@c(omment)?$/$1/;
+# s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/;
+# s/(.*)\@c{.*?}(.*)/$1$2/;
+# s/(.*)\@comment{.*?}(.*)/$1$2/;
+# s/^(.*)\@c /$1/;
+# s/^(.*)\@comment /$1/;
+
+ #############################################################
+ # value substitution before macro expansion, so that
+ # it works in macro arguments
+ s/\@value{($VARRE)}/$value{$1}/eg;
+
+ #############################################################
+ # macro substitution
+ while (/\@(\w+)/g)
+ {
+ if (exists($macros->{$1}))
+ {
+ my $before = $`;
+ my $name = $1;
+ my $after = $';
+ my @args;
+ my $args;
+ if ($after =~ /^\s*{(.*?[^\\])}(.*)/)
+ {
+ $args = $1;
+ $after = $2;
+ }
+ elsif (@{$macros->{$name}->{Args}} == 1)
+ {
+ $args = $after;
+ $args =~ s/^\s*//;
+ $args =~ s/\s*$//;
+ $after = '';
+ }
+ $args =~ s|\\\\|\\|g;
+ $args =~ s|\\{|{|g;
+ $args =~ s|\\}|}|g;
+ if (@{$macros->{$name}->{Args}} > 1)
+ {
+ $args =~ s/(^|[^\\]),/$1$;/g ;
+ $args =~ s|\\,|,|g;
+ @args = split(/$;\s*/, $args) if (@{$macros->{$name}->{Args}} > 1);
+ }
+ else
+ {
+ $args =~ s|\\,|,|g;
+ @args = ($args);
+ }
+ my $macrobody = $macros->{$name}->{Body};
+ for ($i=0; $i<=$#args; $i++)
+ {
+ $macrobody =~ s|\\$macros->{$name}->{Args}->[$i]\\|$args[$i]|g;
+ }
+ $macrobody =~ s|\\\\|\\|g;
+ $_ = $before . $macrobody . $after;
+ unshift @input_spool, map {$_ = $_."\n"} split(/\n/, $_);
+ next INPUT_LINE;
+ }
+ } #
+
+
+ #
+ # try to skip the line
+ #
+ if ($end_tag) {
+ $in_titlepage = 0 if $end_tag eq 'titlepage';
+ next if $to_skip{"end $end_tag"};
+ } elsif ($tag) {
+ $in_titlepage = 1 if $tag eq 'titlepage';
+ next if $to_skip{$tag};
+ last if $tag eq 'bye';
+ }
+ if ($in_top) {
+ # parsing the top node
+ if ($tag eq 'node' ||
+ ($sec2level{$tag} && $tag !~ /unnumbered/ && $tag !~ /heading/))
+ {
+ # no more in top
+ $in_top = 0;
+ push(@lines, $TOPEND);
+ }
+ }
+ unless ($in_pre) {
+ s/``/\"/g;
+ s/''/\"/g;
+ s/([\w ])---([\w ])/$1--$2/g;
+ }
+ #
+ # analyze the tag
+ #
+ if ($tag) {
+ # skip lines
+ &skip_until($tag), next if $tag eq 'ignore';
+ &skip_until($tag), next if $tag eq 'ifnothtml';
+ if ($tag eq 'ifinfo')
+ {
+ &skip_until($tag), next unless $T2H_EXPAND eq 'info';
+ }
+ if ($tag eq 'iftex')
+ {
+ &skip_until($tag), next unless $T2H_EXPAND eq 'tex';
+ }
+ if ($tag eq 'tex')
+ {
+ # add to latex2html file
+ if ($T2H_EXPAND eq 'tex' && $T2H_L2H && ! $in_pre)
+ {
+ # add space to the end -- tex(i2dvi) does this, as well
+ push(@lines, &l2h_ToLatex(&string_until($tag) . " "));
+ }
+ else
+ {
+ &skip_until($tag);
+ }
+ next;
+ }
+ if ($tag eq 'titlepage')
+ {
+ next;
+ }
+ # handle special tables
+ if ($tag =~ /^(|f|v|multi)table$/) {
+ $table_type = $1;
+ $tag = 'table';
+ }
+ # special cases
+ if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*,/i)) {
+ $in_top = 1;
+ $has_top = 1;
+ $has_top_command = 1 if $tag eq 'top';
+ @lines = (); # ignore all lines before top (title page garbage)
+ next;
+ } elsif ($tag eq 'node') {
+ if ($in_top)
+ {
+ $in_top = 0;
+ push(@lines, $TOPEND);
+ }
+ warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o;
+ # request of "Richard Y. Kim" <ryk@ap.com>
+ s/^\@node\s+//;
+ $_ = &protect_html($_); # if node contains '&' for instance
+ ($node, $node_next, $node_prev, $node_up) = split(/,/);
+ &normalise_node($node);
+ &normalise_node($node_next);
+ &normalise_node($node_prev);
+ &normalise_node($node_up);
+ $node =~ /\"/ ?
+ push @lines, &html_debug("<A NAME='$node'></A>\n", __LINE__) :
+ push @lines, &html_debug("<A NAME=\"$node\"></A>\n", __LINE__);
+ next;
+ } elsif ($tag eq 'include') {
+ if (/^\@include\s+($FILERE)\s*$/o) {
+ $file = LocateIncludeFile($1);
+ if ($file && -e $file) {
+ &open($file);
+ print "# including $file\n" if $T2H_VERBOSE;
+ } else {
+ warn "$ERROR Can't find $1, skipping";
+ }
+ } else {
+ warn "$ERROR Bad include line: $_";
+ }
+ next;
+ } elsif ($tag eq 'ifclear') {
+ if (/^\@ifclear\s+($VARRE)\s*$/o) {
+ next unless defined($value{$1});
+ &skip_until($tag);
+ } else {
+ warn "$ERROR Bad ifclear line: $_";
+ }
+ next;
+ } elsif ($tag eq 'ifset') {
+ if (/^\@ifset\s+($VARRE)\s*$/o) {
+ next if defined($value{$1});
+ &skip_until($tag);
+ } else {
+ warn "$ERROR Bad ifset line: $_";
+ }
+ next;
+ } elsif ($tag eq 'menu') {
+ unless ($T2H_SHOW_MENU) {
+ &skip_until($tag);
+ next;
+ }
+ &html_push_if($tag);
+ push(@lines, &html_debug('', __LINE__));
+ } elsif ($format_map{$tag}) {
+ $in_pre = 1 if $format_map{$tag} eq 'PRE';
+ &html_push_if($format_map{$tag});
+ push(@lines, &html_debug('', __LINE__));
+ $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ;
+# push(@lines, &debug("<BLOCKQUOTE>\n", __LINE__))
+# if $tag =~ /example/i;
+ # sunshine@sunshineco.com: <PRE>bla</PRE> looks better than
+ # <PRE>\nbla</PRE> (at least on NeXTstep browser
+ push(@lines, &debug("<$format_map{$tag}>" .
+ ($in_pre ? '' : "\n"), __LINE__));
+ next;
+ }
+ elsif (exists $complex_format_map->{$tag})
+ {
+ my $start = eval $complex_format_map->{$tag}->[0];
+ if ($@)
+ {
+ print "$ERROR: eval of complex_format_map->{$tag}->[0] $complex_format_map->{$tag}->[0]: $@";
+ $start = '<pre>'
+ }
+ $in_pre = 1 if $start =~ /<pre/;
+ push(@lines, html_debug($start. ($in_pre ? '' : "\n"), __LINE__));
+ next;
+ } elsif ($tag eq 'table') {
+ # anorland@hem2.passagen.se
+ # if (/^\s*\@(|f|v|multi)table\s+\@(\w+)/) {
+ if (/^\s*\@(|f|v|multi)table\s+\@(\w+)|(\{[^\}]*\})/) {
+ $in_table = $2;
+ unshift(@tables, join($;, $table_type, $in_table));
+ if ($table_type eq "multi") {
+ # don't use borders -- gets confused by empty cells
+ push(@lines, &debug("<TABLE>\n", __LINE__));
+ &html_push_if('TABLE');
+ } else {
+ push(@lines, &debug("<DL COMPACT>\n", __LINE__));
+ &html_push_if('DL');
+ }
+ push(@lines, &html_debug('', __LINE__));
+ } else {
+ warn "$ERROR Bad table line: $_";
+ }
+ next;
+ }
+ elsif ($tag eq 'synindex' || $tag eq 'syncodeindex')
+ {
+ if (/^\@$tag\s+(\w+)\s+(\w+)\s*$/)
+ {
+ my $from = $1;
+ my $to = $2;
+ my $prefix_from = IndexName2Prefix($from);
+ my $prefix_to = IndexName2Prefix($to);
+
+ warn("$ERROR unknown from index name $from ind syn*index line: $_"), next
+ unless $prefix_from;
+ warn("$ERROR unknown to index name $to ind syn*index line: $_"), next
+ unless $prefix_to;
+
+ if ($tag eq 'syncodeindex')
+ {
+ $index_properties->{$prefix_to}->{'from_code'}->{$prefix_from} = 1;
+ }
+ else
+ {
+ $index_properties->{$prefix_to}->{'from'}->{$prefix_from} = 1;
+ }
+ }
+ else
+ {
+ warn "$ERROR Bad syn*index line: $_";
+ }
+ next;
+ }
+ elsif ($tag eq 'defindex' || $tag eq 'defcodeindex')
+ {
+ if (/^\@$tag\s+(\w+)\s*$/)
+ {
+ my $name = $1;
+ $index_properties->{$name}->{name} = $name;
+ $index_properties->{$name}->{code} = 1 if $tag eq 'defcodeindex';
+ }
+ else
+ {
+ warn "$ERROR Bad defindex line: $_";
+ }
+ next;
+ }
+ elsif (/^\@printindex/)
+ {
+ push (@lines, "<!--::${section}::-->$_");
+ next;
+ }
+ elsif ($tag eq 'sp') {
+ push(@lines, &debug("<P>\n", __LINE__));
+ next;
+ } elsif ($tag eq 'center') {
+ push(@lines, &debug("<center>\n", __LINE__));
+ s/\@center//;
+ } elsif ($tag eq 'setref') {
+ &protect_html; # if setref contains '&' for instance
+ if (/^\@$tag\s*{($NODERE)}\s*$/) {
+ $setref = $1;
+ $setref =~ s/\s+/ /g; # normalize
+ $setref =~ s/ $//;
+ $node2sec{$setref} = $name;
+ $sec2node{$name} = $setref;
+ $node2href{$setref} = "$docu_doc#$docid";
+ } else {
+ warn "$ERROR Bad setref line: $_";
+ }
+ next;
+ } elsif ($tag eq 'lowersections') {
+ local ($sec, $level);
+ while (($sec, $level) = each %sec2level) {
+ $sec2level{$sec} = $level + 1;
+ }
+ next;
+ } elsif ($tag eq 'raisesections') {
+ local ($sec, $level);
+ while (($sec, $level) = each %sec2level) {
+ $sec2level{$sec} = $level - 1;
+ }
+ next;
+ }
+ elsif ($tag eq 'macro' || $tag eq 'rmacro')
+ {
+ if (/^\@$tag\s*(\w+)\s*(.*)/)
+ {
+ my $name = $1;
+ my @args;
+ @args = split(/\s*,\s*/ , $1)
+ if ($2 =~ /^\s*{(.*)}\s*/);
+
+ $macros->{$name}->{Args} = \@args;
+ $macros->{$name}->{Body} = '';
+ while (($_ = &next_line) && $_ !~ /\@end $tag/)
+ {
+ $macros->{$name}->{Body} .= $_;
+ }
+ die "ERROR: No closing '\@end $tag' found for macro definition of '$name'\n"
+ unless (/\@end $tag/);
+ chomp $macros->{$name}->{Body};
+ }
+ else
+ {
+ warn "$ERROR: Bad macro defintion $_"
+ }
+ next;
+ }
+ elsif ($tag eq 'unmacro')
+ {
+ delete $macros->{$1} if (/^\@unmacro\s*(\w+)/);
+ next;
+ }
+ elsif ($tag eq 'documentlanguage')
+ {
+ SetDocumentLanguage($1) if (!$T2H_LANG && /documentlanguage\s*(\w+)/);
+ }
+ elsif (defined($def_map{$tag})) {
+ if ($def_map{$tag}) {
+ s/^\@$tag\s+//;
+ $tag = $def_map{$tag};
+ $_ = "\@$tag $_";
+ $tag =~ s/\s.*//;
+ }
+ } elsif (defined($user_sub{$tag})) {
+ s/^\@$tag\s+//;
+ $sub = $user_sub{$tag};
+ print "# user $tag = $sub, arg: $_" if $T2H_DEBUG & $DEBUG_USER;
+ if (defined(&$sub)) {
+ chop($_);
+ &$sub($_);
+ } else {
+ warn "$ERROR Bad user sub for $tag: $sub\n";
+ }
+ next;
+ }
+ if (defined($def_map{$tag})) {
+ s/^\@$tag\s+//;
+ if ($tag =~ /x$/) {
+ # extra definition line
+ $tag = $`;
+ $is_extra = 1;
+ } else {
+ $is_extra = 0;
+ }
+ while (/\{([^\{\}]*)\}/) {
+ # this is a {} construct
+ ($before, $contents, $after) = ($`, $1, $');
+ # protect spaces
+ $contents =~ s/\s+/$;9/g;
+ # restore $_ protecting {}
+ $_ = "$before$;7$contents$;8$after";
+ }
+ @args = split(/\s+/, &protect_html($_));
+ foreach (@args) {
+ s/$;9/ /g; # unprotect spaces
+ s/$;7/\{/g; # ... {
+ s/$;8/\}/g; # ... }
+ }
+ $type = shift(@args);
+ $type =~ s/^\{(.*)\}$/$1/;
+ print "# def ($tag): {$type} ", join(', ', @args), "\n"
+ if $T2H_DEBUG & $DEBUG_DEF;
+ $type .= ':'; # it's nicer like this
+ my $name = shift(@args);
+ $name =~ s/^\{(.*)\}$/$1/;
+ if ($is_extra) {
+ $_ = &debug("<DT>", __LINE__);
+ } else {
+ $_ = &debug("<DL>\n<DT>", __LINE__);
+ }
+ if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') {
+ $_ .= "<U>$type</U> <B>$name</B>";
+ $_ .= " <I>@args</I>" if @args;
+ } elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr'
+ || $tag eq 'defcv' || $tag eq 'defop') {
+ $ftype = $name;
+ $name = shift(@args);
+ $name =~ s/^\{(.*)\}$/$1/;
+ $_ .= "<U>$type</U> $ftype <B>$name</B>";
+ $_ .= " <I>@args</I>" if @args;
+ } else {
+ warn "$ERROR Unknown definition type: $tag\n";
+ $_ .= "<U>$type</U> <B>$name</B>";
+ $_ .= " <I>@args</I>" if @args;
+ }
+ $_ .= &debug("\n<DD>", __LINE__);
+ $name = &unprotect_html($name);
+ if ($tag eq 'deffn' || $tag eq 'deftypefn') {
+ EnterIndexEntry('f', $name, $docu_doc, $section, \@lines);
+# unshift(@input_spool, "\@findex $name\n");
+ } elsif ($tag eq 'defop') {
+ EnterIndexEntry('f', "$name on $ftype", $docu_doc, $section, \@lines);
+# unshift(@input_spool, "\@findex $name on $ftype\n");
+ } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') {
+ EnterIndexEntry('v', $name, $docu_doc, $section, \@lines);
+# unshift(@input_spool, "\@vindex $name\n");
+ } else {
+ EnterIndexEntry('t', $name, $docu_doc, $section, \@lines);
+# unshift(@input_spool, "\@tindex $name\n");
+ }
+ $dont_html = 1;
+ }
+ } elsif ($end_tag) {
+ if ($format_map{$end_tag}) {
+ $in_pre = 0 if $format_map{$end_tag} eq 'PRE';
+ $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ;
+ &html_pop_if('P');
+ &html_pop_if('LI');
+ &html_pop_if();
+ push(@lines, &debug("</$format_map{$end_tag}>\n", __LINE__));
+ push(@lines, &html_debug('', __LINE__));
+ }
+ elsif (exists $complex_format_map->{$end_tag})
+ {
+ my $end = eval $complex_format_map->{$end_tag}->[1];
+ if ($@)
+ {
+ print "$ERROR: eval of complex_format_map->{$end_tag}->[1] $complex_format_map->{$end_tag}->[0]: $@";
+ $end = '</pre>'
+ }
+ $in_pre = 0 if $end =~ m|</pre>|;
+ push(@lines, html_debug($end, __LINE__));
+ } elsif ($end_tag =~ /^(|f|v|multi)table$/) {
+ unless (@tables) {
+ warn "$ERROR \@end $end_tag without \@*table\n";
+ next;
+ }
+ &html_pop_if('P');
+ ($table_type, $in_table) = split($;, shift(@tables));
+ unless ($1 eq $table_type) {
+ warn "$ERROR \@end $end_tag without matching \@$end_tag\n";
+ next;
+ }
+ if ($table_type eq "multi") {
+ push(@lines, "</TR></TABLE>\n");
+ &html_pop_if('TR');
+ } else {
+ push(@lines, "</DL>\n");
+ &html_pop_if('DD');
+ }
+ &html_pop_if();
+ if (@tables) {
+ ($table_type, $in_table) = split($;, $tables[0]);
+ } else {
+ $in_table = 0;
+ }
+ } elsif (defined($def_map{$end_tag})) {
+ push(@lines, &debug("</DL>\n", __LINE__));
+ } elsif ($end_tag eq 'menu') {
+ &html_pop_if();
+ push(@lines, $_); # must keep it for pass 2
+ }
+ next;
+ }
+ #############################################################
+ # anchor insertion
+ while (/\@anchor\s*\{(.*?)\}/)
+ {
+ $_ = $`.$';
+ my $anchor = $1;
+ $anchor = &normalise_node($anchor);
+ push @lines, &html_debug("<A NAME=\"$anchor\"></A>\n");
+ $node2href{$anchor} = "$docu_doc#$anchor";
+ next INPUT_LINE if $_ =~ /^\s*$/;
+ }
+
+ #############################################################
+ # index entry generation, after value substitutions
+ if (/^\@(\w+?)index\s+/)
+ {
+ EnterIndexEntry($1, $', $docu_doc, $section, \@lines);
+ next;
+ }
+ #
+ # protect texi and HTML things
+ &protect_texi;
+ $_ = &protect_html($_) unless $dont_html;
+ $dont_html = 0;
+ # substitution (unsupported things)
+ s/^\@exdent\s+//g;
+ s/\@noindent\s+//g;
+ s/\@refill\s+//g;
+ # other substitutions
+ &simple_substitutions;
+ s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4
+ #
+ # analyze the tag again
+ #
+ if ($tag) {
+ if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) {
+ if (/^\@$tag\s+(.+)$/) {
+ $name = $1;
+ $name = &normalise_node($name);
+ $level = $sec2level{$tag};
+ # check for index
+ $first_index_chapter = $node
+ if ($level == 1 && !$first_index_chapter &&
+ $name =~ /index/i);
+ if ($in_top && /heading/){
+ $T2H_HAS_TOP_HEADING = 1;
+ $_ = &debug("<H$level>$name</H$level>\n", __LINE__);
+ &html_push_if('body');
+ print "# top heading, section $name, level $level\n"
+ if $T2H_DEBUG & $DEBUG_TOC;
+ }
+ else
+ {
+ unless (/^\@\w*heading/)
+ {
+ unless (/^\@unnumbered/)
+ {
+ my $number = &update_sec_num($tag, $level);
+ $name = $number. ' ' . $name if $T2H_NUMBER_SECTIONS;
+ $sec2number{$name} = $number;
+ $number2sec{$number} = $name;
+ }
+ if (defined($toplevel))
+ {
+ push @lines, ($level==$toplevel ? $CHAPTEREND : $SECTIONEND);
+ }
+ else
+ {
+ # first time we see a "section"
+ unless ($level == 1)
+ {
+ warn "$WARN The first section found is not of level 1: $_";
+ }
+ $toplevel = $level;
+ }
+ push(@sections, $name);
+ next_doc() if ($T2H_SPLIT eq 'section' ||
+ $T2H_SPLIT && $level == $toplevel);
+ }
+ $sec_num++;
+ $docid = "SEC$sec_num";
+ $tocid = (/^\@\w*heading/ ? undef : "TOC$sec_num");
+ # check biblio and glossary
+ $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i);
+ $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i);
+ # check node
+ if ($node)
+ {
+ warn "$ERROR Duplicate node found: $node\n"
+ if ($node2sec{$node});
+ }
+ else
+ {
+ $name .= ' ' while ($node2sec{$name});
+ $node = $name;
+ }
+ $name .= ' ' while ($sec2node{$name});
+ $section = $name;
+ $node2sec{$node} = $name;
+ $sec2node{$name} = $node;
+ $node2href{$node} = "$docu_doc#$docid";
+ $node2next{$node} = $node_next;
+ $node2prev{$node} = $node_prev;
+ $node2up{$node} = $node_up;
+ print "# node $node, section $name, level $level\n"
+ if $T2H_DEBUG & $DEBUG_TOC;
+
+ $node = '';
+ $node_next = '';
+ $node_prev = '';
+ $node_next = '';
+ if ($tocid)
+ {
+ # update TOC
+ while ($level > $curlevel) {
+ $curlevel++;
+ push(@toc_lines, "<UL>\n");
+ }
+ while ($level < $curlevel) {
+ $curlevel--;
+ push(@toc_lines, "</UL>\n");
+ }
+ $_ = &t2h_anchor($tocid, "$docu_doc#$docid", $name, 1);
+ $_ = &substitute_style($_);
+ push(@stoc_lines, "$_<BR>\n") if ($level == 1);
+ if ($T2H_NUMBER_SECTIONS)
+ {
+ push(@toc_lines, $_ . "<BR>\n")
+ }
+ else
+ {
+ push(@toc_lines, "<LI>" . $_ ."</LI>");
+ }
+ }
+ else
+ {
+ push(@lines, &html_debug("<A NAME=\"$docid\"></A>\n",
+ __LINE__));
+ }
+ # update DOC
+ push(@lines, &html_debug('', __LINE__));
+ &html_reset;
+ $_ = "<H$level> $name </H$level>\n<!--docid::${docid}::-->\n";
+ $_ = &debug($_, __LINE__);
+ push(@lines, &html_debug('', __LINE__));
+ }
+ # update DOC
+ foreach $line (split(/\n+/, $_)) {
+ push(@lines, "$line\n");
+ }
+ next;
+ } else {
+ warn "$ERROR Bad section line: $_";
+ }
+ } else {
+ # track variables
+ $value{$1} = Unprotect_texi($2), next if /^\@set\s+($VARRE)\s+(.*)$/o;
+ delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o;
+ # store things
+ $value{'_shorttitle'} = Unprotect_texi($1), next if /^\@shorttitle\s+(.*)$/;
+ $value{'_setfilename'} = Unprotect_texi($1), next if /^\@setfilename\s+(.*)$/;
+ $value{'_settitle'} = Unprotect_texi($1), next if /^\@settitle\s+(.*)$/;
+ $value{'_author'} .= Unprotect_texi($1)."\n", next if /^\@author\s+(.*)$/;
+ $value{'_subtitle'} .= Unprotect_texi($1)."\n", next if /^\@subtitle\s+(.*)$/;
+ $value{'_title'} .= Unprotect_texi($1)."\n", next if /^\@title\s+(.*)$/;
+
+ # list item
+ if (/^\s*\@itemx?\s+/) {
+ $what = $';
+ $what =~ s/\s+$//;
+ if ($in_bibliography && $use_bibliography) {
+ if ($what =~ /^$BIBRE$/o) {
+ $id = 'BIB' . ++$bib_num;
+ $bib2href{$what} = "$docu_doc#$id";
+ print "# found bibliography for '$what' id $id\n"
+ if $T2H_DEBUG & $DEBUG_BIB;
+ $what = &t2h_anchor($id, '', $what);
+ }
+ } elsif ($in_glossary && $T2H_USE_GLOSSARY) {
+ $id = 'GLOSS' . ++$gloss_num;
+ $entry = $what;
+ $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
+ $gloss2href{$entry} = "$docu_doc#$id";
+ print "# found glossary for '$entry' id $id\n"
+ if $T2H_DEBUG & $DEBUG_GLOSS;
+ $what = &t2h_anchor($id, '', $what);
+ }
+ elsif ($in_table && ($table_type eq 'f' || $table_type eq 'v'))
+ {
+ EnterIndexEntry($table_type, $what, $docu_doc, $section, \@lines);
+ }
+ &html_pop_if('P');
+ if ($html_element eq 'DL' || $html_element eq 'DD') {
+ if ($things_map{$in_table} && !$what) {
+ # special case to allow @table @bullet for instance
+ push(@lines, &debug("<DT>$things_map{$in_table}\n", __LINE__));
+ } else {
+ push(@lines, &debug("<DT>\@$in_table\{$what\}\n", __LINE__));
+ }
+ push(@lines, "<DD>");
+ &html_push('DD') unless $html_element eq 'DD';
+ if ($table_type) { # add also an index
+ unshift(@input_spool, "\@${table_type}index $what\n");
+ }
+ } elsif ($html_element eq 'TABLE') {
+ push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
+ &html_push('TR');
+ } elsif ($html_element eq 'TR') {
+ push(@lines, &debug("</TR>\n", __LINE__));
+ push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
+ } else {
+ push(@lines, &debug("<LI>$what\n", __LINE__));
+ &html_push('LI') unless $html_element eq 'LI';
+ }
+ push(@lines, &html_debug('', __LINE__));
+ if ($deferred_ref) {
+ push(@lines, &debug("$deferred_ref\n", __LINE__));
+ $deferred_ref = '';
+ }
+ next;
+ } elsif (/^\@tab\s+(.*)$/) {
+ push(@lines, "<TD>$1</TD>\n");
+ next;
+ }
+ }
+ }
+ # paragraph separator
+ if ($_ eq "\n" && ! $in_pre) {
+ next if $#lines >= 0 && $lines[$#lines] eq "\n";
+ if ($html_element eq 'P') {
+ push (@lines, &debug("</P><P>\n", __LINE__));
+ }
+# else
+# {
+# push(@lines, "<P></P>\n");
+# $_ = &debug("<P></P>\n", __LINE__);
+# }
+ elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE' || $html_element eq 'DD' || $html_element eq 'LI')
+ {
+ &html_push('P');
+ push(@lines, &debug("<P>\n", __LINE__));
+ }
+ }
+ # otherwise
+ push(@lines, $_) unless $in_titlepage;
+ push(@lines, &debug("</center>\n", __LINE__)) if ($tag eq 'center');
+}
+
+# finish TOC
+$level = 0;
+while ($level < $curlevel) {
+ $curlevel--;
+ push(@toc_lines, "</UL>\n");
+}
+
+print "# end of pass 1\n" if $T2H_VERBOSE;
+
+SetDocumentLanguage('en') unless ($T2H_LANG);
+#+++############################################################################
+# #
+# Stuff related to Index generation #
+# #
+#---############################################################################
+
+sub EnterIndexEntry
+{
+ my $prefix = shift;
+ my $key = shift;
+ my $docu_doc = shift;
+ my $section = shift;
+ my $lines = shift;
+ local $_;
+
+ warn "$ERROR Undefined index command: $_", next
+ unless (exists ($index_properties->{$prefix}));
+ $key =~ s/\s+$//;
+ $_ = $key;
+ &protect_texi;
+ $key = $_;
+ $_ = &protect_html($_);
+ my $html_key = substitute_style($_);
+ my $id;
+ $key = remove_style($key);
+ $key = remove_things($key);
+ $_ = $key;
+ &unprotect_texi;
+ $key = $_;
+ while (exists $index->{$prefix}->{$key}) {$key .= ' '};
+ if ($lines->[$#lines] =~ /^<!--docid::(.+)::-->$/)
+ {
+ $id = $1;
+ }
+ else
+ {
+ $id = 'IDX' . ++$idx_num;
+ push(@$lines, &t2h_anchor($id, '', $T2H_INVISIBLE_MARK, !$in_pre));
+ }
+ $index->{$prefix}->{$key}->{html_key} = $html_key;
+ $index->{$prefix}->{$key}->{section} = $section;
+ $index->{$prefix}->{$key}->{href} = "$docu_doc#$id";
+ print "# found ${prefix}index for '$key' with id $id\n"
+ if $T2H_DEBUG & $DEBUG_INDEX;
+}
+
+sub IndexName2Prefix
+{
+ my $name = shift;
+ my $prefix;
+
+ for $prefix (keys %$index_properties)
+ {
+ return $prefix if ($index_properties->{$prefix}->{name} eq $name);
+ }
+ return undef;
+}
+
+sub GetIndexEntries
+{
+ my $normal = shift;
+ my $code = shift;
+ my ($entries, $prefix, $key) = ({});
+
+ for $prefix (keys %$normal)
+ {
+ for $key (keys %{$index->{$prefix}})
+ {
+ $entries->{$key} = {%{$index->{$prefix}->{$key}}};
+ }
+ }
+
+ if (defined($code))
+ {
+ for $prefix (keys %$code)
+ {
+ unless (exists $normal->{$keys})
+ {
+ for $key (keys %{$index->{$prefix}})
+ {
+ $entries->{$key} = {%{$index->{$prefix}->{$key}}};
+ $entries->{$key}->{html_key} = "<CODE>$entries->{$key}->{html_key}</CODE>";
+ }
+ }
+ }
+ }
+ return $entries;
+}
+
+sub byAlpha
+{
+ if ($a =~ /^[A-Za-z]/)
+ {
+ if ($b =~ /^[A-Za-z]/)
+ {
+ return lc($a) cmp lc($b);
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ elsif ($b =~ /^[A-Za-z]/)
+ {
+ return -1;
+ }
+ else
+ {
+ return lc($a) cmp lc($b);
+ }
+}
+
+sub GetIndexPages
+{
+ my $entries = shift;
+ my (@Letters, $key);
+ my ($EntriesByLetter, $Pages, $page) = ({}, [], {});
+ my @keys = sort byAlpha keys %$entries;
+
+ for $key (@keys)
+ {
+ push @{$EntriesByLetter->{uc(substr($key,0, 1))}} , $entries->{$key};
+ }
+ @Letters = sort byAlpha keys %$EntriesByLetter;
+
+ $T2H_SPLIT_INDEX = 0 unless ($T2H_SPLIT);
+
+ unless ($T2H_SPLIT_INDEX)
+ {
+ $page->{First} = $Letters[0];
+ $page->{Last} = $Letters[$#Letters];
+ $page->{Letters} = \@Letters;
+ $page->{EntriesByLetter} = $EntriesByLetter;
+ push @$Pages, $page;
+ return $Pages;
+ }
+
+ if ($T2H_SPLIT_INDEX =~ /^\d+$/)
+ {
+ my $i = 0;
+ my ($prev_letter, $letter);
+ $page->{First} = $Letters[0];
+ for $letter (@Letters)
+ {
+ if ($i > $T2H_SPLIT_INDEX)
+ {
+ $page->{Last} = $prev_letter;
+ push @$Pages, {%$page};
+ $page->{Letters} = [];
+ $page->{EntriesByLetter} = {};
+ $page->{First} = $letter;
+ $i=0;
+ }
+ push @{$page->{Letters}}, $letter;
+ $page->{EntriesByLetter}->{$letter} = [@{$EntriesByLetter->{$letter}}];
+ $i += scalar(@{$EntriesByLetter->{$letter}});
+ $prev_letter = $letter;
+ }
+ $page->{Last} = $Letters[$#Letters];
+ push @$Pages, {%$page};
+ }
+ return $Pages;
+}
+
+sub GetIndexSummary
+{
+ my $first_page = shift;
+ my $Pages = shift;
+ my $name = shift;
+ my ($page, $letter, $summary, $i, $l1, $l2, $l);
+
+ $i = 0;
+ $summary = '<table><tr><th valign=top>Jump to: &nbsp; </th><td>';
+
+ for $page ($first_page, @$Pages)
+ {
+ for $letter (@{$page->{Letters}})
+ {
+ $l = t2h_anchor('', "$page->{href}#${name}_$letter", "<b>$letter</b>",
+ 0, 'style="text-decoration:none"') . "\n &nbsp; \n";
+
+ if ($letter =~ /^[A-Za-z]/)
+ {
+ $l2 .= $l;
+ }
+ else
+ {
+ $l1 .= $l;
+ }
+ }
+ }
+ $summary .= $l1 . "<BR>\n" if ($l1);
+ $summary .= $l2 . '</td></tr></table><br>';
+ return $summary;
+}
+
+sub PrintIndexPage
+{
+ my $lines = shift;
+ my $summary = shift;
+ my $page = shift;
+ my $name = shift;
+
+ push @$lines, $summary;
+
+ push @$lines , <<EOT;
+<P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+EOT
+
+ for $letter (@{$page->{Letters}})
+ {
+ push @$lines, "<TR><TH><A NAME=\"${name}_$letter\"></A>$letter</TH><TD></TD><TD></TD></TR>\n";
+ for $entry (@{$page->{EntriesByLetter}->{$letter}})
+ {
+ push @$lines,
+ "<TR><TD></TD><TD valign=top>" .
+ t2h_anchor('', $entry->{href}, $entry->{html_key}) .
+ "</TD><TD valign=top>" .
+ t2h_anchor('', sec_href($entry->{section}), clean_name($entry->{section})) .
+ "</TD></TR>\n";
+ }
+ push @$lines, "<TR><TD COLSPAN=3> <HR></TD></TR>\n";
+ }
+ push @$lines, "</TABLE><P></P>";
+ push @$lines, $summary;
+}
+
+sub PrintIndex
+{
+ my $lines = shift;
+ my $name = shift;
+ my $section = shift;
+ $section = 'Top' unless $section;
+ my $prefix = IndexName2Prefix($name);
+
+ warn ("$ERROR printindex: bad index name: $name"), return
+ unless $prefix;
+
+ if ($index_properties->{$prefix}->{code})
+ {
+ $index_properties->{$prefix}->{from_code}->{$prefix} = 1;
+ }
+ else
+ {
+ $index_properties->{$prefix}->{from}->{$prefix}= 1;
+ }
+
+ my $Entries = GetIndexEntries($index_properties->{$prefix}->{from},
+ $index_properties->{$prefix}->{from_code});
+ return unless %$Entries;
+
+ if ($T2H_IDX_SUMMARY)
+ {
+ my $key;
+ open(FHIDX, ">$docu_rdir$docu_name" . "_$name.idx")
+ || die "Can't open > $docu_rdir$docu_name" . "_$name.idx for writing: $!\n";
+ print "# writing $name index summary in $docu_rdir$docu_name" . "_$name.idx...\n" if $T2H_VERBOSE;
+
+ for $key (sort keys %$Entries)
+ {
+ print FHIDX "$key\t$Entries->{$key}->{href}\n";
+ }
+ }
+
+ my $Pages = GetIndexPages($Entries);
+ my $page;
+ my $first_page = shift @$Pages;
+ my $sec_name = $section;
+ # remove section number
+ $sec_name =~ s/.*? // if $sec_name =~ /^([A-Z]|\d+)\./;
+
+ ($first_page->{href} = sec_href($section)) =~ s/\#.*$//;
+ # Update tree structure of document
+ if (@$Pages)
+ {
+ my $sec;
+ my @after;
+
+ while (@sections && $sections[$#sections] ne $section)
+ {
+ unshift @after, pop @sections;
+ }
+
+ for $page (@$Pages)
+ {
+ my $node = ($page->{First} ne $page->{Last} ?
+ "$sec_name: $page->{First} -- $page->{Last}" :
+ "$sec_name: $page->{First}");
+ push @sections, $node;
+ $node2sec{$node} = $node;
+ $sec2node{$node} = $node;
+ $node2up{$node} = $section;
+ $page->{href} = next_doc();
+ $page->{name} = $node;
+ $node2href{$node} = $page->{href};
+ if ($prev_node)
+ {
+ $node2next{$prev_node} = $node;
+ $node2prev{$node} = $prev_node;
+ }
+ $prev_node = $node;
+ }
+ push @sections, @after;
+ }
+
+ my $summary = GetIndexSummary($first_page, $Pages, $name);
+ PrintIndexPage($lines, $summary, $first_page, $name);
+ for $page (@$Pages)
+ {
+ push @$lines, ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND);
+ push @$lines, "<H2 ALIGN=\"Left\">$page->{name}</H2>\n";
+ PrintIndexPage($lines, $summary, $page, $name);
+ }
+}
+
+
+#+++############################################################################
+# #
+# Pass 2/3: handle style, menu, index, cross-reference #
+# #
+#---############################################################################
+
+@lines2 = (); # whole document (2nd pass)
+@lines3 = (); # whole document (3rd pass)
+$in_menu = 0; # am I inside a menu
+
+while (@lines) {
+ $_ = shift(@lines);
+ #
+ # special case (protected sections)
+ #
+ if (/^$PROTECTTAG/o) {
+ push(@lines2, $_);
+ next;
+ }
+ #
+ # menu
+ #
+ if (/^\@menu\b/)
+ {
+ $in_menu = 1;
+ $in_menu_listing = 1;
+ push(@lines2, &debug("<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> \n", __LINE__));
+ next;
+ }
+ if (/^\@end\s+menu\b/)
+ {
+ if ($in_menu_listing)
+ {
+ push(@lines2, &debug("</TABLE></BLOCKQUOTE>\n", __LINE__));
+ }
+ else
+ {
+ push(@lines2, &debug("</BLOCKQUOTE>\n", __LINE__));
+ }
+ $in_menu = 0;
+ $in_menu_listing = 0;
+ next;
+ }
+ if ($in_menu)
+ {
+ my ($node, $name, $descr);
+ if (/^\*\s+($NODERE)::/o)
+ {
+ $node = $1;
+ $descr = $';
+ }
+ elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/)
+ {
+ $name = $1;
+ $node = $2;
+ $descr = $';
+ }
+ elsif (/^\*/)
+ {
+ warn "$ERROR Bad menu line: $_";
+ }
+ else
+ {
+ if ($in_menu_listing)
+ {
+ $in_menu_listing = 0;
+ push(@lines2, &debug("</TABLE>\n", __LINE__));
+ }
+ # should be like verbatim -- preseve spaces, etc
+ s/ /\&nbsp;/g;
+ $_ .= "<br>\n";
+ push(@lines2, $_);
+ }
+ if ($node)
+ {
+ if (! $in_menu_listing)
+ {
+ $in_menu_listing = 1;
+ push(@lines2, &debug("<TABLE BORDER=0 CELLSPACING=0>\n", __LINE__));
+ }
+ # look for continuation
+ while ($lines[0] =~ /^\s+\w+/)
+ {
+ $descr .= shift(@lines);
+ }
+ &menu_entry($node, $name, $descr);
+ }
+ next;
+ }
+ #
+ # printindex
+ #
+ PrintIndex(\@lines2, $2, $1), next
+ if (/^<!--::(.*)::-->\@printindex\s+(\w+)/);
+ #
+ # simple style substitutions
+ #
+ $_ = &substitute_style($_);
+ #
+ # xref
+ #
+ while (/\@(x|px|info|)ref{([^{}]+)(}?)/) {
+ # note: Texinfo may accept other characters
+ ($type, $nodes, $full) = ($1, $2, $3);
+ ($before, $after) = ($`, $');
+ if (! $full && $after) {
+ warn "$ERROR Bad xref (no ending } on line): $_";
+ $_ = "$before$;0${type}ref\{$nodes$after";
+ next; # while xref
+ }
+ if ($type eq 'x') {
+ $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} ";
+ } elsif ($type eq 'px') {
+ $type = "$T2H_WORDS->{$T2H_LANG}->{'see'} ";
+ } elsif ($type eq 'info') {
+ $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} Info";
+ } else {
+ $type = '';
+ }
+ unless ($full) {
+ $next = shift(@lines);
+ $next = &substitute_style($next);
+ chop($nodes); # remove final newline
+ if ($next =~ /\}/) { # split on 2 lines
+ $nodes .= " $`";
+ $after = $';
+ } else {
+ $nodes .= " $next";
+ $next = shift(@lines);
+ $next = &substitute_style($next);
+ chop($nodes);
+ if ($next =~ /\}/) { # split on 3 lines
+ $nodes .= " $`";
+ $after = $';
+ } else {
+ warn "$ERROR Bad xref (no ending }): $_";
+ $_ = "$before$;0xref\{$nodes$after";
+ unshift(@lines, $next);
+ next; # while xref
+ }
+ }
+ }
+ $nodes =~ s/\s+/ /g; # remove useless spaces
+ @args = split(/\s*,\s*/, $nodes);
+ $node = $args[0]; # the node is always the first arg
+ $node = &normalise_node($node);
+ $sec = $args[2] || $args[1] || $node2sec{$node};
+ $href = $node2href{$node};
+ if (@args == 5) { # reference to another manual
+ $sec = $args[2] || $node;
+ $man = $args[4] || $args[3];
+ $_ = "${before}${type}$T2H_WORDS->{$T2H_LANG}->{'section'} `$sec' in \@cite{$man}$after";
+ } elsif ($type =~ /Info/) { # inforef
+ warn "$ERROR Wrong number of arguments: $_" unless @args == 3;
+ ($nn, $_, $in) = @args;
+ $_ = "${before}${type} file `$in', node `$nn'$after";
+ } elsif ($sec && $href && ! $T2H_SHORT_REF) {
+ $_ = "${before}${type}";
+ $_ .= "$T2H_WORDS->{$T2H_LANG}->{'section'} " if ${type};
+ $_ .= &t2h_anchor('', $href, $sec) . $after;
+ }
+ elsif ($href)
+ {
+ $_ = "${before}${type} " .
+ &t2h_anchor('', $href, $args[2] || $args[1] || $node) .
+ $after;
+ }
+ else {
+ warn "$ERROR Undefined node ($node): $_";
+ $_ = "$before$;0xref{$nodes}$after";
+ }
+ }
+
+ # replace images
+ s[\@image\s*{(.+?)}]
+ {
+ my @args = split (/\s*,\s*/, $1);
+ my $base = $args[0];
+ my $image =
+ LocateIncludeFile("$base.png") ||
+ LocateIncludeFile("$base.jpg") ||
+ LocateIncludeFile("$base.gif");
+ warn "$ERROR no image file for $base: $_" unless ($image && -e $image);
+ "<IMG SRC=\"$image\" ALT=\"$base\">";
+ ($T2H_CENTER_IMAGE ?
+ "<CENTER><IMG SRC=\"$image\" ALT=\"$base\"></CENTER>" :
+ "<IMG SRC=\"$image\" ALT=\"$base\">");
+ }eg;
+
+ #
+ # try to guess bibliography references or glossary terms
+ #
+ unless (/^<H\d><A NAME=\"SEC\d/) {
+ if ($use_bibliography) {
+ $done = '';
+ while (/$BIBRE/o) {
+ ($pre, $what, $post) = ($`, $&, $');
+ $href = $bib2href{$what};
+ if (defined($href) && $post !~ /^[^<]*<\/A>/) {
+ $done .= $pre . &t2h_anchor('', $href, $what);
+ } else {
+ $done .= "$pre$what";
+ }
+ $_ = $post;
+ }
+ $_ = $done . $_;
+ }
+ if ($T2H_USE_GLOSSARY) {
+ $done = '';
+ while (/\b\w+\b/) {
+ ($pre, $what, $post) = ($`, $&, $');
+ $entry = $what;
+ $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
+ $href = $gloss2href{$entry};
+ if (defined($href) && $post !~ /^[^<]*<\/A>/) {
+ $done .= $pre . &t2h_anchor('', $href, $what);
+ } else {
+ $done .= "$pre$what";
+ }
+ $_ = $post;
+ }
+ $_ = $done . $_;
+ }
+ }
+ # otherwise
+ push(@lines2, $_);
+}
+print "# end of pass 2\n" if $T2H_VERBOSE;
+
+#
+# split style substitutions
+#
+while (@lines2) {
+ $_ = shift(@lines2);
+ #
+ # special case (protected sections)
+ #
+ if (/^$PROTECTTAG/o) {
+ push(@lines3, $_);
+ next;
+ }
+ #
+ # split style substitutions
+ #
+ $old = '';
+ while ($old ne $_) {
+ $old = $_;
+ if (/\@(\w+)\{/) {
+ ($before, $style, $after) = ($`, $1, $');
+ if (defined($style_map{$style})) {
+ $_ = $after;
+ $text = '';
+ $after = '';
+ $failed = 1;
+ while (@lines2) {
+ if (/\}/) {
+ $text .= $`;
+ $after = $';
+ $failed = 0;
+ last;
+ } else {
+ $text .= $_;
+ $_ = shift(@lines2);
+ }
+ }
+ if ($failed) {
+ die "* Bad syntax (\@$style) after: $before\n";
+ } else {
+ $text = &apply_style($style, $text);
+ $_ = "$before$text$after";
+ }
+ }
+ }
+ }
+ # otherwise
+ push(@lines3, $_);
+}
+print "# end of pass 3\n" if $T2H_VERBOSE;
+
+#+++############################################################################
+# #
+# Pass 4: foot notes, final cleanup #
+# #
+#---############################################################################
+
+@foot_lines = (); # footnotes
+@doc_lines = (); # final document
+$end_of_para = 0; # true if last line is <P>
+
+while (@lines3) {
+ $_ = shift(@lines3);
+ #
+ # special case (protected sections)
+ #
+ if (/^$PROTECTTAG/o) {
+ push(@doc_lines, $_);
+ $end_of_para = 0;
+ next;
+ }
+ #
+ # footnotes
+ #
+ while (/\@footnote([^\{\s]+)\{/) {
+ ($before, $d, $after) = ($`, $1, $');
+ $_ = $after;
+ $text = '';
+ $after = '';
+ $failed = 1;
+ while (@lines3) {
+ if (/\}/) {
+ $text .= $`;
+ $after = $';
+ $failed = 0;
+ last;
+ } else {
+ $text .= $_;
+ $_ = shift(@lines3);
+ }
+ }
+ if ($failed) {
+ die "* Bad syntax (\@footnote) after: $before\n";
+ } else {
+ $foot_num++;
+ $docid = "DOCF$foot_num";
+ $footid = "FOOT$foot_num";
+ $foot = "($foot_num)";
+ push(@foot_lines, "<H3>" . &t2h_anchor($footid, "$d#$docid", $foot) . "</H3>\n");
+ $text = "<P>$text" unless $text =~ /^\s*<P>/;
+ push(@foot_lines, "$text\n");
+ $_ = $before . &t2h_anchor($docid, "$docu_foot#$footid", $foot) . $after;
+ }
+ }
+ #
+ # remove unnecessary <P>
+ #
+ if (/^\s*<P>\s*$/) {
+ next if $end_of_para++;
+ } else {
+ $end_of_para = 0;
+ }
+ # otherwise
+ push(@doc_lines, $_);
+}
+
+print "# end of pass 4\n" if $T2H_VERBOSE;
+
+#+++############################################################################
+# #
+# Pass 5: print things #
+# #
+#---############################################################################
+
+$T2H_L2H = &l2h_FinishToLatex if ($T2H_L2H);
+$T2H_L2H = &l2h_ToHtml if ($T2H_L2H);
+$T2H_L2H = &l2h_InitFromHtml if ($T2H_L2H);
+
+# fix node2up, node2prev, node2next, if desired
+if ($has_top_command)
+{
+ for $section (keys %sec2number)
+ {
+ $node = $sec2node{$section};
+ $node2up{$node} = Sec2UpNode($section) unless $node2up{$node};
+ $node2prev{$node} = Sec2PrevNode($section) unless $node2prev{$node};
+ $node2next{$node} = Sec2NextNode($section) unless $node2next{$node};
+ }
+}
+
+# prepare %T2H_THISDOC
+$T2H_THISDOC{fulltitle} = $value{'_title'} || $value{'_settitle'} || "Untitled Document";
+$T2H_THISDOC{title} = $value{'_settitle'} || $T2H_THISDOC{fulltitle};
+$T2H_THISDOC{author} = $value{'_author'};
+$T2H_THISDOC{subtitle} = $value{'_subtitle'};
+$T2H_THISDOC{shorttitle} = $value{'_shorttitle'};
+for $key (keys %T2H_THISDOC)
+{
+ $_ = &substitute_style($T2H_THISDOC{$key});
+ &unprotect_texi;
+ s/\s*$//;
+ $T2H_THISDOC{$key} = $_;
+}
+
+# if no sections, then simply print document as is
+unless (@sections)
+{
+ print "# Writing content into $docu_top_file \n" if $T2H_VERBOSE;
+ open(FILE, "> $docu_top_file")
+ || die "$ERROR: Can't open $docu_top_file for writing: $!\n";
+
+ &$T2H_print_page_head(\*FILE);
+ $T2H_THIS_SECTION = \@doc_lines;
+ t2h_print_lines(\*FILE);
+ &$T2H_print_foot_navigation(\*FILE);
+ &$T2H_print_page_foot(\*FILE);
+ close(FILE);
+ goto Finish;
+}
+
+# initialize $T2H_HREF, $T2H_NAME
+%T2H_HREF =
+ (
+ 'First' , sec_href($sections[0]),
+ 'Last', sec_href($sections[$#sections]),
+ 'About', $docu_about. '#SEC_About',
+ );
+
+# prepare TOC, OVERVIEW, TOP
+$T2H_TOC = \@toc_lines;
+$T2H_OVERVIEW = \@stoc_lines;
+if ($has_top)
+{
+ while (1)
+ {
+ $_ = shift @doc_lines;
+ last if /$TOPEND/;
+ push @$T2H_TOP, $_;
+ }
+ $T2H_HREF{'Top'} = $docu_top . '#SEC_Top';
+}
+else
+{
+ $T2H_HREF{'Top'} = $T2H_HREF{First};
+}
+
+$node2href{Top} = $T2H_HREF{Top};
+$T2H_HREF{Contents} = $docu_toc.'#SEC_Contents' if @toc_lines;
+$T2H_HREF{Overview} = $docu_stoc.'#SEC_OVERVIEW' if @stoc_lines;
+
+# settle on index
+if ($T2H_INDEX_CHAPTER)
+{
+ $T2H_HREF{Index} = $node2href{normalise_node($T2H_INDEX_CHAPTER)};
+ warn "$ERROR T2H_INDEX_CHAPTER '$T2H_INDEX_CHAPTER' not found\n"
+ unless $T2H_HREF{Index};
+}
+if (! $T2H_HREF{Index} && $first_index_chapter)
+{
+ $T2H_INDEX_CHAPTER = $first_index_chapter;
+ $T2H_HREF{Index} = $node2href{$T2H_INDEX_CHAPTER};
+}
+
+print "# Using '" . clean_name($T2H_INDEX_CHAPTER) . "' as index page\n"
+ if ($T2H_VERBOSE && $T2H_HREF{Index});
+
+%T2H_NAME =
+ (
+ 'First', clean_name($sec2node{$sections[0]}),
+ 'Last', clean_name($sec2node{$sections[$#sections]}),
+ 'About', $T2H_WORDS->{$T2H_LANG}->{'About_Title'},
+ 'Contents', $T2H_WORDS->{$T2H_LANG}->{'ToC_Title'},
+ 'Overview', $T2H_WORDS->{$T2H_LANG}->{'Overview_Title'},
+ 'Index' , clean_name($T2H_INDEX_CHAPTER),
+ 'Top', clean_name($T2H_TOP_HEADING || $T2H_THISDOC{'title'} || $T2H_THISDOC{'shorttitle'}),
+ );
+
+#############################################################################
+# print frame and frame toc file
+#
+if ( $T2H_FRAMES )
+{
+ open(FILE, "> $docu_frame_file")
+ || die "$ERROR: Can't open $docu_frame_file for writing: $!\n";
+ print "# Creating frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
+ &$T2H_print_frame(\*FILE);
+ close(FILE);
+
+ open(FILE, "> $docu_toc_frame_file")
+ || die "$ERROR: Can't open $docu_toc_frame_file for writing: $!\n";
+ print "# Creating toc frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
+ &$T2H_print_toc_frame(\*FILE);
+ close(FILE);
+}
+
+
+#############################################################################
+# print Top
+#
+open(FILE, "> $docu_top_file")
+ || die "$ERROR: Can't open $docu_top_file for writing: $!\n";
+&$T2H_print_page_head(\*FILE) unless ($T2H_SPLIT);
+
+if ($has_top)
+{
+ print "# Creating Top in $docu_top_file ...\n" if $T2H_VERBOSE;
+ $T2H_THIS_SECTION = $T2H_TOP;
+ $T2H_HREF{This} = $T2H_HREF{Top};
+ $T2H_NAME{This} = $T2H_NAME{Top};
+ &$T2H_print_Top(\*FILE);
+}
+
+close(FILE) if $T2H_SPLIT;
+
+#############################################################################
+# Print sections
+#
+$T2H_NODE{Forward} = $sec2node{$sections[0]};
+$T2H_NAME{Forward} = &clean_name($sec2node{$sections[0]});
+$T2H_HREF{Forward} = sec_href($sections[0]);
+$T2H_NODE{This} = 'Top';
+$T2H_NAME{This} = $T2H_NAME{Top};
+$T2H_HREF{This} = $T2H_HREF{Top};
+if ($T2H_SPLIT)
+{
+ print "# writing " . scalar(@sections) .
+ " sections in $docu_rdir$docu_name"."_[1..$doc_num]"
+ if $T2H_VERBOSE;
+ $previous = ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND);
+ undef $FH;
+ $doc_num = 0;
+}
+else
+{
+ print "# writing " . scalar(@sections) . " sections in $docu_top_file ..."
+ if $T2H_VERBOSE;
+ $FH = \*FILE;
+ $previous = '';
+}
+
+$counter = 0;
+# loop through sections
+while ($section = shift(@sections))
+{
+ if ($T2H_SPLIT && ($T2H_SPLIT eq 'section' || $previous eq $CHAPTEREND))
+ {
+ if ($FH)
+ {
+ #close previous page
+ &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter';
+ &$T2H_print_page_foot($FH);
+ close($FH);
+ undef $FH;
+ }
+ }
+ $T2H_NAME{Back} = $T2H_NAME{This};
+ $T2H_HREF{Back} = $T2H_HREF{This};
+ $T2H_NODE{Back} = $T2H_NODE{This};
+ $T2H_NAME{This} = $T2H_NAME{Forward};
+ $T2H_HREF{This} = $T2H_HREF{Forward};
+ $T2H_NODE{This} = $T2H_NODE{Forward};
+ if ($sections[0])
+ {
+ $T2H_NODE{Forward} = $sec2node{$sections[0]};
+ $T2H_NAME{Forward} = &clean_name($T2H_NODE{Forward});
+ $T2H_HREF{Forward} = sec_href($sections[0]);
+ }
+ else
+ {
+ undef $T2H_HREF{Forward}, $T2H_NODE{Forward}, $T2H_NAME{Forward};
+ }
+
+ $node = $node2up{$T2H_NODE{This}};
+ $T2H_HREF{Up} = $node2href{$node};
+ if ($T2H_HREF{Up} eq $T2H_HREF{This} || ! $T2H_HREF{Up})
+ {
+ $T2H_NAME{Up} = $T2H_NAME{Top};
+ $T2H_HREF{Up} = $T2H_HREF{Top};
+ $T2H_NODE{Up} = 'Up';
+ }
+ else
+ {
+ $T2H_NAME{Up} = &clean_name($node);
+ $T2H_NODE{Up} = $node;
+ }
+
+ $node = $T2H_NODE{This};
+ $node = $node2prev{$node};
+ $T2H_NAME{Prev} = &clean_name($node);
+ $T2H_HREF{Prev} = $node2href{$node};
+ $T2H_NODE{Prev} = $node;
+
+ $node = $T2H_NODE{This};
+ if ($node2up{$node} && $node2up{$node} ne 'Top'&&
+ ($node2prev{$node} eq $T2H_NODE{Back} || ! $node2prev{$node}))
+ {
+ $node = $node2up{$node};
+ while ($node && $node ne $node2up{$node} && ! $node2prev{$node})
+ {
+ $node = $node2up{$node};
+ }
+ $node = $node2prev{$node}
+ unless $node2up{$node} eq 'Top' || ! $node2up{$node};
+ }
+ else
+ {
+ $node = $node2prev{$node};
+ }
+ $T2H_NAME{FastBack} = &clean_name($node);
+ $T2H_HREF{FastBack} = $node2href{$node};
+ $T2H_NODE{FastBack} = $node;
+
+ $node = $T2H_NODE{This};
+ $node = $node2next{$node};
+ $T2H_NAME{Next} = &clean_name($node);
+ $T2H_HREF{Next} = $node2href{$node};
+ $T2H_NODE{Next} = $node;
+
+ $node = $T2H_NODE{This};
+ if ($node2up{$node} && $node2up{$node} ne 'Top'&&
+ ($node2next{$node} eq $T2H_NODE{Forward} || ! $node2next{$node}))
+ {
+ $node = $node2up{$node};
+ while ($node && $node ne $node2up{$node} && ! $node2next{$node})
+ {
+ $node = $node2up{$node};
+ }
+ }
+ $node = $node2next{$node};
+ $T2H_NAME{FastForward} = &clean_name($node);
+ $T2H_HREF{FastForward} = $node2href{$node};
+ $T2H_NODE{FastForward} = $node;
+
+ if (! defined($FH))
+ {
+ my $file = $T2H_HREF{This};
+ $file =~ s/\#.*$//;
+ open(FILE, "> $docu_rdir$file") ||
+ die "$ERROR: Can't open $docu_rdir$file for writing: $!\n";
+ $FH = \*FILE;
+ &$T2H_print_page_head($FH);
+ t2h_print_label($FH);
+ &$T2H_print_chapter_header($FH) if $T2H_SPLIT eq 'chapter';
+ }
+ else
+ {
+ t2h_print_label($FH);
+ }
+
+ $T2H_THIS_SECTION = [];
+ while (@doc_lines) {
+ $_ = shift(@doc_lines);
+ last if ($_ eq $SECTIONEND || $_ eq $CHAPTEREND);
+ push(@$T2H_THIS_SECTION, $_);
+ }
+ $previous = $_;
+ &$T2H_print_section($FH);
+
+ if ($T2H_VERBOSE)
+ {
+ $counter++;
+ print "." if $counter =~ /00$/;
+ }
+}
+if ($T2H_SPLIT)
+{
+ &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter';
+ &$T2H_print_page_foot($FH);
+ close($FH);
+}
+print "\n" if $T2H_VERBOSE;
+
+#############################################################################
+# Print ToC, Overview, Footnotes
+#
+undef $T2H_HREF{Prev};
+undef $T2H_HREF{Next};
+undef $T2H_HREF{Back};
+undef $T2H_HREF{Forward};
+undef $T2H_HREF{Up};
+
+if (@foot_lines)
+{
+ print "# writing Footnotes in $docu_foot_file...\n" if $T2H_VERBOSE;
+ open (FILE, "> $docu_foot_file") || die "$ERROR: Can't open $docu_foot_file for writing: $!\n"
+ if $T2H_SPLIT;
+ $T2H_HREF{This} = $docu_foot;
+ $T2H_NAME{This} = $T2H_WORDS->{$T2H_LANG}->{'Footnotes_Title'};
+ $T2H_THIS_SECTION = \@foot_lines;
+ &$T2H_print_Footnotes(\*FILE);
+ close(FILE) if $T2H_SPLIT;
+}
+
+if (@toc_lines)
+{
+ print "# writing Toc in $docu_toc_file...\n" if $T2H_VERBOSE;
+ open (FILE, "> $docu_toc_file") || die "$ERROR: Can't open $docu_toc_file for writing: $!\n"
+ if $T2H_SPLIT;
+ $T2H_HREF{This} = $T2H_HREF{Contents};
+ $T2H_NAME{This} = $T2H_NAME{Contents};
+ $T2H_THIS_SECTION = \@toc_lines;
+ &$T2H_print_Toc(\*FILE);
+ close(FILE) if $T2H_SPLIT;
+}
+
+if (@stoc_lines)
+{
+ print "# writing Overview in $docu_stoc_file...\n" if $T2H_VERBOSE;
+ open (FILE, "> $docu_stoc_file") || die "$ERROR: Can't open $docu_stoc_file for writing: $!\n"
+ if $T2H_SPLIT;
+
+ $T2H_HREF{This} = $T2H_HREF{Overview};
+ $T2H_NAME{This} = $T2H_NAME{Overview};
+ $T2H_THIS_SECTION = \@stoc_lines;
+ unshift @$T2H_THIS_SECTION, "<BLOCKQUOTE>\n";
+ push @$T2H_THIS_SECTION, "\n</BLOCKQUOTE>\n";
+ &$T2H_print_Overview(\*FILE);
+ close(FILE) if $T2H_SPLIT;
+}
+
+if ($about_body = &$T2H_about_body())
+{
+ print "# writing About in $docu_about_file...\n" if $T2H_VERBOSE;
+ open (FILE, "> $docu_about_file") || die "$ERROR: Can't open $docu_about_file for writing: $!\n"
+ if $T2H_SPLIT;
+
+ $T2H_HREF{This} = $T2H_HREF{About};
+ $T2H_NAME{This} = $T2H_NAME{About};
+ $T2H_THIS_SECTION = [$about_body];
+ &$T2H_print_About(\*FILE);
+ close(FILE) if $T2H_SPLIT;
+}
+
+unless ($T2H_SPLIT)
+{
+ &$T2H_print_page_foot(\*FILE);
+ close (FILE);
+}
+
+Finish:
+&l2h_FinishFromHtml if ($T2H_L2H);
+&l2h_Finish if($T2H_L2H);
+print "# that's all folks\n" if $T2H_VERBOSE;
+
+exit(0);
+
+#+++############################################################################
+# #
+# Low level functions #
+# #
+#---############################################################################
+
+sub LocateIncludeFile
+{
+ my $file = shift;
+ my $dir;
+
+ return $file if (-e $file && -r $file);
+ foreach $dir (@T2H_INCLUDE_DIRS)
+ {
+ return "$dir/$file" if (-e "$dir/$file" && -r "$dir/$file");
+ }
+ return undef;
+}
+
+sub clean_name
+{
+ local ($_);
+ $_ = &remove_style($_[0]);
+ &unprotect_texi;
+ return $_;
+}
+
+sub update_sec_num {
+ local($name, $level) = @_;
+ my $ret;
+
+ $level--; # here we start at 0
+ if ($name =~ /^appendix/ || defined(@appendix_sec_num)) {
+ # appendix style
+ if (defined(@appendix_sec_num)) {
+ &incr_sec_num($level, @appendix_sec_num);
+ } else {
+ @appendix_sec_num = ('A', 0, 0, 0);
+ }
+ $ret = join('.', @appendix_sec_num[0..$level]);
+ } else {
+ # normal style
+ if (defined(@normal_sec_num))
+ {
+ &incr_sec_num($level, @normal_sec_num);
+ }
+ else
+ {
+ @normal_sec_num = (1, 0, 0, 0);
+ }
+ $ret = join('.', @normal_sec_num[0..$level]);
+ }
+
+ $ret .= "." if $level == 0;
+ return $ret;
+}
+
+sub incr_sec_num {
+ local($level, $l);
+ $level = shift(@_);
+ $_[$level]++;
+ foreach $l ($level+1 .. 3) {
+ $_[$l] = 0;
+ }
+}
+
+sub Sec2UpNode
+{
+ my $sec = shift;
+ my $num = $sec2number{$sec};
+
+ return '' unless $num;
+ return 'Top' unless $num =~ /\.\d+/;
+ $num =~ s/\.[^\.]*$//;
+ $num = $num . '.' unless $num =~ /\./;
+ return $sec2node{$number2sec{$num}};
+}
+
+sub Sec2PrevNode
+{
+ my $sec = shift;
+ my $num = $sec2number{$sec};
+ my ($i, $post);
+
+ if ($num =~ /(\w+)(\.$|$)/)
+ {
+ $num = $`;
+ $i = $1;
+ $post = $2;
+ if ($i eq 'A')
+ {
+ $i = $normal_sec_num[0];
+ }
+ elsif ($i ne '1')
+ {
+ # unfortunately, -- operator is not magical
+ $i = chr(ord($i) + 1);
+ }
+ else
+ {
+ return '';
+ }
+ return $sec2node{$number2sec{$num . $i . $post}}
+ }
+ return '';
+}
+
+sub Sec2NextNode
+{
+ my $sec = shift;
+ my $num = $sec2number{$sec};
+ my $i;
+
+ if ($num =~ /(\w+)(\.$|$)/)
+ {
+ $num = $`;
+ $i = $1;
+ $post = $2;
+ if ($post eq '.' && $i eq $normal_sec_num[0])
+ {
+ $i = 'A';
+ }
+ else
+ {
+ $i++;
+ }
+ return $sec2node{$number2sec{$num . $i . $post}}
+ }
+ return '';
+}
+
+sub check {
+ local($_, %seen, %context, $before, $match, $after);
+
+ while (<>) {
+ if (/\@(\*|\.|\:|\@|\{|\})/) {
+ $seen{$&}++;
+ $context{$&} .= "> $_" if $T2H_VERBOSE;
+ $_ = "$`XX$'";
+ redo;
+ }
+ if (/\@(\w+)/) {
+ ($before, $match, $after) = ($`, $&, $');
+ if ($before =~ /\b[\w-]+$/ && $after =~ /^[\w-.]*\b/) { # e-mail address
+ $seen{'e-mail address'}++;
+ $context{'e-mail address'} .= "> $_" if $T2H_VERBOSE;
+ } else {
+ $seen{$match}++;
+ $context{$match} .= "> $_" if $T2H_VERBOSE;
+ }
+ $match =~ s/^\@/X/;
+ $_ = "$before$match$after";
+ redo;
+ }
+ }
+
+ foreach (sort(keys(%seen))) {
+ if ($T2H_VERBOSE) {
+ print "$_\n";
+ print $context{$_};
+ } else {
+ print "$_ ($seen{$_})\n";
+ }
+ }
+}
+
+sub open {
+ local($name) = @_;
+
+ ++$fh_name;
+ if (open($fh_name, $name)) {
+ unshift(@fhs, $fh_name);
+ } else {
+ warn "$ERROR Can't read file $name: $!\n";
+ }
+}
+
+sub init_input {
+ @fhs = (); # hold the file handles to read
+ @input_spool = (); # spooled lines to read
+ $fh_name = 'FH000';
+ &open($docu);
+}
+
+sub next_line {
+ local($fh, $line);
+
+ if (@input_spool) {
+ $line = shift(@input_spool);
+ return($line);
+ }
+ while (@fhs) {
+ $fh = $fhs[0];
+ $line = <$fh>;
+ return($line) if $line;
+ close($fh);
+ shift(@fhs);
+ }
+ return(undef);
+}
+
+# used in pass 1, use &next_line
+sub skip_until {
+ local($tag) = @_;
+ local($_);
+
+ while ($_ = &next_line) {
+ return if /^\@end\s+$tag\s*$/;
+ }
+ die "* Failed to find '$tag' after: " . $lines[$#lines];
+}
+
+# used in pass 1 for l2h use &next_line
+sub string_until {
+ local($tag) = @_;
+ local($_, $string);
+
+ while ($_ = &next_line) {
+ return $string if /^\@end\s+$tag\s*$/;
+# $_ =~ s/hbox/mbox/g;
+ $string = $string.$_;
+ }
+ die "* Failed to find '$tag' after: " . $lines[$#lines];
+}
+
+#
+# HTML stacking to have a better HTML output
+#
+
+sub html_reset {
+ @html_stack = ('html');
+ $html_element = 'body';
+}
+
+sub html_push {
+ local($what) = @_;
+ push(@html_stack, $html_element);
+ $html_element = $what;
+}
+
+sub html_push_if {
+ local($what) = @_;
+ push(@html_stack, $html_element)
+ if ($html_element && $html_element ne 'P');
+ $html_element = $what;
+}
+
+sub html_pop {
+ $html_element = pop(@html_stack);
+}
+
+sub html_pop_if {
+ local($elt);
+
+ if (@_) {
+ foreach $elt (@_) {
+ if ($elt eq $html_element) {
+ $html_element = pop(@html_stack) if @html_stack;
+ last;
+ }
+ }
+ } else {
+ $html_element = pop(@html_stack) if @html_stack;
+ }
+}
+
+sub html_debug {
+ local($what, $line) = @_;
+ if ($T2H_DEBUG & $DEBUG_HTML)
+ {
+ $what = "\n" unless $what;
+ return("<!-- $line @html_stack, $html_element -->$what")
+ }
+ return($what);
+}
+
+# to debug the output...
+sub debug {
+ local($what, $line) = @_;
+ return("<!-- $line -->$what")
+ if $T2H_DEBUG & $DEBUG_HTML;
+ return($what);
+}
+
+sub SimpleTexi2Html
+{
+ local $_ = $_[0];
+ &protect_texi;
+ &protect_html;
+ $_ = substitute_style($_);
+ $_[0] = $_;
+}
+
+sub normalise_node {
+ local $_ = $_[0];
+ s/\s+/ /g;
+ s/ $//;
+ s/^ //;
+ &protect_texi;
+ &protect_html;
+ $_ = substitute_style($_);
+ $_[0] = $_;
+}
+
+sub menu_entry
+{
+ my ($node, $name, $descr) = @_;
+ my ($href, $entry);
+
+ &normalise_node($node);
+ $href = $node2href{$node};
+ if ($href)
+ {
+ $descr =~ s/^\s+//;
+ $descr =~ s/\s*$//;
+ $descr = SimpleTexi2Html($descr);
+ if ($T2H_NUMBER_SECTIONS && !$T2H_NODE_NAME_IN_MENU && $node2sec{$node})
+ {
+ $entry = $node2sec{$node};
+ $name = '';
+ }
+ else
+ {
+ &normalise_node($name);
+ $entry = ($name && ($name ne $node || ! $T2H_AVOID_MENU_REDUNDANCY)
+ ? "$name : $node" : $node);
+ }
+
+ if ($T2H_AVOID_MENU_REDUNDANCY && $descr)
+ {
+ my $clean_entry = $entry;
+ $clean_entry =~ s/^.*? // if ($clean_entry =~ /^([A-Z]|\d+)\.[\d\.]* /);
+ $clean_entry =~ s/[^\w]//g;
+ my $clean_descr = $descr;
+ $clean_descr =~ s/[^\w]//g;
+ $descr = '' if ($clean_entry eq $clean_descr)
+ }
+ push(@lines2,&debug('<TR><TD ALIGN="left" VALIGN="TOP">' .
+ &t2h_anchor('', $href, $entry) .
+ '</TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">' .
+ $descr .
+ "</TD></TR>\n", __LINE__));
+ }
+ elsif ($node =~ /^\(.*\)\w+/)
+ {
+ push(@lines2,&debug('<TR><TD ALIGN="left" VALIGN="TOP">' .
+ $entry .
+ '</TD><TD ALIGN="left" VALIGN="TOP">' . $descr .
+ "</TD></TR>\n", __LINE__))
+ }
+ else
+ {
+ warn "$ERROR Undefined node of menu_entry ($node): $_";
+ }
+}
+
+sub do_ctrl { "^$_[0]" }
+
+sub do_email {
+ local($addr, $text) = split(/,\s*/, $_[0]);
+
+ $text = $addr unless $text;
+ &t2h_anchor('', "mailto:$addr", $text);
+}
+
+sub do_sc
+{
+ # l2h does this much better
+ return &l2h_ToLatex("{\\sc ".&unprotect_html($_[0])."}") if ($T2H_L2H);
+ return "\U$_[0]\E";
+}
+
+sub do_math
+{
+ return &l2h_ToLatex("\$".&unprotect_html($_[0])."\$") if ($T2H_L2H);
+ return "<EM>".$text."</EM>";
+}
+
+sub do_uref {
+ local($url, $text, $only_text) = split(/,\s*/, $_[0]);
+
+ $text = $only_text if $only_text;
+ $text = $url unless $text;
+ &t2h_anchor('', $url, $text);
+}
+
+sub do_url { &t2h_anchor('', $_[0], $_[0]) }
+
+sub do_acronym
+{
+ return '<FONT SIZE="-1">' . $_[0] . '</FONT>';
+}
+
+sub do_accent
+{
+ return "&$_[0]acute;" if $_[1] eq 'H';
+ return "$_[0]." if $_[1] eq 'dotaccent';
+ return "$_[0]*" if $_[1] eq 'ringaccent';
+ return "$_[0]".'[' if $_[1] eq 'tieaccent';
+ return "$_[0]".'(' if $_[1] eq 'u';
+ return "$_[0]_" if $_[1] eq 'ubaraccent';
+ return ".$_[0]" if $_[1] eq 'udotaccent';
+ return "$_[0]&lt;" if $_[1] eq 'v';
+ return "&$_[0]cedil;" if $_[1] eq ',';
+ return "$_[0]" if $_[1] eq 'dotless';
+ return undef;
+}
+
+sub apply_style {
+ local($texi_style, $text) = @_;
+ local($style);
+
+ $style = $style_map{$texi_style};
+ if (defined($style)) { # known style
+ if ($style =~ /^\"/) { # add quotes
+ $style = $';
+ $text = "\`$text\'";
+ }
+ if ($style =~ /^\&/) { # custom
+ $style = $';
+ $text = &$style($text, $texi_style);
+ } elsif ($style) { # good style
+ $text = "<$style>$text</$style>";
+ } else { # no style
+ }
+ } else { # unknown style
+ $text = undef;
+ }
+ return($text);
+}
+
+# remove Texinfo styles
+sub remove_style {
+ local($_) = @_;
+ 1 while(s/\@\w+{([^\{\}]+)}/$1/g);
+ return($_);
+}
+
+sub remove_things
+{
+ local ($_) = @_;
+ s|\@(\w+)\{\}|$1|g;
+ return $_;
+}
+
+sub substitute_style {
+ local($_) = @_;
+ local($changed, $done, $style, $text);
+
+ &simple_substitutions;
+ $changed = 1;
+ while ($changed) {
+ $changed = 0;
+ $done = '';
+ while (/\@(\w+){([^\{\}]+)}/ || /\@(,){([^\{\}]+)}/) {
+ $text = &apply_style($1, $2);
+ if ($text) {
+ $_ = "$`$text$'";
+ $changed = 1;
+ } else {
+ $done .= "$`\@$1";
+ $_ = "{$2}$'";
+ }
+ }
+ $_ = $done . $_;
+ }
+ return($_);
+}
+
+sub t2h_anchor {
+ local($name, $href, $text, $newline, $extra_attribs) = @_;
+ local($result);
+
+ $result = "<A";
+ $result .= " NAME=\"$name\"" if $name;
+ if ($href)
+ {
+ $href =~ s|^$T2H_HREF_DIR_INSTEAD_FILE|./|
+ if ($T2H_HREF_DIR_INSTEAD_FILE);
+ $result .= ($href =~ /\"/ ? " HREF='$href'" : " HREF=\"$href\"");
+ }
+ $result .= " $extra_attribs" if $extra_attribs;
+ $result .= ">$text</A>";
+ $result .= "\n" if $newline;
+ return($result);
+}
+
+sub pretty_date {
+ local(@MoY, $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
+
+ @MoY = ('January', 'February', 'March', 'April', 'May', 'June',
+ 'July', 'August', 'September', 'October', 'November', 'December');
+ ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
+ $year += ($year < 70) ? 2000 : 1900;
+ # obachman: Let's do it as the Americans do
+ return("$MoY[$mon], $mday $year");
+}
+
+sub doc_href {
+ local($num) = @_;
+
+ return("${docu_name}_$num.$docu_ext");
+}
+
+sub sec_href
+{
+ return $node2href{$sec2node{$_[0]}};
+}
+
+sub next_doc {
+ $docu_doc = &doc_href(++$doc_num);
+}
+
+sub t2h_print_lines {
+ my ($fh, $lines) = @_;
+ local($_);
+ $lines = $T2H_THIS_SECTION unless $lines;
+ my $cnt = 0;
+ for (@$lines)
+ {
+ $_ = l2h_FromHtml($_) if ($T2H_L2H);
+ if (/^$PROTECTTAG/o) {
+ $_ = $tag2pro{$_};
+ } else {
+ &unprotect_texi;
+ }
+ print $fh $_;
+ $cnt += split(/\W*\s+\W*/);
+ }
+ return $cnt;
+}
+
+sub protect_texi {
+ # protect @ { } ` '
+ s/\@\@/$;0/go;
+ s/\@\{/$;1/go;
+ s/\@\}/$;2/go;
+ s/\@\`/$;3/go;
+ s/\@\'/$;4/go;
+}
+
+sub protect_html {
+ local($what) = @_;
+ # protect & < >
+ $what =~ s/\&/\&\#38;/g;
+ $what =~ s/\</\&\#60;/g;
+ $what =~ s/\>/\&\#62;/g;
+ # restore anything in quotes
+ # this fixes my problem where I had:
+ # < IMG SRC="leftarrow.gif" ALT="<--" > but what if I wanted &#60; in my ALT text ??
+ # maybe byte stuffing or some other technique should be used.
+ $what =~ s/\"([^\&]+)\&\#60;(.*)\"/"$1<$2"/g;
+ $what =~ s/\"([^\&]+)\&\#62;(.*)\"/"$1>$2"/g;
+ $what =~ s/\"([^\&]+)\&\#38;(.*)\"/"$1&$2"/g;
+ # but recognize some HTML things
+ $what =~ s/\&\#60;\/A\&\#62;/<\/A>/g; # </A>
+ $what =~ s/\&\#60;A ([^\&]+)\&\#62;/<A $1>/g; # <A [^&]+>
+ $what =~ s/\&\#60;IMG ([^\&]+)\&\#62;/<IMG $1>/g; # <IMG [^&]+>
+ return($what);
+}
+
+sub unprotect_texi {
+ s/$;0/\@/go;
+ s/$;1/\{/go;
+ s/$;2/\}/go;
+ s/$;3/\`/go;
+ s/$;4/\'/go;
+}
+
+sub Unprotect_texi
+{
+ local $_ = shift;
+ &unprotect_texi;
+ return($_);
+}
+
+sub unprotect_html {
+ local($what) = @_;
+ $what =~ s/\&\#38;/\&/g;
+ $what =~ s/\&\#60;/\</g;
+ $what =~ s/\&\#62;/\>/g;
+ return($what);
+}
+
+sub t2h_print_label
+{
+ my $fh = shift;
+ my $href = shift || $T2H_HREF{This};
+ $href =~ s/.*#(.*)$/$1/;
+ print $fh qq{<A NAME="$href"></A>\n};
+}
+
+##############################################################################
+
+ # These next few lines are legal in both Perl and nroff.
+
+.00 ; # finish .ig
+
+'di \" finish diversion--previous line must be blank
+.nr nl 0-1 \" fake up transition to first page again
+.nr % 0 \" start at page 1
+'; __END__ ############# From here on it's a standard manual page ############
+.so /usr/local/man/man1/texi2html.1
diff --git a/doc/texinfo.tex b/doc/texinfo.tex
new file mode 100644
index 0000000..d494cce
--- /dev/null
+++ b/doc/texinfo.tex
@@ -0,0 +1,11045 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2015-11-22.14}
+%
+% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+% 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015
+% Free Software Foundation, Inc.
+%
+% This texinfo.tex file 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 texinfo.tex file 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/>.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. This Exception is an additional permission under section 7
+% of the GNU General Public License, version 3 ("GPLv3").
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or
+% http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or
+% http://www.gnu.org/software/texinfo/ (the Texinfo home page)
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent. You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexraggedright=\raggedright
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexsp=\sp
+\let\ptexstar=\*
+\let\ptexsup=\sup
+\let\ptext=\t
+\let\ptextop=\top
+{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Pre-3.0.
+\else
+ \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putworderror\undefined \gdef\putworderror{error}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+
+% Since the category of space is not known, we have to be careful.
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode`\ =\spacecat}
+
+% sometimes characters are active, so we need control sequences.
+\chardef\ampChar = `\&
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dashChar = `\-
+\chardef\dotChar = `\.
+\chardef\exclamChar= `\!
+\chardef\hashChar = `\#
+\chardef\lquoteChar= `\`
+\chardef\questChar = `\?
+\chardef\rquoteChar= `\'
+\chardef\semiChar = `\;
+\chardef\slashChar = `\/
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+ ap-pen-dix bit-map bit-maps
+ data-base data-bases eshell fall-ing half-way long-est man-u-script
+ man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+ par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+ spell-ing spell-ings
+ stand-alone strong-est time-stamp time-stamps which-ever white-space
+ wide-spread wrap-around
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal. We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+ \tracingstats2
+ \tracingpages1
+ \tracinglostchars2 % 2 gives us more in etex
+ \tracingparagraphs1
+ \tracingoutput1
+ \tracingmacros2
+ \tracingrestores1
+ \showboxbreadth\maxdimen \showboxdepth\maxdimen
+ \ifx\eTeXversion\thisisundefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines16
+}%
+
+% @errormsg{MSG}. Do the index-like expansions on MSG, but if things
+% aren't perfect, it's not the end of the world, being an error message,
+% after all.
+%
+\def\errormsg{\begingroup \indexnofonts \doerrormsg}
+\def\doerrormsg#1{\errmessage{#1}}
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% Output routine
+%
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt }
+
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Output a mark which sets \thischapter, \thissection and \thiscolor.
+% We dump everything together because we only have one kind of mark.
+% This works because we only use \botmark / \topmark, not \firstmark.
+%
+% A mark contains a subexpression of the \ifcase ... \fi construct.
+% \get*marks macros below extract the needed part using \ifcase.
+%
+% Another complication is to let the user choose whether \thischapter
+% (\thissection) refers to the chapter (section) in effect at the top
+% of a page, or that at the bottom of a page. The solution is
+% described on page 260 of The TeXbook. It involves outputting two
+% marks for the sectioning macros, one before the section break, and
+% one after. I won't pretend I can describe this better than DEK...
+%
+\def\domark{%
+ \toks0=\expandafter{\lastchapterdefs}%
+ \toks2=\expandafter{\lastsectiondefs}%
+ \toks4=\expandafter{\prevchapterdefs}%
+ \toks6=\expandafter{\prevsectiondefs}%
+ \toks8=\expandafter{\lastcolordefs}%
+ \mark{%
+ \the\toks0 \the\toks2 % 0: top marks (\last...)
+ \noexpand\or \the\toks4 \the\toks6 % 1: bottom marks (default, \prev...)
+ \noexpand\else \the\toks8 % 2: color marks
+ }%
+}
+
+% \gettopheadingmarks, \getbottomheadingmarks - extract needed part of mark.
+%
+% \topmark doesn't work for the very first chapter (after the title
+% page or the contents), so we use \firstmark there -- this gets us
+% the mark with the chapter defs, unless the user sneaks in, e.g.,
+% @setcolor (or @url, or @link, etc.) between @contents and the very
+% first @chapter.
+\def\gettopheadingmarks{%
+ \ifcase0\topmark\fi
+ \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
+}
+\def\getbottomheadingmarks{\ifcase1\botmark\fi}
+\def\getcolormarks{\ifcase2\topmark\fi}
+
+% Avoid "undefined control sequence" errors.
+\def\lastchapterdefs{}
+\def\lastsectiondefs{}
+\def\lastsection{}
+\def\prevchapterdefs{}
+\def\prevsectiondefs{}
+\def\lastcolordefs{}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% Main output routine.
+%
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument.
+% \shipout a vbox for a single page, adding an optional header, footer,
+% cropmarks, and footnote. This also causes index entries for this page
+% to be written to the auxiliary files.
+%
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Common context changes for both heading and footing.
+ % 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}
+ %
+ % Retrieve the information for the headings from the marks in the page,
+ % and call Plain TeX's \makeheadline and \makefootline, which use the
+ % values in \headline and \footline.
+ %
+ % This is used to check if we are on the first page of a chapter.
+ \ifcase0\topmark\fi
+ \ifx\thischapter\empty
+ % See comment for \gettopheadingmarks
+ \ifcase0\firstmark\fi
+ \let\curchaptername\thischaptername
+ \ifcase1\firstmark\fi
+ \let\prevchaptername\thischaptername
+ \else
+ \let\curchaptername\thischaptername
+ \ifcase1\topmark\fi
+ \let\prevchaptername\thischaptername
+ \fi
+ %
+ \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
+ \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
+ %
+ \ifx\curchaptername\prevchaptername
+ \let\thischapterheading\thischapter
+ \else
+ % \thischapterheading is the same as \thischapter except it is blank
+ % for the first page of a chapter. This is to prevent the chapter name
+ % being shown twice.
+ \def\thischapterheading{}%
+ \fi
+ %
+ \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}%
+ \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}%
+ %
+ {%
+ % Set context for writing to auxiliary files like index files.
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ % We don't want .vr (or whatever) entries like this:
+ % \entry{{\indexbackslash }acronym}{32}{\code {\acronym}}
+ % "\acronym" won't work when it's read back in;
+ % it needs to be
+ % {\code {{\backslashcurfont }acronym}
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingyyy.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 24pt
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \indexdummies
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+% Main part of page, including any footnotes
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1\relax \unvbox#1\relax
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+
+% Argument parsing
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+% For example, \def\foo{\parsearg\fooxxx}.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+ \def\argtorun{#2}%
+ \begingroup
+ \obeylines
+ \spaceisspace
+ #1%
+ \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ \argremovecomment #1\comment\ArgTerm%
+ }%
+}
+
+% First remove any @comment, then any @c comment. Also remove a @texinfoc
+% comment (see \scanmacro for details). Pass the result on to \argcheckspaces.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argremovetexinfoc #1\texinfoc\ArgTerm}
+\def\argremovetexinfoc#1\texinfoc#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+% @end itemize @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+ \def\temp{#3}%
+ \ifx\temp\empty
+ % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+ \let\temp\finishparsearg
+ \else
+ \let\temp\argcheckspaces
+ \fi
+ % Put the space token in:
+ \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarly, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+
+% \parseargdef - define a command taking an argument on the line
+%
+% \parseargdef\foo{...}
+% is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+\def\parseargdef#1{%
+ \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+ \def#2{\parsearg#1}%
+ \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+ \obeyspaces
+ \gdef\obeyedspace{ }
+
+ % Make each space character in the input produce a normal interword
+ % space in the output. Don't allow a line break at this space, as this
+ % is used only in environments like @example, where each line of input
+ % should produce a line of output anyway.
+ %
+ \gdef\sepspaces{\obeyspaces\let =\tie}
+
+ % If an index command is used in an @example environment, any spaces
+ % therein should become regular spaces in the raw index file, not the
+ % expansion of \tie (\leavevmode \penalty \@M \ ).
+ \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex. It's used like this:
+%
+% \envdef\foo{...}
+% \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo. \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches. The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as environments; they don't open a group. (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At run-time, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+ \def\temp{#1}%
+ \ifx\thisenv\temp
+ \else
+ \badenverr
+ \fi
+}
+
+% Environment mismatch, #1 expected:
+\def\badenverr{%
+ \errhelp = \EMsimple
+ \errmessage{This command can appear only \inenvironment\temp,
+ not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+ \ifx#1\empty
+ outside of any environment%
+ \else
+ in environment \expandafter\string#1%
+ \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+ \if 1\csname iscond.#1\endcsname
+ \else
+ % The general wording of \badenverr may not be ideal.
+ \expandafter\checkenv\csname#1\endcsname
+ \csname E#1\endcsname
+ \endgroup
+ \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\unskip\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off says whether to put extra space after punctuation.
+%
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+ \def\temp{#1}%
+ \ifx\temp\onword \plainfrenchspacing
+ \else\ifx\temp\offword \plainnonfrenchspacing
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%
+ \fi\fi
+}
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large. This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material. In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom. The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+ \ifnum\catcode`\^^M=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ \startsavinginserts
+ %
+ \setbox\groupbox = \vtop\bgroup
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it. Thus, space below is not quite equal to space
+% above. But it's pretty close.
+\def\Egroup{%
+ % To get correct interline space between the last line of the group
+ % and the first line afterwards, we have to propagate \prevdepth.
+ \endgraf % Not \par, as it may have been set to \lisppar.
+ \global\dimen1 = \prevdepth
+ \egroup % End the \vtop.
+ \addgroupbox
+ \prevdepth = \dimen1
+ \checkinserts
+}
+
+\def\addgroupbox{
+ % \dimen0 is the vertical size of the group's box.
+ \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
+ % \dimen2 is how much space is left on the page (more or less).
+ \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
+ % if the group doesn't fit on the current page, and it's a big big
+ % group, force a page break.
+ \ifdim \dimen0 > \dimen2
+ \ifdim \pagetotal < \vfilllimit\pageheight
+ \page
+ \fi
+ \fi
+ \box\groupbox
+}
+
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+\parseargdef\need{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+ \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'. Not documented, written for gawk manual.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change). This command
+% is not documented, not supported, and doesn't work.
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% @include FILE -- \input text of FILE.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+ \pushthisfilestack
+ \def\thisfile{#1}%
+ {%
+ \makevalueexpandable % we want to expand any @value in FILE.
+ \turnoffactive % and allow special characters in the expansion
+ \indexnofonts % Allow `@@' and other weird things in file names.
+ \wlog{texinfo.tex: doing @include of #1^^J}%
+ \edef\temp{\noexpand\input #1 }%
+ %
+ % This trickery is to read FILE outside of a group, in case it makes
+ % definitions, etc.
+ \expandafter
+ }\temp
+ \popthisfilestack
+}
+\def\filenamecatcodes{%
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \catcode`-=\other
+ \catcode`\`=\other
+ \catcode`\'=\other
+}
+
+\def\pushthisfilestack{%
+ \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+ \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+ \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+ the stack of filenames is empty.}}
+%
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+ \ifhmode
+ \let\centersub\centerH
+ \else
+ \let\centersub\centerV
+ \fi
+ \centersub{\hfil \ignorespaces#1\unskip \hfil}%
+ \let\centersub\relax % don't let the definition persist, just in case
+}
+\def\centerH#1{{%
+ \hfil\break
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{#1}%
+ \break
+}}
+%
+\newcount\centerpenalty
+\def\centerV#1{%
+ % The idea here is the same as in \startdefun, \cartouche, etc.: if
+ % @center is the first thing after a section heading, we need to wipe
+ % out the negative parskip inserted by \sectionheading, but still
+ % prevent a page break here.
+ \centerpenalty = \lastpenalty
+ \ifnum\centerpenalty>10000 \vskip\parskip \fi
+ \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi
+ \line{\kern\leftskip #1\kern\rightskip}%
+}
+
+% @sp n outputs n lines of vertical space
+%
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+%
+\def\comment{\begingroup \catcode`\^^M=\active%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other\commentxxx}%
+
+{\catcode`\^^M=\active%
+\gdef\commentxxx#1^^M{\endgroup%
+\futurelet\nexttoken\commentxxxx}%
+\gdef\commentxxxx{\ifx\nexttoken\aftermacro\expandafter\comment\fi}%
+}
+
+\def\c{\begingroup \catcode`\^^M=\active%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\cxxx}
+{\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}}
+% See comment in \scanmacro about why the definitions of @c and @comment differ
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading. If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\noneword
+ \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+ \else\ifx\temp\insertword
+ \let\suppressfirstparagraphindent = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @firstparagraphindent option `\temp'}%
+ \fi\fi
+}
+
+% Here is how we actually suppress indentation. Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+ \gdef\indent {\restorefirstparagraphindent \indent}%
+ \gdef\noindent{\restorefirstparagraphindent \noindent}%
+ \global\everypar = {\kern -\parindent \restorefirstparagraphindent}%
+}
+%
+\gdef\restorefirstparagraphindent{%
+ \global\let\indent = \ptexindent
+ \global\let\noindent = \ptexnoindent
+ \global\everypar = {}%
+}
+
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% @setfilename INFO-FILENAME - ignored
+\let\setfilename=\comment
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newbox\boxB
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set). So we test for \relax and 0 as well as being undefined.
+\ifx\pdfoutput\thisisundefined
+\else
+ \ifx\pdfoutput\relax
+ \else
+ \ifcase\pdfoutput
+ \else
+ \pdftrue
+ \fi
+ \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places. Thus, we have to
+% double any backslashes. Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e. Not good.
+%
+% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and
+% related messages. The final outcome is that it is up to the TeX user
+% to double the backslashes and otherwise make the string valid, so
+% that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to
+% do this reliably, so we use it.
+
+% #1 is a control sequence in which to do the replacements,
+% which we \xdef.
+\def\txiescapepdf#1{%
+ \ifx\pdfescapestring\thisisundefined
+ % No primitive available; should we give a warning or log?
+ % Many times it won't matter.
+ \else
+ % The expandable \pdfescapestring primitive escapes parentheses,
+ % backslashes, and other special chars.
+ \xdef#1{\pdfescapestring{#1}}%
+ \fi
+}
+
+\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
+with PDF output, and none of those formats could be found. (.eps cannot
+be supported due to the design of the PDF format; use regular TeX (DVI
+output) for that.)}
+
+\ifpdf
+ %
+ % Color manipulation macros using ideas from pdfcolor.tex,
+ % except using rgb instead of cmyk; the latter is said to render as a
+ % very dark gray on-screen and a very dark halftone in print, instead
+ % of actual black. The dark red here is dark enough to print on paper as
+ % nearly black, but still distinguishable for online viewing. We use
+ % black by default, though.
+ \def\rgbDarkRed{0.50 0.09 0.12}
+ \def\rgbBlack{0 0 0}
+ %
+ % k sets the color for filling (usual text, etc.);
+ % K sets the color for stroking (thin rules, e.g., normal _'s).
+ \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}}
+ %
+ % Set color, and create a mark which defines \thiscolor accordingly,
+ % so that \makeheadline knows which color to restore.
+ \def\setcolor#1{%
+ \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%
+ \domark
+ \pdfsetcolor{#1}%
+ }
+ %
+ \def\maincolor{\rgbBlack}
+ \pdfsetcolor{\maincolor}
+ \edef\thiscolor{\maincolor}
+ \def\lastcolordefs{}
+ %
+ \def\makefootline{%
+ \baselineskip24pt
+ \line{\pdfsetcolor{\maincolor}\the\footline}%
+ }
+ %
+ \def\makeheadline{%
+ \vbox to 0pt{%
+ \vskip-22.5pt
+ \line{%
+ \vbox to8.5pt{}%
+ % Extract \thiscolor definition from the marks.
+ \getcolormarks
+ % Typeset the headline with \maincolor, then restore the color.
+ \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+ }%
+ \vss
+ }%
+ \nointerlineskip
+ }
+ %
+ %
+ \pdfcatalog{/PageMode /UseOutlines}
+ %
+ % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+ \def\dopdfimage#1#2#3{%
+ \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+ \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+ %
+ % pdftex (and the PDF format) support .pdf, .png, .jpg (among
+ % others). Let's try in that order, PDF first since if
+ % someone has a scalable image, presumably better to use that than a
+ % bitmap.
+ \let\pdfimgext=\empty
+ \begingroup
+ \openin 1 #1.pdf \ifeof 1
+ \openin 1 #1.PDF \ifeof 1
+ \openin 1 #1.png \ifeof 1
+ \openin 1 #1.jpg \ifeof 1
+ \openin 1 #1.jpeg \ifeof 1
+ \openin 1 #1.JPG \ifeof 1
+ \errhelp = \nopdfimagehelp
+ \errmessage{Could not find image file #1 for pdf}%
+ \else \gdef\pdfimgext{JPG}%
+ \fi
+ \else \gdef\pdfimgext{jpeg}%
+ \fi
+ \else \gdef\pdfimgext{jpg}%
+ \fi
+ \else \gdef\pdfimgext{png}%
+ \fi
+ \else \gdef\pdfimgext{PDF}%
+ \fi
+ \else \gdef\pdfimgext{pdf}%
+ \fi
+ \closein 1
+ \endgroup
+ %
+ % without \immediate, ancient pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifdim \wd0 >0pt width \pdfimagewidth \fi
+ \ifdim \wd2 >0pt height \pdfimageheight \fi
+ \ifnum\pdftexversion<13
+ #1.\pdfimgext
+ \else
+ {#1.\pdfimgext}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ %
+ \def\pdfmkdest#1{{%
+ % We have to set dummies so commands such as @code, and characters
+ % such as \, aren't expanded when present in a section title.
+ \indexnofonts
+ \turnoffactive
+ \makevalueexpandable
+ \def\pdfdestname{#1}%
+ \txiescapepdf\pdfdestname
+ \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+ }}
+ %
+ % used to mark target names; must be expandable.
+ \def\pdfmkpgn#1{#1}
+ %
+ % by default, use black for everything.
+ \def\urlcolor{\rgbBlack}
+ \def\linkcolor{\rgbBlack}
+ \def\endlink{\setcolor{\maincolor}\pdfendlink}
+ %
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by 1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ %
+ % #1 is the section text, which is what will be displayed in the
+ % outline by the pdf viewer. #2 is the pdf expression for the number
+ % of subentries (or empty, for subsubsections). #3 is the node text,
+ % which might be empty if this toc entry had no corresponding node.
+ % #4 is the page number
+ %
+ \def\dopdfoutline#1#2#3#4{%
+ % Generate a link to the node text if that exists; else, use the
+ % page number. We could generate a destination for the section
+ % text in the case where a section has no node, but it doesn't
+ % seem worth the trouble, since most documents are normally structured.
+ \edef\pdfoutlinedest{#3}%
+ \ifx\pdfoutlinedest\empty
+ \def\pdfoutlinedest{#4}%
+ \else
+ \txiescapepdf\pdfoutlinedest
+ \fi
+ %
+ % Also escape PDF chars in the display string.
+ \edef\pdfoutlinetext{#1}%
+ \txiescapepdf\pdfoutlinetext
+ %
+ \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
+ }
+ %
+ \def\pdfmakeoutlines{%
+ \begingroup
+ % Read toc silently, to get counts of subentries for \pdfoutline.
+ \def\partentry##1##2##3##4{}% ignore parts in the outlines
+ \def\numchapentry##1##2##3##4{%
+ \def\thischapnum{##2}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsecentry##1##2##3##4{%
+ \advancenumber{chap\thischapnum}%
+ \def\thissecnum{##2}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsubsecentry##1##2##3##4{%
+ \advancenumber{sec\thissecnum}%
+ \def\thissubsecnum{##2}%
+ }%
+ \def\numsubsubsecentry##1##2##3##4{%
+ \advancenumber{subsec\thissubsecnum}%
+ }%
+ \def\thischapnum{0}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ %
+ % use \def rather than \let here because we redefine \chapentry et
+ % al. a second time, below.
+ \def\appentry{\numchapentry}%
+ \def\appsecentry{\numsecentry}%
+ \def\appsubsecentry{\numsubsecentry}%
+ \def\appsubsubsecentry{\numsubsubsecentry}%
+ \def\unnchapentry{\numchapentry}%
+ \def\unnsecentry{\numsecentry}%
+ \def\unnsubsecentry{\numsubsecentry}%
+ \def\unnsubsubsecentry{\numsubsubsecentry}%
+ \readdatafile{toc}%
+ %
+ % Read toc second time, this time actually producing the outlines.
+ % The `-' means take the \expnumber as the absolute number of
+ % subentries, which we calculated on our first read of the .toc above.
+ %
+ % We use the node names as the destinations.
+ \def\numchapentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+ \def\numsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+ \def\numsubsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+ \def\numsubsubsecentry##1##2##3##4{% count is always zero
+ \dopdfoutline{##1}{}{##3}{##4}}%
+ %
+ % PDF outlines are displayed using system fonts, instead of
+ % document fonts. Therefore we cannot use special characters,
+ % since the encoding is unknown. For example, the eogonek from
+ % Latin 2 (0xea) gets translated to a | character. Info from
+ % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+ %
+ % TODO this right, we have to translate 8-bit characters to
+ % their "best" equivalent, based on the @documentencoding. Too
+ % much work for too little return. Just use the ASCII equivalents
+ % we use for the index sort strings.
+ %
+ \indexnofonts
+ \setupdatafile
+ % We can have normal brace characters in the PDF outlines, unlike
+ % Texinfo index files. So set that up.
+ \def\{{\lbracecharliteral}%
+ \def\}{\rbracecharliteral}%
+ \catcode`\\=\active \otherbackslash
+ \input \tocreadfilename
+ \endgroup
+ }
+ {\catcode`[=1 \catcode`]=2
+ \catcode`{=\other \catcode`}=\other
+ \gdef\lbracecharliteral[{]%
+ \gdef\rbracecharliteral[}]%
+ ]
+ %
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \nextsp}
+ \def\getfilename#1{%
+ \filenamelength=0
+ % If we don't expand the argument now, \skipspaces will get
+ % snagged on things like "@value{foo}".
+ \edef\temp{#1}%
+ \expandafter\skipspaces\temp|\relax
+ }
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ % make a live url in pdf output.
+ \def\pdfurl#1{%
+ \begingroup
+ % it seems we really need yet another set of dummies; have not
+ % tried to figure out what each command should do in the context
+ % of @url. for now, just make @/ a no-op, that's the only one
+ % people have actually reported a problem with.
+ %
+ \normalturnoffactive
+ \def\@{@}%
+ \let\/=\empty
+ \makevalueexpandable
+ % do we want to go so far as to use \indexnofonts instead of just
+ % special-casing \var here?
+ \def\var##1{##1}%
+ %
+ \leavevmode\setcolor{\urlcolor}%
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \setcolor{\linkcolor}#1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+ % non-pdf mode
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\setcolor = \gobble
+ \let\pdfsetcolor = \gobble
+ \let\pdfmakeoutlines = \relax
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+ \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+ \csname ten#1\endcsname % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Unfortunately, we have to override this for titles and the like, since
+% in those cases "rm" is bold. Sigh.
+\def\rmisbold{\rm\def\curfontstyle{bf}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+% can get a sort of poor man's double spacing by redefining this.
+\def\baselinefactor{1}
+%
+\newdimen\textleading
+\def\setleading#1{%
+ \dimen0 = #1\relax
+ \normalbaselineskip = \baselinefactor\dimen0
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+% PDF CMaps. See also LaTeX's t1.cmap.
+%
+% do nothing with this by default.
+\expandafter\let\csname cmapOT1\endcsname\gobble
+\expandafter\let\csname cmapOT1IT\endcsname\gobble
+\expandafter\let\csname cmapOT1TT\endcsname\gobble
+
+% if we are producing pdf, and we have \pdffontattr, then define cmaps.
+% (\pdffontattr was introduced many years ago, but people still run
+% older pdftex's; it's easy to conditionalize, so we do.)
+\ifpdf \ifx\pdffontattr\thisisundefined \else
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1-0)
+%%Title: (TeX-OT1-0 TeX OT1 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<23> <26> <0023>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+40 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+%
+% \cmapOT1IT
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1IT-0)
+%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1IT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1IT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<25> <26> <0025>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+42 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<23> <0023>
+<24> <00A3>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1IT\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+%
+% \cmapOT1TT
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1TT-0)
+%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1TT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1TT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+5 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<21> <26> <0021>
+<28> <5F> <0028>
+<61> <7E> <0061>
+endbfrange
+32 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <2191>
+<0C> <2193>
+<0D> <0027>
+<0E> <00A1>
+<0F> <00BF>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<20> <2423>
+<27> <2019>
+<60> <2018>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1TT\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+\fi\fi
+
+
+% Set the font macro #1 to the font named \fontprefix#2.
+% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
+% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit).
+% Example:
+% #1 = \textrm
+% #2 = \rmshape
+% #3 = 10
+% #4 = \mainmagstep
+% #5 = OT1
+%
+\def\setfont#1#2#3#4#5{%
+ \font#1=\fontprefix#2#3 scaled #4
+ \csname cmap#5\endcsname#1%
+}
+% This is what gets called when #5 of \setfont is empty.
+\let\cmap\gobble
+%
+% (end of cmaps)
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\thisisundefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} % where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Definitions for a main text size of 11pt. (The default in Texinfo.)
+%
+\def\definetextfontsizexi{%
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1095}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}{OT1}
+\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
+\setfont\defsl\slshape{10}{\magstep1}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf
+\let\tenttsl=\defttsl \let\tensl=\defsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\titleecsize{2074}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
+\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
+\setfont\chapsf\sfbshape{17}{1000}{OT1}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+\def\chapecsize{1728}
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1}
+\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep2}{OT1}
+\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}{OT1}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+\def\sececsize{1440}
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
+\setfont\ssecit\itbshape{10}{1315}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1315}{OT1}
+\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}{OT1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+\def\ssececsize{1200}
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}{OT1}
+\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{1000}{OT1}
+\setfont\reducedit\itshape{10}{1000}{OT1IT}
+\setfont\reducedsl\slshape{10}{1000}{OT1}
+\setfont\reducedsf\sfshape{10}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{1000}{OT1}
+\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+\def\reducedecsize{1000}
+
+\textleading = 13.2pt % line spacing for 11pt CM
+\textfonts % reset the current fonts
+\rm
+} % end of 11pt text font size definitions, \definetextfontsizexi
+
+
+% Definitions to make the main text be 10pt Computer Modern, with
+% section, chapter, etc., sizes following suit. This is for the GNU
+% Press printing of the Emacs 22 manual. Maybe other manuals in the
+% future. Used with @smallbook, which sets the leading to 12pt.
+%
+\def\definetextfontsizex{%
+% Text fonts (10pt).
+\def\textnominalsize{10pt}
+\edef\mainmagstep{1000}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1000}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
+\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
+\setfont\defsl\slshape{10}{\magstephalf}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf
+\let\tensl=\defsl \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\titleecsize{2074}
+
+% Chapter fonts (14.4pt).
+\def\chapnominalsize{14pt}
+\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
+\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
+\let\chapbf\chaprm
+\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
+\font\chapi=cmmi12 scaled \magstep1
+\font\chapsy=cmsy10 scaled \magstep2
+\def\chapecsize{1440}
+
+% Section fonts (12pt).
+\def\secnominalsize{12pt}
+\setfont\secrm\rmbshape{12}{1000}{OT1}
+\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep1}{OT1}
+\setfont\sectt\ttbshape{12}{1000}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
+\setfont\secsf\sfbshape{12}{1000}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep1}{OT1}
+\font\seci=cmmi12
+\font\secsy=cmsy10 scaled \magstep1
+\def\sececsize{1200}
+
+% Subsection fonts (10pt).
+\def\ssecnominalsize{10pt}
+\setfont\ssecrm\rmbshape{10}{1000}{OT1}
+\setfont\ssecit\itbshape{10}{1000}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1000}{OT1}
+\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
+\setfont\ssecsf\sfbshape{10}{1000}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1000}{OT1}
+\font\sseci=cmmi10
+\font\ssecsy=cmsy10
+\def\ssececsize{1000}
+
+% Reduced fonts for @acro in text (9pt).
+\def\reducednominalsize{9pt}
+\setfont\reducedrm\rmshape{9}{1000}{OT1}
+\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{900}{OT1}
+\setfont\reducedit\itshape{9}{1000}{OT1IT}
+\setfont\reducedsl\slshape{9}{1000}{OT1}
+\setfont\reducedsf\sfshape{9}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{900}{OT1}
+\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
+\font\reducedi=cmmi9
+\font\reducedsy=cmsy9
+\def\reducedecsize{0900}
+
+\divide\parskip by 2 % reduce space between paragraphs
+\textleading = 12pt % line spacing for 10pt CM
+\textfonts % reset the current fonts
+\rm
+} % end of 10pt text font size definitions, \definetextfontsizex
+
+
+% We provide the user-level command
+% @fonttextsize 10
+% (or 11) to redefine the text font size. pt is assumed.
+%
+\def\xiword{11}
+\def\xword{10}
+\def\xwordpt{10pt}
+%
+\parseargdef\fonttextsize{%
+ \def\textsizearg{#1}%
+ %\wlog{doing @fonttextsize \textsizearg}%
+ %
+ % Set \globaldefs so that documents can use this inside @tex, since
+ % makeinfo 4.8 does not support it, but we need it nonetheless.
+ %
+ \begingroup \globaldefs=1
+ \ifx\textsizearg\xword \definetextfontsizex
+ \else \ifx\textsizearg\xiword \definetextfontsizexi
+ \else
+ \errhelp=\EMsimple
+ \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
+ \fi\fi
+ \endgroup
+}
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. We don't
+% bother to reset \scriptfont and \scriptscriptfont; awaiting user need.
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this because \STYLE needs to also set the
+% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower). These relative commands are used
+% in, e.g., the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+ \let\tenttsl=\textttsl
+ \def\curfontsize{text}%
+ \def\lsize{reduced}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \def\curfontsize{title}%
+ \def\lsize{chap}\def\lllsize{subsec}%
+ \resetmathfonts \setleading{27pt}}
+\def\titlefont#1{{\titlefonts\rmisbold #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+ \let\tenttsl=\chapttsl
+ \def\curfontsize{chap}%
+ \def\lsize{sec}\def\lllsize{text}%
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+ \let\tenttsl=\secttsl
+ \def\curfontsize{sec}%
+ \def\lsize{subsec}\def\lllsize{reduced}%
+ \resetmathfonts \setleading{17pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+ \let\tenttsl=\ssecttsl
+ \def\curfontsize{ssec}%
+ \def\lsize{text}\def\lllsize{small}%
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+ \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+ \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+ \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+ \let\tenttsl=\reducedttsl
+ \def\curfontsize{reduced}%
+ \def\lsize{small}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \def\curfontsize{small}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \def\curfontsize{smaller}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{9.5pt}}
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}{OT1}
+\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}{OT1}
+\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
+
+% Define these just so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+% 8.5x11=86 smallbook=72 a4=90 a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+% 8.5x11=90+ smallbook=80 a4=90+ a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt. So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+% 8.5x11=71 smallbook=60 a4=75 a5=58
+% --karl, 24jan03.
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\definetextfontsizexi
+
+
+\message{markup,}
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will
+% define and register \INITMACRO to be called on markup style changes.
+% \INITMACRO can check \currentmarkupstyle for the innermost
+% style and the set of \ifmarkupSTYLE switches for all styles
+% currently in effect.
+\newif\ifmarkupvar
+\newif\ifmarkupsamp
+\newif\ifmarkupkey
+%\newif\ifmarkupfile % @file == @samp.
+%\newif\ifmarkupoption % @option == @samp.
+\newif\ifmarkupcode
+\newif\ifmarkupkbd
+%\newif\ifmarkupenv % @env == @code.
+%\newif\ifmarkupcommand % @command == @code.
+\newif\ifmarkuptex % @tex (and part of @math, for now).
+\newif\ifmarkupexample
+\newif\ifmarkupverb
+\newif\ifmarkupverbatim
+
+\let\currentmarkupstyle\empty
+
+\def\setupmarkupstyle#1{%
+ \csname markup#1true\endcsname
+ \def\currentmarkupstyle{#1}%
+ \markupstylesetup
+}
+
+\let\markupstylesetup\empty
+
+\def\defmarkupstylesetup#1{%
+ \expandafter\def\expandafter\markupstylesetup
+ \expandafter{\markupstylesetup #1}%
+ \def#1%
+}
+
+% Markup style setup for left and right quotes.
+\defmarkupstylesetup\markupsetuplq{%
+ \expandafter\let\expandafter \temp
+ \csname markupsetuplq\currentmarkupstyle\endcsname
+ \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
+}
+
+\defmarkupstylesetup\markupsetuprq{%
+ \expandafter\let\expandafter \temp
+ \csname markupsetuprq\currentmarkupstyle\endcsname
+ \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
+}
+
+{
+\catcode`\'=\active
+\catcode`\`=\active
+
+\gdef\markupsetuplqdefault{\let`\lq}
+\gdef\markupsetuprqdefault{\let'\rq}
+
+\gdef\markupsetcodequoteleft{\let`\codequoteleft}
+\gdef\markupsetcodequoteright{\let'\codequoteright}
+}
+
+\let\markupsetuplqcode \markupsetcodequoteleft
+\let\markupsetuprqcode \markupsetcodequoteright
+%
+\let\markupsetuplqexample \markupsetcodequoteleft
+\let\markupsetuprqexample \markupsetcodequoteright
+%
+\let\markupsetuplqkbd \markupsetcodequoteleft
+\let\markupsetuprqkbd \markupsetcodequoteright
+%
+\let\markupsetuplqsamp \markupsetcodequoteleft
+\let\markupsetuprqsamp \markupsetcodequoteright
+%
+\let\markupsetuplqverb \markupsetcodequoteleft
+\let\markupsetuprqverb \markupsetcodequoteright
+%
+\let\markupsetuplqverbatim \markupsetcodequoteleft
+\let\markupsetuprqverbatim \markupsetcodequoteright
+
+% Allow an option to not use regular directed right quote/apostrophe
+% (char 0x27), but instead the undirected quote from cmtt (char 0x0d).
+% The undirected quote is ugly, so don't make it the default, but it
+% works for pasting with more pdf viewers (at least evince), the
+% lilypond developers report. xpdf does work with the regular 0x27.
+%
+\def\codequoteright{%
+ \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
+ \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
+ '%
+ \else \char'15 \fi
+ \else \char'15 \fi
+}
+%
+% and a similar option for the left quote char vs. a grave accent.
+% Modern fonts display ASCII 0x60 as a grave accent, so some people like
+% the code environments to do likewise.
+%
+\def\codequoteleft{%
+ \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
+ \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
+ % [Knuth] pp. 380,381,391
+ % \relax disables Spanish ligatures ?` and !` of \tt font.
+ \relax`%
+ \else \char'22 \fi
+ \else \char'22 \fi
+}
+
+% Commands to set the quote options.
+%
+\parseargdef\codequoteundirected{%
+ \def\temp{#1}%
+ \ifx\temp\onword
+ \expandafter\let\csname SETtxicodequoteundirected\endcsname
+ = t%
+ \else\ifx\temp\offword
+ \expandafter\let\csname SETtxicodequoteundirected\endcsname
+ = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
+ \fi\fi
+}
+%
+\parseargdef\codequotebacktick{%
+ \def\temp{#1}%
+ \ifx\temp\onword
+ \expandafter\let\csname SETtxicodequotebacktick\endcsname
+ = t%
+ \else\ifx\temp\offword
+ \expandafter\let\csname SETtxicodequotebacktick\endcsname
+ = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%
+ \fi\fi
+}
+
+% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
+\def\noligaturesquoteleft{\relax\lq}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Font commands.
+
+% #1 is the font command (\sl or \it), #2 is the text to slant.
+% If we are in a monospaced environment, however, 1) always use \ttsl,
+% and 2) do not add an italic correction.
+\def\dosmartslant#1#2{%
+ \ifusingtt
+ {{\ttsl #2}\let\next=\relax}%
+ {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
+ \next
+}
+\def\smartslanted{\dosmartslant\sl}
+\def\smartitalic{\dosmartslant\it}
+
+% Output an italic correction unless \next (presumed to be the following
+% character) is such as not to need one.
+\def\smartitaliccorrection{%
+ \ifx\next,%
+ \else\ifx\next-%
+ \else\ifx\next.%
+ \else\ifx\next\.%
+ \else\ifx\next\comma%
+ \else\ptexslash
+ \fi\fi\fi\fi\fi
+ \aftersmartic
+}
+
+% Unconditional use \ttsl, and no ic. @var is set to this for defuns.
+\def\ttslanted#1{{\ttsl #1}}
+
+% @cite is like \smartslanted except unconditionally use \sl. We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}
+
+\def\aftersmartic{}
+\def\var#1{%
+ \let\saveaftersmartic = \aftersmartic
+ \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%
+ \smartslanted{#1}%
+}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @b, explicit bold. Also @strong.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+ \def\plainfrenchspacing{%
+ \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+ \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+ \def\endofsentencespacefactor{1000}% for @. and friends
+ }
+ \def\plainnonfrenchspacing{%
+ \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+ \def\endofsentencespacefactor{3000}% for @. and friends
+ }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+% @t, explicit typewriter.
+\def\t#1{%
+ {\tt \rawbackslash \plainfrenchspacing #1}%
+ \null
+}
+
+% @samp.
+\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
+
+% @indicateurl is \samp, that is, with quotes.
+\let\indicateurl=\samp
+
+% @code (and similar) prints in typewriter, but with spaces the same
+% size as normal in the surrounding text, without hyphenation, etc.
+% This is a subroutine for that.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \plainfrenchspacing
+ #1%
+ }%
+ \null % reset spacefactor to 1000
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% (But see \codedashfinish below.)
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+%
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash. -- rms.
+{
+ \catcode`\-=\active \catcode`\_=\active
+ \catcode`\'=\active \catcode`\`=\active
+ \global\let'=\rq \global\let`=\lq % default definitions
+ %
+ \global\def\code{\begingroup
+ \setupmarkupstyle{code}%
+ % The following should really be moved into \setupmarkupstyle handlers.
+ \catcode\dashChar=\active \catcode\underChar=\active
+ \ifallowcodebreaks
+ \let-\codedash
+ \let_\codeunder
+ \else
+ \let-\normaldash
+ \let_\realunder
+ \fi
+ % Given -foo (with a single dash), we do not want to allow a break
+ % after the hyphen.
+ \global\let\codedashprev=\codedash
+ %
+ \codex
+ }
+ %
+ \gdef\codedash{\futurelet\next\codedashfinish}
+ \gdef\codedashfinish{%
+ \normaldash % always output the dash character itself.
+ %
+ % Now, output a discretionary to allow a line break, unless
+ % (a) the next character is a -, or
+ % (b) the preceding character is a -.
+ % E.g., given --posix, we do not want to allow a break after either -.
+ % Given --foo-bar, we do want to allow a break between the - and the b.
+ \ifx\next\codedash \else
+ \ifx\codedashprev\codedash
+ \else \discretionary{}{}{}\fi
+ \fi
+ % we need the space after the = for the case when \next itself is a
+ % space token; it would get swallowed otherwise. As in @code{- a}.
+ \global\let\codedashprev= \next
+ }
+}
+\def\normaldash{-}
+%
+\def\codex #1{\tclose{#1}\endgroup}
+
+\def\codeunder{%
+ % this is all so @math{@code{var_name}+1} can work. In math mode, _
+ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+ % will therefore expand the active definition of _, which is us
+ % (inside @code that is), therefore an endless loop.
+ \ifusingtt{\ifmmode
+ \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+ \else\normalunderscore \fi
+ \discretionary{}{}{}}%
+ {\_}%
+}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__. This is bad.
+% @allowcodebreaks provides a document-level way to turn breaking at -
+% and _ on and off.
+%
+\newif\ifallowcodebreaks \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+ \def\txiarg{#1}%
+ \ifx\txiarg\keywordtrue
+ \allowcodebreakstrue
+ \else\ifx\txiarg\keywordfalse
+ \allowcodebreaksfalse
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%
+ \fi\fi
+}
+
+% For @command, @env, @file, @option quotes seem unnecessary,
+% so use \code rather than \samp.
+\let\command=\code
+\let\env=\code
+\let\file=\code
+\let\option=\code
+
+% @uref (abbreviation for `urlref') aka @url takes an optional
+% (comma-separated) second argument specifying the text to display and
+% an optional third arg as text to display instead of (rather than in
+% addition to) the url itself. First (mandatory) arg is the url.
+
+% TeX-only option to allow changing PDF output to show only the second
+% arg (if given), and not the url (which is then just the link target).
+\newif\ifurefurlonlylink
+
+% The main macro is \urefbreak, which allows breaking at expected
+% places within the url. (There used to be another version, which
+% didn't support automatic breaking.)
+\def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
+\let\uref=\urefbreak
+%
+\def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
+\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}% look for second arg
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \ifurefurlonlylink
+ % PDF plus option to not display url, show just arg
+ \unhbox0
+ \else
+ % PDF, normally display both arg and url for consistency,
+ % visibility, if the pdf is eventually used to print, etc.
+ \unhbox0\ (\urefcode{#1})%
+ \fi
+ \else
+ \unhbox0\ (\urefcode{#1})% DVI, always show arg and url
+ \fi
+ \else
+ \urefcode{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% Allow line breaks around only a few characters (only).
+\def\urefcatcodes{%
+ \catcode\ampChar=\active \catcode\dotChar=\active
+ \catcode\hashChar=\active \catcode\questChar=\active
+ \catcode\slashChar=\active
+}
+{
+ \urefcatcodes
+ %
+ \global\def\urefcode{\begingroup
+ \setupmarkupstyle{code}%
+ \urefcatcodes
+ \let&\urefcodeamp
+ \let.\urefcodedot
+ \let#\urefcodehash
+ \let?\urefcodequest
+ \let/\urefcodeslash
+ \codex
+ }
+ %
+ % By default, they are just regular characters.
+ \global\def&{\normalamp}
+ \global\def.{\normaldot}
+ \global\def#{\normalhash}
+ \global\def?{\normalquest}
+ \global\def/{\normalslash}
+}
+
+% we put a little stretch before and after the breakable chars, to help
+% line breaking of long url's. The unequal skips make look better in
+% cmtt at least, especially for dots.
+\def\urefprestretchamount{.13em}
+\def\urefpoststretchamount{.1em}
+\def\urefprestretch{\urefprebreak \hskip0pt plus\urefprestretchamount\relax}
+\def\urefpoststretch{\urefpostbreak \hskip0pt plus\urefprestretchamount\relax}
+%
+\def\urefcodeamp{\urefprestretch \&\urefpoststretch}
+\def\urefcodedot{\urefprestretch .\urefpoststretch}
+\def\urefcodehash{\urefprestretch \#\urefpoststretch}
+\def\urefcodequest{\urefprestretch ?\urefpoststretch}
+\def\urefcodeslash{\futurelet\next\urefcodeslashfinish}
+{
+ \catcode`\/=\active
+ \global\def\urefcodeslashfinish{%
+ \urefprestretch \slashChar
+ % Allow line break only after the final / in a sequence of
+ % slashes, to avoid line break between the slashes in http://.
+ \ifx\next/\else \urefpoststretch \fi
+ }
+}
+
+% One more complication: by default we'll break after the special
+% characters, but some people like to break before the special chars, so
+% allow that. Also allow no breaking at all, for manual control.
+%
+\parseargdef\urefbreakstyle{%
+ \def\txiarg{#1}%
+ \ifx\txiarg\wordnone
+ \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}
+ \else\ifx\txiarg\wordbefore
+ \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak}
+ \else\ifx\txiarg\wordafter
+ \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak}
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @urefbreakstyle setting `\txiarg'}%
+ \fi\fi\fi
+}
+\def\wordafter{after}
+\def\wordbefore{before}
+\def\wordnone{none}
+
+\urefbreakstyle after
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+ \def\txiarg{#1}%
+ \ifx\txiarg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\txiarg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\txiarg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @kbdinputstyle setting `\txiarg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct'.
+\kbdinputstyle distinct
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}}
+
+\def\xkey{\key}
+\def\kbdsub#1#2#3\par{%
+ \def\one{#1}\def\three{#3}\def\threex{??}%
+ \ifx\one\xkey\ifx\threex\three \key{#2}%
+ \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+ \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+}
+
+% definition of @key that produces a lozenge. Doesn't adjust to text size.
+%\setfont\keyrm\rmshape{8}{1000}{OT1}
+%\font\keysy=cmsy9
+%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+% \vbox{\hrule\kern-0.4pt
+% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+% \kern-0.4pt\hrule}%
+% \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+
+% definition of @key with no lozenge. If the current font is already
+% monospace, don't change it; that way, we respect @kbdinputstyle. But
+% if it isn't monospace, then use \tt.
+%
+\def\key#1{{\setupmarkupstyle{key}%
+ \nohyphenation
+ \ifmonospace\else\tt\fi
+ #1}\null}
+
+% @clicksequence{File @click{} Open ...}
+\def\clicksequence#1{\begingroup #1\endgroup}
+
+% @clickstyle @arrow (by default)
+\parseargdef\clickstyle{\def\click{#1}}
+\def\click{\arrow}
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+%
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+ {\selectfonts\lsize #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+ \null % reset \spacefactor=1000
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+%
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+ {\plainfrenchspacing #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+ \null % reset \spacefactor=1000
+}
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+ \catcode`\_ = \active
+ \gdef\mathunderscore{%
+ \catcode`\_=\active
+ \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+ }
+}
+% Another complication: we want \\ (and @\) to output a math (or tt) \.
+% FYI, plain.tex uses \\ as a temporary control sequence (for no
+% particular reason), but this is not advertised and we don't care.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \tex
+ \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ % make the texinfo accent commands work in math mode
+ \let\"=\ddot
+ \let\'=\acute
+ \let\==\bar
+ \let\^=\hat
+ \let\`=\grave
+ \let\u=\breve
+ \let\v=\check
+ \let\~=\tilde
+ \let\dotaccent=\dot
+ % have to provide another name for sup operator
+ \let\mathopsup=\sup
+ $\finishmath
+}
+\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+ \catcode`^ = \active
+ \catcode`< = \active
+ \catcode`> = \active
+ \catcode`+ = \active
+ \catcode`' = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ \let' = \ptexquoteright
+ }
+}
+
+% for @sub and @sup, if in math mode, just do a normal sub/superscript.
+% If in text, use math to place as sub/superscript, but switch
+% into text mode, with smaller fonts. This is a different font than the
+% one used for real math sub/superscripts (8pt vs. 7pt), but let's not
+% fix it (significant additions to font machinery) until someone notices.
+%
+\def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi}
+\def\finishsub#1{$\sb{\hbox{\selectfonts\lllsize #1}}$}%
+%
+\def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}
+\def\finishsup#1{$\ptexsp{\hbox{\selectfonts\lllsize #1}}$}%
+
+% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
+% Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
+% except specified as a normal braced arg, so no newlines to worry about.
+%
+\def\outfmtnametex{tex}
+%
+\long\def\inlinefmt#1{\doinlinefmt #1,\finish}
+\long\def\doinlinefmt#1,#2,\finish{%
+ \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
+% ignored. But this isn't important because if people want a literal
+% *right* brace they would have to use a command anyway, so they may as
+% well use a command to get a left brace too. We could re-use the
+% delimiter character idea from \verb, but it seems like overkill.
+%
+\long\def\inlineraw{\tex \doinlineraw}
+\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish}
+\def\doinlinerawtwo#1,#2,\finish{%
+ \def\inlinerawname{#1}%
+ \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi
+ \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.
+
+% @@ prints an @, as does @atchar{}.
+\def\@{\char64 }
+\let\atchar=\@
+
+% @{ @} @lbracechar{} @rbracechar{} all generate brace characters.
+% Unless we're in typewriter, use \ecfont because the CM text fonts do
+% not have braces, and we don't want to switch into math.
+\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}}
+\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}}
+\let\{=\mylbrace \let\lbracechar=\{
+\let\}=\myrbrace \let\rbracechar=\}
+\begingroup
+ % Definitions to produce \{ and \} commands for indices,
+ % and @{ and @} for the aux/toc files.
+ \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\! = 0 \catcode`\\ = \other
+ !gdef!lbracecmd[\{]%
+ !gdef!rbracecmd[\}]%
+ !gdef!lbraceatcmd[@{]%
+ !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \ptexc
+\let\dotaccent = \ptexdot
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \ptext
+\let\ubaraccent = \ptexb
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
+ \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence. (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo. Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+ L\kern-.36em
+ {\setbox0=\hbox{T}%
+ \vbox to \ht0{\hbox{%
+ \ifx\textnominalsize\xwordpt
+ % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX.
+ % Revert to plain's \scriptsize, which is 7pt.
+ \count255=\the\fam $\fam\count255 \scriptstyle A$%
+ \else
+ % For 11pt, we can use our lllsize.
+ \selectfonts\lllsize A%
+ \fi
+ }%
+ \vss
+ }}%
+ \kern-.15em
+ \TeX
+}
+
+% Some math mode symbols. Define \ensuremath to switch into math mode
+% unless we are already there. Expansion tricks may not be needed here,
+% but safer, and can't hurt.
+\def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi}
+\def\ensuredmath#1{$\relax#1$}
+%
+\def\bullet{\ensuremath\ptexbullet}
+\def\geq{\ensuremath\ge}
+\def\leq{\ensuremath\le}
+\def\minus{\ensuremath-}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in the cm
+% typewriter fonts as three actual period characters; on the other hand,
+% in other typewriter fonts three periods are wider than 1.5em. So do
+% whichever is larger.
+%
+\def\dots{%
+ \leavevmode
+ \setbox0=\hbox{...}% get width of three periods
+ \ifdim\wd0 > 1.5em
+ \dimen0 = \wd0
+ \else
+ \dimen0 = 1.5em
+ \fi
+ \hbox to \dimen0{%
+ \hskip 0pt plus.25fil
+ .\hskip 0pt plus1fil
+ .\hskip 0pt plus1fil
+ .\hskip 0pt plus.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \dots
+ \spacefactor=\endofsentencespacefactor
+}
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, they should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
+\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{%
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+%
+% Although only regular is the truly official Euro symbol, we ignore
+% that. The Euro is designed to be slightly taller than the regular
+% font height.
+%
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+%
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+%
+% Also doesn't work in math. Do we need to do math with euro symbols?
+% Hope not.
+%
+%
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+ % We set the font at each command, rather than predefining it in
+ % \textfonts and the other font-switching commands, so that
+ % installations which never need the symbol don't have to have the
+ % font installed.
+ %
+ % There is only one designed size (nominal 10pt), so we always scale
+ % that to the current nominal size.
+ %
+ % By the way, simply using "at 1em" works for cmr10 and the like, but
+ % does not work for cmbx10 and other extended/shrunken fonts.
+ %
+ \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+ %
+ \ifx\curfontstyle\bfstylename
+ % bold:
+ \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+ \else
+ % regular:
+ \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+ \fi
+ \thiseurofont
+}
+
+% Glyphs from the EC fonts. We don't use \let for the aliases, because
+% sometimes we redefine the original macro, and the alias should reflect
+% the redefinition.
+%
+% Use LaTeX names for the Icelandic letters.
+\def\DH{{\ecfont \char"D0}} % Eth
+\def\dh{{\ecfont \char"F0}} % eth
+\def\TH{{\ecfont \char"DE}} % Thorn
+\def\th{{\ecfont \char"FE}} % thorn
+%
+\def\guillemetleft{{\ecfont \char"13}}
+\def\guillemotleft{\guillemetleft}
+\def\guillemetright{{\ecfont \char"14}}
+\def\guillemotright{\guillemetright}
+\def\guilsinglleft{{\ecfont \char"0E}}
+\def\guilsinglright{{\ecfont \char"0F}}
+\def\quotedblbase{{\ecfont \char"12}}
+\def\quotesinglbase{{\ecfont \char"0D}}
+%
+% This positioning is not perfect (see the ogonek LaTeX package), but
+% we have the precomposed glyphs for the most common cases. We put the
+% tests to use those glyphs in the single \ogonek macro so we have fewer
+% dummy definitions to worry about for index entries, etc.
+%
+% ogonek is also used with other letters in Lithuanian (IOU), but using
+% the precomposed glyphs for those is not so easy since they aren't in
+% the same EC font.
+\def\ogonek#1{{%
+ \def\temp{#1}%
+ \ifx\temp\macrocharA\Aogonek
+ \else\ifx\temp\macrochara\aogonek
+ \else\ifx\temp\macrocharE\Eogonek
+ \else\ifx\temp\macrochare\eogonek
+ \else
+ \ecfont \setbox0=\hbox{#1}%
+ \ifdim\ht0=1ex\accent"0C #1%
+ \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
+ \fi
+ \fi\fi\fi\fi
+ }%
+}
+\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
+\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
+\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
+\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
+%
+% Use the European Computer Modern fonts (cm-super in outline format)
+% for non-CM glyphs. That is ec* for regular text and tc* for the text
+% companion symbols (LaTeX TS1 encoding). Both are part of the ec
+% package and follow the same conventions.
+%
+\def\ecfont{\etcfont{e}}
+\def\tcfont{\etcfont{t}}
+%
+\def\etcfont#1{%
+ % We can't distinguish serif/sans and italic/slanted, but this
+ % is used for crude hacks anyway (like adding French and German
+ % quotes to documents typeset with CM, where we lose kerning), so
+ % hopefully nobody will notice/care.
+ \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
+ \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
+ \ifmonospace
+ % typewriter:
+ \font\thisecfont = #1ctt\ecsize \space at \nominalsize
+ \else
+ \ifx\curfontstyle\bfstylename
+ % bold:
+ \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize
+ \else
+ % regular:
+ \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize
+ \fi
+ \fi
+ \thisecfont
+}
+
+% @registeredsymbol - R in a circle. The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+ $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+ \hfil\crcr\Orb}}%
+ }$%
+}
+
+% @textdegree - the normal degrees sign.
+%
+\def\textdegree{$^\circ$}
+
+% Laurent Siebenmann reports \Orb undefined with:
+% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38
+% so we'll define it if necessary.
+%
+\ifx\Orb\thisisundefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+% Quotes.
+\chardef\quotedblleft="5C
+\chardef\quotedblright=`\"
+\chardef\quoteleft=`\`
+\chardef\quoteright=`\'
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{%
+ \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+ % Open one extra group, as we want to close it in the middle of \Etitlepage.
+ \begingroup
+ \parindent=0pt \textfonts
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \let\page = \oldpage
+ \page
+ \null
+ }%
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+% Settings used for typesetting titles: no hyphenation, no indentation,
+% don't worry much about spacing, ragged right. This should be used
+% inside a \vbox, and fonts need to be set appropriately first. Because
+% it is always used for titles, nothing else, we call \rmisbold. \par
+% should be specified before the end of the \vbox, since a vbox is a group.
+%
+\def\raggedtitlesettings{%
+ \rmisbold
+ \hyphenpenalty=10000
+ \parindent=0pt
+ \tolerance=5000
+ \ptexraggedright
+}
+
+% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\parseargdef\title{%
+ \checkenv\titlepage
+ \vbox{\titlefonts \raggedtitlesettings #1\par}%
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+ \checkenv\titlepage
+ {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+ \def\temp{\quotation}%
+ \ifx\thisenv\temp
+ \def\quotationauthor{#1}% printed in \Equotation.
+ \else
+ \checkenv\titlepage
+ \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+ {\secfonts\rmisbold \leftline{#1}}%
+ \fi
+}
+
+
+% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make \makeheadline and \makefootline in Plain TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -12pt
+ \global\advance\vsize by -12pt
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+% @evenheadingmarks top \thischapter <- chapter at the top of a page
+% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page
+%
+% The same set of arguments for:
+%
+% @oddheadingmarks
+% @evenfootingmarks
+% @oddfootingmarks
+% @everyheadingmarks
+% @everyfootingmarks
+
+% These define \getoddheadingmarks, \getevenheadingmarks,
+% \getoddfootingmarks, and \getevenfootingmarks, each to one of
+% \gettopheadingmarks, \getbottomheadingmarks.
+%
+\def\evenheadingmarks{\headingmarks{even}{heading}}
+\def\oddheadingmarks{\headingmarks{odd}{heading}}
+\def\evenfootingmarks{\headingmarks{even}{footing}}
+\def\oddfootingmarks{\headingmarks{odd}{footing}}
+\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1}
+ \headingmarks{odd}{heading}{#1} }
+\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1}
+ \headingmarks{odd}{footing}{#1} }
+% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
+\def\headingmarks#1#2#3 {%
+ \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
+ \global\expandafter\let\csname get#1#2marks\endcsname \temp
+}
+
+\everyheadingmarks bottom
+\everyfootingmarks bottom
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\headingsoff{% non-global headings elimination
+ \evenheadline={\hfil}\evenfootline={\hfil}%
+ \oddheadline={\hfil}\oddfootline={\hfil}%
+}
+
+\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
+\HEADINGSoff % it's the default
+
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\thisisundefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemindicate{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil\relax
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. However, if
+ % what follows is an environment such as @example, there will be no
+ % \parskip glue; then the negative vskip we just inserted would
+ % cause the example and the item to crash together. So we use this
+ % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+ % \parskip glue after all. Section titles are handled this way also.
+ %
+ \penalty 10001
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+ \let\itemindex\gobble
+ \tablecheck{table}%
+}
+\envdef\ftable{%
+ \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+ \tablecheck{ftable}%
+}
+\envdef\vtable{%
+ \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+ \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+ \ifnum \the\catcode`\^^M=\active
+ \endgroup
+ \errmessage{This command won't work in this context; perhaps the problem is
+ that we are \inenvironment\thisenv}%
+ \def\next{\doignore{#1}}%
+ \else
+ \let\next\tablex
+ \fi
+ \next
+}
+\def\tablex#1{%
+ \def\itemindicate{#1}%
+ \parsearg\tabley
+}
+\def\tabley#1{%
+ {%
+ \makevalueexpandable
+ \edef\temp{\noexpand\tablez #1\space\space\space}%
+ \expandafter
+ }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+ \aboveenvbreak
+ \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+ \ifnum 0#2>0 \tableindent=#2\mil \fi
+ \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+ \itemmax=\tableindent
+ \advance \itemmax by -\itemmargin
+ \advance \leftskip by \tableindent
+ \exdentamount=\tableindent
+ \parindent = 0pt
+ \parskip = \smallskipamount
+ \ifdim \parskip=0pt \parskip=2pt \fi
+ \let\item = \internalBitem
+ \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+ \aboveenvbreak
+ \itemmax=\itemindent
+ \advance\itemmax by -\itemmargin
+ \advance\leftskip by \itemindent
+ \exdentamount=\itemindent
+ \parindent=0pt
+ \parskip=\smallskipamount
+ \ifdim\parskip=0pt \parskip=2pt \fi
+ %
+ % Try typesetting the item mark so that if the document erroneously says
+ % something like @itemize @samp (intending @table), there's an error
+ % right away at the @itemize. It's not the best error message in the
+ % world, but it's better than leaving it to the @item. This means if
+ % the user wants an empty mark, they have to say @w{} not just @w.
+ \def\itemcontents{#1}%
+ \setbox0 = \hbox{\itemcontents}%
+ %
+ % @itemize with no arg is equivalent to @itemize @bullet.
+ \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+ %
+ \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+ \advance\itemno by 1 % for enumerations
+ {\let\par=\endgraf \smallbreak}% reasonable place to break
+ {%
+ % If the document has an @itemize directly after a section title, a
+ % \nobreak will be last on the list, and \sectionheading will have
+ % done a \vskip-\parskip. In that case, we don't want to zero
+ % parskip, or the item text will crash with the heading. On the
+ % other hand, when there is normal text preceding the item (as there
+ % usually is), we do want to zero parskip, or there would be too much
+ % space. In that case, we won't have a \nobreak before. At least
+ % that's the theory.
+ \ifnum\lastpenalty<10000 \parskip=0in \fi
+ \noindent
+ \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+ %
+ \ifinner\else
+ \vadjust{\penalty 1200}% not good to break after first line of item.
+ \fi
+ % We can be in inner vertical mode in a footnote, although an
+ % @itemize looks awful there.
+ }%
+ \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1. We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+ % separator; typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold. Assignments
+% have to be global since we are inside the implicit group of an
+% alignment entry. \everycr below resets \everytab so we don't have to
+% undo it ourselves.
+\def\headitemfont{\b}% for people to use in the template row; not changeable
+\def\headitem{%
+ \checkenv\multitable
+ \crcr
+ \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings
+ \global\everytab={\bf}% can't use \headitemfont since the parsing differs
+ \the\everytab % for the first item
+}%
+%
+% default for tables with no headings.
+\let\headitemcrhook=\relax
+%
+% A \tab used to include \hskip1sp. But then the space in a template
+% line is not enough. That is bad. So let's go back to just `&' until
+% we again encounter the problem the 1sp was intended to solve.
+% --karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab % insert after every tab.
+%
+\envdef\multitable{%
+ \vskip\parskip
+ \startsavinginserts
+ %
+ % @item within a multitable starts a normal row.
+ % We use \def instead of \let so that if one of the multitable entries
+ % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+ % \endtemplate) expanding \doitemize.
+ \def\item{\crcr}%
+ %
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ %
+ \everycr = {%
+ \noalign{%
+ \global\everytab={}% Reset from possible headitem.
+ \global\colcount=0 % Reset the column counter.
+ %
+ % Check for saved footnotes, etc.:
+ \checkinserts
+ %
+ % Perhaps a \nobreak, then reset:
+ \headitemcrhook
+ \global\let\headitemcrhook=\relax
+ }%
+ }%
+ %
+ \parsearg\domultitable
+}
+\def\domultitable#1{%
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup &%
+ \global\advance\colcount by 1
+ \multistrut
+ \vtop{%
+ % Use the current \colcount to find the correct column width:
+ \hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively
+ % marking characters.
+ \noindent\ignorespaces##\unskip\multistrut
+ }\cr
+}
+\def\Emultitable{%
+ \crcr
+ \egroup % end the \halign
+ \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+ \def\multistrut{\strut}% just use the standard line spacing
+ %
+ % Compute \multitablelinespace (if not defined by user) for use in
+ % \multitableparskip calculation. We used define \multistrut based on
+ % this, but (ironically) that caused the spacing to be off.
+ % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+% Test to see if parskip is larger than space between lines of
+% table. If not, do nothing.
+% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
+ % than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
+ % than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed. They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested. But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+ \expandafter\let\csname #1\endcsname = \relax
+ \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+ % Scan in ``verbatim'' mode:
+ \obeylines
+ \catcode`\@ = \other
+ \catcode`\{ = \other
+ \catcode`\} = \other
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \spaceisspace
+ %
+ % Count number of #1's that we've seen.
+ \doignorecount = 0
+ %
+ % Swallow text until we reach the matching `@end #1'.
+ \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+ \obeylines %
+ %
+ \gdef\dodoignore#1{%
+ % #1 contains the command name as a string, e.g., `ifinfo'.
+ %
+ % Define a command to find the next `@end #1'.
+ \long\def\doignoretext##1^^M@end #1{%
+ \doignoretextyyy##1^^M@#1\_STOP_}%
+ %
+ % And this command to find another #1 command, at the beginning of a
+ % line. (Otherwise, we would consider a line `@c @ifset', for
+ % example, to count as an @ifset for nesting.)
+ \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+ %
+ % And now expand that command.
+ \doignoretext ^^M%
+ }%
+}
+
+\def\doignoreyyy#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty % Nothing found.
+ \let\next\doignoretextzzz
+ \else % Found a nested condition, ...
+ \advance\doignorecount by 1
+ \let\next\doignoretextyyy % ..., look for another.
+ % If we're here, #1 ends with ^^M\ifinfo (for example).
+ \fi
+ \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+ \ifnum\doignorecount = 0 % We have just found the outermost @end.
+ \let\next\enddoignore
+ \else % Still inside a nested condition.
+ \advance\doignorecount by -1
+ \let\next\doignoretext % Look for the next @end.
+ \fi
+ \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+ % Ignore anything after the last `@end #1'; this matters in verbatim
+ % environments, where otherwise the newline after an ignored conditional
+ % would result in a blank line in the output.
+ \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ {%
+ \makevalueexpandable
+ \def\temp{#2}%
+ \edef\next{\gdef\makecsname{SET#1}}%
+ \ifx\temp\empty
+ \next{}%
+ \else
+ \setzzz#2\endsetzzz
+ \fi
+ }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+ {%
+ \makevalueexpandable
+ \global\expandafter\let\csname SET#1\endcsname=\relax
+ }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+ \catcode`\-=\active \catcode`\_=\active
+ %
+ \gdef\makevalueexpandable{%
+ \let\value = \expandablevalue
+ % We don't want these characters active, ...
+ \catcode`\-=\other \catcode`\_=\other
+ % ..., but we might end up with active ones in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}, though.
+ % So \let them to their normal equivalents.
+ \let-\normaldash \let_\normalunderscore
+ }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file. This means that if the
+% 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'']}%
+ \message{Variable `#1', used in @value, is not set.}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get the special treatment we need for `@end ifset,' we call
+% \makecond and then redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+ {%
+ \makevalueexpandable
+ \let\next=\empty
+ \expandafter\ifx\csname SET#2\endcsname\relax
+ #1% If not set, redefine \next.
+ \fi
+ \expandafter
+ }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end executes the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written
+% without the @) is in fact defined. We can only feasibly check at the
+% TeX level, so something like `mathcode' is going to considered
+% defined even though it is not a Texinfo command.
+%
+\makecond{ifcommanddefined}
+\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}}
+%
+\def\doifcmddefined#1#2{{%
+ \makevalueexpandable
+ \let\next=\empty
+ \expandafter\ifx\csname #2\endcsname\relax
+ #1% If not defined, \let\next as above.
+ \fi
+ \expandafter
+ }\next
+}
+\def\ifcmddefinedfail{\doignore{ifcommanddefined}}
+
+% @ifcommandnotdefined CMD ... handled similar to @ifclear above.
+\makecond{ifcommandnotdefined}
+\def\ifcommandnotdefined{%
+ \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}}
+\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}}
+
+% Set the `txicommandconditionals' variable, so documents have a way to
+% test if the @ifcommand...defined conditionals are available.
+\set txicommandconditionals
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named IX.
+% It automatically defines \IXindex such that
+% \IXindex ...rest of line... puts an entry in the index IX.
+% It also defines \IXindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is IX.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \expandafter\chardef\csname#1indfile\endcsname=0
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \expandafter\chardef\csname#1indfile\endcsname=0
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+% The default indices:
+\newindex{cp}% concepts,
+\newcodeindex{fn}% functions,
+\newcodeindex{vr}% variables,
+\newcodeindex{tp}% types,
+\newcodeindex{ky}% keys
+\newcodeindex{pg}% and programs.
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \relax
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all index macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it the two-letter name of the index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx}
+\def\doindexxxx #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
+\def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}}
+
+% Used when writing an index entry out to an index file, to prevent
+% expansion of Texinfo commands that can appear in an index entry.
+%
+\def\indexdummies{%
+ \escapechar = `\\ % use backslash in output files.
+ \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+ \def\ {\realbackslash\space }%
+ %
+ % Need these unexpandable (because we define \tt as a dummy)
+ % definitions when @{ or @} appear in index entry text. Also, more
+ % complicated, when \tex is in effect and \{ is a \delimiter again.
+ % We can't use \lbracecmd and \rbracecmd because texindex assumes
+ % braces and backslashes are used only as delimiters. Perhaps we
+ % should use @lbracechar and @rbracechar?
+ \def\{{{\tt\char123}}%
+ \def\}{{\tt\char125}}%
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% For the aux and toc files, @ is the escape character. So we want to
+% redefine everything using @ as the escape character (instead of
+% \realbackslash, still used for index files). When everything uses @,
+% this will be simpler.
+%
+\def\atdummies{%
+ \def\@{@@}%
+ \def\ {@ }%
+ \let\{ = \lbraceatcmd
+ \let\} = \rbraceatcmd
+ %
+ % Do the redefinitions.
+ \commondummies
+ \otherbackslash
+}
+
+% Called from \indexdummies and \atdummies.
+%
+\def\commondummies{%
+ % \definedummyword defines \#1 as \string\#1\space, thus effectively
+ % preventing its expansion. This is used only for control words,
+ % not control letters, because the \space would be incorrect for
+ % control characters, but is needed to separate the control word
+ % from whatever follows.
+ %
+ % For control letters, we have \definedummyletter, which omits the
+ % space.
+ %
+ % These can be used both for control words that take an argument and
+ % those that do not. If it is followed by {arg} in the input, then
+ % that will dutifully get written to the index (or wherever).
+ %
+ \def\definedummyword ##1{\def##1{\string##1\space}}%
+ \def\definedummyletter##1{\def##1{\string##1}}%
+ \let\definedummyaccent\definedummyletter
+ %
+ \commondummiesnofonts
+ %
+ \definedummyletter\_%
+ \definedummyletter\-%
+ %
+ % Non-English letters.
+ \definedummyword\AA
+ \definedummyword\AE
+ \definedummyword\DH
+ \definedummyword\L
+ \definedummyword\O
+ \definedummyword\OE
+ \definedummyword\TH
+ \definedummyword\aa
+ \definedummyword\ae
+ \definedummyword\dh
+ \definedummyword\exclamdown
+ \definedummyword\l
+ \definedummyword\o
+ \definedummyword\oe
+ \definedummyword\ordf
+ \definedummyword\ordm
+ \definedummyword\questiondown
+ \definedummyword\ss
+ \definedummyword\th
+ %
+ % Although these internal commands shouldn't show up, sometimes they do.
+ \definedummyword\bf
+ \definedummyword\gtr
+ \definedummyword\hat
+ \definedummyword\less
+ \definedummyword\sf
+ \definedummyword\sl
+ \definedummyword\tclose
+ \definedummyword\tt
+ %
+ \definedummyword\LaTeX
+ \definedummyword\TeX
+ %
+ % Assorted special characters.
+ \definedummyword\arrow
+ \definedummyword\bullet
+ \definedummyword\comma
+ \definedummyword\copyright
+ \definedummyword\registeredsymbol
+ \definedummyword\dots
+ \definedummyword\enddots
+ \definedummyword\entrybreak
+ \definedummyword\equiv
+ \definedummyword\error
+ \definedummyword\euro
+ \definedummyword\expansion
+ \definedummyword\geq
+ \definedummyword\guillemetleft
+ \definedummyword\guillemetright
+ \definedummyword\guilsinglleft
+ \definedummyword\guilsinglright
+ \definedummyword\lbracechar
+ \definedummyword\leq
+ \definedummyword\mathopsup
+ \definedummyword\minus
+ \definedummyword\ogonek
+ \definedummyword\pounds
+ \definedummyword\point
+ \definedummyword\print
+ \definedummyword\quotedblbase
+ \definedummyword\quotedblleft
+ \definedummyword\quotedblright
+ \definedummyword\quoteleft
+ \definedummyword\quoteright
+ \definedummyword\quotesinglbase
+ \definedummyword\rbracechar
+ \definedummyword\result
+ \definedummyword\sub
+ \definedummyword\sup
+ \definedummyword\textdegree
+ %
+ % We want to disable all macros so that they are not expanded by \write.
+ \macrolist
+ %
+ \normalturnoffactive
+ %
+ % Handle some cases of @value -- where it does not contain any
+ % (non-fully-expandable) commands.
+ \makevalueexpandable
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+% Define \definedumyletter, \definedummyaccent and \definedummyword before
+% using.
+%
+\def\commondummiesnofonts{%
+ % Control letters and accents.
+ \definedummyletter\!%
+ \definedummyaccent\"%
+ \definedummyaccent\'%
+ \definedummyletter\*%
+ \definedummyaccent\,%
+ \definedummyletter\.%
+ \definedummyletter\/%
+ \definedummyletter\:%
+ \definedummyaccent\=%
+ \definedummyletter\?%
+ \definedummyaccent\^%
+ \definedummyaccent\`%
+ \definedummyaccent\~%
+ \definedummyword\u
+ \definedummyword\v
+ \definedummyword\H
+ \definedummyword\dotaccent
+ \definedummyword\ogonek
+ \definedummyword\ringaccent
+ \definedummyword\tieaccent
+ \definedummyword\ubaraccent
+ \definedummyword\udotaccent
+ \definedummyword\dotless
+ %
+ % Texinfo font commands.
+ \definedummyword\b
+ \definedummyword\i
+ \definedummyword\r
+ \definedummyword\sansserif
+ \definedummyword\sc
+ \definedummyword\slanted
+ \definedummyword\t
+ %
+ % Commands that take arguments.
+ \definedummyword\abbr
+ \definedummyword\acronym
+ \definedummyword\anchor
+ \definedummyword\cite
+ \definedummyword\code
+ \definedummyword\command
+ \definedummyword\dfn
+ \definedummyword\dmn
+ \definedummyword\email
+ \definedummyword\emph
+ \definedummyword\env
+ \definedummyword\file
+ \definedummyword\image
+ \definedummyword\indicateurl
+ \definedummyword\inforef
+ \definedummyword\kbd
+ \definedummyword\key
+ \definedummyword\math
+ \definedummyword\option
+ \definedummyword\pxref
+ \definedummyword\ref
+ \definedummyword\samp
+ \definedummyword\strong
+ \definedummyword\tie
+ \definedummyword\U
+ \definedummyword\uref
+ \definedummyword\url
+ \definedummyword\var
+ \definedummyword\verb
+ \definedummyword\w
+ \definedummyword\xref
+}
+
+% For testing: output @{ and @} in index sort strings as \{ and \}.
+\newif\ifusebracesinindexes
+
+\let\indexlbrace\relax
+\let\indexrbrace\relax
+
+{\catcode`\@=0
+\catcode`\\=13
+ @gdef@backslashdisappear{@def\{}}
+}
+
+{
+\catcode`\<=13
+\catcode`\-=13
+\catcode`\`=13
+ \gdef\indexnonalnumdisappear{%
+ \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else
+ % @set txiindexlquoteignore makes us ignore left quotes in the sort term.
+ % (Introduced for FSFS 2nd ed.)
+ \let`=\empty
+ \fi
+ %
+ \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else
+ \backslashdisappear
+ \fi
+ %
+ \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else
+ \def-{}%
+ \fi
+ \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else
+ \def<{}%
+ \fi
+ \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else
+ \def\@{}%
+ \fi
+ }
+
+ \gdef\indexnonalnumreappear{%
+ \useindexbackslash
+ \let-\normaldash
+ \let<\normalless
+ \def\@{@}%
+ }
+}
+
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names. It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+ % Accent commands should become @asis.
+ \def\definedummyaccent##1{\let##1\asis}%
+ % We can just ignore other control letters.
+ \def\definedummyletter##1{\let##1\empty}%
+ % All control words become @asis by default; overrides below.
+ \let\definedummyword\definedummyaccent
+ \commondummiesnofonts
+ %
+ % Don't no-op \tt, since it isn't a user-level command
+ % and is used in the definitions of the active chars like <, >, |, etc.
+ % Likewise with the other plain tex font commands.
+ %\let\tt=\asis
+ %
+ \def\ { }%
+ \def\@{@}%
+ \def\_{\normalunderscore}%
+ \def\-{}% @- shouldn't affect sorting
+ %
+ \def\lbracechar{{\indexlbrace}}%
+ \def\rbracechar{{\indexrbrace}}%
+ \let\{=\lbracechar
+ \let\}=\rbracechar
+ %
+ %
+ % Non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\DH{DZZ}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\TH{TH}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\dh{dzz}%
+ \def\exclamdown{!}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\ordf{a}%
+ \def\ordm{o}%
+ \def\o{o}%
+ \def\questiondown{?}%
+ \def\ss{ss}%
+ \def\th{th}%
+ %
+ \def\LaTeX{LaTeX}%
+ \def\TeX{TeX}%
+ %
+ % Assorted special characters.
+ % (The following {} will end up in the sort string, but that's ok.)
+ \def\arrow{->}%
+ \def\bullet{bullet}%
+ \def\comma{,}%
+ \def\copyright{copyright}%
+ \def\dots{...}%
+ \def\enddots{...}%
+ \def\equiv{==}%
+ \def\error{error}%
+ \def\euro{euro}%
+ \def\expansion{==>}%
+ \def\geq{>=}%
+ \def\guillemetleft{<<}%
+ \def\guillemetright{>>}%
+ \def\guilsinglleft{<}%
+ \def\guilsinglright{>}%
+ \def\leq{<=}%
+ \def\minus{-}%
+ \def\point{.}%
+ \def\pounds{pounds}%
+ \def\print{-|}%
+ \def\quotedblbase{"}%
+ \def\quotedblleft{"}%
+ \def\quotedblright{"}%
+ \def\quoteleft{`}%
+ \def\quoteright{'}%
+ \def\quotesinglbase{,}%
+ \def\registeredsymbol{R}%
+ \def\result{=>}%
+ \def\textdegree{o}%
+ %
+ % We need to get rid of all macros, leaving only the arguments (if present).
+ % Of course this is not nearly correct, but it is the best we can do for now.
+ % makeinfo does not expand macros in the argument to @deffn, which ends up
+ % writing an index entry, and texindex isn't prepared for an index sort entry
+ % that starts with \.
+ %
+ % Since macro invocations are followed by braces, we can just redefine them
+ % to take a single TeX argument. The case of a macro invocation that
+ % goes to end-of-line is not handled.
+ %
+ \macrolist
+}
+
+
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+% TODO: Two-level index? Operation index?
+
+% Workhorse for all indexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+ \iflinks
+ {%
+ \requireopenindexfile{#1}%
+ % Store the main index entry text (including the third arg).
+ \toks0 = {#2}%
+ % If third arg is present, precede it with a space.
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\empty \else
+ \toks0 = \expandafter{\the\toks0 \space #3}%
+ \fi
+ %
+ \edef\writeto{\csname#1indfile\endcsname}%
+ %
+ \safewhatsit\dosubindwrite
+ }%
+ \fi
+}
+
+% Check if an index file has been opened, and if not, open it.
+\def\requireopenindexfile#1{%
+\ifnum\csname #1indfile\endcsname=0
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \edef\suffix{#1}%
+ % A .fls suffix would conflict with the file extension for the output
+ % of -recorder, so use .f1s instead.
+ \ifx\suffix\indexisfl\def\suffix{f1}\fi
+ % Open the file
+ \immediate\openout\csname#1indfile\endcsname \jobname.\suffix
+ % Using \immediate here prevents an object entering into the current box,
+ % which could confound checks such as those in \safewhatsit for preceding
+ % skips.
+\fi}
+\def\indexisfl{fl}
+
+% Output \ as {\indexbackslash}, because \ is an escape character in
+% the index files.
+\let\indexbackslash=\relax
+{\catcode`\@=0 \catcode`\\=\active
+ @gdef@useindexbackslash{@def\{{@indexbackslash}}}
+}
+
+% Definition for writing index entry text.
+\def\sortas#1{\ignorespaces}%
+
+% Definition for writing index entry sort key. Should occur at the at
+% the beginning of the index entry, like
+% @cindex @sortas{september} \september
+% The \ignorespaces takes care of following space, but there's no way
+% to remove space before it.
+{
+\catcode`\-=13
+\gdef\indexwritesortas{%
+ \begingroup
+ \indexnonalnumreappear
+ \indexwritesortasxxx}
+\gdef\indexwritesortasxxx#1{%
+ \xdef\indexsortkey{#1}\endgroup}
+}
+
+
+% Write the entry in \toks0 to the index file.
+%
+\def\dosubindwrite{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+ \fi
+ %
+ % Remember, we are within a group.
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \useindexbackslash % \indexbackslash isn't defined now so it will be output
+ % as is; and it will print as backslash.
+ % Get the string to sort by, by processing the index entry with all
+ % font commands turned off.
+ {\indexnofonts
+ \indexnonalnumdisappear
+ \xdef\indexsortkey{}%
+ \let\sortas=\indexwritesortas
+ \edef\temp{\the\toks0}%
+ \setbox\dummybox = \hbox{\temp}% Make sure to execute any \sortas
+ \ifx\indexsortkey\empty
+ \xdef\indexsortkey{\temp}%
+ \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi
+ \fi
+ }%
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\writeto{%
+ \string\entry{\indexsortkey}{\noexpand\folio}{\the\toks0}}%
+ }%
+ \temp
+}
+\newbox\dummybox % used above
+
+% Take care of unwanted page breaks/skips around a whatsit:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again. Otherwise, the whatsit generated by the
+% \write or \pdfdest will make \lastskip zero. The result is that
+% sequences like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode. We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip. \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip. The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+\newskip\whatsitskip
+\newcount\whatsitpenalty
+%
+% ..., ready, GO:
+%
+\def\safewhatsit#1{\ifhmode
+ #1%
+ \else
+ % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+ \whatsitskip = \lastskip
+ \edef\lastskipmacro{\the\lastskip}%
+ \whatsitpenalty = \lastpenalty
+ %
+ % If \lastskip is nonzero, that means the last item was a
+ % skip. And since a skip is discardable, that means this
+ % -\whatsitskip glue we're inserting is preceded by a
+ % non-discardable item, therefore it is not a potential
+ % breakpoint, therefore no \nobreak needed.
+ \ifx\lastskipmacro\zeroskipmacro
+ \else
+ \vskip-\whatsitskip
+ \fi
+ %
+ #1%
+ %
+ \ifx\lastskipmacro\zeroskipmacro
+ % If \lastskip was zero, perhaps the last item was a penalty, and
+ % perhaps it was >=10000, e.g., a \nobreak. In that case, we want
+ % to re-insert the same penalty (values >10000 are used for various
+ % signals); since we just inserted a non-discardable item, any
+ % following glue (such as a \parskip) would be a breakpoint. For example:
+ % @deffn deffn-whatever
+ % @vindex index-whatever
+ % Description.
+ % would allow a break between the index-whatever whatsit
+ % and the "Description." paragraph.
+ \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
+ \else
+ % On the other hand, if we had a nonzero \lastskip,
+ % this make-up glue would be preceded by a non-discardable item
+ % (the whatsit from the \write), so we must insert a \nobreak.
+ \nobreak\vskip\whatsitskip
+ \fi
+\fi}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \plainfrenchspacing
+ \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ % See comment in \requireopenindexfile.
+ \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi
+ \openin 1 \jobname.\indexname s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ \catcode`\\ = 0
+ \escapechar = `\\
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \thisline
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\ttbackslash}%
+ \let\indexlbrace\{ % Likewise, set these sequences for braces
+ \let\indexrbrace\} % used in the sort key.
+ \begindoublecolumns
+ \let\entryorphanpenalty=\indexorphanpenalty
+ %
+ % Read input from the index file line by line.
+ \loopdo
+ \ifeof1
+ \let\firsttoken\relax
+ \else
+ \read 1 to \nextline
+ \edef\act{\gdef\noexpand\firsttoken{\getfirsttoken\nextline}}%
+ \act
+ \fi
+ \thisline
+ %
+ \ifeof1\else
+ \let\thisline\nextline
+ \repeat
+ %%
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+\def\getfirsttoken#1{\expandafter\getfirsttokenx#1\endfirsttoken}
+\long\def\getfirsttokenx#1#2\endfirsttoken{\noexpand#1}
+
+\def\loopdo#1\repeat{\def\body{#1}\loopdoxxx}
+\def\loopdoxxx{\let\next=\relax\body\let\next=\loopdoxxx\fi\next}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+{\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13
+\catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13
+\catcode`\$=3
+\gdef\initialglyphs{%
+ % Some changes for non-alphabetic characters. Using the glyphs from the
+ % math fonts looks more consistent than the typewriter font used elsewhere
+ % for these characters.
+ \def\indexbackslash{\math{\backslash}}%
+ \let\\=\indexbackslash
+ %
+ % Can't get bold backslash so don't use bold forward slash
+ \catcode`\/=13
+ \def/{{\secrmnotbold \normalslash}}%
+ \def-{{\normaldash\normaldash}}% en dash `--'
+ \def^{{\chapbf \normalcaret}}%
+ \def~{{\chapbf \normaltilde}}%
+ \def\_{%
+ \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }%
+ \def|{$\vert$}%
+ \def<{$\less$}%
+ \def>{$\gtr$}%
+ \def+{$\normalplus$}%
+}}
+
+\def\initial{%
+ \bgroup
+ \initialglyphs
+ \initialx
+}
+
+\def\initialx#1{%
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ % The glue before the bonus allows a little bit of space at the
+ % bottom of a column to reduce an increase in inter-line spacing.
+ \nobreak
+ \vskip 0pt plus 5\baselineskip
+ \penalty -300
+ \vskip 0pt plus -5\baselineskip
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus 1\baselineskip
+ \leftline{\secfonts \kern-0.05em \secbf #1}%
+ % \secfonts is inside the argument of \leftline so that the change of
+ % \baselineskip will not affect any glue inserted before the vbox that
+ % \leftline creates.
+ % Do our best not to break after the initial.
+ \nobreak
+ \vskip .33\baselineskip plus .1\baselineskip
+ \egroup % \initialglyphs
+}
+
+\newdimen\entryrightmargin
+\entryrightmargin=0pt
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin. It is used for index
+% and table of contents entries. The paragraph is indented by \leftskip.
+%
+\def\entry{%
+ \begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % When reading the text of entry, convert explicit line breaks
+ % from @* into spaces. The user might give these in long section
+ % titles, for instance.
+ \def\*{\unskip\space\ignorespaces}%
+ \def\entrybreak{\hfil\break}% An undocumented command
+ %
+ % A bit of stretch before each entry for the benefit of balancing
+ % columns.
+ \vskip 0pt plus0.5pt
+ %
+ % Swallow the left brace of the text (first parameter):
+ \afterassignment\doentry
+ \let\temp =
+}
+\def\entrybreak{\unskip\space\ignorespaces}%
+\def\doentry{%
+ % Save the text of the entry
+ \global\setbox\boxA=\hbox\bgroup
+ \bgroup % Instead of the swallowed brace.
+ \noindent
+ \aftergroup\finishentry
+ % And now comes the text of the entry.
+ % Not absorbing as a macro argument reduces the chance of problems
+ % with catcodes occurring.
+}
+{\catcode`\@=11
+\gdef\finishentry#1{%
+ \egroup % end box A
+ \dimen@ = \wd\boxA % Length of text of entry
+ \global\setbox\boxA=\hbox\bgroup\unhbox\boxA
+ % #1 is the page number.
+ %
+ % Get the width of the page numbers, and only use
+ % leaders if they are present.
+ \global\setbox\boxB = \hbox{#1}%
+ \ifdim\wd\boxB = 0pt
+ \null\nobreak\hfill\ %
+ \else
+ %
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ \ifpdf
+ \pdfgettoks#1.%
+ \hskip\skip\thinshrinkable\the\toksA
+ \else
+ \hskip\skip\thinshrinkable #1%
+ \fi
+ \fi
+ \egroup % end \boxA
+ \ifdim\wd\boxB = 0pt
+ \global\setbox\entryindexbox=\box\boxA
+ \else
+ \global\setbox\entryindexbox=\vbox\bgroup\noindent
+ % We want the text of the entries to be aligned to the left, and the
+ % page numbers to be aligned to the right.
+ %
+ \advance\leftskip by 0pt plus 1fil
+ \advance\leftskip by 0pt plus -1fill
+ \rightskip = 0pt plus -1fil
+ \advance\rightskip by 0pt plus 1fill
+ % Cause last line, which could consist of page numbers on their own
+ % if the list of page numbers is long, to be aligned to the right.
+ \parfillskip=0pt plus -1fill
+ %
+ \hangindent=1em
+ %
+ \advance\rightskip by \entryrightmargin
+ % Determine how far we can stretch into the margin.
+ % This allows, e.g., "Appendix H GNU Free Documentation License" to
+ % fit on one line in @letterpaper format.
+ \ifdim\entryrightmargin>2.1em
+ \dimen@i=2.1em
+ \else
+ \dimen@i=0em
+ \fi
+ \advance \parfillskip by 0pt minus 1\dimen@i
+ %
+ \dimen@ii = \hsize
+ \advance\dimen@ii by -1\leftskip
+ \advance\dimen@ii by -1\entryrightmargin
+ \advance\dimen@ii by 1\dimen@i
+ \let\maybestrut=\relax
+ \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line
+ \let\maybestrut=\strut
+ \ifdim\dimen@ > 0.8\dimen@ii % due to long index text
+ \dimen@ = 0.7\dimen@ % Try to split the text roughly evenly
+ \dimen@ii = \hsize
+ \advance \dimen@ii by -1em
+ \ifnum\dimen@>\dimen@ii
+ % If the entry is too long, use the whole line
+ \dimen@ = \dimen@ii
+ \fi
+ \advance\leftskip by 0pt plus 1fill % ragged right
+ \advance \dimen@ by 1\rightskip
+ \parshape = 2 0pt \dimen@ 1em \dimen@ii
+ % Ideally we'd add a finite glue at the end of the first line only, but
+ % TeX doesn't seem to provide a way to do such a thing.
+ \fi\fi
+ \maybestrut % Add a strut on the first and last lines
+ \unhbox\boxA
+ \maybestrut
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % Word spacing - no stretch
+ \spaceskip=\fontdimen2\font minus \fontdimen4\font
+ %
+ \linepenalty=1000 % Discourage line breaks.
+ \hyphenpenalty=5000 % Discourage hyphenation.
+ %
+ \par % format the paragraph
+ \egroup % The \vbox
+ \fi
+ \endgroup
+ % delay text of entry until after penalty
+ \bgroup\aftergroup\insertindexentrybox
+ \entryorphanpenalty
+}}
+
+\newskip\thinshrinkable
+\skip\thinshrinkable=.15em minus .15em
+
+\newbox\entryindexbox
+\def\insertindexentrybox{%
+\lineskip=0pt % This comes into effect when the \vbox has a large
+ % height due to the paragraph in it having several
+ % lines.
+\box\entryindexbox}
+
+% Default is no penalty
+\let\entryorphanpenalty\egroup
+
+% Used from \printindex. \firsttoken should be the first token
+% after the \entry. If it's not another \entry, we are at the last
+% line of a group of index entries, so insert a penalty to discourage
+% orphaned index entries.
+\long\def\indexorphanpenalty{%
+ \def\isentry{\entry}%
+ \ifx\firsttoken\isentry
+ \else
+ \unskip\penalty 9000
+ % The \unskip here stops breaking before the glue. It relies on the
+ % \vskip above being there, otherwise there is an error
+ % "You can't use `\unskip' in vertical mode". There has to be glue
+ % in the current vertical list that hasn't been added to the
+ % "current page". See Chapter 24 of the TeXbook. This contradicts
+ % Section 8.3.7 in "TeX by Topic," though.
+ \fi
+ \egroup % now comes the box added with \aftergroup
+}
+
+% Like plain.tex's \dotfill, except uses up at least 1 em.
+% The filll stretch here overpowers both the fil and fill stretch to push
+% the page number to the right.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll}
+
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+\newdimen\doublecolumntopgap
+\doublecolumntopgap = 0pt
+
+\newtoks\savedtopmark % Used in \begindoublecolumns
+\newtoks\savedfirstmark
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ % Save \topmark and \firstmark
+ \global\savedtopmark=\expandafter{\topmark}%
+ \global\savedfirstmark=\expandafter{\firstmark}%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % We recover the two marks that the last output routine saved in order
+ % to propagate the information in marks added around a chapter heading,
+ % which could be otherwise be lost by the time the final page is output.
+ %
+ \mark{\the\savedtopmark}% Only mark in page passed to following \output.
+ \output = {%
+ \setbox0=\box\PAGE % clear box 255
+ }abc\eject
+ %
+ \mark{\the\savedfirstmark}%
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \global\doublecolumntopgap = \topskip
+ \global\advance\doublecolumntopgap by -1\baselineskip
+ \global\advance\vsize by -1\doublecolumntopgap
+ \vsize = 2\vsize
+ \topskip=0pt
+}
+
+% The double-column output routine for all double-column pages except
+% the last, which is done by \balancecolumns.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \vbox{%
+ \vskip\doublecolumntopgap
+ \hbox to\pagewidth{\box0\hfil\box2}}%
+}
+
+
+% Finished with with double columns.
+\def\enddoublecolumns{%
+ % The following penalty ensures that the page builder is exercised
+ % _before_ we change the output routine. This is necessary in the
+ % following situation:
+ %
+ % The last section of the index consists only of a single entry.
+ % Before this section, \pagetotal is less than \pagegoal, so no
+ % break occurs before the last section starts. However, the last
+ % section, consisting of \initial and the single \entry, does not
+ % fit on the page and has to be broken off. Without the following
+ % penalty the page builder will not be exercised until \eject
+ % below, and by that time we'll already have changed the output
+ % routine to the \balancecolumns version, so the next-to-last
+ % double-column page will be processed with \balancecolumns, which
+ % is wrong: The two columns will go to the main vertical list, with
+ % the broken-off section in the recent contributions. As soon as
+ % the output routine finishes, TeX starts reconsidering the page
+ % break. The two columns and the broken-off section both fit on the
+ % page, because the two columns now take up only half of the page
+ % goal. When TeX sees \eject from below which follows the final
+ % section, it invokes the new output routine that we've set after
+ % \balancecolumns below; \onepageout will try to fit the two columns
+ % and the final section into the vbox of \pageheight (see
+ % \pagebody), causing an overfull box.
+ %
+ % Note that glue won't work here, because glue does not exercise the
+ % page builder, unlike penalties (see The TeXbook, pp. 280-281).
+ \penalty0
+ %
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Only called for the last of the double column material. \doublecolumnout
+% does the others.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \ifdim\dimen@<14\baselineskip
+ % Don't split a short final column in two.
+ \setbox2=\vbox{}%
+ \else
+ \divide\dimen@ by 2 % target to split to
+ \dimen@ii = \dimen@
+ \splittopskip = \topskip
+ % Loop until the second column is no higher than the first
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ % Remove glue from bottom of first column to
+ % make sure it is higher than the second.
+ \global\setbox1 = \vbox{\unvbox1\unpenalty\unskip}%
+ \ifdim\ht3>\ht1
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ \multiply\dimen@ii by 4
+ \divide\dimen@ii by 5
+ \ifdim\ht3<\dimen@ii
+ % Column heights are too different, so don't make their bottoms
+ % flush with each other. The glue at the end of the second column
+ % allows a second column to stretch, reducing the difference in
+ % height between the two.
+ \setbox0=\vbox to\dimen@{\unvbox1\vfill}%
+ \setbox2=\vbox to\dimen@{\unvbox3\vskip 0pt plus 0.3\ht0}%
+ \else
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ \fi
+ \fi
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% Let's start with @part.
+\outer\parseargdef\part{\partzzz{#1}}
+\def\partzzz#1{%
+ \chapoddpage
+ \null
+ \vskip.3\vsize % move it down on the page a bit
+ \begingroup
+ \noindent \titlefonts\rmisbold #1\par % the text
+ \let\lastnode=\empty % no node to associate with
+ \writetocentry{part}{#1}{}% but put it in the toc
+ \headingsoff % no headline or footline on the part page
+ % This outputs a mark at the end of the page that clears \thischapter
+ % and \thissection, as is done in \startcontents.
+ \let\pchapsepmacro\relax
+ \chapmacro{}{Yomitfromtoc}{}%
+ \chapoddpage
+ \endgroup
+}
+
+% \unnumberedno is an oxymoron. But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number". We avoid collisions with chapter
+% numbers by starting them at 10000. (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines these (using marks) as the number+name, number
+% and name of the chapter. Page headings and footings can use
+% these. @section does likewise.
+\def\thischapter{}
+\def\thischapternum{}
+\def\thischaptername{}
+\def\thissection{}
+\def\thissectionnum{}
+\def\thissectionname{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achieve this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unnlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+ % Compute the abs. sec. level:
+ \absseclevel=#2
+ \advance\absseclevel by \secbase
+ % Make sure \absseclevel doesn't fall outside the range:
+ \ifnum \absseclevel < 0
+ \absseclevel = 0
+ \else
+ \ifnum \absseclevel > 3
+ \absseclevel = 3
+ \fi
+ \fi
+ % The heading type:
+ \def\headtype{#1}%
+ \if \headtype U%
+ \ifnum \absseclevel < \unnlevel
+ \chardef\unnlevel = \absseclevel
+ \fi
+ \else
+ % Check for appendix sections:
+ \ifnum \absseclevel = 0
+ \edef\chapheadtype{\headtype}%
+ \else
+ \if \headtype A\if \chapheadtype N%
+ \errmessage{@appendix... within a non-appendix chapter}%
+ \fi\fi
+ \fi
+ % Check for numbered within unnumbered:
+ \ifnum \absseclevel > \unnlevel
+ \def\headtype{U}%
+ \else
+ \chardef\unnlevel = 3
+ \fi
+ \fi
+ % Now print the heading:
+ \if \headtype U%
+ \ifcase\absseclevel
+ \unnumberedzzz{#3}%
+ \or \unnumberedseczzz{#3}%
+ \or \unnumberedsubseczzz{#3}%
+ \or \unnumberedsubsubseczzz{#3}%
+ \fi
+ \else
+ \if \headtype A%
+ \ifcase\absseclevel
+ \appendixzzz{#3}%
+ \or \appendixsectionzzz{#3}%
+ \or \appendixsubseczzz{#3}%
+ \or \appendixsubsubseczzz{#3}%
+ \fi
+ \else
+ \ifcase\absseclevel
+ \chapterzzz{#3}%
+ \or \seczzz{#3}%
+ \or \numberedsubseczzz{#3}%
+ \or \numberedsubsubseczzz{#3}%
+ \fi
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered. Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v. By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+ % section resetting is \global in case the chapter is in a group, such
+ % as an @include file.
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\chapno by 1
+ %
+ % Used for \float.
+ \gdef\chaplevelprefix{\the\chapno.}%
+ \resetallfloatnos
+ %
+ % \putwordChapter can contain complex things in translations.
+ \toks0=\expandafter{\putwordChapter}%
+ \message{\the\toks0 \space \the\chapno}%
+ %
+ % Write the actual heading.
+ \chapmacro{#1}{Ynumbered}{\the\chapno}%
+ %
+ % So @section and the like are numbered underneath this chapter.
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz
+%
+\def\appendixzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\appendixno by 1
+ \gdef\chaplevelprefix{\appendixletter.}%
+ \resetallfloatnos
+ %
+ % \putwordAppendix can contain complex things in translations.
+ \toks0=\expandafter{\putwordAppendix}%
+ \message{\the\toks0 \space \appendixletter}%
+ %
+ \chapmacro{#1}{Yappendix}{\appendixletter}%
+ %
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+% normally unnmhead0 calls unnumberedzzz:
+\outer\parseargdef\unnumbered{\unnmhead0{#1}}
+\def\unnumberedzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\unnumberedno by 1
+ %
+ % Since an unnumbered has no number, no prefix for figures.
+ \global\let\chaplevelprefix = \empty
+ \resetallfloatnos
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+ % argument to \message. Therefore, if #1 contained @-commands, TeX
+ % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+ % expanded @cite (which turns out to cause errors because \cite is meant
+ % to be executed, not expanded).
+ %
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+ % simply yielding the contents of <toks register>. (We also do this for
+ % the toc entries.)
+ \toks0 = {#1}%
+ \message{(\the\toks0)}%
+ %
+ \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+ %
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+ \let\centerparametersmaybe = \centerparameters
+ \unnmhead0{#1}%
+ \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+%
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+% normally calls appendixsectionzzz:
+\outer\parseargdef\appendixsection{\apphead1{#1}}
+\def\appendixsectionzzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+% normally calls unnumberedseczzz:
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}}
+\def\unnumberedseczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+%
+% normally calls numberedsubseczzz:
+\outer\parseargdef\numberedsubsec{\numhead2{#1}}
+\def\numberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+% normally calls appendixsubseczzz:
+\outer\parseargdef\appendixsubsec{\apphead2{#1}}
+\def\appendixsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+% normally calls unnumberedsubseczzz:
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}
+\def\unnumberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+%
+% normally numberedsubsubseczzz:
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}}
+\def\numberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynumbered}%
+ {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% normally appendixsubsubseczzz:
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}}
+\def\appendixsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% normally unnumberedsubsubseczzz:
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}
+\def\unnumberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+\def\majorheading{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+ \vbox{\chapfonts \raggedtitlesettings #1\par}%
+ \nobreak\bigskip \nobreak
+ \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+% Parameter controlling skip before chapter headings (if needed)
+\newskip\chapheadingskip
+
+% Define plain chapter starts, and page on/off switching for it.
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+
+% Start a new page
+\def\chappager{\par\vfill\supereject}
+
+% \chapoddpage - start on an odd page for a new chapter
+% Because \domark is called before \chapoddpage, the filler page will
+% get the headings for the next chapter, which is wrong. But we don't
+% care -- we just disable all headings on the filler page.
+\def\chapoddpage{%
+ \chappager
+ \ifodd\pageno \else
+ \begingroup
+ \headingsoff
+ \null
+ \chappager
+ \endgroup
+ \fi
+}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% \chapmacro - Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+% Not used for @heading series.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yappendixkeyword{Yappendix}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+%
+\def\chapmacro#1#2#3{%
+ \checkenv{}% chapters, etc., should not start inside an environment.
+ %
+ % Insert the first mark before the heading break (see notes for \domark).
+ \let\prevchapterdefs=\lastchapterdefs
+ \let\prevsectiondefs=\lastsectiondefs
+ \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
+ \gdef\thissection{}}%
+ %
+ \def\temptype{#2}%
+ \ifx\temptype\Ynothingkeyword
+ \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+ \gdef\thischapter{\thischaptername}}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+ \gdef\thischapter{}}%
+ \else\ifx\temptype\Yappendixkeyword
+ \toks0={#1}%
+ \xdef\lastchapterdefs{%
+ \gdef\noexpand\thischaptername{\the\toks0}%
+ \gdef\noexpand\thischapternum{\appendixletter}%
+ % \noexpand\putwordAppendix avoids expanding indigestible
+ % commands in some of the translations.
+ \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
+ \noexpand\thischapternum:
+ \noexpand\thischaptername}%
+ }%
+ \else
+ \toks0={#1}%
+ \xdef\lastchapterdefs{%
+ \gdef\noexpand\thischaptername{\the\toks0}%
+ \gdef\noexpand\thischapternum{\the\chapno}%
+ % \noexpand\putwordChapter avoids expanding indigestible
+ % commands in some of the translations.
+ \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
+ \noexpand\thischapternum:
+ \noexpand\thischaptername}%
+ }%
+ \fi\fi\fi
+ %
+ % Output the mark. Pass it through \safewhatsit, to take care of
+ % the preceding space.
+ \safewhatsit\domark
+ %
+ % Insert the chapter heading break.
+ \pchapsepmacro
+ %
+ % Now the second mark, after the heading break. No break points
+ % between here and the heading.
+ \let\prevchapterdefs=\lastchapterdefs
+ \let\prevsectiondefs=\lastsectiondefs
+ \domark
+ %
+ {%
+ \chapfonts \rmisbold
+ \let\footnote=\errfootnoteheading % give better error message
+ %
+ % Have to define \lastsection before calling \donoderef, because the
+ % xref code eventually uses it. On the other hand, it has to be called
+ % after \pchapsepmacro, or the headline will change too soon.
+ \gdef\lastsection{#1}%
+ %
+ % Only insert the separating space if we have a chapter/appendix
+ % number, and don't print the unnumbered ``number''.
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unnchap}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+ \def\toctype{omit}%
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+ \def\toctype{app}%
+ \else
+ \setbox0 = \hbox{#3\enspace}%
+ \def\toctype{numchap}%
+ \fi\fi\fi
+ %
+ % Write the toc entry for this chapter. Must come before the
+ % \donoderef, because we include the current node name in the toc
+ % entry, and \donoderef resets it to empty.
+ \writetocentry{\toctype}{#1}{#3}%
+ %
+ % For pdftex, we have to write out the node definition (aka, make
+ % the pdfdest) after any page break, but before the actual text has
+ % been typeset. If the destination for the pdf outline is after the
+ % text, then jumping from the outline may wind up with the text not
+ % being visible, for instance under high magnification.
+ \donoderef{#2}%
+ %
+ % Typeset the actual heading.
+ \nobreak % Avoid page breaks at the interline glue.
+ \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff. We'll see. --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
+\def\unnchfopen #1{%
+ \chapoddpage
+ \vbox{\chapfonts \raggedtitlesettings #1\par}%
+ \nobreak\bigskip\nobreak
+}
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+\def\centerchfopen #1{%
+ \chapoddpage
+ \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}%
+ \nobreak\bigskip \nobreak
+}
+\def\CHAPFopen{%
+ \global\let\chapmacro=\chfopen
+ \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles. These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text of the title,
+% #2 is the section level (sec/subsec/subsubsec),
+% #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc),
+% #4 is the section number.
+%
+\def\seckeyword{sec}
+%
+\def\sectionheading#1#2#3#4{%
+ {%
+ \def\sectionlevel{#2}%
+ \def\temptype{#3}%
+ %
+ % It is ok for the @heading series commands to appear inside an
+ % environment (it's been historically allowed, though the logic is
+ % dubious), but not the others.
+ \ifx\temptype\Yomitfromtockeyword\else
+ \checkenv{}% non-@*heading should not be in an environment.
+ \fi
+ \let\footnote=\errfootnoteheading
+ %
+ % Switch to the right set of fonts.
+ \csname #2fonts\endcsname \rmisbold
+ %
+ % Insert first mark before the heading break (see notes for \domark).
+ \let\prevsectiondefs=\lastsectiondefs
+ \ifx\temptype\Ynothingkeyword
+ \ifx\sectionlevel\seckeyword
+ \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
+ \gdef\thissection{\thissectionname}}%
+ \fi
+ \else\ifx\temptype\Yomitfromtockeyword
+ % Don't redefine \thissection.
+ \else\ifx\temptype\Yappendixkeyword
+ \ifx\sectionlevel\seckeyword
+ \toks0={#1}%
+ \xdef\lastsectiondefs{%
+ \gdef\noexpand\thissectionname{\the\toks0}%
+ \gdef\noexpand\thissectionnum{#4}%
+ % \noexpand\putwordSection avoids expanding indigestible
+ % commands in some of the translations.
+ \gdef\noexpand\thissection{\noexpand\putwordSection{}
+ \noexpand\thissectionnum:
+ \noexpand\thissectionname}%
+ }%
+ \fi
+ \else
+ \ifx\sectionlevel\seckeyword
+ \toks0={#1}%
+ \xdef\lastsectiondefs{%
+ \gdef\noexpand\thissectionname{\the\toks0}%
+ \gdef\noexpand\thissectionnum{#4}%
+ % \noexpand\putwordSection avoids expanding indigestible
+ % commands in some of the translations.
+ \gdef\noexpand\thissection{\noexpand\putwordSection{}
+ \noexpand\thissectionnum:
+ \noexpand\thissectionname}%
+ }%
+ \fi
+ \fi\fi\fi
+ %
+ % Go into vertical mode. Usually we'll already be there, but we
+ % don't want the following whatsit to end up in a preceding paragraph
+ % if the document didn't happen to have a blank line.
+ \par
+ %
+ % Output the mark. Pass it through \safewhatsit, to take care of
+ % the preceding space.
+ \safewhatsit\domark
+ %
+ % Insert space above the heading.
+ \csname #2headingbreak\endcsname
+ %
+ % Now the second mark, after the heading break. No break points
+ % between here and the heading.
+ \global\let\prevsectiondefs=\lastsectiondefs
+ \domark
+ %
+ % Only insert the space after the number if we have a section number.
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unn}%
+ \gdef\lastsection{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ % for @headings -- no section number, don't include in toc,
+ % and don't redefine \lastsection.
+ \setbox0 = \hbox{}%
+ \def\toctype{omit}%
+ \let\sectionlevel=\empty
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{app}%
+ \gdef\lastsection{#1}%
+ \else
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{num}%
+ \gdef\lastsection{#1}%
+ \fi\fi\fi
+ %
+ % Write the toc entry (before \donoderef). See comments in \chapmacro.
+ \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+ %
+ % Write the node reference (= pdf destination for pdftex).
+ % Again, see comments in \chapmacro.
+ \donoderef{#3}%
+ %
+ % Interline glue will be inserted when the vbox is completed.
+ % That glue will be a valid breakpoint for the page, since it'll be
+ % preceded by a whatsit (usually from the \donoderef, or from the
+ % \writetocentry if there was no node). We don't want to allow that
+ % break, since then the whatsits could end up on page n while the
+ % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000.
+ \nobreak
+ %
+ % Output the actual section heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
+ \hangindent=\wd0 % zero if no section number
+ \unhbox0 #1}%
+ }%
+ % Add extra space after the heading -- half of whatever came above it.
+ % Don't allow stretch, though.
+ \kern .5 \csname #2headingskip\endcsname
+ %
+ % Do not let the kern be a potential breakpoint, as it would be if it
+ % was followed by glue.
+ \nobreak
+ %
+ % We'll almost certainly start a paragraph next, so don't let that
+ % glue accumulate. (Not a breakpoint because it's preceded by a
+ % discardable item.) However, when a paragraph is not started next
+ % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out
+ % or the negative glue will cause weirdly wrong output, typically
+ % obscuring the section heading with something else.
+ \vskip-\parskip
+ %
+ % This is so the last item on the main vertical list is a known
+ % \penalty > 10000, so \startdefun, etc., can recognize the situation
+ % and do the needful.
+ \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this. The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything. This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+ \edef\writetoctype{#1}%
+ \ifx\writetoctype\omitkeyword \else
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ %
+ \iflinks
+ {\atdummies
+ \edef\temp{%
+ \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+ \temp
+ }%
+ \fi
+ \fi
+ %
+ % Tell \shipout to create a pdf destination on each page, if we're
+ % writing pdf. These are used in the table of contents. We can't
+ % just write one on every page because the title pages are numbered
+ % 1 and 2 (the page numbers aren't printed), and so are the first
+ % two pages of the document. Thus, we'd have two destinations named
+ % `1', and two named `2'.
+ \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care. This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+%
+\def\activecatcodes{%
+ \catcode`\"=\active
+ \catcode`\$=\active
+ \catcode`\<=\active
+ \catcode`\>=\active
+ \catcode`\\=\active
+ \catcode`\^=\active
+ \catcode`\_=\active
+ \catcode`\|=\active
+ \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+ \setupdatafile
+ \activecatcodes
+ \input \tocreadfilename
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+ \immediate\closeout\tocfile
+ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \chapmacro{#1}{Yomitfromtoc}{}%
+ %
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \entryrightmargin=\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+% redefined for the two-volume lispref. We always output on
+% \jobname.toc even if this is redefined.
+%
+\def\tocreadfilename{\jobname.toc}
+
+% Normal (long) toc.
+%
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \tocreadfilename\space
+ \ifeof 1 \else
+ \readtocfile
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \ifeof 1 \else
+ \pdfmakeoutlines
+ \fi
+ \closein 1
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+ \startcontents{\putwordShortTOC}%
+ %
+ \let\partentry = \shortpartentry
+ \let\numchapentry = \shortchapentry
+ \let\appentry = \shortchapentry
+ \let\unnchapentry = \shortunnchapentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf
+ \let\sl=\shortcontsl \let\tt=\shortconttt
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\numsecentry##1##2##3##4{}
+ \let\appsecentry = \numsecentry
+ \let\unnsecentry = \numsecentry
+ \let\numsubsecentry = \numsecentry
+ \let\appsubsecentry = \numsecentry
+ \let\unnsubsecentry = \numsecentry
+ \let\numsubsubsecentry = \numsecentry
+ \let\appsubsubsecentry = \numsecentry
+ \let\unnsubsubsecentry = \numsecentry
+ \openin 1 \tocreadfilename\space
+ \ifeof 1 \else
+ \readtocfile
+ \fi
+ \closein 1
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+ % This space should be enough, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % But use \hss just in case.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ %
+ % We'd like to right-justify chapter numbers, but that looks strange
+ % with appendix letters. And right-justifying numbers and
+ % left-justifying letters looks strange when there is less than 10
+ % chapters. Have to read the whole toc once to know how many chapters
+ % there are before deciding ...
+ \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Parts, in the main contents. Replace the part number, which doesn't
+% exist, with an empty box. Let's hope all the numbers have the same width.
+% Also ignore the page number, which is conventionally not printed.
+\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}}
+\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}}
+%
+% Parts, in the short toc.
+\def\shortpartentry#1#2#3#4{%
+ \penalty-300
+ \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip
+ \shortchapentry{{\bf #1}}{\numeralbox}{}{}%
+}
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+ % We use M since it's probably the widest letter.
+ \setbox0 = \hbox{\putwordAppendix{} M}%
+ \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ % Move the page numbers slightly to the right
+ \advance\entryrightmargin by -0.05em
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @tex ... @end tex escapes into raw TeX temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain @ character.
+
+\envdef\tex{%
+ \setupmarkupstyle{tex}%
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+ \catcode `\%=14
+ \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
+ % other math active characters (just in case), to plain's definitions.
+ \mathactive
+ %
+ % Inverse of the list at the beginning of the file.
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\/=\ptexslash
+ \let\sp=\ptexsp
+ \let\*=\ptexstar
+ %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode
+ \let\t=\ptext
+ \expandafter \let\csname top\endcsname=\ptextop % we've made it outer
+ \let\frenchspacing=\plainfrenchspacing
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz and
+ % \sectionheading, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ \ifnum\lastpenalty<10000
+ % Penalize breaking before the environment, because preceding text
+ % often leads into it.
+ \penalty100
+ \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\def\afterenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz and
+ % \sectionheading, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ % it's not a good place to break if the last penalty was \nobreak
+ % or better ...
+ \ifnum\lastpenalty<10000 \penalty-50 \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+ \ifhmode\par\fi % can't be in the midst of a paragraph.
+ \startsavinginserts
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt % we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+ % side, and for 6pt waste from
+ % each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ %
+ % If this cartouche directly follows a sectioning command, we need the
+ % \parskip glue (backspaced over by default) or the cartouche can
+ % collide with the section heading.
+ \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi
+ %
+ \setbox\groupbox=\vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \kern3pt
+ \hsize=\cartinner
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+ \comment % For explanation, see the end of def\group.
+}
+\def\Ecartouche{%
+ \ifhmode\par\fi
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+ \addgroupbox
+ \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\newdimen\nonfillparindent
+\def\nonfillstart{%
+ \aboveenvbreak
+ \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ % Turn off paragraph indentation but redefine \indent to emulate
+ % the normal \indent.
+ \nonfillparindent=\parindent
+ \parindent = 0pt
+ \let\indent\nonfillindent
+ %
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \else
+ \let\nonarrowing = \relax
+ \fi
+ \let\exdent=\nofillexdent
+}
+
+\begingroup
+\obeyspaces
+% We want to swallow spaces (but not other tokens) after the fake
+% @indent in our nonfill-environments, where spaces are normally
+% active and set to @tie, resulting in them not being ignored after
+% @indent.
+\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
+\gdef\nonfillindentcheck{%
+\ifx\temp %
+\expandafter\nonfillindentgobble%
+\else%
+\leavevmode\nonfillindentbox%
+\fi%
+}%
+\endgroup
+\def\nonfillindentgobble#1{\nonfillindent}
+\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+% @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+ \ifx\SETdispenvsize\smallword
+ % end paragraph for sake of leading, in case document has no blank
+ % line. This is redundant with what happens in \aboveenvbreak, but
+ % we need to do it before changing the fonts, and it's inconvenient
+ % to change the fonts afterward.
+ \ifnum \lastpenalty=10000 \else \endgraf \fi
+ \smallexamplefonts \rm
+ \fi
+}
+\def\setsmalldispenv{%
+ \ifx\SETdispenvsize\nosmallword
+ \else
+ \ifnum \lastpenalty=10000 \else \endgraf \fi
+ \smallexamplefonts \rm
+ \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it in one command. #1 is the env name, #2 the definition.
+\def\makedispenvdef#1#2{%
+ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}%
+ \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}%
+ \expandafter\let\csname E#1\endcsname \afterenvbreak
+ \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two environment synonyms (#1 and #2) for an environment.
+\def\maketwodispenvdef#1#2#3{%
+ \makedispenvdef{#1}{#3}%
+ \makedispenvdef{#2}{#3}%
+}
+%
+% @lisp: indented, narrowed, typewriter font;
+% @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvdef{lisp}{example}{%
+ \nonfillstart
+ \tt\setupmarkupstyle{example}%
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenvdef{display}{%
+ \nonfillstart
+ \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenvdef{format}{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \advance\leftskip by 0pt plus 1fill\relax
+ \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @raggedright does more-or-less normal line breaking but no right
+% justification. From plain.tex. Don't stretch around special
+% characters in urls in this environment, since the stretch at the right
+% should be enough.
+\envdef\raggedright{%
+ \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax
+ \def\urefprestretchamount{0pt}%
+ \def\urefpoststretchamount{0pt}%
+}
+\let\Eraggedright\par
+
+\envdef\raggedleft{%
+ \parindent=0pt \leftskip0pt plus2em
+ \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+ \hbadness=10000 % Last line will usually be underfull, so turn off
+ % badness reporting.
+}
+\let\Eraggedleft\par
+
+\envdef\raggedcenter{%
+ \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
+ \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+ \hbadness=10000 % Last line will usually be underfull, so turn off
+ % badness reporting.
+}
+\let\Eraggedcenter\par
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins. We keep \parskip nonzero in general, since
+% we're doing normal filling. So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\makedispenvdef{quotation}{\quotationstart}
+%
+\def\quotationstart{%
+ \indentedblockstart % same as \indentedblock, but increase right margin too.
+ \ifx\nonarrowing\relax
+ \advance\rightskip by \lispnarrowing
+ \fi
+ \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+ \par
+ \ifx\quotationauthor\thisisundefined\else
+ % indent a bit.
+ \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+ \fi
+ {\parskip=0pt \afterenvbreak}%
+}
+\def\Esmallquotation{\Equotation}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty \else
+ {\bf #1: }%
+ \fi
+}
+
+% @indentedblock is like @quotation, but indents only on the left and
+% has no optional argument.
+%
+\makedispenvdef{indentedblock}{\indentedblockstart}
+%
+\def\indentedblockstart{%
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \parindent=0pt
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \else
+ \let\nonarrowing = \relax
+ \fi
+}
+
+% Keep a nonzero parskip for the environment, since we're doing normal filling.
+%
+\def\Eindentedblock{%
+ \par
+ {\parskip=0pt \afterenvbreak}%
+}
+\def\Esmallindentedblock{\Eindentedblock}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too. Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+ \do\<\do\>\do\|\do\@\do+\do\"%
+ % Don't do the quotes -- if we do, @set txicodequoteundirected and
+ % @set txicodequotebacktick will not have effect on @verb and
+ % @verbatim, and ?` and !` ligatures won't get disabled.
+ %\do\`\do\'%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \setupmarkupstyle{verb}%
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion.
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+% We typeset each line of the verbatim in an \hbox, so we can handle
+% tabs. The \global is in case the verbatim line starts with an accent,
+% or some other command that starts with a begin-group. Otherwise, the
+% entire \verbbox would disappear at the corresponding end-group, before
+% it is typeset. Meanwhile, we can't have nested verbatim commands
+% (can we?), so the \global won't be overwriting itself.
+\newbox\verbbox
+\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}
+%
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab
+ \divide\dimen\verbbox by\tabw
+ \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw
+ \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw
+ \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox
+ }%
+ }
+\endgroup
+
+% start the verbatim environment.
+\def\setupverbatim{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \tt % easiest (and conventionally used) font for verbatim
+ % The \leavevmode here is for blank lines. Otherwise, we would
+ % never \starttabox and the \egroup would end verbatim mode.
+ \def\par{\leavevmode\egroup\box\verbbox\endgraf}%
+ \tabexpand
+ \setupmarkupstyle{verbatim}%
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count.
+ % Must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+ \catcode`\ =\active
+ \obeylines %
+ % ignore everything up to the first ^^M, that's the newline at the end
+ % of the @verbatim input line itself. Otherwise we get an extra blank
+ % line in the output.
+ \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+ % We really want {...\end verbatim} in the body of the macro, but
+ % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+ \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+ {%
+ \makevalueexpandable
+ \setupverbatim
+ \indexnofonts % Allow `@@' and other weird things in file names.
+ \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%
+ \input #1
+ \afterenvbreak
+ }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+ \begingroup
+ \parindent = 0pt % paragraph indentation looks wrong on title page
+ \scanexp\copyingtext
+ \endgroup
+}
+
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+\newcount\defunpenalty
+
+% Start the processing of @deffn:
+\def\startdefun{%
+ \ifnum\lastpenalty<10000
+ \medbreak
+ \defunpenalty=10003 % Will keep this @deffn together with the
+ % following @def command, see below.
+ \else
+ % If there are two @def commands in a row, we'll have a \nobreak,
+ % which is there to keep the function description together with its
+ % header. But if there's nothing but headers, we need to allow a
+ % break somewhere. Check specifically for penalty 10002, inserted
+ % by \printdefunline, instead of 10000, since the sectioning
+ % commands also insert a nobreak penalty, and we don't want to allow
+ % a break between a section heading and a defun.
+ %
+ % As a further refinement, we avoid "club" headers by signalling
+ % with penalty of 10003 after the very first @deffn in the
+ % sequence (see above), and penalty of 10002 after any following
+ % @def command.
+ \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
+ %
+ % Similarly, after a section heading, do not allow a break.
+ % But do insert the glue.
+ \medskip % preceded by discardable penalty, so not a breakpoint
+ \fi
+ %
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+ % First, check whether we are in the right environment:
+ \checkenv#1%
+ %
+ % As above, allow line break if we have multiple x headers in a row.
+ % It's not a great place, though.
+ \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
+ %
+ % And now, it's time to reuse the body of the original defun:
+ \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+ \begingroup
+ % call \deffnheader:
+ #1#2 \endheader
+ % common ending:
+ \interlinepenalty = 10000
+ \advance\rightskip by 0pt plus 1fil\relax
+ \endgraf
+ \nobreak\vskip -\parskip
+ \penalty\defunpenalty % signal to \startdefun and \dodefunx
+ % Some of the @defun-type tags do not enable magic parentheses,
+ % rendering the following check redundant. But we don't optimize.
+ \checkparencounts
+ \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remaining is to define \deffnheader.
+%
+\def\makedefun#1{%
+ \expandafter\let\csname E#1\endcsname = \Edefun
+ \edef\temp{\noexpand\domakedefun
+ \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+ \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader { (defn. of \deffnheader) }
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+ \envdef#1{%
+ \startdefun
+ \doingtypefnfalse % distinguish typed functions from all else
+ \parseargusing\activeparens{\printdefunline#3}%
+ }%
+ \def#2{\dodefunx#1}%
+ \def#3%
+}
+
+\newif\ifdoingtypefn % doing typed function?
+\newif\ifrettypeownline % typeset return type on its own line?
+
+% @deftypefnnewline on|off says whether the return type of typed functions
+% are printed on their own line. This affects @deftypefn, @deftypefun,
+% @deftypeop, and @deftypemethod.
+%
+\parseargdef\deftypefnnewline{%
+ \def\temp{#1}%
+ \ifx\temp\onword
+ \expandafter\let\csname SETtxideftypefnnl\endcsname
+ = \empty
+ \else\ifx\temp\offword
+ \expandafter\let\csname SETtxideftypefnnl\endcsname
+ = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @txideftypefnnl value `\temp',
+ must be on|off}%
+ \fi\fi
+}
+
+% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+ % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+ \dosubind{fn}{\code{#3}}{#1}%
+ \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{fn}{\code{#4}}{#1}%
+ \doingtypefntrue
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{vr}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+% Types:
+
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+ \doind{tp}{\code{#2}}%
+ \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+ \par
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \advance\leftskip by -\defbodyindent
+ %
+ % Determine if we are typesetting the return type of a typed function
+ % on a line by itself.
+ \rettypeownlinefalse
+ \ifdoingtypefn % doing a typed function specifically?
+ % then check user option for putting return type on its own line:
+ \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else
+ \rettypeownlinetrue
+ \fi
+ \fi
+ %
+ % How we'll format the category name. Putting it in brackets helps
+ % distinguish it from the body text that may end up on the next line
+ % just below it.
+ \def\temp{#1}%
+ \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+ %
+ % Figure out line sizes for the paragraph shape. We'll always have at
+ % least two.
+ \tempnum = 2
+ %
+ % The first line needs space for \box0; but if \rightskip is nonzero,
+ % we need only space for the part of \box0 which exceeds it:
+ \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip
+ %
+ % If doing a return type on its own line, we'll have another line.
+ \ifrettypeownline
+ \advance\tempnum by 1
+ \def\maybeshapeline{0in \hsize}%
+ \else
+ \def\maybeshapeline{}%
+ \fi
+ %
+ % The continuations:
+ \dimen2=\hsize \advance\dimen2 by -\defargsindent
+ %
+ % The final paragraph shape:
+ \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2
+ %
+ % Put the category name at the right margin.
+ \noindent
+ \hbox to 0pt{%
+ \hfil\box0 \kern-\hsize
+ % \hsize has to be shortened this way:
+ \kern\leftskip
+ % Intentionally do not respect \rightskip, since we need the space.
+ }%
+ %
+ % Allow all lines to be underfull without complaint:
+ \tolerance=10000 \hbadness=10000
+ \exdentamount=\defbodyindent
+ {%
+ % defun fonts. We use typewriter by default (used to be bold) because:
+ % . we're printing identifiers, they should be in tt in principle.
+ % . in languages with many accents, such as Czech or French, it's
+ % common to leave accents off identifiers. The result looks ok in
+ % tt, but exceedingly strange in rm.
+ % . we don't want -- and --- to be treated as ligatures.
+ % . this still does not fix the ?` and !` ligatures, but so far no
+ % one has made identifiers using them :).
+ \df \tt
+ \def\temp{#2}% text of the return type
+ \ifx\temp\empty\else
+ \tclose{\temp}% typeset the return type
+ \ifrettypeownline
+ % put return type on its own line; prohibit line break following:
+ \hfil\vadjust{\nobreak}\break
+ \else
+ \space % type on same line, so just followed by a space
+ \fi
+ \fi % no return type
+ #3% output function name
+ }%
+ {\rm\enskip}% hskip 0.5 em of \tenrm
+ %
+ \boldbrax
+ % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name. This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable. Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+ % use sl by default (not ttsl),
+ % tt for the names.
+ \df \sl \hyphenchar\font=0
+ %
+ % On the other hand, if an argument has two dashes (for instance), we
+ % want a way to get ttsl. We used to recommend @var for that, so
+ % leave the code in, but it's strange for @var to lead to typewriter.
+ % Nowadays we recommend @code, since the difference between a ttsl hyphen
+ % and a tt hyphen is pretty tiny. @code also disables ?` !`.
+ \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
+ #1%
+ \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+ \catcode`\(=\active \catcode`\)=\active
+ \catcode`\[=\active \catcode`\]=\active
+ \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+ \activeparens
+ \global\let(=\lparen \global\let)=\rparen
+ \global\let[=\lbrack \global\let]=\rbrack
+ \global\let& = \&
+
+ \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+ \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+ \ifampseen
+ % At the first level, print parens in roman,
+ % otherwise use the default font.
+ \ifnum \parencount=1 \rm \fi
+ \else
+ % The \sf parens (in \boldbrax) actually are a little bolder than
+ % the contained text. This is especially needed for [ and ] .
+ \sf
+ \fi
+}
+\def\infirstlevel#1{%
+ \ifampseen
+ \ifnum\parencount=1
+ #1%
+ \fi
+ \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+ \global\advance\parencount by 1
+ {\parenfont(}%
+ \infirstlevel \bfafterword
+}
+\def\clnr{%
+ {\parenfont)}%
+ \infirstlevel \sl
+ \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+ \global\advance\brackcount by 1
+ {\bf[}%
+}
+\def\rbrb{%
+ {\bf]}%
+ \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+ \ifnum\parencount=0 \else \badparencount \fi
+ \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+% these should not use \errmessage; the glibc manual, at least, actually
+% has such constructs (when documenting function pointers).
+\def\badparencount{%
+ \message{Warning: unbalanced parentheses in @def...}%
+ \global\parencount=0
+}
+\def\badbrackcount{%
+ \message{Warning: unbalanced square brackets in @def...}%
+ \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\thisisundefined
+ \newwrite\macscribble
+ \def\scantokens#1{%
+ \toks0={#1}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \input \jobname.tmp
+ }
+\fi
+
+\let\aftermacroxxx\relax
+\def\aftermacro{\aftermacroxxx}
+
+% alias because \c means cedilla in @tex or @math
+\let\texinfoc=\c
+
+% Used at the time of macro expansion.
+% Argument is macro body with arguments substituted
+\def\scanmacro#1{%
+ \newlinechar`\^^M
+ \def\xprocessmacroarg{\eatspaces}%
+ %
+ % Process the macro body under the current catcode regime.
+ \scantokens{#1\texinfoc}\aftermacro%
+ %
+ % The \c is to remove the \newlinechar added by \scantokens, and
+ % can be noticed by \parsearg.
+ % The \aftermacro allows a \comment at the end of the macro definition
+ % to duplicate itself past the final \newlinechar added by \scantokens:
+ % this is used in the definition of \group to comment out a newline. We
+ % don't do the same for \c to support Texinfo files with macros that ended
+ % with a @c, which should no longer be necessary.
+ % We avoid surrounding the call to \scantokens with \bgroup and \egroup
+ % to allow macros to open or close groups themselves.
+}
+
+\def\scanexp#1{%
+ \bgroup
+ % Undo catcode changes of \startcontents and \printindex
+ % When called from @insertcopying or (short)caption, we need active
+ % backslash to get it printed correctly.
+ % FIXME: This may not be needed.
+ %\catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+ \edef\temp{\noexpand\scanmacro{#1}}%
+ \temp
+ \egroup
+}
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+
+% List of all defined macros in the form
+% \definedummyword\macro1\definedummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+ \toks0 = \expandafter{\macrolist\definedummyword#1}%
+ \xdef\macrolist{\the\toks0}%
+}
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+% \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+%
+\def\cslet#1#2{%
+ \expandafter\let
+ \csname#1\expandafter\endcsname
+ \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \
+% to recognize macro arguments; this is the job of \mbodybackslash.
+%
+% Non-ASCII encodings make 8-bit characters active, so un-activate
+% them to avoid their expansion. Must do this non-globally, to
+% confine the change to the current group.
+%
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+%
+\def\scanctxt{% used as subroutine
+ \catcode`\"=\other
+ \catcode`\+=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\~=\other
+ \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi
+}
+
+\def\scanargctxt{% used for copying and captions, not macros.
+ \scanctxt
+ \catcode`\@=\other
+ \catcode`\\=\other
+ \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{% used for @macro definitions
+ \scanctxt
+ \catcode`\ =\other
+ \catcode`\@=\other
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\^^M=\other
+ \usembodybackslash
+}
+
+% Used when scanning braced macro arguments. Note, however, that catcode
+% changes here are ineffectual if the macro invocation was nested inside
+% an argument to another Texinfo command.
+\def\macroargctxt{%
+ \scanctxt
+ \catcode`\ =\active
+ \catcode`\^^M=\other
+ \catcode`\\=\active
+}
+
+\def\macrolineargctxt{% used for whole-line arguments without braces
+ \scanctxt
+ \catcode`\{=\other
+ \catcode`\}=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+%
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\margbackslash#1{\char`\#1 }
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0\relax
+ \else
+ \expandafter\parsemargdef \argl;%
+ \if\paramno>256\relax
+ \ifx\eTeXversion\thisisundefined
+ \errhelp = \EMsimple
+ \errmessage{You need eTeX to compile a file with macros with more than 256 arguments}
+ \fi
+ \fi
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{Macro name \the\macname\space already defined}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ \addtomacrolist{\the\macname}%
+ \fi
+ \begingroup \macrobodyctxt
+ \ifrecursive \expandafter\parsermacbody
+ \else \expandafter\parsemacbody
+ \fi}
+
+\parseargdef\unmacro{%
+ \if1\csname ismacro.#1\endcsname
+ \global\cslet{#1}{macsave.#1}%
+ \global\expandafter\let \csname ismacro.#1\endcsname=0%
+ % Remove the macro name from \macrolist:
+ \begingroup
+ \expandafter\let\csname#1\endcsname \relax
+ \let\definedummyword\unmacrodo
+ \xdef\macrolist{\macrolist}%
+ \endgroup
+ \else
+ \errmessage{Macro #1 not defined}%
+ \fi
+}
+
+% Called by \do from \dounmacro on each macro. The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+ \ifx #1\relax
+ % remove this
+ \else
+ \noexpand\definedummyword \noexpand#1%
+ \fi
+}
+
+% \getargs -- Parse the arguments to a @macro line. Set \macname to
+% the name of the macro, and \argl to the braced argument list.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname#1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+% This made use of the feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+
+% Parse the optional {params} list to @macro or @rmacro.
+% Set \paramno to the number of arguments,
+% and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a
+% three-param macro.) Define \macarg.BLAH for each BLAH in the params
+% list to some hook where the argument is to be expanded. If there are
+% less than 10 arguments that hook is to be replaced by ##N where N
+% is the position in that list, that is to say the macro arguments are to be
+% defined `a la TeX in the macro body.
+%
+% That gets used by \mbodybackslash (above).
+%
+% If there are 10 or more arguments, a different technique is used: see
+% \parsemmanyargdef.
+%
+\def\parsemargdef#1;{%
+ \paramno=0\def\paramlist{}%
+ \let\hash\relax
+ % \hash is redefined to `#' later to get it into definitions
+ \let\processmacroarg\relax
+ \parsemargdefxxx#1,;,%
+ \ifnum\paramno<10\relax\else
+ \paramno0\relax
+ \parsemmanyargdef@@#1,;,% 10 or more arguments
+ \fi
+}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\processmacroarg{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% \parsemacbody, \parsermacbody
+%
+% Read recursive and nonrecursive macro bodies. (They're different since
+% rec and nonrec macros end differently.)
+%
+% We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro
+% body to be transformed.
+% Set \macrobody to the body of the macro, and call \defmacro.
+%
+{\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%
+\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
+{\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%
+\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
+
+% Make @ a letter, so that we can make private-to-Texinfo macro names.
+\edef\texiatcatcode{\the\catcode`\@}
+\catcode `@=11\relax
+
+%%%%%%%%%%%%%% Code for > 10 arguments only %%%%%%%%%%%%%%%%%%
+
+% If there are 10 or more arguments, a different technique is used, where the
+% hook remains in the body, and when macro is to be expanded the body is
+% processed again to replace the arguments.
+%
+% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the
+% argument N value and then \edef the body (nothing else will expand because of
+% the catcode regime under which the body was input).
+%
+% If you compile with TeX (not eTeX), and you have macros with 10 or more
+% arguments, no macro can have more than 256 arguments (else error).
+%
+% In case that there are 10 or more arguments we parse again the arguments
+% list to set new definitions for the \macarg.BLAH macros corresponding to
+% each BLAH argument. It was anyhow needed to parse already once this list
+% in order to count the arguments, and as macros with at most 9 arguments
+% are by far more frequent than macro with 10 or more arguments, defining
+% twice the \macarg.BLAH macros does not cost too much processing power.
+\def\parsemmanyargdef@@#1,{%
+ \if#1;\let\next=\relax
+ \else
+ \let\next=\parsemmanyargdef@@
+ \edef\tempb{\eatspaces{#1}}%
+ \expandafter\def\expandafter\tempa
+ \expandafter{\csname macarg.\tempb\endcsname}%
+ % Note that we need some extra \noexpand\noexpand, this is because we
+ % don't want \the to be expanded in the \parsermacbody as it uses an
+ % \xdef .
+ \expandafter\edef\tempa
+ {\noexpand\noexpand\noexpand\the\toks\the\paramno}%
+ \advance\paramno by 1\relax
+ \fi\next}
+
+
+\let\endargs@\relax
+\let\nil@\relax
+\def\nilm@{\nil@}%
+\long\def\nillm@{\nil@}%
+
+% This macro is expanded during the Texinfo macro expansion, not during its
+% definition. It gets all the arguments' values and assigns them to macros
+% macarg.ARGNAME
+%
+% #1 is the macro name
+% #2 is the list of argument names
+% #3 is the list of argument values
+\def\getargvals@#1#2#3{%
+ \def\macargdeflist@{}%
+ \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion.
+ \def\paramlist{#2,\nil@}%
+ \def\macroname{#1}%
+ \begingroup
+ \macroargctxt
+ \def\argvaluelist{#3,\nil@}%
+ \def\@tempa{#3}%
+ \ifx\@tempa\empty
+ \setemptyargvalues@
+ \else
+ \getargvals@@
+ \fi
+}
+\def\getargvals@@{%
+ \ifx\paramlist\nilm@
+ % Some sanity check needed here that \argvaluelist is also empty.
+ \ifx\argvaluelist\nillm@
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Too many arguments in macro `\macroname'!}%
+ \fi
+ \let\next\macargexpandinbody@
+ \else
+ \ifx\argvaluelist\nillm@
+ % No more arguments values passed to macro. Set remaining named-arg
+ % macros to empty.
+ \let\next\setemptyargvalues@
+ \else
+ % pop current arg name into \@tempb
+ \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}%
+ \expandafter\@tempa\expandafter{\paramlist}%
+ % pop current argument value into \@tempc
+ \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}%
+ \expandafter\@tempa\expandafter{\argvaluelist}%
+ % Here \@tempb is the current arg name and \@tempc is the current arg value.
+ % First place the new argument macro definition into \@tempd
+ \expandafter\macname\expandafter{\@tempc}%
+ \expandafter\let\csname macarg.\@tempb\endcsname\relax
+ \expandafter\def\expandafter\@tempe\expandafter{%
+ \csname macarg.\@tempb\endcsname}%
+ \edef\@tempd{\long\def\@tempe{\the\macname}}%
+ \push@\@tempd\macargdeflist@
+ \let\next\getargvals@@
+ \fi
+ \fi
+ \next
+}
+
+\def\push@#1#2{%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter#2%
+ \expandafter\expandafter\expandafter{%
+ \expandafter#1#2}%
+}
+
+% Replace arguments by their values in the macro body, and place the result
+% in macro \@tempa.
+%
+\def\macvalstoargs@{%
+ % To do this we use the property that token registers that are \the'ed
+ % within an \edef expand only once. So we are going to place all argument
+ % values into respective token registers.
+ %
+ % First we save the token context, and initialize argument numbering.
+ \begingroup
+ \paramno0\relax
+ % Then, for each argument number #N, we place the corresponding argument
+ % value into a new token list register \toks#N
+ \expandafter\putargsintokens@\saveparamlist@,;,%
+ % Then, we expand the body so that argument are replaced by their
+ % values. The trick for values not to be expanded themselves is that they
+ % are within tokens and that tokens expand only once in an \edef .
+ \edef\@tempc{\csname mac.\macroname .body\endcsname}%
+ % Now we restore the token stack pointer to free the token list registers
+ % which we have used, but we make sure that expanded body is saved after
+ % group.
+ \expandafter
+ \endgroup
+ \expandafter\def\expandafter\@tempa\expandafter{\@tempc}%
+ }
+
+% Define the named-macro outside of this group and then close this group.
+%
+\def\macargexpandinbody@{%
+ \expandafter
+ \endgroup
+ \macargdeflist@
+ % First the replace in body the macro arguments by their values, the result
+ % is in \@tempa .
+ \macvalstoargs@
+ % Then we point at the \norecurse or \gobble (for recursive) macro value
+ % with \@tempb .
+ \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname
+ % Depending on whether it is recursive or not, we need some tailing
+ % \egroup .
+ \ifx\@tempb\gobble
+ \let\@tempc\relax
+ \else
+ \let\@tempc\egroup
+ \fi
+ % And now we do the real job:
+ \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}%
+ \@tempd
+}
+
+\def\putargsintokens@#1,{%
+ \if#1;\let\next\relax
+ \else
+ \let\next\putargsintokens@
+ % First we allocate the new token list register, and give it a temporary
+ % alias \@tempb .
+ \toksdef\@tempb\the\paramno
+ % Then we place the argument value into that token list register.
+ \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname
+ \expandafter\@tempb\expandafter{\@tempa}%
+ \advance\paramno by 1\relax
+ \fi
+ \next
+}
+
+% Trailing missing arguments are set to empty.
+%
+\def\setemptyargvalues@{%
+ \ifx\paramlist\nilm@
+ \let\next\macargexpandinbody@
+ \else
+ \expandafter\setemptyargvaluesparser@\paramlist\endargs@
+ \let\next\setemptyargvalues@
+ \fi
+ \next
+}
+
+\def\setemptyargvaluesparser@#1,#2\endargs@{%
+ \expandafter\def\expandafter\@tempa\expandafter{%
+ \expandafter\def\csname macarg.#1\endcsname{}}%
+ \push@\@tempa\macargdeflist@
+ \def\paramlist{#2}%
+}
+
+% #1 is the element target macro
+% #2 is the list macro
+% #3,#4\endargs@ is the list value
+\def\pop@#1#2#3,#4\endargs@{%
+ \def#1{#3}%
+ \def#2{#4}%
+}
+\long\def\longpop@#1#2#3,#4\endargs@{%
+ \long\def#1{#3}%
+ \long\def#2{#4}%
+}
+
+
+%%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%%
+
+
+
+% Remove following spaces at the expansion stage.
+% This works because spaces are discarded before each argument when TeX is
+% getting the arguments for a macro.
+% This must not be immediately followed by a }.
+\long\def\gobblespaces#1{#1}
+
+% This defines a Texinfo @macro or @rmacro, called by \parsemacbody.
+% \macrobody has the body of the macro in it, with placeholders for
+% its parameters, looking like "\processmacroarg{\hash 1}".
+% \paramno is the number of parameters
+% \paramlist is a TeX parameter text, e.g. "#1,#2,#3,"
+% There are eight cases: recursive and nonrecursive macros of zero, one,
+% up to nine, and many arguments.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in: @include reads the file inside a group.
+%
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifnum\paramno=1
+ \def\processmacroarg{\gobblespaces}%
+ % This removes the pair of braces around the argument. We don't
+ % use \eatspaces, because this can cause ends of lines to be lost
+ % when the argument to \eatspaces is read, leading to line-based
+ % commands like "@itemize" not being read correctly.
+ \else
+ \def\processmacroarg{\xprocessmacroarg}%
+ \let\xprocessmacroarg\relax
+ \fi
+ \ifrecursive %%%%%%%%%%%%%% Recursive %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\macrobody}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname @@@\endcsname}%
+ \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname @@@@\endcsname{%
+ \noexpand\gobblespaces##1\empty}%
+ % The \empty is for \gobblespaces in case #1 is empty
+ }%
+ \expandafter\xdef\csname\the\macname @@@@\endcsname##1{%
+ \egroup\noexpand\scanmacro{\macrobody}}%
+ \else
+ \ifnum\paramno<10\relax % at most 9
+ % See non-recursive section below for comments
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup
+ \noexpand\expandafter
+ \noexpand\macroargctxt
+ \noexpand\expandafter
+ \expandafter\noexpand\csname\the\macname @@\endcsname}%
+ \expandafter\xdef\csname\the\macname @@\endcsname##1{%
+ \noexpand\passargtomacro
+ \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
+ \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname @@@@\endcsname\paramlist{%
+ \egroup\noexpand\scanmacro{\macrobody}}%
+ \else % 10 or more
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\getargvals@{\the\macname}{\argl}%
+ }%
+ \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody
+ \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble
+ \fi
+ \fi
+ \else %%%%%%%%%%%%%%%%%%%%%% Non-recursive %%%%%%%%%%%%%%%%%%%%%%%%%%
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\macrobody}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname @@@\endcsname}%
+ \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname @@@@\endcsname{%
+ \noexpand\gobblespaces##1\empty}%
+ % The \empty is for \gobblespaces in case #1 is empty
+ }%
+ \expandafter\xdef\csname\the\macname @@@@\endcsname##1{%
+ \egroup
+ \noexpand\scanmacro{\macrobody}%
+ }%
+ \else % at most 9
+ \ifnum\paramno<10\relax
+ % @MACNAME sets the context for reading the macro argument
+ % @MACNAME@@ gets the argument, processes backslashes and appends a
+ % comma.
+ % @MACNAME@@@ removes braces surrounding the argument list.
+ % @MACNAME@@@@ scans the macro body with arguments substituted.
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup
+ \noexpand\expandafter % This \expandafter skip any spaces after the
+ \noexpand\macroargctxt % macro before we change the catcode of space.
+ \noexpand\expandafter
+ \expandafter\noexpand\csname\the\macname @@\endcsname}%
+ \expandafter\xdef\csname\the\macname @@\endcsname##1{%
+ \noexpand\passargtomacro
+ \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
+ \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname @@@@\endcsname\paramlist{%
+ \egroup\noexpand\scanmacro{\macrobody}}%
+ \else % 10 or more:
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\getargvals@{\the\macname}{\argl}%
+ }%
+ \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody
+ \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse
+ \fi
+ \fi
+ \fi}
+
+\catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+{\catcode`\@=0 \catcode`\\=13 % We need to manipulate \ so use @ as escape
+@catcode`@_=11 % private names
+@catcode`@!=11 % used as argument separator
+
+% \passargtomacro#1#2 -
+% Call #1 with a list of tokens #2, with any doubled backslashes in #2
+% compressed to one.
+%
+% This implementation works by expansion, and not execution (so we cannot use
+% \def or similar). This reduces the risk of this failing in contexts where
+% complete expansion is done with no execution (for example, in writing out to
+% an auxiliary file for an index entry).
+%
+% State is kept in the input stream: the argument passed to
+% @look_ahead, @gobble_and_check_finish and @add_segment is
+%
+% THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN (... rest of input)
+%
+% where:
+% THE_MACRO - name of the macro we want to call
+% ARG_RESULT - argument list we build to pass to that macro
+% PENDING_BS - either a backslash or nothing
+% NEXT_TOKEN - used to look ahead in the input stream to see what's coming next
+
+@gdef@passargtomacro#1#2{%
+ @add_segment #1!{}@relax#2\@_finish\%
+}
+@gdef@_finish{@_finishx} @global@let@_finishx@relax
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 used to look ahead
+%
+% If the next token is not a backslash, process the rest of the argument;
+% otherwise, remove the next token.
+@gdef@look_ahead#1!#2#3#4{%
+ @ifx#4\%
+ @expandafter@gobble_and_check_finish
+ @else
+ @expandafter@add_segment
+ @fi#1!{#2}#4#4%
+}
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 should be a backslash, which is gobbled.
+% #5 looks ahead
+%
+% Double backslash found. Add a single backslash, and look ahead.
+@gdef@gobble_and_check_finish#1!#2#3#4#5{%
+ @add_segment#1\!{}#5#5%
+}
+
+@gdef@is_fi{@fi}
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 is input stream until next backslash
+%
+% Input stream is either at the start of the argument, or just after a
+% backslash sequence, either a lone backslash, or a doubled backslash.
+% NEXT_TOKEN contains the first token in the input stream: if it is \finish,
+% finish; otherwise, append to ARG_RESULT the segment of the argument up until
+% the next backslash. PENDING_BACKSLASH contains a backslash to represent
+% a backslash just before the start of the input stream that has not been
+% added to ARG_RESULT.
+@gdef@add_segment#1!#2#3#4\{%
+@ifx#3@_finish
+ @call_the_macro#1!%
+@else
+ % append the pending backslash to the result, followed by the next segment
+ @expandafter@is_fi@look_ahead#1#2#4!{\}@fi
+ % this @fi is discarded by @look_ahead.
+ % we can't get rid of it with \expandafter because we don't know how
+ % long #4 is.
+}
+
+% #1 - THE_MACRO
+% #2 - ARG_RESULT
+% #3 discards the res of the conditional in @add_segment, and @is_fi ends the
+% conditional.
+@gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}}
+
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% \braceorline MAC is used for a one-argument macro MAC. It checks
+% whether the next non-whitespace character is a {. It sets the context
+% for reading the argument (slightly different in the two cases). Then,
+% to read the argument, in the whole-line case, it then calls the regular
+% \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC.
+%
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup
+ \macroargctxt
+ \expandafter\passargtomacro
+ \else
+ \macrolineargctxt\expandafter\parsearg
+ \fi \macnamexxx}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Make them active and then expand them all to nothing.
+%
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+ {%
+ \expandafter\let\obeyedspace=\empty
+ \addtomacrolist{#1}%
+ \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+ }%
+ \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{%
+ \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references. The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross, , , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node. #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+ \ifx\lastnode\empty\else
+ \setref{\lastnode}{#1}%
+ \global\let\lastnode=\empty
+ \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \lastsection,
+% or the anchor name.
+% 2) NAME-snt - section number and type, passed as the SNT arg, or
+% empty for anchors.
+% 3) NAME-pg - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat. In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+ \pdfmkdest{#1}%
+ \iflinks
+ {%
+ \requireauxfile
+ \atdummies % preserve commands, but don't expand them
+ \edef\writexrdef##1##2{%
+ \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+ ##1}{##2}}% these are parameters of \writexrdef
+ }%
+ \toks0 = \expandafter{\lastsection}%
+ \immediate \writexrdef{title}{\the\toks0 }%
+ \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+ \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout
+ }%
+ \fi
+}
+
+% @xrefautosectiontitle on|off says whether @section(ing) names are used
+% automatically in xrefs, if the third arg is not explicitly specified.
+% This was provided as a "secret" @set xref-automatic-section-title
+% variable, now it's official.
+%
+\parseargdef\xrefautomaticsectiontitle{%
+ \def\temp{#1}%
+ \ifx\temp\onword
+ \expandafter\let\csname SETxref-automatic-section-title\endcsname
+ = \empty
+ \else\ifx\temp\offword
+ \expandafter\let\csname SETxref-automatic-section-title\endcsname
+ = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @xrefautomaticsectiontitle value `\temp',
+ must be on|off}%
+ \fi\fi
+}
+
+%
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref{\putwordsee{} \xrefXX}
+\def\xref{\putwordSee{} \xrefXX}
+\def\ref{\xrefXX}
+
+\def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX}
+\def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]}
+%
+\newbox\toprefbox
+\newbox\printedrefnamebox
+\newbox\infofilenamebox
+\newbox\printedmanualbox
+%
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ %
+ % Get args without leading/trailing spaces.
+ \def\printedrefname{\ignorespaces #3}%
+ \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}%
+ %
+ \def\infofilename{\ignorespaces #4}%
+ \setbox\infofilenamebox = \hbox{\infofilename\unskip}%
+ %
+ \def\printedmanual{\ignorespaces #5}%
+ \setbox\printedmanualbox = \hbox{\printedmanual\unskip}%
+ %
+ % If the printed reference name (arg #3) was not explicitly given in
+ % the @xref, figure out what we want to use.
+ \ifdim \wd\printedrefnamebox = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax
+ % Not auto section-title: use node name inside the square brackets.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ % Auto section-title: use chapter/section title inside
+ % the square brackets if we have it.
+ \ifdim \wd\printedmanualbox > 0pt
+ % It is in another manual, so we don't have it; use node name.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We (should) know the real title if we have the xref values.
+ \def\printedrefname{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printedrefname{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % Make link in pdf output.
+ \ifpdf
+ {\indexnofonts
+ \turnoffactive
+ \makevalueexpandable
+ % This expands tokens, so do it after making catcode changes, so _
+ % etc. don't get their TeX definitions. This ignores all spaces in
+ % #4, including (wrongly) those in the middle of the filename.
+ \getfilename{#4}%
+ %
+ % This (wrongly) does not take account of leading or trailing
+ % spaces in #1, which should be ignored.
+ \edef\pdfxrefdest{#1}%
+ \ifx\pdfxrefdest\empty
+ \def\pdfxrefdest{Top}% no empty targets
+ \else
+ \txiescapepdf\pdfxrefdest % escape PDF special chars
+ \fi
+ %
+ \leavevmode
+ \startlink attr{/Border [0 0 0]}%
+ \ifnum\filenamelength>0
+ goto file{\the\filename.pdf} name{\pdfxrefdest}%
+ \else
+ goto name{\pdfmkpgn{\pdfxrefdest}}%
+ \fi
+ }%
+ \setcolor{\linkcolor}%
+ \fi
+ %
+ % Float references are printed completely differently: "Figure 1.2"
+ % instead of "[somenode], p.3". We distinguish them by the
+ % LABEL-title being set to a magic string.
+ {%
+ % Have to otherify everything special to allow the \csname to
+ % include an _ in the xref name, etc.
+ \indexnofonts
+ \turnoffactive
+ \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+ \csname XR#1-title\endcsname
+ }%
+ \iffloat\Xthisreftitle
+ % If the user specified the print name (third arg) to the ref,
+ % print it instead of our usual "Figure 1.2".
+ \ifdim\wd\printedrefnamebox = 0pt
+ \refx{#1-snt}{}%
+ \else
+ \printedrefname
+ \fi
+ %
+ % If the user also gave the printed manual name (fifth arg), append
+ % "in MANUALNAME".
+ \ifdim \wd\printedmanualbox > 0pt
+ \space \putwordin{} \cite{\printedmanual}%
+ \fi
+ \else
+ % node/anchor (non-float) references.
+ %
+ % If we use \unhbox to print the node names, TeX does not insert
+ % empty discretionaries after hyphens, which means that it will not
+ % find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens,
+ % this is a loss. Therefore, we give the text of the node name
+ % again, so it is as if TeX is seeing it for the first time.
+ %
+ \ifdim \wd\printedmanualbox > 0pt
+ % Cross-manual reference with a printed manual name.
+ %
+ \crossmanualxref{\cite{\printedmanual\unskip}}%
+ %
+ \else\ifdim \wd\infofilenamebox > 0pt
+ % Cross-manual reference with only an info filename (arg 4), no
+ % printed manual name (arg 5). This is essentially the same as
+ % the case above; we output the filename, since we have nothing else.
+ %
+ \crossmanualxref{\code{\infofilename\unskip}}%
+ %
+ \else
+ % Reference within this manual.
+ %
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % output the `[mynode]' via the macro below so it can be overridden.
+ \xrefprintnodename\printedrefname
+ %
+ % But we always want a comma and a space:
+ ,\space
+ %
+ % output the `page 3'.
+ \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+ \ifx,\tokenafterxref
+ \else\ifx.\tokenafterxref
+ \else\ifx;\tokenafterxref
+ \else\ifx)\tokenafterxref
+ \else,% add a , if xref not followed by punctuation
+ \fi\fi\fi\fi
+ \fi\fi
+ \fi
+ \endlink
+\endgroup}
+
+% Output a cross-manual xref to #1. Used just above (twice).
+%
+% Only include the text "Section ``foo'' in" if the foo is neither
+% missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply
+% "see The Foo Manual", the idea being to refer to the whole manual.
+%
+% But, this being TeX, we can't easily compare our node name against the
+% string "Top" while ignoring the possible spaces before and after in
+% the input. By adding the arbitrary 7sp below, we make it much less
+% likely that a real node name would have the same width as "Top" (e.g.,
+% in a monospaced font). Hopefully it will never happen in practice.
+%
+% For the same basic reason, we retypeset the "Top" at every
+% reference, since the current font is indeterminate.
+%
+\def\crossmanualxref#1{%
+ \setbox\toprefbox = \hbox{Top\kern7sp}%
+ \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}%
+ \ifdim \wd2 > 7sp % nonempty?
+ \ifdim \wd2 = \wd\toprefbox \else % same as Top?
+ \putwordSection{} ``\printedrefname'' \putwordin{}\space
+ \fi
+ \fi
+ #1%
+}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output. It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents. Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+ \ifnum\secno=0
+ \putwordChapter@tie \the\chapno
+ \else \ifnum\subsecno=0
+ \putwordSection@tie \the\chapno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+\def\Yappendix{%
+ \ifnum\secno=0
+ \putwordAppendix@tie @char\the\appendixno{}%
+ \else \ifnum\subsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie
+ @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+ \requireauxfile
+ {%
+ \indexnofonts
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\thisrefX
+ \csname XR#1\endcsname
+ }%
+ \ifx\thisrefX\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ {\toks0 = {#1}% avoid expansion of possibly-complex value
+ \message{\linenumber Undefined cross reference `\the\toks0'.}}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \thisrefX
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file. Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions). But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+ {% The node name might contain 8-bit characters, which in our current
+ % implementation are changed to commands like @'e. Don't let these
+ % mess up the control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safexrefname{#1}%
+ }%
+ %
+ \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref
+ %
+ % Was that xref control sequence that we just defined for a float?
+ \expandafter\iffloat\csname XR\safexrefname\endcsname
+ % it was a float, and we have the (safe) float type in \iffloattype.
+ \expandafter\let\expandafter\floatlist
+ \csname floatlist\iffloattype\endcsname
+ %
+ % Is this the first time we've seen this float type?
+ \expandafter\ifx\floatlist\relax
+ \toks0 = {\do}% yes, so just \do
+ \else
+ % had it before, so preserve previous elements in list.
+ \toks0 = \expandafter{\floatlist\do}%
+ \fi
+ %
+ % Remember this xref in the control sequence \floatlistFLOATTYPE,
+ % for later use in \listoffloats.
+ \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
+ {\safexrefname}}%
+ \fi
+}
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate at the beginning of the file.
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% Used when writing to the aux file, or when using data from it.
+\def\requireauxfile{%
+ \iflinks
+ \tryauxfile
+ % Open the new aux file. TeX will close it automatically at exit.
+ \immediate\openout\auxfile=\jobname.aux
+ \fi
+ \global\let\requireauxfile=\relax % Only do this once.
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+%
+\def\tryauxfile{%
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \readdatafile{aux}%
+ \global\havexrefstrue
+ \fi
+ \closein 1
+}
+
+\def\setupdatafile{%
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\^=\other
+ %
+ % Special characters. Should be turned off anyway, but...
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`\%=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ %
+ % This is to support \ in node names and titles, since the \
+ % characters end up in a \csname. It's easier than
+ % leaving it active and making its active definition an actual \
+ % character. What I don't understand is why it works in the *value*
+ % of the xrdef. Seems like it should be a catcode12 \, and that
+ % should not typeset properly. But it works, so I'm moving on for
+ % now. --karl, 15jan04.
+ \catcode`\\=\other
+ %
+ % Make the characters 128-255 be printing characters.
+ {\setnonasciicharscatcodenonglobal\other}%
+ %
+ % @ is our escape character in .aux files, and we need braces.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+ \setupdatafile
+ \input\jobname.#1
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for Info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+\gdef\dofootnote{%
+ \insert\footins\bgroup
+ %
+ % Nested footnotes are not supported in TeX, that would take a lot
+ % more work. (\startsavinginserts does not suffice.)
+ \let\footnote=\errfootnotenest
+ %
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \hsize=\pagewidth
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ %
+ % Invoke rest of plain TeX footnote routine.
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+\def\errfootnotenest{%
+ \errhelp=\EMsimple
+ \errmessage{Nested footnotes not supported in texinfo.tex,
+ even though they work in makeinfo; sorry}
+}
+
+\def\errfootnoteheading{%
+ \errhelp=\EMsimple
+ \errmessage{Footnotes in chapters, sections, etc., are not supported}
+}
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished. Otherwise, the insertion
+% would be lost.
+% Similarly, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes. --kasal, 16nov03.
+%
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+ \ifx \insert\ptexinsert
+ \let\insert\saveinsert
+ \else
+ \let\checkinserts\relax
+ \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+ \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+ \afterassignment\next
+ % swallow the left brace
+ \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+ \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+ {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+ \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-)
+ \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+ \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+ \next
+}
+\def\newsaveinsX #1{%
+ \csname newbox\endcsname #1%
+ \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+ \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ % Do not bother showing banner with epsf.tex v2.7k (available in
+ % doc/epsf.tex and on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\thisisundefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \else \ifx\centersub\centerV
+ % for @center @image, we need a vbox so we can have our vertical space
+ \imagevmodetrue
+ \vbox\bgroup % vbox has better behavior than vtop herev
+ \fi\fi
+ %
+ \ifimagevmode
+ \nobreak\medskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \fi
+ %
+ % Leave vertical mode so that indentation from an enclosing
+ % environment such as @quotation is respected.
+ % However, if we're at the top level, we don't want the
+ % normal paragraph indentation.
+ % On the other hand, if we are in the case of @center @image, we don't
+ % want to start a paragraph, which will create a hsize-width box and
+ % eradicate the centering.
+ \ifx\centersub\centerV\else \noindent \fi
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode
+ \medskip % space after a standalone image
+ \fi
+ \ifx\centersub\centerV \egroup \fi
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc. We don't actually implement floating yet, we always include the
+% float "here". But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc. Can't contain commas. If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label. Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored. It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+ \let\thiscaption=\empty
+ \let\thisshortcaption=\empty
+ %
+ % don't lose footnotes inside @float.
+ %
+ % BEWARE: when the floats start float, we have to issue warning whenever an
+ % insert appears inside a float which could possibly float. --kasal, 26may04
+ %
+ \startsavinginserts
+ %
+ % We can't be used inside a paragraph.
+ \par
+ %
+ \vtop\bgroup
+ \def\floattype{#1}%
+ \def\floatlabel{#2}%
+ \def\floatloc{#3}% we do nothing with this yet.
+ %
+ \ifx\floattype\empty
+ \let\safefloattype=\empty
+ \else
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ \fi
+ %
+ % If label is given but no type, we handle that as the empty type.
+ \ifx\floatlabel\empty \else
+ % We want each FLOATTYPE to be numbered separately (Figure 1,
+ % Table 1, Figure 2, ...). (And if no label, no number.)
+ %
+ \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+ \global\advance\floatno by 1
+ %
+ {%
+ % This magic value for \lastsection is output by \setref as the
+ % XREFLABEL-title value. \xrefX uses it to distinguish float
+ % labels (which have a completely different output format) from
+ % node and anchor labels. And \xrdef uses it to construct the
+ % lists of floats.
+ %
+ \edef\lastsection{\floatmagic=\safefloattype}%
+ \setref{\floatlabel}{Yfloat}%
+ }%
+ \fi
+ %
+ % start with \parskip glue, I guess.
+ \vskip\parskip
+ %
+ % Don't suppress indentation if a float happens to start a section.
+ \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption: Foo 1.1
+% @float Foo & @caption{Cap}: Foo: Cap
+% @float Foo & no caption: Foo
+% @float ,lbl & Caption{Cap}: 1.1: Cap
+% @float ,lbl & no caption: 1.1
+% @float & @caption{Cap}: Cap
+% @float & no caption:
+%
+\def\Efloat{%
+ \let\floatident = \empty
+ %
+ % In all cases, if we have a float type, it comes first.
+ \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+ %
+ % If we have an xref label, the number comes next.
+ \ifx\floatlabel\empty \else
+ \ifx\floattype\empty \else % if also had float type, need tie first.
+ \appendtomacro\floatident{\tie}%
+ \fi
+ % the number.
+ \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+ \fi
+ %
+ % Start the printed caption with what we've constructed in
+ % \floatident, but keep it separate; we need \floatident again.
+ \let\captionline = \floatident
+ %
+ \ifx\thiscaption\empty \else
+ \ifx\floatident\empty \else
+ \appendtomacro\captionline{: }% had ident, so need a colon between
+ \fi
+ %
+ % caption text.
+ \appendtomacro\captionline{\scanexp\thiscaption}%
+ \fi
+ %
+ % If we have anything to print, print it, with space before.
+ % Eventually this needs to become an \insert.
+ \ifx\captionline\empty \else
+ \vskip.5\parskip
+ \captionline
+ %
+ % Space below caption.
+ \vskip\parskip
+ \fi
+ %
+ % If have an xref label, write the list of floats info. Do this
+ % after the caption, to avoid chance of it being a breakpoint.
+ \ifx\floatlabel\empty \else
+ % Write the text that goes in the lof to the aux file as
+ % \floatlabel-lof. Besides \floatident, we include the short
+ % caption if specified, else the full caption if specified, else nothing.
+ {%
+ \requireauxfile
+ \atdummies
+ %
+ % since we read the caption text in the macro world, where ^^M
+ % is turned into a normal character, we have to scan it back, so
+ % we don't write the literal three characters "^^M" into the aux file.
+ \scanexp{%
+ \xdef\noexpand\gtemp{%
+ \ifx\thisshortcaption\empty
+ \thiscaption
+ \else
+ \thisshortcaption
+ \fi
+ }%
+ }%
+ \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+ \ifx\gtemp\empty \else : \gtemp \fi}}%
+ }%
+ \fi
+ \egroup % end of \vtop
+ %
+ % place the captured inserts
+ %
+ % BEWARE: when the floats start floating, we have to issue warning
+ % whenever an insert appears inside a float which could possibly
+ % float. --kasal, 26may04
+ %
+ \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+ \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use. Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+ \ifx#1\relax
+ % Haven't seen this figure type before.
+ \csname newcount\endcsname #1%
+ %
+ % Remember to reset this floatno at the next chap.
+ \expandafter\gdef\expandafter\resetallfloatnos
+ \expandafter{\resetallfloatnos #1=0 }%
+ \fi
+ \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value. We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref. That is, the magic
+% \lastsection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string. If so, #2 will be the
+% (safe) float type for this float. We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+ \def\temp{#1}%
+ \def\iffloattype{#2}%
+ \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+ \def\floattype{#1}% floattype
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ %
+ % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+ \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+ \ifhavexrefs
+ % if the user said @listoffloats foo but never @float foo.
+ \message{\linenumber No `\safefloattype' floats to list.}%
+ \fi
+ \else
+ \begingroup
+ \leftskip=\tocindent % indent these entries like a toc
+ \let\do=\listoffloatsdo
+ \csname floatlist\safefloattype\endcsname
+ \endgroup
+ \fi
+}
+
+% This is called on each entry in a list of floats. We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file. We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+ % Can't fully expand XR#1-lof because it can contain anything. Just
+ % pass the control sequence. On the other hand, XR#1-pg is just the
+ % page number, and we want to fully expand that so we can get a link
+ % in pdf output.
+ \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+ %
+ % use the same \entry macro we use to generate the TOC and index.
+ \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+ \writeentry
+}}
+
+
+\message{localization,}
+
+% For single-language documents, @documentlanguage is usually given very
+% early, just after @documentencoding. Single argument is the language
+% (de) or locale (de_DE) abbreviation.
+%
+{
+ \catcode`\_ = \active
+ \globaldefs=1
+\parseargdef\documentlanguage{%
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file by the name they passed if it exists.
+ \let_ = \normalunderscore % normal _ character for filename test
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \documentlanguagetrywithoutunderscore #1_\finish
+ \else
+ \globaldefs = 1 % everything in the txi-LL files needs to persist
+ \input txi-#1.tex
+ \fi
+ \closein 1
+ \endgroup % end raw TeX
+}
+%
+% If they passed de_DE, and txi-de_DE.tex doesn't exist,
+% try txi-de.tex.
+%
+\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \else
+ \globaldefs = 1 % everything in the txi-LL files needs to persist
+ \input txi-#1.tex
+ \fi
+ \closein 1
+}
+}% end of special _ catcode
+%
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? Putting it in the current
+directory should work if nowhere else does.}
+
+% This macro is called from txi-??.tex files; the first argument is the
+% \language name to set (without the "\lang@" prefix), the second and
+% third args are \{left,right}hyphenmin.
+%
+% The language names to pass are determined when the format is built.
+% See the etex.log file created at that time, e.g.,
+% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
+%
+% With TeX Live 2008, etex now includes hyphenation patterns for all
+% available languages. This means we can support hyphenation in
+% Texinfo, at least to some extent. (This still doesn't solve the
+% accented characters problem.)
+%
+\catcode`@=11
+\def\txisetlanguage#1#2#3{%
+ % do not set the language if the name is undefined in the current TeX.
+ \expandafter\ifx\csname lang@#1\endcsname \relax
+ \message{no patterns for #1}%
+ \else
+ \global\language = \csname lang@#1\endcsname
+ \fi
+ % but there is no harm in adjusting the hyphenmin values regardless.
+ \global\lefthyphenmin = #2\relax
+ \global\righthyphenmin = #3\relax
+}
+
+% Helpers for encodings.
+% Set the catcode of characters 128 through 255 to the specified number.
+%
+\def\setnonasciicharscatcode#1{%
+ \count255=128
+ \loop\ifnum\count255<256
+ \global\catcode\count255=#1\relax
+ \advance\count255 by 1
+ \repeat
+}
+
+\def\setnonasciicharscatcodenonglobal#1{%
+ \count255=128
+ \loop\ifnum\count255<256
+ \catcode\count255=#1\relax
+ \advance\count255 by 1
+ \repeat
+}
+
+% @documentencoding sets the definition of non-ASCII characters
+% according to the specified encoding.
+%
+\def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz}
+\def\documentencodingzzz#1{%
+ % Encoding being declared for the document.
+ \def\declaredencoding{\csname #1.enc\endcsname}%
+ %
+ % Supported encodings: names converted to tokens in order to be able
+ % to compare them with \ifx.
+ \def\ascii{\csname US-ASCII.enc\endcsname}%
+ \def\latnine{\csname ISO-8859-15.enc\endcsname}%
+ \def\latone{\csname ISO-8859-1.enc\endcsname}%
+ \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
+ \def\utfeight{\csname UTF-8.enc\endcsname}%
+ %
+ \ifx \declaredencoding \ascii
+ \asciichardefs
+ %
+ \else \ifx \declaredencoding \lattwo
+ \setnonasciicharscatcode\active
+ \lattwochardefs
+ %
+ \else \ifx \declaredencoding \latone
+ \setnonasciicharscatcode\active
+ \latonechardefs
+ %
+ \else \ifx \declaredencoding \latnine
+ \setnonasciicharscatcode\active
+ \latninechardefs
+ %
+ \else \ifx \declaredencoding \utfeight
+ \setnonasciicharscatcode\active
+ % since we already invoked \utfeightchardefs at the top level
+ % (below), do not re-invoke it, then our check for duplicated
+ % definitions triggers. Making non-ascii chars active is enough.
+ %
+ \else
+ \message{Ignoring unknown document encoding: #1.}%
+ %
+ \fi % utfeight
+ \fi % latnine
+ \fi % latone
+ \fi % lattwo
+ \fi % ascii
+}
+
+% emacs-page
+% A message to be logged when using a character that isn't available
+% the default font encoding (OT1).
+%
+\def\missingcharmsg#1{\message{Character missing, sorry: #1.}}
+
+% Take account of \c (plain) vs. \, (Texinfo) difference.
+\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
+
+% First, make active non-ASCII characters in order for them to be
+% correctly categorized when TeX reads the replacement text of
+% macros containing the character definitions.
+\setnonasciicharscatcode\active
+%
+% Latin1 (ISO-8859-1) character definitions.
+\def\latonechardefs{%
+ \gdef^^a0{\tie}
+ \gdef^^a1{\exclamdown}
+ \gdef^^a2{{\tcfont \char162}} % cent
+ \gdef^^a3{\pounds}
+ \gdef^^a4{{\tcfont \char164}} % currency
+ \gdef^^a5{{\tcfont \char165}} % yen
+ \gdef^^a6{{\tcfont \char166}} % broken bar
+ \gdef^^a7{\S}
+ \gdef^^a8{\"{}}
+ \gdef^^a9{\copyright}
+ \gdef^^aa{\ordf}
+ \gdef^^ab{\guillemetleft}
+ \gdef^^ac{\ensuremath\lnot}
+ \gdef^^ad{\-}
+ \gdef^^ae{\registeredsymbol}
+ \gdef^^af{\={}}
+ %
+ \gdef^^b0{\textdegree}
+ \gdef^^b1{$\pm$}
+ \gdef^^b2{$^2$}
+ \gdef^^b3{$^3$}
+ \gdef^^b4{\'{}}
+ \gdef^^b5{$\mu$}
+ \gdef^^b6{\P}
+ \gdef^^b7{\ensuremath\cdot}
+ \gdef^^b8{\cedilla\ }
+ \gdef^^b9{$^1$}
+ \gdef^^ba{\ordm}
+ \gdef^^bb{\guillemetright}
+ \gdef^^bc{$1\over4$}
+ \gdef^^bd{$1\over2$}
+ \gdef^^be{$3\over4$}
+ \gdef^^bf{\questiondown}
+ %
+ \gdef^^c0{\`A}
+ \gdef^^c1{\'A}
+ \gdef^^c2{\^A}
+ \gdef^^c3{\~A}
+ \gdef^^c4{\"A}
+ \gdef^^c5{\ringaccent A}
+ \gdef^^c6{\AE}
+ \gdef^^c7{\cedilla C}
+ \gdef^^c8{\`E}
+ \gdef^^c9{\'E}
+ \gdef^^ca{\^E}
+ \gdef^^cb{\"E}
+ \gdef^^cc{\`I}
+ \gdef^^cd{\'I}
+ \gdef^^ce{\^I}
+ \gdef^^cf{\"I}
+ %
+ \gdef^^d0{\DH}
+ \gdef^^d1{\~N}
+ \gdef^^d2{\`O}
+ \gdef^^d3{\'O}
+ \gdef^^d4{\^O}
+ \gdef^^d5{\~O}
+ \gdef^^d6{\"O}
+ \gdef^^d7{$\times$}
+ \gdef^^d8{\O}
+ \gdef^^d9{\`U}
+ \gdef^^da{\'U}
+ \gdef^^db{\^U}
+ \gdef^^dc{\"U}
+ \gdef^^dd{\'Y}
+ \gdef^^de{\TH}
+ \gdef^^df{\ss}
+ %
+ \gdef^^e0{\`a}
+ \gdef^^e1{\'a}
+ \gdef^^e2{\^a}
+ \gdef^^e3{\~a}
+ \gdef^^e4{\"a}
+ \gdef^^e5{\ringaccent a}
+ \gdef^^e6{\ae}
+ \gdef^^e7{\cedilla c}
+ \gdef^^e8{\`e}
+ \gdef^^e9{\'e}
+ \gdef^^ea{\^e}
+ \gdef^^eb{\"e}
+ \gdef^^ec{\`{\dotless i}}
+ \gdef^^ed{\'{\dotless i}}
+ \gdef^^ee{\^{\dotless i}}
+ \gdef^^ef{\"{\dotless i}}
+ %
+ \gdef^^f0{\dh}
+ \gdef^^f1{\~n}
+ \gdef^^f2{\`o}
+ \gdef^^f3{\'o}
+ \gdef^^f4{\^o}
+ \gdef^^f5{\~o}
+ \gdef^^f6{\"o}
+ \gdef^^f7{$\div$}
+ \gdef^^f8{\o}
+ \gdef^^f9{\`u}
+ \gdef^^fa{\'u}
+ \gdef^^fb{\^u}
+ \gdef^^fc{\"u}
+ \gdef^^fd{\'y}
+ \gdef^^fe{\th}
+ \gdef^^ff{\"y}
+}
+
+% Latin9 (ISO-8859-15) encoding character definitions.
+\def\latninechardefs{%
+ % Encoding is almost identical to Latin1.
+ \latonechardefs
+ %
+ \gdef^^a4{\euro}
+ \gdef^^a6{\v S}
+ \gdef^^a8{\v s}
+ \gdef^^b4{\v Z}
+ \gdef^^b8{\v z}
+ \gdef^^bc{\OE}
+ \gdef^^bd{\oe}
+ \gdef^^be{\"Y}
+}
+
+% Latin2 (ISO-8859-2) character definitions.
+\def\lattwochardefs{%
+ \gdef^^a0{\tie}
+ \gdef^^a1{\ogonek{A}}
+ \gdef^^a2{\u{}}
+ \gdef^^a3{\L}
+ \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+ \gdef^^a5{\v L}
+ \gdef^^a6{\'S}
+ \gdef^^a7{\S}
+ \gdef^^a8{\"{}}
+ \gdef^^a9{\v S}
+ \gdef^^aa{\cedilla S}
+ \gdef^^ab{\v T}
+ \gdef^^ac{\'Z}
+ \gdef^^ad{\-}
+ \gdef^^ae{\v Z}
+ \gdef^^af{\dotaccent Z}
+ %
+ \gdef^^b0{\textdegree}
+ \gdef^^b1{\ogonek{a}}
+ \gdef^^b2{\ogonek{ }}
+ \gdef^^b3{\l}
+ \gdef^^b4{\'{}}
+ \gdef^^b5{\v l}
+ \gdef^^b6{\'s}
+ \gdef^^b7{\v{}}
+ \gdef^^b8{\cedilla\ }
+ \gdef^^b9{\v s}
+ \gdef^^ba{\cedilla s}
+ \gdef^^bb{\v t}
+ \gdef^^bc{\'z}
+ \gdef^^bd{\H{}}
+ \gdef^^be{\v z}
+ \gdef^^bf{\dotaccent z}
+ %
+ \gdef^^c0{\'R}
+ \gdef^^c1{\'A}
+ \gdef^^c2{\^A}
+ \gdef^^c3{\u A}
+ \gdef^^c4{\"A}
+ \gdef^^c5{\'L}
+ \gdef^^c6{\'C}
+ \gdef^^c7{\cedilla C}
+ \gdef^^c8{\v C}
+ \gdef^^c9{\'E}
+ \gdef^^ca{\ogonek{E}}
+ \gdef^^cb{\"E}
+ \gdef^^cc{\v E}
+ \gdef^^cd{\'I}
+ \gdef^^ce{\^I}
+ \gdef^^cf{\v D}
+ %
+ \gdef^^d0{\DH}
+ \gdef^^d1{\'N}
+ \gdef^^d2{\v N}
+ \gdef^^d3{\'O}
+ \gdef^^d4{\^O}
+ \gdef^^d5{\H O}
+ \gdef^^d6{\"O}
+ \gdef^^d7{$\times$}
+ \gdef^^d8{\v R}
+ \gdef^^d9{\ringaccent U}
+ \gdef^^da{\'U}
+ \gdef^^db{\H U}
+ \gdef^^dc{\"U}
+ \gdef^^dd{\'Y}
+ \gdef^^de{\cedilla T}
+ \gdef^^df{\ss}
+ %
+ \gdef^^e0{\'r}
+ \gdef^^e1{\'a}
+ \gdef^^e2{\^a}
+ \gdef^^e3{\u a}
+ \gdef^^e4{\"a}
+ \gdef^^e5{\'l}
+ \gdef^^e6{\'c}
+ \gdef^^e7{\cedilla c}
+ \gdef^^e8{\v c}
+ \gdef^^e9{\'e}
+ \gdef^^ea{\ogonek{e}}
+ \gdef^^eb{\"e}
+ \gdef^^ec{\v e}
+ \gdef^^ed{\'{\dotless{i}}}
+ \gdef^^ee{\^{\dotless{i}}}
+ \gdef^^ef{\v d}
+ %
+ \gdef^^f0{\dh}
+ \gdef^^f1{\'n}
+ \gdef^^f2{\v n}
+ \gdef^^f3{\'o}
+ \gdef^^f4{\^o}
+ \gdef^^f5{\H o}
+ \gdef^^f6{\"o}
+ \gdef^^f7{$\div$}
+ \gdef^^f8{\v r}
+ \gdef^^f9{\ringaccent u}
+ \gdef^^fa{\'u}
+ \gdef^^fb{\H u}
+ \gdef^^fc{\"u}
+ \gdef^^fd{\'y}
+ \gdef^^fe{\cedilla t}
+ \gdef^^ff{\dotaccent{}}
+}
+
+% UTF-8 character definitions.
+%
+% This code to support UTF-8 is based on LaTeX's utf8.def, with some
+% changes for Texinfo conventions. It is included here under the GPL by
+% permission from Frank Mittelbach and the LaTeX team.
+%
+\newcount\countUTFx
+\newcount\countUTFy
+\newcount\countUTFz
+
+\gdef\UTFviiiTwoOctets#1#2{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\endcsname}
+%
+\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
+%
+\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
+
+\gdef\UTFviiiDefined#1{%
+ \ifx #1\relax
+ \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
+ \else
+ \expandafter #1%
+ \fi
+}
+
+\begingroup
+ \catcode`\~13
+ \catcode`\"12
+
+ \def\UTFviiiLoop{%
+ \global\catcode\countUTFx\active
+ \uccode`\~\countUTFx
+ \uppercase\expandafter{\UTFviiiTmp}%
+ \advance\countUTFx by 1
+ \ifnum\countUTFx < \countUTFy
+ \expandafter\UTFviiiLoop
+ \fi}
+
+ \countUTFx = "C2
+ \countUTFy = "E0
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiTwoOctets\string~}}
+ \UTFviiiLoop
+
+ \countUTFx = "E0
+ \countUTFy = "F0
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiThreeOctets\string~}}
+ \UTFviiiLoop
+
+ \countUTFx = "F0
+ \countUTFy = "F4
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiFourOctets\string~}}
+ \UTFviiiLoop
+\endgroup
+
+\def\globallet{\global\let} % save some \expandafter's below
+
+% @U{xxxx} to produce U+xxxx, if we support it.
+\def\U#1{%
+ \expandafter\ifx\csname uni:#1\endcsname \relax
+ \errhelp = \EMsimple
+ \errmessage{Unicode character U+#1 not supported, sorry}%
+ \else
+ \csname uni:#1\endcsname
+ \fi
+}
+
+\begingroup
+ \catcode`\"=12
+ \catcode`\<=12
+ \catcode`\.=12
+ \catcode`\,=12
+ \catcode`\;=12
+ \catcode`\!=12
+ \catcode`\~=13
+ \gdef\DeclareUnicodeCharacter#1#2{%
+ \countUTFz = "#1\relax
+ %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%
+ \begingroup
+ \parseXMLCharref
+ \def\UTFviiiTwoOctets##1##2{%
+ \csname u8:##1\string ##2\endcsname}%
+ \def\UTFviiiThreeOctets##1##2##3{%
+ \csname u8:##1\string ##2\string ##3\endcsname}%
+ \def\UTFviiiFourOctets##1##2##3##4{%
+ \csname u8:##1\string ##2\string ##3\string ##4\endcsname}%
+ \expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter
+ \gdef\UTFviiiTmp{#2}%
+ %
+ \expandafter\ifx\csname uni:#1\endcsname \relax \else
+ \message{Internal error, already defined: #1}%
+ \fi
+ %
+ % define an additional control sequence for this code point.
+ \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp
+ \endgroup}
+
+ \gdef\parseXMLCharref{%
+ \ifnum\countUTFz < "A0\relax
+ \errhelp = \EMsimple
+ \errmessage{Cannot define Unicode char value < 00A0}%
+ \else\ifnum\countUTFz < "800\relax
+ \parseUTFviiiA,%
+ \parseUTFviiiB C\UTFviiiTwoOctets.,%
+ \else\ifnum\countUTFz < "10000\relax
+ \parseUTFviiiA;%
+ \parseUTFviiiA,%
+ \parseUTFviiiB E\UTFviiiThreeOctets.{,;}%
+ \else
+ \parseUTFviiiA;%
+ \parseUTFviiiA,%
+ \parseUTFviiiA!%
+ \parseUTFviiiB F\UTFviiiFourOctets.{!,;}%
+ \fi\fi\fi
+ }
+
+ \gdef\parseUTFviiiA#1{%
+ \countUTFx = \countUTFz
+ \divide\countUTFz by 64
+ \countUTFy = \countUTFz
+ \multiply\countUTFz by 64
+ \advance\countUTFx by -\countUTFz
+ \advance\countUTFx by 128
+ \uccode `#1\countUTFx
+ \countUTFz = \countUTFy}
+
+ \gdef\parseUTFviiiB#1#2#3#4{%
+ \advance\countUTFz by "#10\relax
+ \uccode `#3\countUTFz
+ \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
+\endgroup
+
+% https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M
+% U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)
+% U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)
+% U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A
+% U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B
+%
+% Many of our renditions are less than wonderful, and all the missing
+% characters are available somewhere. Loading the necessary fonts
+% awaits user request. We can't truly support Unicode without
+% reimplementing everything that's been done in LaTeX for many years,
+% plus probably using luatex or xetex, and who knows what else.
+% We won't be doing that here in this simple file. But we can try to at
+% least make most of the characters not bomb out.
+%
+\def\utfeightchardefs{%
+ \DeclareUnicodeCharacter{00A0}{\tie}
+ \DeclareUnicodeCharacter{00A1}{\exclamdown}
+ \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent
+ \DeclareUnicodeCharacter{00A3}{\pounds}
+ \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency
+ \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen
+ \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar
+ \DeclareUnicodeCharacter{00A7}{\S}
+ \DeclareUnicodeCharacter{00A8}{\"{ }}
+ \DeclareUnicodeCharacter{00A9}{\copyright}
+ \DeclareUnicodeCharacter{00AA}{\ordf}
+ \DeclareUnicodeCharacter{00AB}{\guillemetleft}
+ \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}
+ \DeclareUnicodeCharacter{00AD}{\-}
+ \DeclareUnicodeCharacter{00AE}{\registeredsymbol}
+ \DeclareUnicodeCharacter{00AF}{\={ }}
+
+ \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
+ \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}
+ \DeclareUnicodeCharacter{00B2}{$^2$}
+ \DeclareUnicodeCharacter{00B3}{$^3$}
+ \DeclareUnicodeCharacter{00B4}{\'{ }}
+ \DeclareUnicodeCharacter{00B5}{$\mu$}
+ \DeclareUnicodeCharacter{00B6}{\P}
+ \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}
+ \DeclareUnicodeCharacter{00B8}{\cedilla{ }}
+ \DeclareUnicodeCharacter{00B9}{$^1$}
+ \DeclareUnicodeCharacter{00BA}{\ordm}
+ \DeclareUnicodeCharacter{00BB}{\guillemetright}
+ \DeclareUnicodeCharacter{00BC}{$1\over4$}
+ \DeclareUnicodeCharacter{00BD}{$1\over2$}
+ \DeclareUnicodeCharacter{00BE}{$3\over4$}
+ \DeclareUnicodeCharacter{00BF}{\questiondown}
+
+ \DeclareUnicodeCharacter{00C0}{\`A}
+ \DeclareUnicodeCharacter{00C1}{\'A}
+ \DeclareUnicodeCharacter{00C2}{\^A}
+ \DeclareUnicodeCharacter{00C3}{\~A}
+ \DeclareUnicodeCharacter{00C4}{\"A}
+ \DeclareUnicodeCharacter{00C5}{\AA}
+ \DeclareUnicodeCharacter{00C6}{\AE}
+ \DeclareUnicodeCharacter{00C7}{\cedilla{C}}
+ \DeclareUnicodeCharacter{00C8}{\`E}
+ \DeclareUnicodeCharacter{00C9}{\'E}
+ \DeclareUnicodeCharacter{00CA}{\^E}
+ \DeclareUnicodeCharacter{00CB}{\"E}
+ \DeclareUnicodeCharacter{00CC}{\`I}
+ \DeclareUnicodeCharacter{00CD}{\'I}
+ \DeclareUnicodeCharacter{00CE}{\^I}
+ \DeclareUnicodeCharacter{00CF}{\"I}
+
+ \DeclareUnicodeCharacter{00D0}{\DH}
+ \DeclareUnicodeCharacter{00D1}{\~N}
+ \DeclareUnicodeCharacter{00D2}{\`O}
+ \DeclareUnicodeCharacter{00D3}{\'O}
+ \DeclareUnicodeCharacter{00D4}{\^O}
+ \DeclareUnicodeCharacter{00D5}{\~O}
+ \DeclareUnicodeCharacter{00D6}{\"O}
+ \DeclareUnicodeCharacter{00D7}{\ensuremath\times}
+ \DeclareUnicodeCharacter{00D8}{\O}
+ \DeclareUnicodeCharacter{00D9}{\`U}
+ \DeclareUnicodeCharacter{00DA}{\'U}
+ \DeclareUnicodeCharacter{00DB}{\^U}
+ \DeclareUnicodeCharacter{00DC}{\"U}
+ \DeclareUnicodeCharacter{00DD}{\'Y}
+ \DeclareUnicodeCharacter{00DE}{\TH}
+ \DeclareUnicodeCharacter{00DF}{\ss}
+
+ \DeclareUnicodeCharacter{00E0}{\`a}
+ \DeclareUnicodeCharacter{00E1}{\'a}
+ \DeclareUnicodeCharacter{00E2}{\^a}
+ \DeclareUnicodeCharacter{00E3}{\~a}
+ \DeclareUnicodeCharacter{00E4}{\"a}
+ \DeclareUnicodeCharacter{00E5}{\aa}
+ \DeclareUnicodeCharacter{00E6}{\ae}
+ \DeclareUnicodeCharacter{00E7}{\cedilla{c}}
+ \DeclareUnicodeCharacter{00E8}{\`e}
+ \DeclareUnicodeCharacter{00E9}{\'e}
+ \DeclareUnicodeCharacter{00EA}{\^e}
+ \DeclareUnicodeCharacter{00EB}{\"e}
+ \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}
+ \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}
+ \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}
+ \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}
+
+ \DeclareUnicodeCharacter{00F0}{\dh}
+ \DeclareUnicodeCharacter{00F1}{\~n}
+ \DeclareUnicodeCharacter{00F2}{\`o}
+ \DeclareUnicodeCharacter{00F3}{\'o}
+ \DeclareUnicodeCharacter{00F4}{\^o}
+ \DeclareUnicodeCharacter{00F5}{\~o}
+ \DeclareUnicodeCharacter{00F6}{\"o}
+ \DeclareUnicodeCharacter{00F7}{\ensuremath\div}
+ \DeclareUnicodeCharacter{00F8}{\o}
+ \DeclareUnicodeCharacter{00F9}{\`u}
+ \DeclareUnicodeCharacter{00FA}{\'u}
+ \DeclareUnicodeCharacter{00FB}{\^u}
+ \DeclareUnicodeCharacter{00FC}{\"u}
+ \DeclareUnicodeCharacter{00FD}{\'y}
+ \DeclareUnicodeCharacter{00FE}{\th}
+ \DeclareUnicodeCharacter{00FF}{\"y}
+
+ \DeclareUnicodeCharacter{0100}{\=A}
+ \DeclareUnicodeCharacter{0101}{\=a}
+ \DeclareUnicodeCharacter{0102}{\u{A}}
+ \DeclareUnicodeCharacter{0103}{\u{a}}
+ \DeclareUnicodeCharacter{0104}{\ogonek{A}}
+ \DeclareUnicodeCharacter{0105}{\ogonek{a}}
+ \DeclareUnicodeCharacter{0106}{\'C}
+ \DeclareUnicodeCharacter{0107}{\'c}
+ \DeclareUnicodeCharacter{0108}{\^C}
+ \DeclareUnicodeCharacter{0109}{\^c}
+ \DeclareUnicodeCharacter{010A}{\dotaccent{C}}
+ \DeclareUnicodeCharacter{010B}{\dotaccent{c}}
+ \DeclareUnicodeCharacter{010C}{\v{C}}
+ \DeclareUnicodeCharacter{010D}{\v{c}}
+ \DeclareUnicodeCharacter{010E}{\v{D}}
+ \DeclareUnicodeCharacter{010F}{d'}
+
+ \DeclareUnicodeCharacter{0110}{\DH}
+ \DeclareUnicodeCharacter{0111}{\dh}
+ \DeclareUnicodeCharacter{0112}{\=E}
+ \DeclareUnicodeCharacter{0113}{\=e}
+ \DeclareUnicodeCharacter{0114}{\u{E}}
+ \DeclareUnicodeCharacter{0115}{\u{e}}
+ \DeclareUnicodeCharacter{0116}{\dotaccent{E}}
+ \DeclareUnicodeCharacter{0117}{\dotaccent{e}}
+ \DeclareUnicodeCharacter{0118}{\ogonek{E}}
+ \DeclareUnicodeCharacter{0119}{\ogonek{e}}
+ \DeclareUnicodeCharacter{011A}{\v{E}}
+ \DeclareUnicodeCharacter{011B}{\v{e}}
+ \DeclareUnicodeCharacter{011C}{\^G}
+ \DeclareUnicodeCharacter{011D}{\^g}
+ \DeclareUnicodeCharacter{011E}{\u{G}}
+ \DeclareUnicodeCharacter{011F}{\u{g}}
+
+ \DeclareUnicodeCharacter{0120}{\dotaccent{G}}
+ \DeclareUnicodeCharacter{0121}{\dotaccent{g}}
+ \DeclareUnicodeCharacter{0122}{\cedilla{G}}
+ \DeclareUnicodeCharacter{0123}{\cedilla{g}}
+ \DeclareUnicodeCharacter{0124}{\^H}
+ \DeclareUnicodeCharacter{0125}{\^h}
+ \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}
+ \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}
+ \DeclareUnicodeCharacter{0128}{\~I}
+ \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}
+ \DeclareUnicodeCharacter{012A}{\=I}
+ \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}
+ \DeclareUnicodeCharacter{012C}{\u{I}}
+ \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}
+ \DeclareUnicodeCharacter{012E}{\ogonek{I}}
+ \DeclareUnicodeCharacter{012F}{\ogonek{i}}
+
+ \DeclareUnicodeCharacter{0130}{\dotaccent{I}}
+ \DeclareUnicodeCharacter{0131}{\dotless{i}}
+ \DeclareUnicodeCharacter{0132}{IJ}
+ \DeclareUnicodeCharacter{0133}{ij}
+ \DeclareUnicodeCharacter{0134}{\^J}
+ \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
+ \DeclareUnicodeCharacter{0136}{\cedilla{K}}
+ \DeclareUnicodeCharacter{0137}{\cedilla{k}}
+ \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}
+ \DeclareUnicodeCharacter{0139}{\'L}
+ \DeclareUnicodeCharacter{013A}{\'l}
+ \DeclareUnicodeCharacter{013B}{\cedilla{L}}
+ \DeclareUnicodeCharacter{013C}{\cedilla{l}}
+ \DeclareUnicodeCharacter{013D}{L'}% should kern
+ \DeclareUnicodeCharacter{013E}{l'}% should kern
+ \DeclareUnicodeCharacter{013F}{L\U{00B7}}
+
+ \DeclareUnicodeCharacter{0140}{l\U{00B7}}
+ \DeclareUnicodeCharacter{0141}{\L}
+ \DeclareUnicodeCharacter{0142}{\l}
+ \DeclareUnicodeCharacter{0143}{\'N}
+ \DeclareUnicodeCharacter{0144}{\'n}
+ \DeclareUnicodeCharacter{0145}{\cedilla{N}}
+ \DeclareUnicodeCharacter{0146}{\cedilla{n}}
+ \DeclareUnicodeCharacter{0147}{\v{N}}
+ \DeclareUnicodeCharacter{0148}{\v{n}}
+ \DeclareUnicodeCharacter{0149}{'n}
+ \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}
+ \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}
+ \DeclareUnicodeCharacter{014C}{\=O}
+ \DeclareUnicodeCharacter{014D}{\=o}
+ \DeclareUnicodeCharacter{014E}{\u{O}}
+ \DeclareUnicodeCharacter{014F}{\u{o}}
+
+ \DeclareUnicodeCharacter{0150}{\H{O}}
+ \DeclareUnicodeCharacter{0151}{\H{o}}
+ \DeclareUnicodeCharacter{0152}{\OE}
+ \DeclareUnicodeCharacter{0153}{\oe}
+ \DeclareUnicodeCharacter{0154}{\'R}
+ \DeclareUnicodeCharacter{0155}{\'r}
+ \DeclareUnicodeCharacter{0156}{\cedilla{R}}
+ \DeclareUnicodeCharacter{0157}{\cedilla{r}}
+ \DeclareUnicodeCharacter{0158}{\v{R}}
+ \DeclareUnicodeCharacter{0159}{\v{r}}
+ \DeclareUnicodeCharacter{015A}{\'S}
+ \DeclareUnicodeCharacter{015B}{\'s}
+ \DeclareUnicodeCharacter{015C}{\^S}
+ \DeclareUnicodeCharacter{015D}{\^s}
+ \DeclareUnicodeCharacter{015E}{\cedilla{S}}
+ \DeclareUnicodeCharacter{015F}{\cedilla{s}}
+
+ \DeclareUnicodeCharacter{0160}{\v{S}}
+ \DeclareUnicodeCharacter{0161}{\v{s}}
+ \DeclareUnicodeCharacter{0162}{\cedilla{T}}
+ \DeclareUnicodeCharacter{0163}{\cedilla{t}}
+ \DeclareUnicodeCharacter{0164}{\v{T}}
+ \DeclareUnicodeCharacter{0165}{\v{t}}
+ \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}
+ \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}
+ \DeclareUnicodeCharacter{0168}{\~U}
+ \DeclareUnicodeCharacter{0169}{\~u}
+ \DeclareUnicodeCharacter{016A}{\=U}
+ \DeclareUnicodeCharacter{016B}{\=u}
+ \DeclareUnicodeCharacter{016C}{\u{U}}
+ \DeclareUnicodeCharacter{016D}{\u{u}}
+ \DeclareUnicodeCharacter{016E}{\ringaccent{U}}
+ \DeclareUnicodeCharacter{016F}{\ringaccent{u}}
+
+ \DeclareUnicodeCharacter{0170}{\H{U}}
+ \DeclareUnicodeCharacter{0171}{\H{u}}
+ \DeclareUnicodeCharacter{0172}{\ogonek{U}}
+ \DeclareUnicodeCharacter{0173}{\ogonek{u}}
+ \DeclareUnicodeCharacter{0174}{\^W}
+ \DeclareUnicodeCharacter{0175}{\^w}
+ \DeclareUnicodeCharacter{0176}{\^Y}
+ \DeclareUnicodeCharacter{0177}{\^y}
+ \DeclareUnicodeCharacter{0178}{\"Y}
+ \DeclareUnicodeCharacter{0179}{\'Z}
+ \DeclareUnicodeCharacter{017A}{\'z}
+ \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}
+ \DeclareUnicodeCharacter{017C}{\dotaccent{z}}
+ \DeclareUnicodeCharacter{017D}{\v{Z}}
+ \DeclareUnicodeCharacter{017E}{\v{z}}
+ \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}}
+
+ \DeclareUnicodeCharacter{01C4}{D\v{Z}}
+ \DeclareUnicodeCharacter{01C5}{D\v{z}}
+ \DeclareUnicodeCharacter{01C6}{d\v{z}}
+ \DeclareUnicodeCharacter{01C7}{LJ}
+ \DeclareUnicodeCharacter{01C8}{Lj}
+ \DeclareUnicodeCharacter{01C9}{lj}
+ \DeclareUnicodeCharacter{01CA}{NJ}
+ \DeclareUnicodeCharacter{01CB}{Nj}
+ \DeclareUnicodeCharacter{01CC}{nj}
+ \DeclareUnicodeCharacter{01CD}{\v{A}}
+ \DeclareUnicodeCharacter{01CE}{\v{a}}
+ \DeclareUnicodeCharacter{01CF}{\v{I}}
+
+ \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}
+ \DeclareUnicodeCharacter{01D1}{\v{O}}
+ \DeclareUnicodeCharacter{01D2}{\v{o}}
+ \DeclareUnicodeCharacter{01D3}{\v{U}}
+ \DeclareUnicodeCharacter{01D4}{\v{u}}
+
+ \DeclareUnicodeCharacter{01E2}{\={\AE}}
+ \DeclareUnicodeCharacter{01E3}{\={\ae}}
+ \DeclareUnicodeCharacter{01E6}{\v{G}}
+ \DeclareUnicodeCharacter{01E7}{\v{g}}
+ \DeclareUnicodeCharacter{01E8}{\v{K}}
+ \DeclareUnicodeCharacter{01E9}{\v{k}}
+
+ \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}
+ \DeclareUnicodeCharacter{01F1}{DZ}
+ \DeclareUnicodeCharacter{01F2}{Dz}
+ \DeclareUnicodeCharacter{01F3}{dz}
+ \DeclareUnicodeCharacter{01F4}{\'G}
+ \DeclareUnicodeCharacter{01F5}{\'g}
+ \DeclareUnicodeCharacter{01F8}{\`N}
+ \DeclareUnicodeCharacter{01F9}{\`n}
+ \DeclareUnicodeCharacter{01FC}{\'{\AE}}
+ \DeclareUnicodeCharacter{01FD}{\'{\ae}}
+ \DeclareUnicodeCharacter{01FE}{\'{\O}}
+ \DeclareUnicodeCharacter{01FF}{\'{\o}}
+
+ \DeclareUnicodeCharacter{021E}{\v{H}}
+ \DeclareUnicodeCharacter{021F}{\v{h}}
+
+ \DeclareUnicodeCharacter{0226}{\dotaccent{A}}
+ \DeclareUnicodeCharacter{0227}{\dotaccent{a}}
+ \DeclareUnicodeCharacter{0228}{\cedilla{E}}
+ \DeclareUnicodeCharacter{0229}{\cedilla{e}}
+ \DeclareUnicodeCharacter{022E}{\dotaccent{O}}
+ \DeclareUnicodeCharacter{022F}{\dotaccent{o}}
+
+ \DeclareUnicodeCharacter{0232}{\=Y}
+ \DeclareUnicodeCharacter{0233}{\=y}
+ \DeclareUnicodeCharacter{0237}{\dotless{j}}
+
+ \DeclareUnicodeCharacter{02DB}{\ogonek{ }}
+
+ % Greek letters upper case
+ \DeclareUnicodeCharacter{0391}{{\it A}}
+ \DeclareUnicodeCharacter{0392}{{\it B}}
+ \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}
+ \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}
+ \DeclareUnicodeCharacter{0395}{{\it E}}
+ \DeclareUnicodeCharacter{0396}{{\it Z}}
+ \DeclareUnicodeCharacter{0397}{{\it H}}
+ \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}
+ \DeclareUnicodeCharacter{0399}{{\it I}}
+ \DeclareUnicodeCharacter{039A}{{\it K}}
+ \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}
+ \DeclareUnicodeCharacter{039C}{{\it M}}
+ \DeclareUnicodeCharacter{039D}{{\it N}}
+ \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}
+ \DeclareUnicodeCharacter{039F}{{\it O}}
+ \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}
+ \DeclareUnicodeCharacter{03A1}{{\it P}}
+ %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma
+ \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}
+ \DeclareUnicodeCharacter{03A4}{{\it T}}
+ \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}
+ \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}
+ \DeclareUnicodeCharacter{03A7}{{\it X}}
+ \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}
+ \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}
+
+ % Vowels with accents
+ \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}
+ \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}
+ \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}
+ \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}
+ \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}
+ \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}
+
+ % Standalone accent
+ \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}
+
+ % Greek letters lower case
+ \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}
+ \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}
+ \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}
+ \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}
+ \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}
+ \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}
+ \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}
+ \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}
+ \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}
+ \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}
+ \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}
+ \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}
+ \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}
+ \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}
+ \DeclareUnicodeCharacter{03BF}{{\it o}} % omicron
+ \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}
+ \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}
+ \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}
+ \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}
+ \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}
+ \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}
+ \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}
+ \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}
+ \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}
+ \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}
+
+ % More Greek vowels with accents
+ \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}
+ \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}
+ \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}
+ \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}
+ \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}
+
+ % Variant Greek letters
+ \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}
+ \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}
+ \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}
+
+ \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}
+ \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}
+ \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}
+ \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}
+ \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}
+ \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}
+ \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}
+ \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}
+ \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}
+ \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}
+ \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}
+ \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}
+
+ \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}
+ \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}
+
+ \DeclareUnicodeCharacter{1E20}{\=G}
+ \DeclareUnicodeCharacter{1E21}{\=g}
+ \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}
+ \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}
+ \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}
+ \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}
+ \DeclareUnicodeCharacter{1E26}{\"H}
+ \DeclareUnicodeCharacter{1E27}{\"h}
+
+ \DeclareUnicodeCharacter{1E30}{\'K}
+ \DeclareUnicodeCharacter{1E31}{\'k}
+ \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}
+ \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}
+ \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}
+ \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}
+ \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}
+ \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}
+ \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}
+ \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}
+ \DeclareUnicodeCharacter{1E3E}{\'M}
+ \DeclareUnicodeCharacter{1E3F}{\'m}
+
+ \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}
+ \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}
+ \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}
+ \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}
+ \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}
+ \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}
+ \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}
+ \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}
+ \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}
+ \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}
+
+ \DeclareUnicodeCharacter{1E54}{\'P}
+ \DeclareUnicodeCharacter{1E55}{\'p}
+ \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}
+ \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}
+ \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}
+ \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}
+ \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}
+ \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}
+ \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}
+ \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}
+
+ \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}
+ \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}
+ \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}
+ \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}
+ \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}
+ \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}
+ \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}
+ \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}
+ \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}
+ \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}
+
+ \DeclareUnicodeCharacter{1E7C}{\~V}
+ \DeclareUnicodeCharacter{1E7D}{\~v}
+ \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}
+ \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}
+
+ \DeclareUnicodeCharacter{1E80}{\`W}
+ \DeclareUnicodeCharacter{1E81}{\`w}
+ \DeclareUnicodeCharacter{1E82}{\'W}
+ \DeclareUnicodeCharacter{1E83}{\'w}
+ \DeclareUnicodeCharacter{1E84}{\"W}
+ \DeclareUnicodeCharacter{1E85}{\"w}
+ \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}
+ \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}
+ \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}
+ \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}
+ \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}
+ \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}
+ \DeclareUnicodeCharacter{1E8C}{\"X}
+ \DeclareUnicodeCharacter{1E8D}{\"x}
+ \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}
+ \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}
+
+ \DeclareUnicodeCharacter{1E90}{\^Z}
+ \DeclareUnicodeCharacter{1E91}{\^z}
+ \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}
+ \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}
+ \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}
+ \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}
+ \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}
+ \DeclareUnicodeCharacter{1E97}{\"t}
+ \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}
+ \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}
+
+ \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}
+ \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}
+
+ \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}
+ \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}
+ \DeclareUnicodeCharacter{1EBC}{\~E}
+ \DeclareUnicodeCharacter{1EBD}{\~e}
+
+ \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}
+ \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}
+ \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}
+ \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}
+
+ \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}
+ \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}
+
+ \DeclareUnicodeCharacter{1EF2}{\`Y}
+ \DeclareUnicodeCharacter{1EF3}{\`y}
+ \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}
+
+ \DeclareUnicodeCharacter{1EF8}{\~Y}
+ \DeclareUnicodeCharacter{1EF9}{\~y}
+
+ % Punctuation
+ \DeclareUnicodeCharacter{2013}{--}
+ \DeclareUnicodeCharacter{2014}{---}
+ \DeclareUnicodeCharacter{2018}{\quoteleft}
+ \DeclareUnicodeCharacter{2019}{\quoteright}
+ \DeclareUnicodeCharacter{201A}{\quotesinglbase}
+ \DeclareUnicodeCharacter{201C}{\quotedblleft}
+ \DeclareUnicodeCharacter{201D}{\quotedblright}
+ \DeclareUnicodeCharacter{201E}{\quotedblbase}
+ \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}
+ \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}
+ \DeclareUnicodeCharacter{2022}{\bullet}
+ \DeclareUnicodeCharacter{202F}{\thinspace}
+ \DeclareUnicodeCharacter{2026}{\dots}
+ \DeclareUnicodeCharacter{2039}{\guilsinglleft}
+ \DeclareUnicodeCharacter{203A}{\guilsinglright}
+
+ \DeclareUnicodeCharacter{20AC}{\euro}
+
+ \DeclareUnicodeCharacter{2192}{\expansion}
+ \DeclareUnicodeCharacter{21D2}{\result}
+
+ % Mathematical symbols
+ \DeclareUnicodeCharacter{2200}{\ensuremath\forall}
+ \DeclareUnicodeCharacter{2203}{\ensuremath\exists}
+ \DeclareUnicodeCharacter{2208}{\ensuremath\in}
+ \DeclareUnicodeCharacter{2212}{\minus}
+ \DeclareUnicodeCharacter{2217}{\ast}
+ \DeclareUnicodeCharacter{221E}{\ensuremath\infty}
+ \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}
+ \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}
+ \DeclareUnicodeCharacter{2229}{\ensuremath\cap}
+ \DeclareUnicodeCharacter{2261}{\equiv}
+ \DeclareUnicodeCharacter{2264}{\ensuremath\leq}
+ \DeclareUnicodeCharacter{2265}{\ensuremath\geq}
+ \DeclareUnicodeCharacter{2282}{\ensuremath\subset}
+ \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}
+
+ \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}
+ \DeclareUnicodeCharacter{2032}{\ensuremath\prime}
+ \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}
+ \DeclareUnicodeCharacter{2111}{\ensuremath\Im}
+ \DeclareUnicodeCharacter{2113}{\ensuremath\ell}
+ \DeclareUnicodeCharacter{2118}{\ensuremath\wp}
+ \DeclareUnicodeCharacter{211C}{\ensuremath\Re}
+ \DeclareUnicodeCharacter{2127}{\ensuremath\mho}
+ \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}
+ \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}
+ \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}
+ \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}
+ \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}
+ \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}
+ \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}
+ \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}
+ \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}
+ \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}
+ \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}
+ \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}
+ \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}
+ \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}
+ \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}
+ \DeclareUnicodeCharacter{21BE}{\ensuremath\upharpoonright}
+ \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}
+ \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}
+ \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}
+ \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}
+ \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}
+ \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}
+ \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}
+ \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}
+ \DeclareUnicodeCharacter{21DD}{\ensuremath\leadsto}
+ \DeclareUnicodeCharacter{2201}{\ensuremath\complement}
+ \DeclareUnicodeCharacter{2202}{\ensuremath\partial}
+ \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}
+ \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}
+ \DeclareUnicodeCharacter{2209}{\ensuremath\notin}
+ \DeclareUnicodeCharacter{220B}{\ensuremath\owns}
+ \DeclareUnicodeCharacter{220F}{\ensuremath\prod}
+ \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}
+ \DeclareUnicodeCharacter{2211}{\ensuremath\sum}
+ \DeclareUnicodeCharacter{2213}{\ensuremath\mp}
+ \DeclareUnicodeCharacter{2218}{\ensuremath\circ}
+ \DeclareUnicodeCharacter{221A}{\ensuremath\surd}
+ \DeclareUnicodeCharacter{221D}{\ensuremath\propto}
+ \DeclareUnicodeCharacter{2220}{\ensuremath\angle}
+ \DeclareUnicodeCharacter{2223}{\ensuremath\mid}
+ \DeclareUnicodeCharacter{2228}{\ensuremath\vee}
+ \DeclareUnicodeCharacter{222A}{\ensuremath\cup}
+ \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}
+ \DeclareUnicodeCharacter{222E}{\ensuremath\oint}
+ \DeclareUnicodeCharacter{223C}{\ensuremath\sim}
+ \DeclareUnicodeCharacter{2240}{\ensuremath\wr}
+ \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}
+ \DeclareUnicodeCharacter{2245}{\ensuremath\cong}
+ \DeclareUnicodeCharacter{2248}{\ensuremath\approx}
+ \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}
+ \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}
+ \DeclareUnicodeCharacter{2260}{\ensuremath\neq}
+ \DeclareUnicodeCharacter{226A}{\ensuremath\ll}
+ \DeclareUnicodeCharacter{226B}{\ensuremath\gg}
+ \DeclareUnicodeCharacter{227A}{\ensuremath\prec}
+ \DeclareUnicodeCharacter{227B}{\ensuremath\succ}
+ \DeclareUnicodeCharacter{2283}{\ensuremath\supset}
+ \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}
+ \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}
+ \DeclareUnicodeCharacter{228F}{\ensuremath\sqsubset}
+ \DeclareUnicodeCharacter{2290}{\ensuremath\sqsupset}
+ \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}
+ \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}
+ \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}
+ \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}
+ \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}
+ \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}
+ \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}
+ \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}
+ \DeclareUnicodeCharacter{2299}{\ensuremath\odot}
+ \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}
+ \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}
+ \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}
+ \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}
+ \DeclareUnicodeCharacter{22A8}{\ensuremath\models}
+ \DeclareUnicodeCharacter{22B4}{\ensuremath\unlhd}
+ \DeclareUnicodeCharacter{22B5}{\ensuremath\unrhd}
+ \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}
+ \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}
+ \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}
+ \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}
+ \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}
+ \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}
+ \DeclareUnicodeCharacter{22C6}{\ensuremath\star}
+ \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}
+ \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}
+ \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}
+ \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}
+ \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}
+ \DeclareUnicodeCharacter{2322}{\ensuremath\frown}
+ \DeclareUnicodeCharacter{2323}{\ensuremath\smile}
+
+ \DeclareUnicodeCharacter{25A1}{\ensuremath\Box}
+ \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}
+ \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}
+ \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}
+ \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}
+ \DeclareUnicodeCharacter{25C7}{\ensuremath\Diamond}
+ \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}
+ \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}
+ \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}
+ \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}
+ \DeclareUnicodeCharacter{266D}{\ensuremath\flat}
+ \DeclareUnicodeCharacter{266E}{\ensuremath\natural}
+ \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}
+ \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}
+ \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}
+ \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}
+ \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}
+ \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}
+ \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}
+ \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}
+ \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}
+ \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}
+ \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}
+ \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}
+ \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}
+ \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}
+ \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}
+ \DeclareUnicodeCharacter{2A1D}{\ensuremath\Join}
+ \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}
+ \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}
+ \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}
+
+ \global\mathchardef\checkmark="1370 % actually the square root sign
+ \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}
+}% end of \utfeightchardefs
+
+% US-ASCII character definitions.
+\def\asciichardefs{% nothing need be done
+ \relax
+}
+
+% Latin1 (ISO-8859-1) character definitions.
+\def\nonasciistringdefs{%
+ \setnonasciicharscatcode\active
+ \def\defstringchar##1{\def##1{\string##1}}%
+ %
+ \defstringchar^^80\defstringchar^^81\defstringchar^^82\defstringchar^^83%
+ \defstringchar^^84\defstringchar^^85\defstringchar^^86\defstringchar^^87%
+ \defstringchar^^88\defstringchar^^89\defstringchar^^8a\defstringchar^^8b%
+ \defstringchar^^8c\defstringchar^^8d\defstringchar^^8e\defstringchar^^8f%
+ %
+ \defstringchar^^90\defstringchar^^91\defstringchar^^92\defstringchar^^93%
+ \defstringchar^^94\defstringchar^^95\defstringchar^^96\defstringchar^^97%
+ \defstringchar^^98\defstringchar^^99\defstringchar^^9a\defstringchar^^9b%
+ \defstringchar^^9c\defstringchar^^9d\defstringchar^^9e\defstringchar^^9f%
+ %
+ \defstringchar^^a0\defstringchar^^a1\defstringchar^^a2\defstringchar^^a3%
+ \defstringchar^^a4\defstringchar^^a5\defstringchar^^a6\defstringchar^^a7%
+ \defstringchar^^a8\defstringchar^^a9\defstringchar^^aa\defstringchar^^ab%
+ \defstringchar^^ac\defstringchar^^ad\defstringchar^^ae\defstringchar^^af%
+ %
+ \defstringchar^^b0\defstringchar^^b1\defstringchar^^b2\defstringchar^^b3%
+ \defstringchar^^b4\defstringchar^^b5\defstringchar^^b6\defstringchar^^b7%
+ \defstringchar^^b8\defstringchar^^b9\defstringchar^^ba\defstringchar^^bb%
+ \defstringchar^^bc\defstringchar^^bd\defstringchar^^be\defstringchar^^bf%
+ %
+ \defstringchar^^c0\defstringchar^^c1\defstringchar^^c2\defstringchar^^c3%
+ \defstringchar^^c4\defstringchar^^c5\defstringchar^^c6\defstringchar^^c7%
+ \defstringchar^^c8\defstringchar^^c9\defstringchar^^ca\defstringchar^^cb%
+ \defstringchar^^cc\defstringchar^^cd\defstringchar^^ce\defstringchar^^cf%
+ %
+ \defstringchar^^d0\defstringchar^^d1\defstringchar^^d2\defstringchar^^d3%
+ \defstringchar^^d4\defstringchar^^d5\defstringchar^^d6\defstringchar^^d7%
+ \defstringchar^^d8\defstringchar^^d9\defstringchar^^da\defstringchar^^db%
+ \defstringchar^^dc\defstringchar^^dd\defstringchar^^de\defstringchar^^df%
+ %
+ \defstringchar^^e0\defstringchar^^e1\defstringchar^^e2\defstringchar^^e3%
+ \defstringchar^^e4\defstringchar^^e5\defstringchar^^e6\defstringchar^^e7%
+ \defstringchar^^e8\defstringchar^^e9\defstringchar^^ea\defstringchar^^eb%
+ \defstringchar^^ec\defstringchar^^ed\defstringchar^^ee\defstringchar^^ef%
+ %
+ \defstringchar^^f0\defstringchar^^f1\defstringchar^^f2\defstringchar^^f3%
+ \defstringchar^^f4\defstringchar^^f5\defstringchar^^f6\defstringchar^^f7%
+ \defstringchar^^f8\defstringchar^^f9\defstringchar^^fa\defstringchar^^fb%
+ \defstringchar^^fc\defstringchar^^fd\defstringchar^^fe\defstringchar^^ff%
+}
+
+
+% define all the unicode characters we know about, for the sake of @U.
+\utfeightchardefs
+
+
+% Make non-ASCII characters printable again for compatibility with
+% existing Texinfo documents that may use them, even without declaring a
+% document encoding.
+%
+\setnonasciicharscatcode \other
+
+
+\message{formatting,}
+
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be very finicky about underfull hboxes, either.
+\hbadness = 6666
+
+% Following George Bush, get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading. The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ % if we don't reset these, they will remain at "1 true in" of
+ % whatever layout pdftex was dumped with.
+ \pdfhorigin = 1 true in
+ \pdfvorigin = 1 true in
+ \fi
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{607.2pt}{6in}% that's 46 lines
+ {\voffset}{.25in}%
+ {\bindingoffset}{36pt}%
+ {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.25 trim size.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5in}%
+ {-.2in}{0in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .5cm
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+ \parskip = 1.5pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.4in}{4.8in}%
+ {-.2in}{-.4in}%
+ {0pt}{14pt}%
+ {9in}{6in}%
+ %
+ \lispnarrowing = 0.25in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .4cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % Double-side printing via postscript on Laserjet 4050
+ % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+ % To change the settings for a different printer or situation, adjust
+ % \normaloffset until the front-side and back-side texts align. Then
+ % do the same for \bindingoffset. You can set these for testing in
+ % your texinfo source file like this:
+ % @tex
+ % \global\normaloffset = -6mm
+ % \global\bindingoffset = 10mm
+ % @end tex
+ \internalpagesizes{673.2pt}{160mm}% that's 51 lines
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{160mm}{120mm}%
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{8pt}%
+ {210mm}{148mm}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}%
+ {\voffset}{4.6mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{241mm}{165mm}%
+ {\voffset}{-2.95mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \dimen0 = #1\relax
+ \advance\dimen0 by \voffset
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+\def^^L{\par} % remove \outer, so ^L can appear in an @comment
+
+% DEL is a comment character, in case @c does not suffice.
+\catcode`\^^? = 14
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other \def\normaldoublequote{"}
+\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix
+\catcode`\+=\other \def\normalplus{+}
+\catcode`\<=\other \def\normalless{<}
+\catcode`\>=\other \def\normalgreater{>}
+\catcode`\^=\other \def\normalcaret{^}
+\catcode`\_=\other \def\normalunderscore{_}
+\catcode`\|=\other \def\normalverticalbar{|}
+\catcode`\~=\other \def\normaltilde{~}
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde
+\chardef\hatchar=`\^
+\catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\let\realunder=_
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+
+\chardef \less=`\<
+\catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless
+\chardef \gtr=`\>
+\catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr
+\catcode`\+=\active \def+{{\tt \char 43}}
+\catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+\catcode`\-=\active \let-=\normaldash
+
+
+% 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.
+}
+
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+ \normalturnoffactive
+ \otherbackslash
+}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% In Texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
+\catcode`\\=\active % @ for escape char from now on.
+
+% Print a typewriter backslash. For math mode, we can't simply use
+% \backslashcurfont: the story here is that in math mode, the \char
+% of \backslashcurfont ends up printing the roman \ from the math symbol
+% font (because \char in math mode uses the \mathcode, and plain.tex
+% sets \mathcode`\\="026E). Hence we use an explicit \mathchar,
+% which is the decimal equivalent of "715c (class 7, e.g., use \fam;
+% ignored family value; char position "5C). We can't use " for the
+% usual hex value because it has already been made active.
+
+@def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}}
+@let@backslashchar = @ttbackslash % @backslashchar{} is for user documents.
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other. We switch back and forth between these.
+@gdef@rawbackslash{@let\=@backslashcurfont}
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+%
+{@catcode`- = @active
+ @gdef@normalturnoffactive{%
+ @nonasciistringdefs
+ @let-=@normaldash
+ @let"=@normaldoublequote
+ @let$=@normaldollar %$ font-lock fix
+ @let+=@normalplus
+ @let<=@normalless
+ @let>=@normalgreater
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let~=@normaltilde
+ @let\=@ttbackslash
+ @markupsetuplqdefault
+ @markupsetuprqdefault
+ @unsepspaces
+ }
+}
+
+% 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.
+% So turn them off again, and have @fixbackslash turn them back on.
+@catcode`+=@other @catcode`@_=@other
+
+% \enablebackslashhack - allow file to begin `\input texinfo'
+%
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+% If the file did not have a `\input texinfo', then it is turned off after
+% the first line; otherwise the first `\' in the file would cause an error.
+% This is used on the very last line of this file, texinfo.tex.
+% We also use @c to call @fixbackslash, in case ends of lines are hidden.
+{
+@catcode`@^=7
+@catcode`@^^M=13@gdef@enablebackslashhack{%
+ @global@let\ = @eatinput%
+ @catcode`@^^M=13%
+ @def@c{@fixbackslash@c}%
+ @def ^^M{@let^^M@secondlinenl}%
+ @gdef @secondlinenl{@let^^M@thirdlinenl}%
+ @gdef @thirdlinenl{@fixbackslash}%
+}}
+
+{@catcode`@^=7 @catcode`@^^M=13%
+@gdef@eatinput input texinfo#1^^M{@fixbackslash}}
+
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @ttbackslash @fi
+ @catcode13=5 % regular end of line
+ @let@c=@texinfoc
+ % Also turn back on active characters that might appear in the input
+ % file name, in case not using a pre-dumped format.
+ @catcode`+=@active
+ @catcode`@_=@active
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc. This macro, @fixbackslash, gets
+ % called at the beginning of every Texinfo file. Not opening texinfo.cnf
+ % directly in this file, texinfo.tex, makes it possible to make a format
+ % file for Texinfo.
+ %
+ @openin 1 texinfo.cnf
+ @ifeof 1 @else @input texinfo.cnf @fi
+ @closein 1
+}
+
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These (along with & and #) are made active for url-breaking, so need
+% active definitions as the normal characters.
+@def@normaldot{.}
+@def@normalquest{?}
+@def@normalslash{/}
+
+% These look ok in all fonts, so just make them not special.
+% @hashchar{} gets its own user-level command, because of #line.
+@catcode`@& = @other @def@normalamp{&}
+@catcode`@# = @other @def@normalhash{#}
+@catcode`@% = @other @def@normalpercent{%}
+
+@let @hashchar = @normalhash
+
+@c Finally, make ` and ' active, so that txicodequoteundirected and
+@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we
+@c don't make ` and ' active, @code will not get them as active chars.
+@c Do this last of all since we use ` in the previous @catcode assignments.
+@catcode`@'=@active
+@catcode`@`=@active
+@markupsetuplqdefault
+@markupsetuprqdefault
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message\\|emacs-page"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@ignore
+ arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore
+@enablebackslashhack
diff --git a/doc/version.texi b/doc/version.texi
new file mode 100644
index 0000000..d310273
--- /dev/null
+++ b/doc/version.texi
@@ -0,0 +1,11 @@
+@ignore
+Copyright (C) 1988-2022 Free Software Foundation, Inc.
+@end ignore
+
+@set EDITION 8.2
+@set VERSION 8.2
+
+@set UPDATED 19 September 2022
+@set UPDATED-MONTH September 2022
+
+@set LASTCHANGE Mon Sep 19 11:15:16 EDT 2022
diff --git a/emacs_keymap.c b/emacs_keymap.c
new file mode 100644
index 0000000..02597da
--- /dev/null
+++ b/emacs_keymap.c
@@ -0,0 +1,872 @@
+/* emacs_keymap.c -- the keymap for emacs_mode in readline (). */
+
+/* Copyright (C) 1987-2017 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (BUFSIZ)
+#include <stdio.h>
+#endif /* !BUFSIZ */
+
+#include "readline.h"
+
+/* An array of function pointers, one for each possible key.
+ If the type byte is ISKMAP, then the pointer is the address of
+ a keymap. */
+
+KEYMAP_ENTRY_ARRAY emacs_standard_keymap = {
+
+ /* Control keys. */
+ { ISFUNC, rl_set_mark }, /* Control-@ */
+ { ISFUNC, rl_beg_of_line }, /* Control-a */
+ { ISFUNC, rl_backward_char }, /* Control-b */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */
+ { ISFUNC, rl_delete }, /* Control-d */
+ { ISFUNC, rl_end_of_line }, /* Control-e */
+ { ISFUNC, rl_forward_char }, /* Control-f */
+ { ISFUNC, rl_abort }, /* Control-g */
+ { ISFUNC, rl_rubout }, /* Control-h */
+ { ISFUNC, rl_complete }, /* Control-i */
+ { ISFUNC, rl_newline }, /* Control-j */
+ { ISFUNC, rl_kill_line }, /* Control-k */
+ { ISFUNC, rl_clear_screen }, /* Control-l */
+ { ISFUNC, rl_newline }, /* Control-m */
+ { ISFUNC, rl_get_next_history }, /* Control-n */
+ { ISFUNC, rl_operate_and_get_next }, /* Control-o */
+ { ISFUNC, rl_get_previous_history }, /* Control-p */
+ { ISFUNC, rl_quoted_insert }, /* Control-q */
+ { ISFUNC, rl_reverse_search_history }, /* Control-r */
+ { ISFUNC, rl_forward_search_history }, /* Control-s */
+ { ISFUNC, rl_transpose_chars }, /* Control-t */
+ { ISFUNC, rl_unix_line_discard }, /* Control-u */
+ { ISFUNC, rl_quoted_insert }, /* Control-v */
+ { ISFUNC, rl_unix_word_rubout }, /* Control-w */
+ { ISKMAP, (rl_command_func_t *)emacs_ctlx_keymap }, /* Control-x */
+ { ISFUNC, rl_yank }, /* Control-y */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */
+ { ISKMAP, (rl_command_func_t *)emacs_meta_keymap }, /* Control-[ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */
+ { ISFUNC, rl_char_search }, /* Control-] */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */
+ { ISFUNC, rl_undo_command }, /* Control-_ */
+
+ /* The start of printing characters. */
+ { ISFUNC, rl_insert }, /* SPACE */
+ { ISFUNC, rl_insert }, /* ! */
+ { ISFUNC, rl_insert }, /* " */
+ { ISFUNC, rl_insert }, /* # */
+ { ISFUNC, rl_insert }, /* $ */
+ { ISFUNC, rl_insert }, /* % */
+ { ISFUNC, rl_insert }, /* & */
+ { ISFUNC, rl_insert }, /* ' */
+ { ISFUNC, rl_insert }, /* ( */
+ { ISFUNC, rl_insert }, /* ) */
+ { ISFUNC, rl_insert }, /* * */
+ { ISFUNC, rl_insert }, /* + */
+ { ISFUNC, rl_insert }, /* , */
+ { ISFUNC, rl_insert }, /* - */
+ { ISFUNC, rl_insert }, /* . */
+ { ISFUNC, rl_insert }, /* / */
+
+ /* Regular digits. */
+ { ISFUNC, rl_insert }, /* 0 */
+ { ISFUNC, rl_insert }, /* 1 */
+ { ISFUNC, rl_insert }, /* 2 */
+ { ISFUNC, rl_insert }, /* 3 */
+ { ISFUNC, rl_insert }, /* 4 */
+ { ISFUNC, rl_insert }, /* 5 */
+ { ISFUNC, rl_insert }, /* 6 */
+ { ISFUNC, rl_insert }, /* 7 */
+ { ISFUNC, rl_insert }, /* 8 */
+ { ISFUNC, rl_insert }, /* 9 */
+
+ /* A little more punctuation. */
+ { ISFUNC, rl_insert }, /* : */
+ { ISFUNC, rl_insert }, /* ; */
+ { ISFUNC, rl_insert }, /* < */
+ { ISFUNC, rl_insert }, /* = */
+ { ISFUNC, rl_insert }, /* > */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* @ */
+
+ /* Uppercase alphabet. */
+ { ISFUNC, rl_insert }, /* A */
+ { ISFUNC, rl_insert }, /* B */
+ { ISFUNC, rl_insert }, /* C */
+ { ISFUNC, rl_insert }, /* D */
+ { ISFUNC, rl_insert }, /* E */
+ { ISFUNC, rl_insert }, /* F */
+ { ISFUNC, rl_insert }, /* G */
+ { ISFUNC, rl_insert }, /* H */
+ { ISFUNC, rl_insert }, /* I */
+ { ISFUNC, rl_insert }, /* J */
+ { ISFUNC, rl_insert }, /* K */
+ { ISFUNC, rl_insert }, /* L */
+ { ISFUNC, rl_insert }, /* M */
+ { ISFUNC, rl_insert }, /* N */
+ { ISFUNC, rl_insert }, /* O */
+ { ISFUNC, rl_insert }, /* P */
+ { ISFUNC, rl_insert }, /* Q */
+ { ISFUNC, rl_insert }, /* R */
+ { ISFUNC, rl_insert }, /* S */
+ { ISFUNC, rl_insert }, /* T */
+ { ISFUNC, rl_insert }, /* U */
+ { ISFUNC, rl_insert }, /* V */
+ { ISFUNC, rl_insert }, /* W */
+ { ISFUNC, rl_insert }, /* X */
+ { ISFUNC, rl_insert }, /* Y */
+ { ISFUNC, rl_insert }, /* Z */
+
+ /* Some more punctuation. */
+ { ISFUNC, rl_insert }, /* [ */
+ { ISFUNC, rl_insert }, /* \ */
+ { ISFUNC, rl_insert }, /* ] */
+ { ISFUNC, rl_insert }, /* ^ */
+ { ISFUNC, rl_insert }, /* _ */
+ { ISFUNC, rl_insert }, /* ` */
+
+ /* Lowercase alphabet. */
+ { ISFUNC, rl_insert }, /* a */
+ { ISFUNC, rl_insert }, /* b */
+ { ISFUNC, rl_insert }, /* c */
+ { ISFUNC, rl_insert }, /* d */
+ { ISFUNC, rl_insert }, /* e */
+ { ISFUNC, rl_insert }, /* f */
+ { ISFUNC, rl_insert }, /* g */
+ { ISFUNC, rl_insert }, /* h */
+ { ISFUNC, rl_insert }, /* i */
+ { ISFUNC, rl_insert }, /* j */
+ { ISFUNC, rl_insert }, /* k */
+ { ISFUNC, rl_insert }, /* l */
+ { ISFUNC, rl_insert }, /* m */
+ { ISFUNC, rl_insert }, /* n */
+ { ISFUNC, rl_insert }, /* o */
+ { ISFUNC, rl_insert }, /* p */
+ { ISFUNC, rl_insert }, /* q */
+ { ISFUNC, rl_insert }, /* r */
+ { ISFUNC, rl_insert }, /* s */
+ { ISFUNC, rl_insert }, /* t */
+ { ISFUNC, rl_insert }, /* u */
+ { ISFUNC, rl_insert }, /* v */
+ { ISFUNC, rl_insert }, /* w */
+ { ISFUNC, rl_insert }, /* x */
+ { ISFUNC, rl_insert }, /* y */
+ { ISFUNC, rl_insert }, /* z */
+
+ /* Final punctuation. */
+ { ISFUNC, rl_insert }, /* { */
+ { ISFUNC, rl_insert }, /* | */
+ { ISFUNC, rl_insert }, /* } */
+ { ISFUNC, rl_insert }, /* ~ */
+ { ISFUNC, rl_rubout }, /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+ /* Pure 8-bit characters (128 - 159).
+ These might be used in some
+ character sets. */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+
+ /* ISO Latin-1 characters (160 - 255) */
+ { ISFUNC, rl_insert }, /* No-break space */
+ { ISFUNC, rl_insert }, /* Inverted exclamation mark */
+ { ISFUNC, rl_insert }, /* Cent sign */
+ { ISFUNC, rl_insert }, /* Pound sign */
+ { ISFUNC, rl_insert }, /* Currency sign */
+ { ISFUNC, rl_insert }, /* Yen sign */
+ { ISFUNC, rl_insert }, /* Broken bar */
+ { ISFUNC, rl_insert }, /* Section sign */
+ { ISFUNC, rl_insert }, /* Diaeresis */
+ { ISFUNC, rl_insert }, /* Copyright sign */
+ { ISFUNC, rl_insert }, /* Feminine ordinal indicator */
+ { ISFUNC, rl_insert }, /* Left pointing double angle quotation mark */
+ { ISFUNC, rl_insert }, /* Not sign */
+ { ISFUNC, rl_insert }, /* Soft hyphen */
+ { ISFUNC, rl_insert }, /* Registered sign */
+ { ISFUNC, rl_insert }, /* Macron */
+ { ISFUNC, rl_insert }, /* Degree sign */
+ { ISFUNC, rl_insert }, /* Plus-minus sign */
+ { ISFUNC, rl_insert }, /* Superscript two */
+ { ISFUNC, rl_insert }, /* Superscript three */
+ { ISFUNC, rl_insert }, /* Acute accent */
+ { ISFUNC, rl_insert }, /* Micro sign */
+ { ISFUNC, rl_insert }, /* Pilcrow sign */
+ { ISFUNC, rl_insert }, /* Middle dot */
+ { ISFUNC, rl_insert }, /* Cedilla */
+ { ISFUNC, rl_insert }, /* Superscript one */
+ { ISFUNC, rl_insert }, /* Masculine ordinal indicator */
+ { ISFUNC, rl_insert }, /* Right pointing double angle quotation mark */
+ { ISFUNC, rl_insert }, /* Vulgar fraction one quarter */
+ { ISFUNC, rl_insert }, /* Vulgar fraction one half */
+ { ISFUNC, rl_insert }, /* Vulgar fraction three quarters */
+ { ISFUNC, rl_insert }, /* Inverted questionk mark */
+ { ISFUNC, rl_insert }, /* Latin capital letter a with grave */
+ { ISFUNC, rl_insert }, /* Latin capital letter a with acute */
+ { ISFUNC, rl_insert }, /* Latin capital letter a with circumflex */
+ { ISFUNC, rl_insert }, /* Latin capital letter a with tilde */
+ { ISFUNC, rl_insert }, /* Latin capital letter a with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin capital letter a with ring above */
+ { ISFUNC, rl_insert }, /* Latin capital letter ae */
+ { ISFUNC, rl_insert }, /* Latin capital letter c with cedilla */
+ { ISFUNC, rl_insert }, /* Latin capital letter e with grave */
+ { ISFUNC, rl_insert }, /* Latin capital letter e with acute */
+ { ISFUNC, rl_insert }, /* Latin capital letter e with circumflex */
+ { ISFUNC, rl_insert }, /* Latin capital letter e with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin capital letter i with grave */
+ { ISFUNC, rl_insert }, /* Latin capital letter i with acute */
+ { ISFUNC, rl_insert }, /* Latin capital letter i with circumflex */
+ { ISFUNC, rl_insert }, /* Latin capital letter i with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin capital letter eth (Icelandic) */
+ { ISFUNC, rl_insert }, /* Latin capital letter n with tilde */
+ { ISFUNC, rl_insert }, /* Latin capital letter o with grave */
+ { ISFUNC, rl_insert }, /* Latin capital letter o with acute */
+ { ISFUNC, rl_insert }, /* Latin capital letter o with circumflex */
+ { ISFUNC, rl_insert }, /* Latin capital letter o with tilde */
+ { ISFUNC, rl_insert }, /* Latin capital letter o with diaeresis */
+ { ISFUNC, rl_insert }, /* Multiplication sign */
+ { ISFUNC, rl_insert }, /* Latin capital letter o with stroke */
+ { ISFUNC, rl_insert }, /* Latin capital letter u with grave */
+ { ISFUNC, rl_insert }, /* Latin capital letter u with acute */
+ { ISFUNC, rl_insert }, /* Latin capital letter u with circumflex */
+ { ISFUNC, rl_insert }, /* Latin capital letter u with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin capital letter Y with acute */
+ { ISFUNC, rl_insert }, /* Latin capital letter thorn (Icelandic) */
+ { ISFUNC, rl_insert }, /* Latin small letter sharp s (German) */
+ { ISFUNC, rl_insert }, /* Latin small letter a with grave */
+ { ISFUNC, rl_insert }, /* Latin small letter a with acute */
+ { ISFUNC, rl_insert }, /* Latin small letter a with circumflex */
+ { ISFUNC, rl_insert }, /* Latin small letter a with tilde */
+ { ISFUNC, rl_insert }, /* Latin small letter a with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin small letter a with ring above */
+ { ISFUNC, rl_insert }, /* Latin small letter ae */
+ { ISFUNC, rl_insert }, /* Latin small letter c with cedilla */
+ { ISFUNC, rl_insert }, /* Latin small letter e with grave */
+ { ISFUNC, rl_insert }, /* Latin small letter e with acute */
+ { ISFUNC, rl_insert }, /* Latin small letter e with circumflex */
+ { ISFUNC, rl_insert }, /* Latin small letter e with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin small letter i with grave */
+ { ISFUNC, rl_insert }, /* Latin small letter i with acute */
+ { ISFUNC, rl_insert }, /* Latin small letter i with circumflex */
+ { ISFUNC, rl_insert }, /* Latin small letter i with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin small letter eth (Icelandic) */
+ { ISFUNC, rl_insert }, /* Latin small letter n with tilde */
+ { ISFUNC, rl_insert }, /* Latin small letter o with grave */
+ { ISFUNC, rl_insert }, /* Latin small letter o with acute */
+ { ISFUNC, rl_insert }, /* Latin small letter o with circumflex */
+ { ISFUNC, rl_insert }, /* Latin small letter o with tilde */
+ { ISFUNC, rl_insert }, /* Latin small letter o with diaeresis */
+ { ISFUNC, rl_insert }, /* Division sign */
+ { ISFUNC, rl_insert }, /* Latin small letter o with stroke */
+ { ISFUNC, rl_insert }, /* Latin small letter u with grave */
+ { ISFUNC, rl_insert }, /* Latin small letter u with acute */
+ { ISFUNC, rl_insert }, /* Latin small letter u with circumflex */
+ { ISFUNC, rl_insert }, /* Latin small letter u with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin small letter y with acute */
+ { ISFUNC, rl_insert }, /* Latin small letter thorn (Icelandic) */
+ { ISFUNC, rl_insert } /* Latin small letter y with diaeresis */
+#endif /* KEYMAP_SIZE > 128 */
+};
+
+KEYMAP_ENTRY_ARRAY emacs_meta_keymap = {
+
+ /* Meta keys. Just like above, but the high bit is set. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-@ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-a */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-b */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-c */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-d */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-e */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-f */
+ { ISFUNC, rl_abort }, /* Meta-Control-g */
+ { ISFUNC, rl_backward_kill_word }, /* Meta-Control-h */
+ { ISFUNC, rl_tab_insert }, /* Meta-Control-i */
+ { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-j */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-k */
+ { ISFUNC, rl_clear_display }, /* Meta-Control-l */
+ { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-m */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-n */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-o */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-p */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-q */
+ { ISFUNC, rl_revert_line }, /* Meta-Control-r */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-s */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-t */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-u */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-v */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-w */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-x */
+ { ISFUNC, rl_yank_nth_arg }, /* Meta-Control-y */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-z */
+
+ { ISFUNC, rl_complete }, /* Meta-Control-[ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-\ */
+ { ISFUNC, rl_backward_char_search }, /* Meta-Control-] */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-^ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-_ */
+
+ /* The start of printing characters. */
+ { ISFUNC, rl_set_mark }, /* Meta-SPACE */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-! */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-" */
+ { ISFUNC, rl_insert_comment }, /* Meta-# */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-$ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-% */
+ { ISFUNC, rl_tilde_expand }, /* Meta-& */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-' */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-( */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-) */
+ { ISFUNC, rl_insert_completions }, /* Meta-* */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-+ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-, */
+ { ISFUNC, rl_digit_argument }, /* Meta-- */
+ { ISFUNC, rl_yank_last_arg}, /* Meta-. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-/ */
+
+ /* Regular digits. */
+ { ISFUNC, rl_digit_argument }, /* Meta-0 */
+ { ISFUNC, rl_digit_argument }, /* Meta-1 */
+ { ISFUNC, rl_digit_argument }, /* Meta-2 */
+ { ISFUNC, rl_digit_argument }, /* Meta-3 */
+ { ISFUNC, rl_digit_argument }, /* Meta-4 */
+ { ISFUNC, rl_digit_argument }, /* Meta-5 */
+ { ISFUNC, rl_digit_argument }, /* Meta-6 */
+ { ISFUNC, rl_digit_argument }, /* Meta-7 */
+ { ISFUNC, rl_digit_argument }, /* Meta-8 */
+ { ISFUNC, rl_digit_argument }, /* Meta-9 */
+
+ /* A little more punctuation. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-: */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-; */
+ { ISFUNC, rl_beginning_of_history }, /* Meta-< */
+ { ISFUNC, rl_possible_completions }, /* Meta-= */
+ { ISFUNC, rl_end_of_history }, /* Meta-> */
+ { ISFUNC, rl_possible_completions }, /* Meta-? */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-@ */
+
+ /* Uppercase alphabet. */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-A */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-B */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-C */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-D */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-E */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-F */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-G */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-H */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-I */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-J */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-K */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-L */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-M */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-N */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-O */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-P */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-Q */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-R */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-S */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-T */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-U */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-V */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-W */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-X */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-Y */
+ { ISFUNC, rl_do_lowercase_version }, /* Meta-Z */
+
+ /* Some more punctuation. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-[ */ /* was rl_arrow_keys */
+ { ISFUNC, rl_delete_horizontal_space }, /* Meta-\ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-] */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-^ */
+ { ISFUNC, rl_yank_last_arg }, /* Meta-_ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-` */
+
+ /* Lowercase alphabet. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-a */
+ { ISFUNC, rl_backward_word }, /* Meta-b */
+ { ISFUNC, rl_capitalize_word }, /* Meta-c */
+ { ISFUNC, rl_kill_word }, /* Meta-d */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-e */
+ { ISFUNC, rl_forward_word }, /* Meta-f */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-g */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-h */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-i */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-j */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-k */
+ { ISFUNC, rl_downcase_word }, /* Meta-l */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-m */
+ { ISFUNC, rl_noninc_forward_search }, /* Meta-n */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-o */ /* was rl_arrow_keys */
+ { ISFUNC, rl_noninc_reverse_search }, /* Meta-p */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-q */
+ { ISFUNC, rl_revert_line }, /* Meta-r */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-s */
+ { ISFUNC, rl_transpose_words }, /* Meta-t */
+ { ISFUNC, rl_upcase_word }, /* Meta-u */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-v */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-w */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-x */
+ { ISFUNC, rl_yank_pop }, /* Meta-y */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-z */
+
+ /* Final punctuation. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-{ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-| */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-} */
+ { ISFUNC, rl_tilde_expand }, /* Meta-~ */
+ { ISFUNC, rl_backward_kill_word }, /* Meta-rubout */
+
+#if KEYMAP_SIZE > 128
+ /* Undefined keys. */
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 }
+#endif /* KEYMAP_SIZE > 128 */
+};
+
+KEYMAP_ENTRY_ARRAY emacs_ctlx_keymap = {
+
+ /* Control keys. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-d */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-e */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */
+ { ISFUNC, rl_abort }, /* Control-g */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-h */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-i */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-j */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-k */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-l */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-m */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-n */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-p */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-q */
+ { ISFUNC, rl_re_read_init_file }, /* Control-r */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-s */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-t */
+ { ISFUNC, rl_undo_command }, /* Control-u */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-v */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-w */
+ { ISFUNC, rl_exchange_point_and_mark }, /* Control-x */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-y */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-[ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-_ */
+
+ /* The start of printing characters. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* SPACE */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* " */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* # */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* $ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* % */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* & */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */
+ { ISFUNC, rl_start_kbd_macro }, /* ( */
+ { ISFUNC, rl_end_kbd_macro }, /* ) */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* * */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* + */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* , */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* - */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* . */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* / */
+
+ /* Regular digits. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* 0 */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* 1 */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* 2 */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* 3 */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* 4 */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* 5 */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* 6 */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* 7 */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* 8 */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* 9 */
+
+ /* A little more punctuation. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* : */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ; */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* < */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* = */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* > */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ? */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */
+
+ /* Uppercase alphabet. */
+ { ISFUNC, rl_do_lowercase_version }, /* A */
+ { ISFUNC, rl_do_lowercase_version }, /* B */
+ { ISFUNC, rl_do_lowercase_version }, /* C */
+ { ISFUNC, rl_do_lowercase_version }, /* D */
+ { ISFUNC, rl_do_lowercase_version }, /* E */
+ { ISFUNC, rl_do_lowercase_version }, /* F */
+ { ISFUNC, rl_do_lowercase_version }, /* G */
+ { ISFUNC, rl_do_lowercase_version }, /* H */
+ { ISFUNC, rl_do_lowercase_version }, /* I */
+ { ISFUNC, rl_do_lowercase_version }, /* J */
+ { ISFUNC, rl_do_lowercase_version }, /* K */
+ { ISFUNC, rl_do_lowercase_version }, /* L */
+ { ISFUNC, rl_do_lowercase_version }, /* M */
+ { ISFUNC, rl_do_lowercase_version }, /* N */
+ { ISFUNC, rl_do_lowercase_version }, /* O */
+ { ISFUNC, rl_do_lowercase_version }, /* P */
+ { ISFUNC, rl_do_lowercase_version }, /* Q */
+ { ISFUNC, rl_do_lowercase_version }, /* R */
+ { ISFUNC, rl_do_lowercase_version }, /* S */
+ { ISFUNC, rl_do_lowercase_version }, /* T */
+ { ISFUNC, rl_do_lowercase_version }, /* U */
+ { ISFUNC, rl_do_lowercase_version }, /* V */
+ { ISFUNC, rl_do_lowercase_version }, /* W */
+ { ISFUNC, rl_do_lowercase_version }, /* X */
+ { ISFUNC, rl_do_lowercase_version }, /* Y */
+ { ISFUNC, rl_do_lowercase_version }, /* Z */
+
+ /* Some more punctuation. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* [ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* \ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ^ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* _ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ` */
+
+ /* Lowercase alphabet. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* a */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* b */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* c */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* d */
+ { ISFUNC, rl_call_last_kbd_macro }, /* e */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* f */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* g */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* h */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* i */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* j */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* k */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* l */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* m */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* n */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* o */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* p */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* q */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* r */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* s */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* t */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* u */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* v */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* w */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* x */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* y */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* z */
+
+ /* Final punctuation. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* { */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* | */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* } */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ~ */
+ { ISFUNC, rl_backward_kill_line }, /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+ /* Undefined keys. */
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 }
+#endif /* KEYMAP_SIZE > 128 */
+};
diff --git a/examples/Inputrc b/examples/Inputrc
new file mode 100644
index 0000000..a358bc4
--- /dev/null
+++ b/examples/Inputrc
@@ -0,0 +1,81 @@
+# My ~/.inputrc file is in -*- text -*- for easy editing with Emacs.
+#
+# Notice the various bindings which are conditionalized depending
+# on which program is running, or what terminal is active.
+#
+
+# Copyright (C) 1989-2009 Free Software Foundation, Inc.
+#
+# 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/>.
+#
+
+# In all programs, all terminals, make sure this is bound.
+"\C-x\C-r": re-read-init-file
+
+# Hp terminals (and some others) have ugly default behaviour for C-h.
+"\C-h": backward-delete-char
+"\e\C-h": backward-kill-word
+"\C-xd": dump-functions
+
+# In xterm windows, make the arrow keys do the right thing.
+$if TERM=xterm
+"\e[A": previous-history
+"\e[B": next-history
+"\e[C": forward-char
+"\e[D": backward-char
+
+# alternate arrow key prefix
+"\eOA": previous-history
+"\eOB": next-history
+"\eOC": forward-char
+"\eOD": backward-char
+
+# Under Xterm in Bash, we bind local Function keys to do something useful.
+$if Bash
+"\e[11~": "Function Key 1"
+"\e[12~": "Function Key 2"
+"\e[13~": "Function Key 3"
+"\e[14~": "Function Key 4"
+"\e[15~": "Function Key 5"
+
+# I know the following escape sequence numbers are 1 greater than
+# the function key. Don't ask me why, I didn't design the xterm terminal.
+"\e[17~": "Function Key 6"
+"\e[18~": "Function Key 7"
+"\e[19~": "Function Key 8"
+"\e[20~": "Function Key 9"
+"\e[21~": "Function Key 10"
+$endif
+$endif
+
+# For Bash, all terminals, add some Bash specific hacks.
+$if Bash
+"\C-xv": show-bash-version
+"\C-x\C-e": shell-expand-line
+
+# Here is one for editing my path.
+"\C-xp": "$PATH\C-x\C-e\C-e\"\C-aPATH=\":\C-b"
+
+# Make C-x r read my mail in emacs.
+# "\C-xr": "emacs -f rmail\C-j"
+$endif
+
+# For FTP, different hacks:
+$if Ftp
+"\C-xg": "get \M-?"
+"\C-xt": "put \M-?"
+"\M-.": yank-last-arg
+$endif
+
+" ": self-insert
diff --git a/examples/Makefile.in b/examples/Makefile.in
new file mode 100644
index 0000000..291c6b7
--- /dev/null
+++ b/examples/Makefile.in
@@ -0,0 +1,193 @@
+#
+# This is the Makefile for the readline examples subdirectory.
+#
+# Copyright (C) 1994,2008,2009 Free Software Foundation, Inc.
+
+# 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/>.
+
+RL_LIBRARY_VERSION = @LIBVERSION@
+
+SHELL = @MAKE_SHELL@
+RM = rm -f
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+datarootdir = @datarootdir@
+
+bindir = @bindir@
+srcdir = @srcdir@
+datadir = @datadir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+#BUILD_DIR = .
+BUILD_DIR = @BUILD_DIR@
+installdir = $(datadir)/readline
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+
+# Support an alternate destination root directory for package building
+DESTDIR =
+
+DEFS = @DEFS@
+CC = @CC@
+CFLAGS = @CFLAGS@
+LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DREADLINE_LIBRARY -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"'
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I$(srcdir) -I$(top_srcdir) -I..
+
+CCFLAGS = $(ASAN_CFLAGS) $(DEFS) $(LOCAL_CFLAGS) $(INCLUDES) $(CPPFLAGS) \
+ $(CFLAGS)
+LDFLAGS = -g -L.. @LDFLAGS@ $(ASAN_LDFLAGS)
+
+ASAN_XCFLAGS = -fsanitize=address -fno-omit-frame-pointer
+ASAN_XLDFLAGS = -fsanitize=address
+
+READLINE_LIB = ../libreadline.a
+HISTORY_LIB = ../libhistory.a
+
+TERMCAP_LIB = @TERMCAP_LIB@
+
+.c.o:
+ ${RM} $@
+ $(CC) $(CCFLAGS) -c $<
+
+SOURCES = excallback.c fileman.c histexamp.c manexamp.c rl-fgets.c rl.c \
+ rlbasic.c rlcat.c rlevent.c rlptytest.c rltest.c rlversion.c \
+ rltest2.c rl-callbacktest.c hist_erasedups.c hist_purgecmd.c \
+ rlkeymaps.c rl-timeout.c
+
+EXECUTABLES = fileman$(EXEEXT) rltest$(EXEEXT) rl$(EXEEXT) rlcat$(EXEEXT) \
+ rlevent$(EXEEXT) rlversion$(EXEEXT) histexamp$(EXEEXT) \
+ rl-callbacktest$(EXEEXT) rlbasic$(EXEEXT) \
+ hist_erasedups$(EXEEXT) hist_purgecmd$(EXEEXT) \
+ rlkeymaps$(EXEEXT) rl-timeout$(EXEEXT)
+
+OBJECTS = fileman.o rltest.o rl.o rlevent.o rlcat.o rlversion.o histexamp.o \
+ rltest2.o rl-callbacktest.o rlbasic.o hist_erasedups.o hist_purgecmd.o \
+ rlkeymaps.o rl-timeout.o
+
+OTHEREXE = rlptytest$(EXEEXT)
+OTHEROBJ = rlptytest.o
+
+all: $(EXECUTABLES)
+everything: all
+
+asan:
+ ${MAKE} ${MFLAGS} ASAN_CFLAGS='${ASAN_XCFLAGS}' ASAN_LDFLAGS='${ASAN_XLDFLAGS}' all
+
+check: rlversion$(EXEEXT)
+ @echo Readline version: `rlversion$(EXEEXT)`
+
+installdirs:
+ -$(SHELL) $(top_srcdir)/support/mkdirs $(DESTDIR)$(installdir)
+
+install: installdirs
+ @for f in $(SOURCES); do \
+ $(RM) $(DESTDIR)$(installdir)/$$f ; \
+ $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(installdir) ; \
+ done
+
+uninstall:
+ @for f in $(SOURCES); do \
+ $(RM) $(DESTDIR)$(installdir)/$$f ; \
+ done
+ -rmdir $(DESTDIR)$(installdir)
+
+rl$(EXEEXT): rl.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ rl.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rlbasic$(EXEEXT): rlbasic.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ rlbasic.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rlcat$(EXEEXT): rlcat.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ rlcat.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rlevent$(EXEEXT): rlevent.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ rlevent.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rlkeymaps$(EXEEXT): rlkeymaps.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ rlkeymaps.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+fileman$(EXEEXT): fileman.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ fileman.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rltest$(EXEEXT): rltest.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ rltest.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rltest2$(EXEEXT): rltest2.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ rltest2.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rl-callbacktest$(EXEEXT): rl-callbacktest.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ rl-callbacktest.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rlptytest$(EXEEXT): rlptytest.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ rlptytest.o $(READLINE_LIB) $(TERMCAP_LIB) $(LIBUTIL)
+
+rl-timeout$(EXEEXT): rl-timeout.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ rl-timeout.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rlversion$(EXEEXT): rlversion.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ rlversion.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+histexamp$(EXEEXT): histexamp.o $(HISTORY_LIB)
+ $(CC) $(LDFLAGS) -o $@ histexamp.o -lhistory $(TERMCAP_LIB)
+
+hist_erasedups$(EXEEXT): hist_erasedups.o $(HISTORY_LIB)
+ $(CC) $(LDFLAGS) -o $@ hist_erasedups.o -lhistory $(TERMCAP_LIB)
+
+hist_purgecmd$(EXEEXT): hist_purgecmd.o $(HISTORY_LIB)
+ $(CC) $(LDFLAGS) -o $@ hist_purgecmd.o -lhistory $(TERMCAP_LIB)
+
+clean mostlyclean:
+ $(RM) $(OBJECTS) $(OTHEROBJ)
+ $(RM) $(EXECUTABLES) $(OTHEREXE) *.exe
+
+distclean maintainer-clean: clean
+ $(RM) Makefile
+
+fileman.o: fileman.c
+rltest.o: rltest.c
+rltest2.o: rltest2.c
+rl.o: rl.c
+rlversion.o: rlversion.c
+histexamp.o: histexamp.c
+hist_erasedups.o: hist_erasedups.c
+hist_purgecmd.o: hist_purgecmd.c
+rlbasic.o: rlbasic.c
+rlkeymaps.o: rlkeymaps.c
+rlcat.o: rlcat.c
+rlptytest.o: rlptytest.c
+rl-callbacktest.o: rl-callbacktest.c
+rl-timeout.o: rl-timeout.c
+
+fileman.o: $(top_srcdir)/readline.h
+rltest.o: $(top_srcdir)/readline.h
+rltest2.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h
+rl.o: $(top_srcdir)/readline.h
+rlversion.o: $(top_srcdir)/readline.h
+histexamp.o: $(top_srcdir)/history.h
+hist_erasedups.o: $(top_srcdir)/history.h
+hist_purgecmd.o: $(top_srcdir)/history.h
+rlbasic.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h
+rlcat.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h
+rlptytest.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h
+rl-callbacktest.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h
+rl-timeout.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h
diff --git a/examples/autoconf/BASH_CHECK_LIB_TERMCAP b/examples/autoconf/BASH_CHECK_LIB_TERMCAP
new file mode 100644
index 0000000..0a09883
--- /dev/null
+++ b/examples/autoconf/BASH_CHECK_LIB_TERMCAP
@@ -0,0 +1,41 @@
+AC_DEFUN([BASH_CHECK_LIB_TERMCAP],
+[
+if test "X$bash_cv_termcap_lib" = "X"; then
+_bash_needmsg=yes
+else
+AC_MSG_CHECKING(which library has the termcap functions)
+_bash_needmsg=
+fi
+AC_CACHE_VAL(bash_cv_termcap_lib,
+[AC_CHECK_FUNC(tgetent, bash_cv_termcap_lib=libc,
+ [AC_CHECK_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap,
+ [AC_CHECK_LIB(tinfo, tgetent, bash_cv_termcap_lib=libtinfo,
+ [AC_CHECK_LIB(curses, tgetent, bash_cv_termcap_lib=libcurses,
+ [AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses,
+ [AC_CHECK_LIB(ncursesw, tgetent, bash_cv_termcap_lib=libncursesw,
+ bash_cv_termcap_lib=gnutermcap)])])])])])])
+if test "X$_bash_needmsg" = "Xyes"; then
+AC_MSG_CHECKING(which library has the termcap functions)
+fi
+AC_MSG_RESULT(using $bash_cv_termcap_lib)
+if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then
+LDFLAGS="$LDFLAGS -L./lib/termcap"
+TERMCAP_LIB="./lib/termcap/libtermcap.a"
+TERMCAP_DEP="./lib/termcap/libtermcap.a"
+elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then
+TERMCAP_LIB=-ltermcap
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libtinfo; then
+TERMCAP_LIB=-ltinfo
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libncurses; then
+TERMCAP_LIB=-lncurses
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libc; then
+TERMCAP_LIB=
+TERMCAP_DEP=
+else
+TERMCAP_LIB=-lcurses
+TERMCAP_DEP=
+fi
+])
diff --git a/examples/autoconf/RL_LIB_READLINE_VERSION b/examples/autoconf/RL_LIB_READLINE_VERSION
new file mode 100644
index 0000000..cc158a8
--- /dev/null
+++ b/examples/autoconf/RL_LIB_READLINE_VERSION
@@ -0,0 +1,119 @@
+dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB
+dnl require:
+dnl AC_PROG_CC
+dnl BASH_CHECK_LIB_TERMCAP
+
+AC_DEFUN([RL_LIB_READLINE_VERSION],
+[
+AC_REQUIRE([BASH_CHECK_LIB_TERMCAP])
+
+AC_MSG_CHECKING([version of installed readline library])
+
+# What a pain in the ass this is.
+
+# save cpp and ld options
+_save_CFLAGS="$CFLAGS"
+_save_LDFLAGS="$LDFLAGS"
+_save_LIBS="$LIBS"
+
+# Don't set ac_cv_rl_prefix if the caller has already assigned a value. This
+# allows the caller to do something like $_rl_prefix=$withval if the user
+# specifies --with-installed-readline=PREFIX as an argument to configure
+
+if test -z "$ac_cv_rl_prefix"; then
+test "x$prefix" = xNONE && ac_cv_rl_prefix=$ac_default_prefix || ac_cv_rl_prefix=${prefix}
+fi
+
+eval ac_cv_rl_includedir=${ac_cv_rl_prefix}/include
+eval ac_cv_rl_libdir=${ac_cv_rl_prefix}/lib
+
+LIBS="$LIBS -lreadline ${TERMCAP_LIB}"
+CFLAGS="$CFLAGS -I${ac_cv_rl_includedir}"
+LDFLAGS="$LDFLAGS -L${ac_cv_rl_libdir}"
+
+AC_CACHE_VAL(ac_cv_rl_version,
+[AC_TRY_RUN([
+#include <stdio.h>
+#include <readline/readline.h>
+#include <stdlib.h>
+
+extern int rl_gnu_readline_p;
+
+main()
+{
+ FILE *fp;
+ fp = fopen("conftest.rlv", "w");
+ if (fp == 0)
+ exit(1);
+ if (rl_gnu_readline_p != 1)
+ fprintf(fp, "0.0\n");
+ else
+ fprintf(fp, "%s\n", rl_library_version ? rl_library_version : "0.0");
+ fclose(fp);
+ exit(0);
+}
+],
+ac_cv_rl_version=`cat conftest.rlv`,
+ac_cv_rl_version='0.0',
+ac_cv_rl_version='4.2')])
+
+CFLAGS="$_save_CFLAGS"
+LDFLAGS="$_save_LDFLAGS"
+LIBS="$_save_LIBS"
+
+RL_MAJOR=0
+RL_MINOR=0
+
+# (
+case "$ac_cv_rl_version" in
+2*|3*|4*|5*|6*|7*|8*|9*)
+ RL_MAJOR=`echo $ac_cv_rl_version | sed 's:\..*$::'`
+ RL_MINOR=`echo $ac_cv_rl_version | sed -e 's:^.*\.::' -e 's:[[a-zA-Z]]*$::'`
+ ;;
+esac
+
+# (((
+case $RL_MAJOR in
+[[0-9][0-9]]) _RL_MAJOR=$RL_MAJOR ;;
+[[0-9]]) _RL_MAJOR=0$RL_MAJOR ;;
+*) _RL_MAJOR=00 ;;
+esac
+
+# (((
+case $RL_MINOR in
+[[0-9][0-9]]) _RL_MINOR=$RL_MINOR ;;
+[[0-9]]) _RL_MINOR=0$RL_MINOR ;;
+*) _RL_MINOR=00 ;;
+esac
+
+RL_VERSION="0x${_RL_MAJOR}${_RL_MINOR}"
+
+# Readline versions greater than 4.2 have these defines in readline.h
+
+if test $ac_cv_rl_version = '0.0' ; then
+ AC_MSG_WARN([Could not test version of installed readline library.])
+elif test $RL_MAJOR -gt 4 || { test $RL_MAJOR = 4 && test $RL_MINOR -gt 2 ; } ; then
+ # set these for use by the caller
+ RL_PREFIX=$ac_cv_rl_prefix
+ RL_LIBDIR=$ac_cv_rl_libdir
+ RL_INCLUDEDIR=$ac_cv_rl_includedir
+ AC_MSG_RESULT($ac_cv_rl_version)
+else
+
+AC_DEFINE_UNQUOTED(RL_READLINE_VERSION, $RL_VERSION, [encoded version of the installed readline library])
+AC_DEFINE_UNQUOTED(RL_VERSION_MAJOR, $RL_MAJOR, [major version of installed readline library])
+AC_DEFINE_UNQUOTED(RL_VERSION_MINOR, $RL_MINOR, [minor version of installed readline library])
+
+AC_SUBST(RL_VERSION)
+AC_SUBST(RL_MAJOR)
+AC_SUBST(RL_MINOR)
+
+# set these for use by the caller
+RL_PREFIX=$ac_cv_rl_prefix
+RL_LIBDIR=$ac_cv_rl_libdir
+RL_INCLUDEDIR=$ac_cv_rl_includedir
+
+AC_MSG_RESULT($ac_cv_rl_version)
+
+fi
+])
diff --git a/examples/autoconf/wi_LIB_READLINE b/examples/autoconf/wi_LIB_READLINE
new file mode 100644
index 0000000..c738322
--- /dev/null
+++ b/examples/autoconf/wi_LIB_READLINE
@@ -0,0 +1,76 @@
+dnl Borut Razem
+dnl
+dnl This macro checks for the presence of the readline library.
+dnl It works also in cross-compilation environment.
+dnl
+dnl To get it into the aclocal.m4 dnl file, do this:
+dnl aclocal -I . --verbose
+dnl
+dnl The --verbose will show all of the files that are searched
+dnl for .m4 macros.
+
+AC_DEFUN([wi_LIB_READLINE], [
+ dnl check for the readline.h header file
+
+ AC_CHECK_HEADER(readline/readline.h)
+
+ if test "$ac_cv_header_readline_readline_h" = yes; then
+ dnl check the readline version
+
+ cat > conftest.$ac_ext <<EOF
+#include <stdio.h>
+#include <readline/readline.h>
+wi_LIB_READLINE_VERSION RL_VERSION_MAJOR RL_VERSION_MINOR
+EOF
+
+ wi_READLINE_VERSION=$($CPP $CPPFLAGS conftest.$ac_ext | sed -n -e "s/^wi_LIB_READLINE_VERSION *\([[0-9\]][[0-9\]]*\) *\([[0-9\]][[0-9\]]*\)$/\1.\2/p")
+ rm -rf conftest*
+
+ if test -n "$wi_READLINE_VERSION"; then
+ wi_MAJOR=$(expr $wi_READLINE_VERSION : '\([[0-9]][[0-9]]*\)\.')
+ wi_MINOR=$(expr $wi_READLINE_VERSION : '[[0-9]][[0-9]]*\.\([[0-9]][[0-9]]*$\)')
+ if test $wi_MINOR -lt 10; then
+ wi_MINOR=$(expr $wi_MINOR \* 10)
+ fi
+ wi_READLINE_VERSION=$(expr $wi_MAJOR \* 100 + $wi_MINOR)
+ else
+ wi_READLINE_VERSION=-1
+ fi
+
+ dnl check for the readline library
+
+ ac_save_LIBS="$LIBS"
+ # Note: $LIBCURSES is permitted to be empty.
+
+ for LIBREADLINE in "-lreadline.dll" "-lreadline" "-lreadline $LIBCURSES" "-lreadline -ltermcap" "-lreadline -lncurses" "-lreadline -lcurses"
+ do
+ AC_MSG_CHECKING([for GNU Readline library $LIBREADLINE])
+
+ LIBS="$ac_save_LIBS $LIBREADLINE"
+
+ AC_TRY_LINK([
+ /* includes */
+ #include <stdio.h>
+ #include <readline/readline.h>
+ ],[
+ /* function-body */
+ int dummy = rl_completion_append_character; /* rl_completion_append_character appeared in version 2.1 */
+ readline(NULL);
+ ],[
+ wi_cv_lib_readline=yes
+ AC_MSG_RESULT(yes)
+ ],[
+ wi_cv_lib_readline=no
+ AC_MSG_RESULT(no)
+ ])
+
+ if test "$wi_cv_lib_readline" = yes; then
+ AC_SUBST(LIBREADLINE)
+ AC_DEFINE_UNQUOTED(HAVE_LIBREADLINE, $wi_READLINE_VERSION, [Readline])
+ break
+ fi
+ done
+
+ LIBS="$ac_save_LIBS"
+ fi
+])
diff --git a/examples/excallback.c b/examples/excallback.c
new file mode 100644
index 0000000..923c923
--- /dev/null
+++ b/examples/excallback.c
@@ -0,0 +1,200 @@
+/*
+From: Jeff Solomon <jsolomon@stanford.edu>
+Date: Fri, 9 Apr 1999 10:13:27 -0700 (PDT)
+To: chet@po.cwru.edu
+Subject: new readline example
+Message-ID: <14094.12094.527305.199695@mrclean.Stanford.EDU>
+
+Chet,
+
+I've been using readline 4.0. Specifically, I've been using the perl
+version Term::ReadLine::Gnu. It works great.
+
+Anyway, I've been playing around the alternate interface and I wanted
+to contribute a little C program, callback.c, to you that you could
+use as an example of the alternate interface in the /examples
+directory of the readline distribution.
+
+My example shows how, using the alternate interface, you can
+interactively change the prompt (which is very nice imo). Also, I
+point out that you must roll your own terminal setting when using the
+alternate interface because readline depreps (using your parlance) the
+terminal while in the user callback. I try to demostrate what I mean
+with an example. I've included the program below.
+
+To compile, I just put the program in the examples directory and made
+the appropriate changes to the EXECUTABLES and OBJECTS line and added
+an additional target 'callback'.
+
+I compiled on my Sun Solaris2.6 box using Sun's cc.
+
+Let me know what you think.
+
+Jeff
+*/
+/*
+Copyright (C) 1999 Jeff Solomon
+*/
+
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+
+#include <stdio.h>
+#include <termios.h> /* xxx - should make this more general */
+
+#include <locale.h>
+
+#ifdef READLINE_LIBRARY
+# include "readline.h"
+#else
+# include <readline/readline.h>
+#endif
+
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+
+/* This little examples demonstrates the alternate interface to using readline.
+ * In the alternate interface, the user maintains control over program flow and
+ * only calls readline when STDIN is readable. Using the alternate interface,
+ * you can do anything else while still using readline (like talking to a
+ * network or another program) without blocking.
+ *
+ * Specifically, this program highlights two importants features of the
+ * alternate interface. The first is the ability to interactively change the
+ * prompt, which can't be done using the regular interface since rl_prompt is
+ * read-only.
+ *
+ * The second feature really highlights a subtle point when using the alternate
+ * interface. That is, readline will not alter the terminal when inside your
+ * callback handler. So let's so, your callback executes a user command that
+ * takes a non-trivial amount of time to complete (seconds). While your
+ * executing the command, the user continues to type keystrokes and expects them
+ * to be re-echoed on the new prompt when it returns. Unfortunately, the default
+ * terminal configuration doesn't do this. After the prompt returns, the user
+ * must hit one additional keystroke and then will see all of his previous
+ * keystrokes. To illustrate this, compile and run this program. Type "sleep" at
+ * the prompt and then type "bar" before the prompt returns (you have 3
+ * seconds). Notice how "bar" is re-echoed on the prompt after the prompt
+ * returns? This is what you expect to happen. Now comment out the 4 lines below
+ * the line that says COMMENT LINE BELOW. Recompile and rerun the program and do
+ * the same thing. When the prompt returns, you should not see "bar". Now type
+ * "f", see how "barf" magically appears? This behavior is un-expected and not
+ * desired.
+ */
+
+void process_line(char *line);
+int change_prompt(void);
+char *get_prompt(void);
+
+int prompt = 1;
+char prompt_buf[40], line_buf[256];
+tcflag_t old_lflag;
+cc_t old_vtime;
+struct termios term;
+
+int
+main()
+{
+ fd_set fds;
+
+ setlocale (LC_ALL, "");
+
+ /* Adjust the terminal slightly before the handler is installed. Disable
+ * canonical mode processing and set the input character time flag to be
+ * non-blocking.
+ */
+ if( tcgetattr(STDIN_FILENO, &term) < 0 ) {
+ perror("tcgetattr");
+ exit(1);
+ }
+ old_lflag = term.c_lflag;
+ old_vtime = term.c_cc[VTIME];
+ term.c_lflag &= ~ICANON;
+ term.c_cc[VTIME] = 1;
+ /* COMMENT LINE BELOW - see above */
+ if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) {
+ perror("tcsetattr");
+ exit(1);
+ }
+
+ rl_add_defun("change-prompt", change_prompt, CTRL('t'));
+ rl_callback_handler_install(get_prompt(), process_line);
+
+ while(1) {
+ FD_ZERO(&fds);
+ FD_SET(fileno(stdin), &fds);
+
+ if( select(FD_SETSIZE, &fds, NULL, NULL, NULL) < 0) {
+ perror("select");
+ exit(1);
+ }
+
+ if( FD_ISSET(fileno(stdin), &fds) ) {
+ rl_callback_read_char();
+ }
+ }
+}
+
+void
+process_line(char *line)
+{
+ if( line == NULL ) {
+ fprintf(stderr, "\n", line);
+
+ /* reset the old terminal setting before exiting */
+ term.c_lflag = old_lflag;
+ term.c_cc[VTIME] = old_vtime;
+ if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) {
+ perror("tcsetattr");
+ exit(1);
+ }
+ exit(0);
+ }
+
+ if( strcmp(line, "sleep") == 0 ) {
+ sleep(3);
+ } else {
+ fprintf(stderr, "|%s|\n", line);
+ }
+
+ free (line);
+}
+
+int
+change_prompt(void)
+{
+ /* toggle the prompt variable */
+ prompt = !prompt;
+
+ /* save away the current contents of the line */
+ strcpy(line_buf, rl_line_buffer);
+
+ /* install a new handler which will change the prompt and erase the current line */
+ rl_callback_handler_install(get_prompt(), process_line);
+
+ /* insert the old text on the new line */
+ rl_insert_text(line_buf);
+
+ /* redraw the current line - this is an undocumented function. It invokes the
+ * redraw-current-line command.
+ */
+ rl_refresh_line(0, 0);
+}
+
+char *
+get_prompt(void)
+{
+ /* The prompts can even be different lengths! */
+ sprintf(prompt_buf, "%s",
+ prompt ? "Hit ctrl-t to toggle prompt> " : "Pretty cool huh?> ");
+ return prompt_buf;
+}
diff --git a/examples/fileman.c b/examples/fileman.c
new file mode 100644
index 0000000..2a8b097
--- /dev/null
+++ b/examples/fileman.c
@@ -0,0 +1,506 @@
+/* fileman.c - file manager example for readline library. */
+
+/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library for
+ reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* fileman.c -- A tiny application which demonstrates how to use the
+ GNU Readline library. This application interactively allows users
+ to manipulate files and their modes. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_FILE_H
+# include <sys/file.h>
+#endif
+#include <sys/stat.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else /* !HAVE_STRING_H */
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+#include <time.h>
+
+#ifdef READLINE_LIBRARY
+# include "readline.h"
+# include "history.h"
+#else
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
+
+extern char *xmalloc PARAMS((size_t));
+
+void initialize_readline PARAMS((void));
+void too_dangerous PARAMS((char *));
+
+int execute_line PARAMS((char *));
+int valid_argument PARAMS((char *, char *));
+
+/* The names of functions that actually do the manipulation. */
+int com_list PARAMS((char *));
+int com_view PARAMS((char *));
+int com_rename PARAMS((char *));
+int com_stat PARAMS((char *));
+int com_pwd PARAMS((char *));
+int com_delete PARAMS((char *));
+int com_help PARAMS((char *));
+int com_cd PARAMS((char *));
+int com_quit PARAMS((char *));
+
+/* A structure which contains information on the commands this program
+ can understand. */
+
+typedef struct {
+ char *name; /* User printable name of the function. */
+ rl_icpfunc_t *func; /* Function to call to do the job. */
+ char *doc; /* Documentation for this function. */
+} COMMAND;
+
+COMMAND commands[] = {
+ { "cd", com_cd, "Change to directory DIR" },
+ { "delete", com_delete, "Delete FILE" },
+ { "help", com_help, "Display this text" },
+ { "?", com_help, "Synonym for `help'" },
+ { "list", com_list, "List files in DIR" },
+ { "ls", com_list, "Synonym for `list'" },
+ { "pwd", com_pwd, "Print the current working directory" },
+ { "quit", com_quit, "Quit using Fileman" },
+ { "rename", com_rename, "Rename FILE to NEWNAME" },
+ { "stat", com_stat, "Print out statistics on FILE" },
+ { "view", com_view, "View the contents of FILE" },
+ { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
+};
+
+/* Forward declarations. */
+char *stripwhite ();
+COMMAND *find_command ();
+
+/* The name of this program, as taken from argv[0]. */
+char *progname;
+
+/* When non-zero, this global means the user is done using this program. */
+int done;
+
+char *
+dupstr (s)
+ char *s;
+{
+ char *r;
+
+ r = xmalloc (strlen (s) + 1);
+ strcpy (r, s);
+ return (r);
+}
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *line, *s;
+
+ progname = argv[0];
+
+ initialize_readline (); /* Bind our completer. */
+
+ /* Loop reading and executing lines until the user quits. */
+ for ( ; done == 0; )
+ {
+ line = readline ("FileMan: ");
+
+ if (!line)
+ break;
+
+ /* Remove leading and trailing whitespace from the line.
+ Then, if there is anything left, add it to the history list
+ and execute it. */
+ s = stripwhite (line);
+
+ if (*s)
+ {
+ add_history (s);
+ execute_line (s);
+ }
+
+ free (line);
+ }
+ exit (0);
+}
+
+/* Execute a command line. */
+int
+execute_line (line)
+ char *line;
+{
+ register int i;
+ COMMAND *command;
+ char *word;
+
+ /* Isolate the command word. */
+ i = 0;
+ while (line[i] && whitespace (line[i]))
+ i++;
+ word = line + i;
+
+ while (line[i] && !whitespace (line[i]))
+ i++;
+
+ if (line[i])
+ line[i++] = '\0';
+
+ command = find_command (word);
+
+ if (!command)
+ {
+ fprintf (stderr, "%s: No such command for FileMan.\n", word);
+ return (-1);
+ }
+
+ /* Get argument to command, if any. */
+ while (whitespace (line[i]))
+ i++;
+
+ word = line + i;
+
+ /* Call the function. */
+ return ((*(command->func)) (word));
+}
+
+/* Look up NAME as the name of a command, and return a pointer to that
+ command. Return a NULL pointer if NAME isn't a command name. */
+COMMAND *
+find_command (name)
+ char *name;
+{
+ register int i;
+
+ for (i = 0; commands[i].name; i++)
+ if (strcmp (name, commands[i].name) == 0)
+ return (&commands[i]);
+
+ return ((COMMAND *)NULL);
+}
+
+/* Strip whitespace from the start and end of STRING. Return a pointer
+ into STRING. */
+char *
+stripwhite (string)
+ char *string;
+{
+ register char *s, *t;
+
+ for (s = string; whitespace (*s); s++)
+ ;
+
+ if (*s == 0)
+ return (s);
+
+ t = s + strlen (s) - 1;
+ while (t > s && whitespace (*t))
+ t--;
+ *++t = '\0';
+
+ return s;
+}
+
+/* **************************************************************** */
+/* */
+/* Interface to Readline Completion */
+/* */
+/* **************************************************************** */
+
+char *command_generator PARAMS((const char *, int));
+char **fileman_completion PARAMS((const char *, int, int));
+
+/* Tell the GNU Readline library how to complete. We want to try to complete
+ on command names if this is the first word in the line, or on filenames
+ if not. */
+void
+initialize_readline ()
+{
+ /* Allow conditional parsing of the ~/.inputrc file. */
+ rl_readline_name = "FileMan";
+
+ /* Tell the completer that we want a crack first. */
+ rl_attempted_completion_function = fileman_completion;
+}
+
+/* Attempt to complete on the contents of TEXT. START and END bound the
+ region of rl_line_buffer that contains the word to complete. TEXT is
+ the word to complete. We can use the entire contents of rl_line_buffer
+ in case we want to do some simple parsing. Return the array of matches,
+ or NULL if there aren't any. */
+char **
+fileman_completion (text, start, end)
+ const char *text;
+ int start, end;
+{
+ char **matches;
+
+ matches = (char **)NULL;
+
+ /* If this word is at the start of the line, then it is a command
+ to complete. Otherwise it is the name of a file in the current
+ directory. */
+ if (start == 0)
+ matches = rl_completion_matches (text, command_generator);
+
+ return (matches);
+}
+
+/* Generator function for command completion. STATE lets us know whether
+ to start from scratch; without any state (i.e. STATE == 0), then we
+ start at the top of the list. */
+char *
+command_generator (text, state)
+ const char *text;
+ int state;
+{
+ static int list_index, len;
+ char *name;
+
+ /* If this is a new word to complete, initialize now. This includes
+ saving the length of TEXT for efficiency, and initializing the index
+ variable to 0. */
+ if (!state)
+ {
+ list_index = 0;
+ len = strlen (text);
+ }
+
+ /* Return the next name which partially matches from the command list. */
+ while (name = commands[list_index].name)
+ {
+ list_index++;
+
+ if (strncmp (name, text, len) == 0)
+ return (dupstr(name));
+ }
+
+ /* If no names matched, then return NULL. */
+ return ((char *)NULL);
+}
+
+/* **************************************************************** */
+/* */
+/* FileMan Commands */
+/* */
+/* **************************************************************** */
+
+/* String to pass to system (). This is for the LIST, VIEW and RENAME
+ commands. */
+static char syscom[1024];
+
+/* List the file(s) named in arg. */
+int
+com_list (arg)
+ char *arg;
+{
+ if (!arg)
+ arg = "";
+
+ sprintf (syscom, "ls -FClg %s", arg);
+ return (system (syscom));
+}
+
+int
+com_view (arg)
+ char *arg;
+{
+ if (!valid_argument ("view", arg))
+ return 1;
+
+#if defined (__MSDOS__)
+ /* more.com doesn't grok slashes in pathnames */
+ sprintf (syscom, "less %s", arg);
+#else
+ sprintf (syscom, "more %s", arg);
+#endif
+ return (system (syscom));
+}
+
+int
+com_rename (arg)
+ char *arg;
+{
+ too_dangerous ("rename");
+ return (1);
+}
+
+int
+com_stat (arg)
+ char *arg;
+{
+ struct stat finfo;
+
+ if (!valid_argument ("stat", arg))
+ return (1);
+
+ if (stat (arg, &finfo) == -1)
+ {
+ perror (arg);
+ return (1);
+ }
+
+ printf ("Statistics for `%s':\n", arg);
+
+ printf ("%s has %d link%s, and is %lu byte%s in length.\n",
+ arg,
+ finfo.st_nlink,
+ (finfo.st_nlink == 1) ? "" : "s",
+ (unsigned long)finfo.st_size,
+ (finfo.st_size == 1) ? "" : "s");
+ printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime));
+ printf (" Last access at: %s", ctime (&finfo.st_atime));
+ printf (" Last modified at: %s", ctime (&finfo.st_mtime));
+ return (0);
+}
+
+int
+com_delete (arg)
+ char *arg;
+{
+ too_dangerous ("delete");
+ return (1);
+}
+
+/* Print out help for ARG, or for all of the commands if ARG is
+ not present. */
+int
+com_help (arg)
+ char *arg;
+{
+ register int i;
+ int printed = 0;
+
+ for (i = 0; commands[i].name; i++)
+ {
+ if (!*arg || (strcmp (arg, commands[i].name) == 0))
+ {
+ printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+ printed++;
+ }
+ }
+
+ if (!printed)
+ {
+ printf ("No commands match `%s'. Possibilities are:\n", arg);
+
+ for (i = 0; commands[i].name; i++)
+ {
+ /* Print in six columns. */
+ if (printed == 6)
+ {
+ printed = 0;
+ printf ("\n");
+ }
+
+ printf ("%s\t", commands[i].name);
+ printed++;
+ }
+
+ if (printed)
+ printf ("\n");
+ }
+ return (0);
+}
+
+/* Change to the directory ARG. */
+int
+com_cd (arg)
+ char *arg;
+{
+ if (chdir (arg) == -1)
+ {
+ perror (arg);
+ return 1;
+ }
+
+ com_pwd ("");
+ return (0);
+}
+
+/* Print out the current working directory. */
+int
+com_pwd (ignore)
+ char *ignore;
+{
+ char dir[1024], *s;
+
+ s = getcwd (dir, sizeof(dir) - 1);
+ if (s == 0)
+ {
+ printf ("Error getting pwd: %s\n", dir);
+ return 1;
+ }
+
+ printf ("Current directory is %s\n", dir);
+ return 0;
+}
+
+/* The user wishes to quit using this program. Just set DONE non-zero. */
+int
+com_quit (arg)
+ char *arg;
+{
+ done = 1;
+ return (0);
+}
+
+/* Function which tells you that you can't do this. */
+void
+too_dangerous (caller)
+ char *caller;
+{
+ fprintf (stderr,
+ "%s: Too dangerous for me to distribute. Write it yourself.\n",
+ caller);
+}
+
+/* Return non-zero if ARG is a valid argument for CALLER, else print
+ an error message and return zero. */
+int
+valid_argument (caller, arg)
+ char *caller, *arg;
+{
+ if (!arg || !*arg)
+ {
+ fprintf (stderr, "%s: Argument required.\n", caller);
+ return (0);
+ }
+
+ return (1);
+}
diff --git a/examples/hist_erasedups.c b/examples/hist_erasedups.c
new file mode 100644
index 0000000..f820eba
--- /dev/null
+++ b/examples/hist_erasedups.c
@@ -0,0 +1,121 @@
+/* hist_erasedups -- remove all duplicate entries from history file */
+
+/* Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library for
+ reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef READLINE_LIBRARY
+#define READLINE_LIBRARY 1
+#endif
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef READLINE_LIBRARY
+# include "history.h"
+#else
+# include <readline/history.h>
+#endif
+
+#include <string.h>
+
+#define STREQ(a, b) ((a)[0] == (b)[0] && strcmp(a, b) == 0)
+#define STREQN(a, b, n) ((n == 0) ? (1) \
+ : ((a)[0] == (b)[0] && strncmp(a, b, n) == 0))
+
+int hist_erasedups (void);
+
+static void
+usage()
+{
+ fprintf (stderr, "hist_erasedups: usage: hist_erasedups [-t] [filename]\n");
+ exit (2);
+}
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *fn;
+ int r;
+
+ while ((r = getopt (argc, argv, "t")) != -1)
+ {
+ switch (r)
+ {
+ case 't':
+ history_write_timestamps = 1;
+ break;
+ default:
+ usage ();
+ }
+ }
+ argv += optind;
+ argc -= optind;
+
+ fn = argc ? argv[0] : getenv ("HISTFILE");
+ if (fn == 0)
+ {
+ fprintf (stderr, "hist_erasedups: no history file\n");
+ usage ();
+ }
+
+ if ((r = read_history (fn)) != 0)
+ {
+ fprintf (stderr, "hist_erasedups: read_history: %s: %s\n", fn, strerror (r));
+ exit (1);
+ }
+
+ hist_erasedups ();
+
+ if ((r = write_history (fn)) != 0)
+ {
+ fprintf (stderr, "hist_erasedups: write_history: %s: %s\n", fn, strerror (r));
+ exit (1);
+ }
+
+ exit (0);
+}
+
+int
+hist_erasedups ()
+{
+ int r, n;
+ HIST_ENTRY *h, *temp;
+
+ using_history ();
+ while (h = previous_history ())
+ {
+ r = where_history ();
+ for (n = 0; n < r; n++)
+ {
+ temp = history_get (n+history_base);
+ if (STREQ (h->line, temp->line))
+ {
+ remove_history (n);
+ r--; /* have to get one fewer now */
+ n--; /* compensate for above increment */
+ history_offset--; /* moving backwards in history list */
+ }
+ }
+ }
+ using_history ();
+
+ return r;
+}
diff --git a/examples/hist_purgecmd.c b/examples/hist_purgecmd.c
new file mode 100644
index 0000000..7992d81
--- /dev/null
+++ b/examples/hist_purgecmd.c
@@ -0,0 +1,151 @@
+/* hist_purgecmd -- remove all instances of command or pattern from history
+ file */
+
+/* Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library for
+ reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef READLINE_LIBRARY
+#define READLINE_LIBRARY 1
+#endif
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <regex.h>
+
+#ifdef READLINE_LIBRARY
+# include "history.h"
+#else
+# include <readline/history.h>
+#endif
+
+#include <string.h>
+
+#define STREQ(a, b) ((a)[0] == (b)[0] && strcmp(a, b) == 0)
+#define STREQN(a, b, n) ((n == 0) ? (1) \
+ : ((a)[0] == (b)[0] && strncmp(a, b, n) == 0))
+
+#define PURGE_REGEXP 0x01
+
+int hist_purgecmd (char *, int);
+
+static void
+usage()
+{
+ fprintf (stderr, "hist_purgecmd: usage: hist_purgecmd [-r] [-t] [-f filename] command-spec\n");
+ exit (2);
+}
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *fn;
+ int r, flags;
+
+ flags = 0;
+ fn = 0;
+ while ((r = getopt (argc, argv, "f:rt")) != -1)
+ {
+ switch (r)
+ {
+ case 'f':
+ fn = optarg;
+ break;
+ case 'r':
+ flags |= PURGE_REGEXP;
+ break;
+ case 't':
+ history_write_timestamps = 1;
+ break;
+ default:
+ usage ();
+ }
+ }
+ argv += optind;
+ argc -= optind;
+
+ if (fn == 0)
+ fn = getenv ("HISTFILE");
+ if (fn == 0)
+ {
+ fprintf (stderr, "hist_purgecmd: no history file\n");
+ usage ();
+ }
+
+ if ((r = read_history (fn)) != 0)
+ {
+ fprintf (stderr, "hist_purgecmd: read_history: %s: %s\n", fn, strerror (r));
+ exit (1);
+ }
+
+ for (r = 0; r < argc; r++)
+ hist_purgecmd (argv[r], flags);
+
+ if ((r = write_history (fn)) != 0)
+ {
+ fprintf (stderr, "hist_purgecmd: write_history: %s: %s\n", fn, strerror (r));
+ exit (1);
+ }
+
+ exit (0);
+}
+
+int
+hist_purgecmd (cmd, flags)
+ char *cmd;
+ int flags;
+{
+ int r, n, rflags;
+ HIST_ENTRY *temp;
+ regex_t regex = { 0 };
+
+ if (flags & PURGE_REGEXP)
+ {
+ rflags = REG_EXTENDED|REG_NOSUB;
+ if (regcomp (&regex, cmd, rflags))
+ {
+ fprintf (stderr, "hist_purgecmd: %s: invalid regular expression\n", cmd);
+ return -1;
+ }
+ }
+
+ r = 0;
+ using_history ();
+ r = where_history ();
+ for (n = 0; n < r; n++)
+ {
+ temp = history_get (n+history_base);
+ if (((flags & PURGE_REGEXP) && (regexec (&regex, temp->line, 0, 0, 0) == 0)) ||
+ ((flags & PURGE_REGEXP) == 0 && STREQ (temp->line, cmd)))
+ {
+ remove_history (n);
+ r--; /* have to get one fewer now */
+ n--; /* compensate for above increment */
+ history_offset--; /* moving backwards in history list */
+ }
+ }
+ using_history ();
+
+ if (flags & PURGE_REGEXP)
+ regfree (&regex);
+
+ return r;
+}
diff --git a/examples/histexamp.c b/examples/histexamp.c
new file mode 100644
index 0000000..309d769
--- /dev/null
+++ b/examples/histexamp.c
@@ -0,0 +1,128 @@
+/* histexamp.c - history library example program. */
+
+/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library for
+ reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdio.h>
+
+#ifdef READLINE_LIBRARY
+# include "history.h"
+#else
+# include <readline/history.h>
+#endif
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char line[1024], *t;
+ int len, done;
+
+ line[0] = 0;
+ done = 0;
+
+ using_history ();
+ while (!done)
+ {
+ printf ("history$ ");
+ fflush (stdout);
+ t = fgets (line, sizeof (line) - 1, stdin);
+ if (t && *t)
+ {
+ len = strlen (t);
+ if (t[len - 1] == '\n')
+ t[len - 1] = '\0';
+ }
+
+ if (!t)
+ strcpy (line, "quit");
+
+ if (line[0])
+ {
+ char *expansion;
+ int result;
+
+ using_history ();
+
+ result = history_expand (line, &expansion);
+ if (result)
+ fprintf (stderr, "%s\n", expansion);
+
+ if (result < 0 || result == 2)
+ {
+ free (expansion);
+ continue;
+ }
+
+ add_history (expansion);
+ strncpy (line, expansion, sizeof (line) - 1);
+ free (expansion);
+ }
+
+ if (strcmp (line, "quit") == 0)
+ done = 1;
+ else if (strcmp (line, "save") == 0)
+ write_history ("history_file");
+ else if (strcmp (line, "read") == 0)
+ read_history ("history_file");
+ else if (strcmp (line, "list") == 0)
+ {
+ register HIST_ENTRY **the_list;
+ register int i;
+ time_t tt;
+ char timestr[128];
+
+ the_list = history_list ();
+ if (the_list)
+ for (i = 0; the_list[i]; i++)
+ {
+ tt = history_get_time (the_list[i]);
+ if (tt)
+ strftime (timestr, sizeof (timestr), "%a %R", localtime(&tt));
+ else
+ strcpy (timestr, "??");
+ printf ("%d: %s: %s\n", i + history_base, timestr, the_list[i]->line);
+ }
+ }
+ else if (strncmp (line, "delete", 6) == 0)
+ {
+ int which;
+ if ((sscanf (line + 6, "%d", &which)) == 1)
+ {
+ HIST_ENTRY *entry = remove_history (which);
+ if (!entry)
+ fprintf (stderr, "No such entry %d\n", which);
+ else
+ {
+ free (entry->line);
+ free (entry);
+ }
+ }
+ else
+ {
+ fprintf (stderr, "non-numeric arg given to `delete'\n");
+ }
+ }
+ }
+}
diff --git a/examples/manexamp.c b/examples/manexamp.c
new file mode 100644
index 0000000..351c628
--- /dev/null
+++ b/examples/manexamp.c
@@ -0,0 +1,111 @@
+/* manexamp.c -- The examples which appear in the documentation are here. */
+
+/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library for
+ reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdio.h>
+#include <readline/readline.h>
+
+/* **************************************************************** */
+/* */
+/* How to Emulate gets () */
+/* */
+/* **************************************************************** */
+
+/* A static variable for holding the line. */
+static char *line_read = (char *)NULL;
+
+/* Read a string, and return a pointer to it. Returns NULL on EOF. */
+char *
+rl_gets ()
+{
+ /* If the buffer has already been allocated, return the memory
+ to the free pool. */
+ if (line_read)
+ {
+ free (line_read);
+ line_read = (char *)NULL;
+ }
+
+ /* Get a line from the user. */
+ line_read = readline ("");
+
+ /* If the line has any text in it, save it on the history. */
+ if (line_read && *line_read)
+ add_history (line_read);
+
+ return (line_read);
+}
+
+/* **************************************************************** */
+/* */
+/* Writing a Function to be Called by Readline. */
+/* */
+/* **************************************************************** */
+
+/* Invert the case of the COUNT following characters. */
+invert_case_line (count, key)
+ int count, key;
+{
+ register int start, end;
+
+ start = rl_point;
+
+ if (count < 0)
+ {
+ direction = -1;
+ count = -count;
+ }
+ else
+ direction = 1;
+
+ /* Find the end of the range to modify. */
+ end = start + (count * direction);
+
+ /* Force it to be within range. */
+ if (end > rl_end)
+ end = rl_end;
+ else if (end < 0)
+ end = -1;
+
+ if (start > end)
+ {
+ int temp = start;
+ start = end;
+ end = temp;
+ }
+
+ if (start == end)
+ return;
+
+ /* Tell readline that we are modifying the line, so save the undo
+ information. */
+ rl_modifying (start, end);
+
+ for (; start != end; start += direction)
+ {
+ if (_rl_uppercase_p (rl_line_buffer[start]))
+ rl_line_buffer[start] = _rl_to_lower (rl_line_buffer[start]);
+ else if (_rl_lowercase_p (rl_line_buffer[start]))
+ rl_line_buffer[start] = _rl_to_upper (rl_line_buffer[start]);
+ }
+
+ /* Move point to on top of the last character changed. */
+ rl_point = end - direction;
+}
diff --git a/examples/readlinebuf.h b/examples/readlinebuf.h
new file mode 100644
index 0000000..c8f3a7b
--- /dev/null
+++ b/examples/readlinebuf.h
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * $Revision: 1.2 $
+ * $Date: 2001/09/11 06:19:36 $
+ * $Author: vyzo $
+ *
+ * Contents: A streambuf which uses the GNU readline library for line I/O
+ * (c) 2001 by Dimitris Vyzovitis [vyzo@media.mit.edu]
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ ******************************************************************************/
+
+#ifndef _READLINEBUF_H_
+#define _READLINEBUF_H_
+
+#include <iostream>
+#include <cstring>
+#include <cassert>
+#include <cstdlib>
+#include <cstdio>
+
+#include <readline/readline.h>
+#include <readline/history.h>
+
+#if (defined __GNUC__) && (__GNUC__ < 3)
+#include <streambuf.h>
+#else
+#include <streambuf>
+using std::streamsize;
+using std::streambuf;
+#endif
+
+class readlinebuf : public streambuf {
+public:
+#if (defined __GNUC__) && (__GNUC__ < 3)
+ typedef char char_type;
+ typedef int int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+#endif
+ static const int_type eof = EOF; // this is -1
+ static const int_type not_eof = 0;
+
+private:
+ const char* prompt_;
+ bool history_;
+ char* line_;
+ int low_;
+ int high_;
+
+protected:
+
+ virtual int_type showmanyc() const { return high_ - low_; }
+
+ virtual streamsize xsgetn( char_type* buf, streamsize n ) {
+ int rd = n > (high_ - low_)? (high_ - low_) : n;
+ memcpy( buf, line_, rd );
+ low_ += rd;
+
+ if ( rd < n ) {
+ low_ = high_ = 0;
+ free( line_ ); // free( NULL ) is a noop
+ line_ = readline( prompt_ );
+ if ( line_ ) {
+ high_ = strlen( line_ );
+ if ( history_ && high_ ) add_history( line_ );
+ rd += xsgetn( buf + rd, n - rd );
+ }
+ }
+
+ return rd;
+ }
+
+ virtual int_type underflow() {
+ if ( high_ == low_ ) {
+ low_ = high_ = 0;
+ free( line_ ); // free( NULL ) is a noop
+ line_ = readline( prompt_ );
+ if ( line_ ) {
+ high_ = strlen( line_ );
+ if ( history_ && high_ ) add_history( line_ );
+ }
+ }
+
+ if ( low_ < high_ ) return line_[low_];
+ else return eof;
+ }
+
+ virtual int_type uflow() {
+ int_type c = underflow();
+ if ( c != eof ) ++low_;
+ return c;
+ }
+
+ virtual int_type pbackfail( int_type c = eof ) {
+ if ( low_ > 0 ) --low_;
+ else if ( c != eof ) {
+ if ( high_ > 0 ) {
+ char* nl = (char*)realloc( line_, high_ + 1 );
+ if ( nl ) {
+ line_ = (char*)memcpy( nl + 1, line_, high_ );
+ high_ += 1;
+ line_[0] = char( c );
+ } else return eof;
+ } else {
+ assert( !line_ );
+ line_ = (char*)malloc( sizeof( char ) );
+ *line_ = char( c );
+ high_ = 1;
+ }
+ } else return eof;
+
+ return not_eof;
+ }
+
+public:
+ readlinebuf( const char* prompt = NULL, bool history = true )
+ : prompt_( prompt ), history_( history ),
+ line_( NULL ), low_( 0 ), high_( 0 ) {
+ setbuf( 0, 0 );
+ }
+
+
+};
+
+#endif
diff --git a/examples/rl-callbacktest.c b/examples/rl-callbacktest.c
new file mode 100644
index 0000000..7febacd
--- /dev/null
+++ b/examples/rl-callbacktest.c
@@ -0,0 +1,115 @@
+/* Standard include files. stdio.h is required. */
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+/* Used for select(2) */
+#include <sys/types.h>
+#include <sys/select.h>
+
+#include <signal.h>
+
+#include <errno.h>
+#include <stdio.h>
+
+#include <locale.h>
+
+/* Standard readline include files. */
+#if defined (READLINE_LIBRARY)
+# include "readline.h"
+# include "history.h"
+#else
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
+
+extern int errno;
+
+static void cb_linehandler (char *);
+static void signandler (int);
+
+int running, sigwinch_received;
+const char *prompt = "rltest$ ";
+
+/* Handle SIGWINCH and window size changes when readline is not active and
+ reading a character. */
+static void
+sighandler (int sig)
+{
+ sigwinch_received = 1;
+}
+
+/* Callback function called for each line when accept-line executed, EOF
+ seen, or EOF character read. This sets a flag and returns; it could
+ also call exit(3). */
+static void
+cb_linehandler (char *line)
+{
+ /* Can use ^D (stty eof) or `exit' to exit. */
+ if (line == NULL || strcmp (line, "exit") == 0)
+ {
+ if (line == 0)
+ printf ("\n");
+ printf ("exit\n");
+ /* This function needs to be called to reset the terminal settings,
+ and calling it from the line handler keeps one extra prompt from
+ being displayed. */
+ rl_callback_handler_remove ();
+
+ running = 0;
+ }
+ else
+ {
+ if (*line)
+ add_history (line);
+ printf ("input line: %s\n", line);
+ free (line);
+ }
+}
+
+int
+main (int c, char **v)
+{
+ fd_set fds;
+ int r;
+
+ setlocale (LC_ALL, "");
+
+ /* Handle SIGWINCH */
+ signal (SIGWINCH, sighandler);
+
+ /* Install the line handler. */
+ rl_callback_handler_install (prompt, cb_linehandler);
+
+ /* Enter a simple event loop. This waits until something is available
+ to read on readline's input stream (defaults to standard input) and
+ calls the builtin character read callback to read it. It does not
+ have to modify the user's terminal settings. */
+ running = 1;
+ while (running)
+ {
+ FD_ZERO (&fds);
+ FD_SET (fileno (rl_instream), &fds);
+
+ r = select (FD_SETSIZE, &fds, NULL, NULL, NULL);
+ if (r < 0 && errno != EINTR)
+ {
+ perror ("rltest: select");
+ rl_callback_handler_remove ();
+ break;
+ }
+ if (sigwinch_received)
+ {
+ rl_resize_terminal ();
+ sigwinch_received = 0;
+ }
+ if (r < 0)
+ continue;
+
+ if (FD_ISSET (fileno (rl_instream), &fds))
+ rl_callback_read_char ();
+ }
+
+ printf ("rltest: Event loop has exited\n");
+ return 0;
+}
diff --git a/examples/rl-fgets.c b/examples/rl-fgets.c
new file mode 100644
index 0000000..5512b94
--- /dev/null
+++ b/examples/rl-fgets.c
@@ -0,0 +1,374 @@
+/*
+Date: Tue, 16 Mar 2004 19:38:40 -0800
+From: Harold Levy <Harold.Levy@synopsys.com>
+Subject: fgets(stdin) --> readline() redirector
+To: chet@po.cwru.edu
+
+Hi Chet,
+
+Here is something you may find useful enough to include in the readline
+distribution. It is a shared library that redirects calls to fgets(stdin)
+to readline() via LD_PRELOAD, and it supports a custom prompt and list of
+command names. Many people have asked me for this file, so I thought I'd
+pass it your way in hope of just including it with readline to begin with.
+
+Best Regards,
+
+-Harold
+*/
+
+/******************************************************************************
+*******************************************************************************
+
+ FILE NAME: fgets.c TARGET: libfgets.so
+ AUTHOR: Harold Levy VERSION: 1.0
+ hlevy@synopsys.com
+
+ ABSTRACT: Customize fgets() behavior via LD_PRELOAD in the following ways:
+
+ -- If fgets(stdin) is called, redirect to GNU readline() to obtain
+ command-line editing, file-name completion, history, etc.
+
+ -- A list of commands for command-name completion can be configured by
+ setting the environment-variable FGETS_COMMAND_FILE to a file containing
+ the list of commands to be used.
+
+ -- Command-line editing with readline() works best when the prompt string
+ is known; you can set this with the FGETS_PROMPT environment variable.
+
+ -- There special strings that libfgets will interpret as internal commands:
+
+ _fgets_reset_ reset the command list
+
+ _fgets_dump_ dump status
+
+ _fgets_debug_ toggle debug messages
+
+ HOW TO BUILD: Here are examples of how to build libfgets.so on various
+ platforms; you will have to add -I and -L flags to configure access to
+ the readline header and library files.
+
+ (32-bit builds with gcc)
+ AIX: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lreadline -ltermcap
+ HP-UX: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldld -lreadline
+ Linux: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lreadline
+ SunOS: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lgen -lreadline
+
+ (64-bit builds without gcc)
+ SunOS: SUNWspro/bin/cc -D_LARGEFILE64_SOURCE=1 -xtarget=ultra -xarch=v9 \
+ -KPIC fgets.c -Bdynamic -lc -ldl -lgen -ltermcap -lreadline
+
+ HOW TO USE: Different operating systems have different levels of support
+ for the LD_PRELOAD concept. The generic method for 32-bit platforms is to
+ put libtermcap.so, libfgets.so, and libreadline.so (with absolute paths)
+ in the LD_PRELOAD environment variable, and to put their parent directories
+ in the LD_LIBRARY_PATH environment variable. Unfortunately there is no
+ generic method for 64-bit platforms; e.g. for 64-bit SunOS, you would have
+ to build both 32-bit and 64-bit libfgets and libreadline libraries, and
+ use the LD_FLAGS_32 and LD_FLAGS_64 environment variables with preload and
+ library_path configurations (a mix of 32-bit and 64-bit calls are made under
+ 64-bit SunOS).
+
+ EXAMPLE WRAPPER: Here is an example shell script wrapper around the
+ program "foo" that uses fgets() for command-line input:
+
+ #!/bin/csh
+ #### replace this with the libtermcap.so directory:
+ set dir1 = "/usr/lib"
+ #### replace this with the libfgets.so directory:
+ set dir2 = "/usr/fgets"
+ #### replace this with the libreadline.so directory:
+ set dir3 = "/usr/local/lib"
+ set lib1 = "${dir1}/libtermcap.so"
+ set lib2 = "${dir2}/libfgets.so"
+ set lib3 = "${dir3}/libreadline.so"
+ if ( "${?LD_PRELOAD}" ) then
+ setenv LD_PRELOAD "${lib1}:${lib2}:${lib3}:${LD_PRELOAD}"
+ else
+ setenv LD_PRELOAD "${lib1}:${lib2}:${lib3}"
+ endif
+ if ( "${?LD_LIBRARY_PATH}" ) then
+ setenv LD_LIBRARY_PATH "${dir1}:${dir2}:${dir3}:${LD_LIBRARY_PATH}"
+ else
+ setenv LD_LIBRARY_PATH "${dir1}:${dir2}:${dir3}"
+ endif
+ setenv FGETS_COMMAND_FILE "${dir2}/foo.commands"
+ setenv FGETS_PROMPT "foo> "
+ exec "foo" $*
+
+ Copyright (C)©2003-2004 Harold Levy.
+
+ This code links to the GNU readline library, and as such is bound by the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation, either version 2 or (at your option) any later version.
+
+ The GNU General Public License is often shipped with GNU software, and is
+ generally kept in a file called COPYING or LICENSE. If you do not have a
+ copy of the license, write to the Free Software Foundation, 59 Temple Place,
+ Suite 330, Boston, MA 02111 USA.
+
+ 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.
+
+*******************************************************************************
+******************************************************************************/
+
+
+
+#include <dlfcn.h>
+#include <stdio.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <readline/readline.h>
+#include <readline/history.h>
+
+
+
+/* for dynamically connecting to the native fgets() */
+#if defined(RTLD_NEXT)
+#define REAL_LIBC RTLD_NEXT
+#else
+#define REAL_LIBC ((void *) -1L)
+#endif
+typedef char * ( * fgets_t ) ( char * s, int n, FILE * stream ) ;
+
+
+
+/* private data */
+/* -- writeable data is stored in the shared library's data segment
+ -- every process that uses the shared library gets a private memory copy of
+ its entire data segment
+ -- static data in the shared library is not copied to the application
+ -- only read-only (i.e. 'const') data is stored in the shared library's
+ text segment
+*/
+static char ** my_fgets_names = NULL ;
+static int my_fgets_number_of_names = 0 ;
+static int my_fgets_debug_flag = 0 ;
+
+
+
+/* invoked with _fgets_reset_ */
+static void
+my_fgets_reset (
+ void
+) {
+ if ( my_fgets_names && (my_fgets_number_of_names > 0) ) {
+ int i ;
+ if ( my_fgets_debug_flag ) {
+ printf ( "libfgets: removing command list\n" ) ;
+ }
+ for ( i = 0 ; i < my_fgets_number_of_names ; i ++ ) {
+ if ( my_fgets_names[i] ) free ( my_fgets_names[i] ) ;
+ }
+ free ( my_fgets_names ) ;
+ }
+ my_fgets_names = NULL ;
+ my_fgets_number_of_names = 0 ;
+}
+
+
+
+/* invoked with _fgets_dump_ */
+static void
+my_fgets_dump (
+ void
+) {
+ char * s ;
+ printf ( "\n" ) ;
+ s = getenv ( "FGETS_PROMPT" ) ;
+ printf ( "FGETS_PROMPT = %s\n", s ? s : "" ) ;
+ s = getenv ( "FGETS_COMMAND_FILE" ) ;
+ printf ( "FGETS_COMMAND_FILE = %s\n", s ? s : "" ) ;
+ printf ( "debug flag = %d\n", my_fgets_debug_flag ) ;
+ printf ( "#commands = %d\n", my_fgets_number_of_names ) ;
+ if ( my_fgets_debug_flag ) {
+ if ( my_fgets_names && (my_fgets_number_of_names > 0) ) {
+ int i ;
+ for ( i = 0 ; i < my_fgets_number_of_names ; i ++ ) {
+ printf ( "%s\n", my_fgets_names[i] ) ;
+ }
+ }
+ }
+ printf ( "\n" ) ;
+}
+
+
+
+/* invoked with _fgets_debug_ */
+static void
+my_fgets_debug_toggle (
+ void
+) {
+ my_fgets_debug_flag = my_fgets_debug_flag ? 0 : 1 ;
+ if ( my_fgets_debug_flag ) {
+ printf ( "libfgets: debug flag = %d\n", my_fgets_debug_flag ) ;
+ }
+}
+
+
+
+/* read the command list if needed, return the i-th name */
+static char *
+my_fgets_lookup (
+ int index
+) {
+ if ( (! my_fgets_names) || (! my_fgets_number_of_names) ) {
+ char * fname ;
+ FILE * fp ;
+ fgets_t _fgets ;
+ int i ;
+ char buf1[256], buf2[256] ;
+ fname = getenv ( "FGETS_COMMAND_FILE" ) ;
+ if ( ! fname ) {
+ if ( my_fgets_debug_flag ) {
+ printf ( "libfgets: empty or unset FGETS_COMMAND_FILE\n" ) ;
+ }
+ return NULL ;
+ }
+ fp = fopen ( fname, "r" ) ;
+ if ( ! fp ) {
+ if ( my_fgets_debug_flag ) {
+ printf ( "libfgets: cannot open '%s' for reading\n", fname ) ;
+ }
+ return NULL ;
+ }
+ _fgets = (fgets_t) dlsym ( REAL_LIBC, "fgets" ) ;
+ if ( ! _fgets ) {
+ fprintf ( stderr,
+ "libfgets: failed to dynamically link to native fgets()\n"
+ ) ;
+ return NULL ;
+ }
+ for ( i = 0 ; _fgets(buf1,255,fp) ; i ++ ) ;
+ if ( ! i ) { fclose(fp) ; return NULL ; }
+ my_fgets_names = (char**) calloc ( i, sizeof(char*) ) ;
+ rewind ( fp ) ;
+ i = 0 ;
+ while ( _fgets(buf1,255,fp) ) {
+ buf1[255] = 0 ;
+ if ( 1 == sscanf(buf1,"%s",buf2) ) {
+ my_fgets_names[i] = strdup(buf2) ;
+ i ++ ;
+ }
+ }
+ fclose ( fp ) ;
+ my_fgets_number_of_names = i ;
+ if ( my_fgets_debug_flag ) {
+ printf ( "libfgets: successfully read %d commands\n", i ) ;
+ }
+ }
+ if ( index < my_fgets_number_of_names ) {
+ return my_fgets_names[index] ;
+ } else {
+ return NULL ;
+ }
+}
+
+
+
+/* generate a list of partial name matches for readline() */
+static char *
+my_fgets_generator (
+ const char * text,
+ int state
+)
+{
+ static int list_index, len ;
+ char * name ;
+ if ( ! state ) {
+ list_index = 0 ;
+ len = strlen ( text ) ;
+ }
+ while ( ( name = my_fgets_lookup(list_index) ) ) {
+ list_index ++ ;
+ if ( ! strncmp ( name, text, len ) ) {
+ return ( strdup ( name ) ) ;
+ }
+ }
+ return ( NULL ) ;
+}
+
+
+
+/* partial name completion callback for readline() */
+static char **
+my_fgets_completion (
+ const char * text,
+ int start,
+ int end
+)
+{
+ char ** matches ;
+ matches = NULL ;
+ if ( ! start ) {
+ matches = rl_completion_matches ( text, my_fgets_generator ) ;
+ }
+ return ( matches ) ;
+}
+
+
+
+/* fgets() intercept */
+char *
+fgets (
+ char * s,
+ int n,
+ FILE * stream
+)
+{
+ if ( ! s ) return NULL ;
+ if ( stream == stdin ) {
+ char * prompt ;
+ char * my_fgets_line ;
+ rl_already_prompted = 1 ;
+ rl_attempted_completion_function = my_fgets_completion ;
+ rl_catch_signals = 1 ;
+ rl_catch_sigwinch = 1 ;
+ rl_set_signals () ;
+ prompt = getenv ( "FGETS_PROMPT" ) ;
+ for (
+ my_fgets_line = 0 ; ! my_fgets_line ; my_fgets_line=readline(prompt)
+ ) ;
+ if ( ! strncmp(my_fgets_line, "_fgets_reset_", 13) ) {
+ my_fgets_reset () ;
+ free ( my_fgets_line ) ;
+ strcpy ( s, "\n" ) ;
+ return ( s ) ;
+ }
+ if ( ! strncmp(my_fgets_line, "_fgets_dump_", 12) ) {
+ my_fgets_dump () ;
+ free ( my_fgets_line ) ;
+ strcpy ( s, "\n" ) ;
+ return ( s ) ;
+ }
+ if ( ! strncmp(my_fgets_line, "_fgets_debug_", 13) ) {
+ my_fgets_debug_toggle () ;
+ free ( my_fgets_line ) ;
+ strcpy ( s, "\n" ) ;
+ return ( s ) ;
+ }
+ (void) strncpy ( s, my_fgets_line, n-1 ) ;
+ (void) strcat ( s, "\n" ) ;
+ if ( *my_fgets_line ) add_history ( my_fgets_line ) ;
+ free ( my_fgets_line ) ;
+ return ( s ) ;
+ } else {
+ static fgets_t _fgets ;
+ _fgets = (fgets_t) dlsym ( REAL_LIBC, "fgets" ) ;
+ if ( ! _fgets ) {
+ fprintf ( stderr,
+ "libfgets: failed to dynamically link to native fgets()\n"
+ ) ;
+ strcpy ( s, "\n" ) ;
+ return ( s ) ;
+ }
+ return (
+ _fgets ( s, n, stream )
+ ) ;
+ }
+}
diff --git a/examples/rl-test-timeout b/examples/rl-test-timeout
new file mode 100644
index 0000000..2c9de1a
--- /dev/null
+++ b/examples/rl-test-timeout
@@ -0,0 +1,6 @@
+./rl-timeout readline1 0.5
+./rl-timeout readline2 0.25
+
+./rl-timeout callback1 0.5
+./rl-timeout callback2 0.5
+
diff --git a/examples/rl-timeout.c b/examples/rl-timeout.c
new file mode 100644
index 0000000..b8a24ba
--- /dev/null
+++ b/examples/rl-timeout.c
@@ -0,0 +1,245 @@
+/* rl-timeout: test various readline builtin timeouts. */
+
+/* Copyright (C) 2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library for
+ reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* Standard include files. stdio.h is required. */
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <limits.h>
+
+/* Used for select(2) */
+#include <sys/types.h>
+#include <sys/select.h>
+
+#include <errno.h>
+#include <stdio.h>
+
+/* Standard readline include files. */
+#if defined (READLINE_LIBRARY)
+# include "readline.h"
+# include "history.h"
+#else
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
+
+extern int errno;
+
+static void cb_linehandler (char *);
+
+int timeout_secs = 1, timeout_usecs = 0;
+int running;
+const char *prompt = "rl-timeout$ ";
+
+/* **************************************************************** */
+/* */
+/* Example 1: readline () with rl_readline_state */
+/* */
+/* **************************************************************** */
+
+void
+rltest_timeout_readline1 ()
+{
+ const char *temp;
+
+ rl_set_timeout (timeout_secs, timeout_usecs);
+ temp = readline (prompt);
+ if (RL_ISSTATE (RL_STATE_TIMEOUT))
+ printf ("timeout\n");
+ else if (temp == NULL)
+ printf ("no input line\n");
+ else
+ printf ("input line: %s\n", temp);
+ free ((void *) temp);
+}
+
+/* **************************************************************** */
+/* */
+/* Example 2: readline () with rl_timeout_event_hook */
+/* */
+/* **************************************************************** */
+
+static int
+timeout_handler ()
+{
+ printf ("timeout\n");
+ return READERR;
+}
+
+void
+rltest_timeout_readline2 ()
+{
+ const char *temp;
+
+ rl_set_timeout (timeout_secs, timeout_usecs);
+ rl_timeout_event_hook = timeout_handler;
+ temp = readline (prompt);
+ if (temp == NULL)
+ printf ("no input line\n");
+ else
+ printf ("input line: %s\n", temp);
+ free ((void *)temp);
+}
+
+/* **************************************************************** */
+/* */
+/* Example 3: rl_callback_* () with rl_timeout_remaining */
+/* */
+/* **************************************************************** */
+
+/* Callback function called for each line when accept-line executed, EOF
+ seen, or EOF character read. This sets a flag and returns; it could
+ also call exit(3). */
+static void
+cb_linehandler (char *line)
+{
+ /* Can use ^D (stty eof) or `exit' to exit. */
+ if (line == NULL || strcmp (line, "exit") == 0)
+ {
+ if (line == 0)
+ printf ("\n");
+ printf ("exit\n");
+ /* This function needs to be called to reset the terminal settings,
+ and calling it from the line handler keeps one extra prompt from
+ being displayed. */
+ rl_callback_handler_remove ();
+
+ running = 0;
+ }
+ else
+ {
+ if (*line)
+ add_history (line);
+ printf ("input line: %s\n", line);
+ free (line);
+ }
+}
+
+void
+rltest_timeout_callback1 ()
+{
+ fd_set fds;
+ int r;
+ unsigned sec, usec;
+
+ rl_set_timeout (timeout_secs, timeout_usecs);
+ rl_callback_handler_install (prompt, cb_linehandler);
+ running = 1;
+ while (running)
+ {
+ FD_ZERO (&fds);
+ FD_SET (fileno (rl_instream), &fds);
+ r = rl_timeout_remaining (&sec, &usec);
+ if (r == 1)
+ {
+ struct timeval timeout = {sec, usec};
+ r = select (FD_SETSIZE, &fds, NULL, NULL, &timeout);
+ }
+ if (r < 0 && errno != EINTR)
+ {
+ perror ("rl-timeout: select");
+ rl_callback_handler_remove ();
+ break;
+ }
+ else if (r == 0)
+ {
+ printf ("rl-timeout: timeout\n");
+ rl_callback_handler_remove ();
+ break;
+ }
+
+ if (FD_ISSET (fileno (rl_instream), &fds))
+ rl_callback_read_char ();
+ }
+
+ printf ("rl-timeout: Event loop has exited\n");
+}
+
+/* **************************************************************** */
+/* */
+/* Example 4: rl_callback_* () with rl_timeout_event_hook */
+/* */
+/* **************************************************************** */
+
+static int
+cb_timeouthandler ()
+{
+ printf ("timeout\n");
+ rl_callback_handler_remove ();
+ running = 0;
+ return READERR;
+}
+
+void
+rltest_timeout_callback2 ()
+{
+ int r;
+
+ rl_set_timeout (timeout_secs, timeout_usecs);
+ rl_timeout_event_hook = cb_timeouthandler;
+ rl_callback_handler_install (prompt, cb_linehandler);
+ running = 1;
+ while (running)
+ rl_callback_read_char ();
+
+ printf ("rl-timeout: Event loop has exited\n");
+}
+
+int
+main (int argc, char **argv)
+{
+ if (argc >= 2)
+ {
+ if (argc >= 3)
+ {
+ double timeout = atof (argv[2]);
+ if (timeout <= 0.0)
+ {
+ fprintf (stderr, "rl-timeout: specify a positive number for timeout.\n");
+ return 2;
+ }
+ else if (timeout > UINT_MAX)
+ {
+ fprintf (stderr, "rl-timeout: timeout too large.\n");
+ return 2;
+ }
+ timeout_secs = (unsigned) timeout;
+ timeout_usecs = (unsigned) ((timeout - timeout_secs) * 1000000 + 0.5);
+ }
+
+ if (strcmp (argv[1], "readline1") == 0)
+ rltest_timeout_readline1 ();
+ else if (strcmp (argv[1], "readline2") == 0)
+ rltest_timeout_readline2 ();
+ else if (strcmp (argv[1], "callback1") == 0)
+ rltest_timeout_callback1 ();
+ else if (strcmp (argv[1], "callback2") == 0)
+ rltest_timeout_callback2 ();
+ else
+ return 2;
+ }
+ else
+ {
+ fprintf (stderr, "usage: rl-timeout [readline1 | readline2 | callback1 | callback2] [timeout]\n");
+ return 2;
+ }
+ return 0;
+}
diff --git a/examples/rl.c b/examples/rl.c
new file mode 100644
index 0000000..39e5b8e
--- /dev/null
+++ b/examples/rl.c
@@ -0,0 +1,166 @@
+/*
+ * rl - command-line interface to read a line from the standard input
+ * (or another fd) using readline.
+ *
+ * usage: rl [-p prompt] [-u unit] [-d default] [-n nchars]
+ */
+
+/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library for
+ reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <unistd.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+extern void exit();
+#endif
+
+#ifdef HAVE_LOCALE_H
+# include <locale.h>
+#endif
+
+#if defined (READLINE_LIBRARY)
+# include "posixstat.h"
+# include "readline.h"
+# include "history.h"
+#else
+# include <sys/stat.h>
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
+
+extern int optind;
+extern char *optarg;
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strrchr();
+#endif
+
+static char *progname;
+static char *deftext;
+
+static int
+set_deftext ()
+{
+ if (deftext)
+ {
+ rl_insert_text (deftext);
+ deftext = (char *)NULL;
+ rl_startup_hook = (rl_hook_func_t *)NULL;
+ }
+ return 0;
+}
+
+static void
+usage()
+{
+ fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default] [-n nchars]\n",
+ progname, progname);
+}
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *temp, *prompt;
+ struct stat sb;
+ int opt, fd, nch;
+ FILE *ifp;
+
+ progname = strrchr(argv[0], '/');
+ if (progname == 0)
+ progname = argv[0];
+ else
+ progname++;
+
+#ifdef HAVE_SETLOCALE
+ setlocale (LC_ALL, "");
+#endif
+
+ /* defaults */
+ prompt = "readline$ ";
+ fd = nch = 0;
+ deftext = (char *)0;
+
+ while ((opt = getopt(argc, argv, "p:u:d:n:")) != EOF)
+ {
+ switch (opt)
+ {
+ case 'p':
+ prompt = optarg;
+ break;
+ case 'u':
+ fd = atoi(optarg);
+ if (fd < 0)
+ {
+ fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg);
+ exit (2);
+ }
+ break;
+ case 'd':
+ deftext = optarg;
+ break;
+ case 'n':
+ nch = atoi(optarg);
+ if (nch < 0)
+ {
+ fprintf (stderr, "%s: bad value for -n: `%s'\n", progname, optarg);
+ exit (2);
+ }
+ break;
+ default:
+ usage ();
+ exit (2);
+ }
+ }
+
+ if (fd != 0)
+ {
+ if (fstat (fd, &sb) < 0)
+ {
+ fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd);
+ exit (1);
+ }
+ ifp = fdopen (fd, "r");
+ rl_instream = ifp;
+ }
+
+ if (deftext && *deftext)
+ rl_startup_hook = set_deftext;
+
+ if (nch > 0)
+ rl_num_chars_to_read = nch;
+
+ temp = readline (prompt);
+
+ /* Test for EOF. */
+ if (temp == 0)
+ exit (1);
+
+ printf ("%s\n", temp);
+ exit (0);
+}
diff --git a/examples/rlbasic.c b/examples/rlbasic.c
new file mode 100644
index 0000000..1ce4da9
--- /dev/null
+++ b/examples/rlbasic.c
@@ -0,0 +1,37 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_LOCALE_H
+# include <locale.h>
+#endif
+
+#if defined (READLINE_LIBRARY)
+# include "readline.h"
+# include "history.h"
+#else
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
+
+int
+main (int c, char **v)
+{
+ char *input;
+
+#ifdef HAVE_SETLOCALE
+ setlocale (LC_ALL, "");
+#endif
+
+ for (;;) {
+ input = readline ((char *)NULL);
+ if (input == 0)
+ break;
+ printf ("%s\n", input);
+ if (strcmp (input, "exit") == 0)
+ break;
+ free (input);
+ }
+ exit (0);
+}
diff --git a/examples/rlcat.c b/examples/rlcat.c
new file mode 100644
index 0000000..f1b0362
--- /dev/null
+++ b/examples/rlcat.c
@@ -0,0 +1,187 @@
+/*
+ * rlcat - cat(1) using readline
+ *
+ * usage: rlcat
+ */
+
+/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library for
+ reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <sys/types.h>
+#include "posixstat.h"
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+extern void exit();
+#endif
+
+#ifdef HAVE_LOCALE_H
+# include <locale.h>
+#endif
+
+#ifndef errno
+extern int errno;
+#endif
+
+#if defined (READLINE_LIBRARY)
+# include "readline.h"
+# include "history.h"
+#else
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
+
+extern int optind;
+extern char *optarg;
+
+static int stdcat();
+
+static char *progname;
+static int vflag;
+
+static void
+usage()
+{
+ fprintf (stderr, "%s: usage: %s [-vEVN] [filename]\n", progname, progname);
+}
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *temp;
+ int opt, Vflag, Nflag;
+
+#ifdef HAVE_SETLOCALE
+ setlocale (LC_ALL, "");
+#endif
+
+ progname = strrchr(argv[0], '/');
+ if (progname == 0)
+ progname = argv[0];
+ else
+ progname++;
+
+ vflag = Vflag = Nflag = 0;
+ while ((opt = getopt(argc, argv, "vEVN")) != EOF)
+ {
+ switch (opt)
+ {
+ case 'v':
+ vflag = 1;
+ break;
+ case 'V':
+ Vflag = 1;
+ break;
+ case 'E':
+ Vflag = 0;
+ break;
+ case 'N':
+ Nflag = 1;
+ break;
+ default:
+ usage ();
+ exit (2);
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ if (isatty(0) == 0 || argc || Nflag)
+ return stdcat(argc, argv);
+
+ rl_variable_bind ("editing-mode", Vflag ? "vi" : "emacs");
+ while (temp = readline (""))
+ {
+ if (*temp)
+ add_history (temp);
+ printf ("%s\n", temp);
+ }
+
+ return (ferror (stdout));
+}
+
+static int
+fcopy(fp)
+ FILE *fp;
+{
+ int c;
+ char *x;
+
+ while ((c = getc(fp)) != EOF)
+ {
+ if (vflag && isascii ((unsigned char)c) && isprint((unsigned char)c) == 0)
+ {
+ x = rl_untranslate_keyseq (c);
+ if (fputs (x, stdout) == EOF)
+ return 1;
+ }
+ else if (putchar (c) == EOF)
+ return 1;
+ }
+ return (ferror (stdout));
+}
+
+int
+stdcat (argc, argv)
+ int argc;
+ char **argv;
+{
+ int i, fd, r;
+ char *s;
+ FILE *fp;
+
+ if (argc == 0)
+ return (fcopy(stdin));
+
+ for (i = 0, r = 1; i < argc; i++)
+ {
+ if (*argv[i] == '-' && argv[i][1] == 0)
+ fp = stdin;
+ else
+ {
+ fp = fopen (argv[i], "r");
+ if (fp == 0)
+ {
+ fprintf (stderr, "%s: %s: cannot open: %s\n", progname, argv[i], strerror(errno));
+ continue;
+ }
+ }
+ r = fcopy (fp);
+ if (fp != stdin)
+ fclose(fp);
+ }
+ return r;
+}
diff --git a/examples/rlevent.c b/examples/rlevent.c
new file mode 100644
index 0000000..1b7f4eb
--- /dev/null
+++ b/examples/rlevent.c
@@ -0,0 +1,181 @@
+/*
+ * rl - command-line interface to read a line from the standard input
+ * (or another fd) using readline.
+ *
+ * usage: rl [-p prompt] [-u unit] [-d default] [-n nchars]
+ */
+
+/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library for
+ reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#else
+extern int getopt();
+extern int sleep();
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+extern void exit();
+#endif
+
+#ifdef HAVE_LOCALE_H
+# include <locale.h>
+#endif
+
+#if defined (READLINE_LIBRARY)
+# include "posixstat.h"
+# include "readline.h"
+# include "history.h"
+#else
+# include <sys/stat.h>
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
+
+extern int optind;
+extern char *optarg;
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strrchr();
+#endif
+
+static char *progname;
+static char *deftext;
+
+static int
+event_hook ()
+{
+ fprintf (stderr, "ding!\n");
+ sleep (1);
+ return 0;
+}
+
+static int
+set_deftext ()
+{
+ if (deftext)
+ {
+ rl_insert_text (deftext);
+ deftext = (char *)NULL;
+ rl_startup_hook = (rl_hook_func_t *)NULL;
+ }
+ return 0;
+}
+
+static void
+usage()
+{
+ fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default] [-n nchars]\n",
+ progname, progname);
+}
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *temp, *prompt;
+ struct stat sb;
+ int opt, fd, nch;
+ FILE *ifp;
+
+#ifdef HAVE_SETLOCALE
+ setlocale (LC_ALL, "");
+#endif
+
+ progname = strrchr(argv[0], '/');
+ if (progname == 0)
+ progname = argv[0];
+ else
+ progname++;
+
+ /* defaults */
+ prompt = "readline$ ";
+ fd = nch = 0;
+ deftext = (char *)0;
+
+ while ((opt = getopt(argc, argv, "p:u:d:n:")) != EOF)
+ {
+ switch (opt)
+ {
+ case 'p':
+ prompt = optarg;
+ break;
+ case 'u':
+ fd = atoi(optarg);
+ if (fd < 0)
+ {
+ fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg);
+ exit (2);
+ }
+ break;
+ case 'd':
+ deftext = optarg;
+ break;
+ case 'n':
+ nch = atoi(optarg);
+ if (nch < 0)
+ {
+ fprintf (stderr, "%s: bad value for -n: `%s'\n", progname, optarg);
+ exit (2);
+ }
+ break;
+ default:
+ usage ();
+ exit (2);
+ }
+ }
+
+ if (fd != 0)
+ {
+ if (fstat (fd, &sb) < 0)
+ {
+ fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd);
+ exit (1);
+ }
+ ifp = fdopen (fd, "r");
+ rl_instream = ifp;
+ }
+
+ if (deftext && *deftext)
+ rl_startup_hook = set_deftext;
+
+ if (nch > 0)
+ rl_num_chars_to_read = nch;
+
+ rl_event_hook = event_hook;
+ temp = readline (prompt);
+
+ /* Test for EOF. */
+ if (temp == 0)
+ exit (1);
+
+ printf ("%s\n", temp);
+ exit (0);
+}
diff --git a/examples/rlfe/ChangeLog b/examples/rlfe/ChangeLog
new file mode 100644
index 0000000..ba41b2b
--- /dev/null
+++ b/examples/rlfe/ChangeLog
@@ -0,0 +1,37 @@
+2004-11-04 Per Bothner <per@bothner.com>
+
+ * pty.c: Import from screen-4.0.2.
+ * configure.in, Makefile.in, config.h.in: Set up autoconf handling,
+ copying a bunk of stuff over from screen.
+ * rlfe.c: Use OpenPTY from pty.c instead of get_master_pty.
+
+2004-11-03 Per Bothner <per@bothner.com>
+
+ * rlfe.c: Get input emphasis (boldening) more robust.
+
+ * rlfe.c: Various cleanups on comments and names.
+
+2003-11-07 Wolfgang Taeuber <wolfgang_taeuber@agilent.com>
+
+ * Specify a history file and the size of the history file with command
+ * line options; use EDITOR/VISUAL to set vi/emacs preference.
+
+1999-09-03 Chet Ramey <chet@nike.ins.cwru.edu>
+
+ * fep.c: Memmove is not universally available. This patch assumes
+ that an autoconf test has been performed, and that memcpy is
+ available without checking.
+
+ * fep.c: VDISCARD is not universally available, even when termios is.
+
+ * fep.c: If a system doesn't have TIOCSCTTY, the first `open'
+ performed after setsid allocates a controlling terminal. The
+ original code would leave the child process running on the slave pty
+ without a controlling tty if TIOCSCTTY was not available.
+
+ * fep.c: Most versions of SVR4, including solaris, don't allow
+ terminal ioctl calls on the master side of the pty.
+
+1999-08-28 Per Bothner <per@bothner.com>
+
+ * fep.c: Initial release.
diff --git a/examples/rlfe/Makefile.in b/examples/rlfe/Makefile.in
new file mode 100644
index 0000000..7d6fd53
--- /dev/null
+++ b/examples/rlfe/Makefile.in
@@ -0,0 +1,184 @@
+#
+# Makefile template for rlfe
+#
+# See machine dependant config.h for more configuration options.
+#
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+DESTDIR =
+
+# Where to install screen.
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+# don't forget to change mandir and infodir in doc/Makefile.
+bindir = $(exec_prefix)/bin
+
+VERSION = @VERSION@
+SCREEN = screen-$(VERSION)
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+#LDFLAGS = -L$(READLINE_DIR)
+LDFLAGS = @LDFLAGS@
+LIBS = -lreadline -lhistory @LIBS@
+
+CPP=@CPP@
+CPP_DEPEND=$(CC) -MM
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+AWK = @AWK@
+
+OPTIONS=
+#OPTIONS= -DDEBUG
+
+SHELL=/bin/sh
+
+CFILES= rlfe.c pty.c
+HFILES= extern.h os.h screen.h
+EXTRA_DIST=configure.in configure Makefile.in config.h.in ChangeLog README
+OFILES= rlfe.o pty.o
+
+all: rlfe
+
+rlfe: $(OFILES)
+ $(CC) $(LDFLAGS) -o $@ $(OFILES) $(LIBS)
+
+rlfe-$(VERSION).tar.gz:
+ tar czf $@ $(CFILES) $(HFILES) $(EXTRA_DIST)
+
+.c.o:
+ $(CC) -c -I. -I$(srcdir) $(CPPFLAGS) $(M_CFLAGS) $(DEFS) $(OPTIONS) $(CFLAGS) $<
+
+install_bin: .version screen
+ -if [ -f $(DESTDIR)$(bindir)/$(SCREEN) ] && [ ! -f $(DESTDIR)$(bindir)/$(SCREEN).old ]; \
+ then mv $(DESTDIR)$(bindir)/$(SCREEN) $(DESTDIR)$(bindir)/$(SCREEN).old; fi
+ $(INSTALL_PROGRAM) screen $(DESTDIR)$(bindir)/$(SCREEN)
+ -chown root $(DESTDIR)$(bindir)/$(SCREEN) && chmod 4755 $(DESTDIR)$(bindir)/$(SCREEN)
+# This doesn't work if $(bindir)/screen is a symlink
+ -if [ -f $(DESTDIR)$(bindir)/screen ] && [ ! -f $(DESTDIR)$(bindir)/screen.old ]; then mv $(DESTDIR)$(bindir)/screen $(DESTDIR)$(bindir)/screen.old; fi
+ rm -f $(DESTDIR)$(bindir)/screen
+ (cd $(DESTDIR)$(bindir) && ln -sf $(SCREEN) screen)
+ cp $(srcdir)/utf8encodings/?? $(DESTDIR)$(SCREENENCODINGS)
+
+uninstall: .version
+ rm -f $(DESTDIR)$(bindir)/$(SCREEN)
+ rm -f $(DESTDIR)$(bindir)/screen
+ -mv $(DESTDIR)$(bindir)/screen.old $(DESTDIR)$(bindir)/screen
+ rm -f $(DESTDIR)$(ETCSCREENRC)
+ cd doc; $(MAKE) uninstall
+
+shadow:
+ mkdir shadow;
+ cd shadow; ln -s ../*.[ch] ../*.in ../*.sh ../configure ../doc ../terminfo ../etc .
+ rm -f shadow/term.h shadow/tty.c shadow/comm.h shadow/osdef.h
+ echo "install all Makefiles and config:" > shadow/Makefile
+ echo " rm -f config.cache" >> shadow/Makefile
+ echo " sh ./configure" >> shadow/Makefile
+
+term.h: term.c term.sh
+ AWK=$(AWK) srcdir=$(srcdir) sh $(srcdir)/term.sh
+
+kmapdef.c: term.h
+
+tty.c: tty.sh
+ sh $(srcdir)/tty.sh tty.c
+
+mostlyclean:
+ rm -f $(OFILES) rlfe *.o
+
+clean celan: mostlyclean
+ rm -f tty.c term.h comm.h osdef.h kmapdef.c core
+
+# Delete all files from the current directory that are created by
+# configuring or building the program.
+# building of term.h/comm.h requires awk. Keep it in the distribution
+# we keep config.h, as this file knows where 'make dist' finds the ETCSCREENRC.
+#distclean: mostlyclean
+# rm -f $(SCREEN).tar $(SCREEN).tar.gz
+# rm -f config.status Makefile
+# rm -f osdef.h doc/Makefile
+
+maintainer-clean:
+ @echo "This command is not even intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+
+# Delete everything from the current directory that can be
+# reconstructed with this Makefile.
+realclean: .version mostlyclean
+ rm -f $(SCREEN).tar $(SCREEN).tar.gz
+ rm -f config.status Makefile doc/Makefile
+ rm -f tty.c term.h comm.h osdef.h kmapdef.c
+ rm -f config.h
+ echo "install all Makefiles and config:" > Makefile
+ echo " sh ./configure" >> Makefile
+
+tags TAGS: $(CFILES)
+ -ctags *.sh $(CFILES) *.h
+ -ctags -e *.sh $(CFILES) *.h
+
+dist: .version $(SCREEN).tar.gz
+
+
+# Perform self-tests (if any).
+check:
+
+config:
+ rm -f config.cache
+ sh ./configure
+
+
+###############################################################################
+
+.version:
+ @rev=`sed < $(srcdir)/patchlevel.h -n -e '/#define REV/s/#define REV *//p'`; \
+ vers=`sed < $(srcdir)/patchlevel.h -n -e '/#define VERS/s/#define VERS *//p'`; \
+ pat=`sed < $(srcdir)/patchlevel.h -n -e '/#define PATCHLEVEL/s/#define PATCHLEVEL *//p'`; \
+ if [ "$${rev}.$${vers}.$${pat}" != "$(VERSION)" ]; then \
+ echo "This distribution is screen-$${rev}.$${vers}.$${pat}, but"; \
+ echo "the Makefile is from $(VERSION). Please update!"; exit 1; fi
+
+###############################################################################
+
+mdepend: $(CFILES) term.h
+ @rm -f DEPEND ; \
+ for i in ${CFILES} ; do \
+ echo "$$i" ; \
+ echo `echo "$$i" | sed -e 's/.c$$/.o/'`": $$i" `\
+ cc -E $$i |\
+ grep '^# .*"\./.*\.h"' |\
+ (sort -t'"' -u -k 2,2 2>/dev/null || sort -t'"' -u +1 -2) |\
+ sed -e 's/.*"\.\/\(.*\)".*/\1/'\
+ ` >> DEPEND ; \
+ done
+
+depend: depend.in
+ ./config.status || ./configure
+
+depend.in: $(CFILES) term.h
+ cp Makefile.in Makefile.in~
+ sed -e '/\#\#\# Dependencies/q' < Makefile.in > tmp_make
+ for i in $(CFILES); do echo $$i; $(CPP_DEPEND) $$i >> tmp_make; done
+ mv tmp_make Makefile.in
+
+Makefile makefile: config.status $(srcdir)/Makefile.in
+ CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status
+
+config.status: $(srcdir)/configure
+ $(SHELL) ./config.status --recheck
+
+$(srcdir)/configure: $(srcdir)/configure.in
+ cd $(srcdir) && autoconf
+
+###############################################################################
+
+### Dependencies:
+pty.o: pty.c config.h
diff --git a/examples/rlfe/README b/examples/rlfe/README
new file mode 100644
index 0000000..9e1f689
--- /dev/null
+++ b/examples/rlfe/README
@@ -0,0 +1,78 @@
+rlfe (ReadLine Front-End) is a "universal wrapper" around readline.
+You specify an interactive program to run (typically a shell), and
+readline is used to edit input lines.
+
+There are other such front-ends; what distinguishes this one is that
+it monitors the state of the inferior pty, and if the inferior program
+switches its terminal to raw mode, then rlfe passes your characters
+through directly. This basically means you can run your entire
+session (including bash and terminal-mode emacs) under rlfe.
+
+FEATURES
+
+* Can use all readline commands (and history) in commands that
+read input lines in "canonical mode" - even 'cat'!
+
+* Automatically switches between "readline-editing mode" and "raw mode"
+depending on the terminal mode. If the inferior program invokes
+readline itself, it will do its own line editing. (The inferior
+readline will not know about rlfe, and it will have its own history.)
+You can even run programs like 'emavs -nw' and 'vi' under rlfe.
+The goal is you could leave rlfe always on without even knowing
+about it. (We're not quite there, but it works tolerably well.)
+
+* The input line (after any prompt) is changed to bold-face.
+
+INSTALL
+
+The usual: ./configure && make && make install
+
+Note so far rlfe has only been tested on GNU Linux (Fedora Core 2)
+and Mac OS X (10.3).
+
+This assumes readline header files and libraries are in the default
+places. If not, you can create a link named readline pointing to the
+readline sources. To link with libreadline.a and libhistory.a
+you can copy or link them, or add LDFLAGS='-/path/to/readline' to
+the make command-line.
+
+USAGE
+
+Just run it. That by default runs bash. You can run some other
+command by giving it as command-line arguments.
+
+There are a few tweaks: -h allows you to name the history file,
+and -s allows you to specify its size. It default to "emacs" mode,
+but if the the environment variable EDITOR is set to "vi" that
+mode is chosen.
+
+ISSUES
+
+* The mode switching depends on the terminal mode set by the inferior
+program. Thus ssh/telnet/screen-type programs will typically be in
+raw mode, so rlfe won't be much use, even if remote programs run in
+canonical mode. The work-around is to run rlfe on the remote end.
+
+* Echo supression and prompt recognition are somewhat fragile.
+(A protocol so that the o/s tty code can reliably communicate its
+state to rlfe could solve this problem, and the previous one.)
+
+* See the intro to rlfe.c for more notes.
+
+* Assumes a VT100-compatible terminal, though that could be generalized
+if anybody cares.
+
+* Requires ncurses.
+
+* It would be useful to integrate rlfe's logic in a terminal emulator.
+That would make it easier to reposition the edit position with a mouse,
+integrate cut-and-paste with the system clipboard, and more robustly
+handle escape sequence and multi-byte characters more robustly.
+
+AUTHOR
+
+Per Bothner <per@bothner.com>
+
+LICENSE
+
+GPL.
diff --git a/examples/rlfe/config.h.in b/examples/rlfe/config.h.in
new file mode 100644
index 0000000..a843fec
--- /dev/null
+++ b/examples/rlfe/config.h.in
@@ -0,0 +1,383 @@
+/* Copyright 2004 Per Bothner <per@bothner.com>
+ * Based on config.h from screen-4.0.2.
+ * Copyright (c) 1993-2000
+ * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
+ * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
+ * Copyright (c) 1987 Oliver Laumann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, 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 (see the file COPYING); if not, write to the
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ ****************************************************************
+ * $Id: config.h.in,v 1.12 1994/05/31 12:31:36 mlschroe Exp $ FAU
+ */
+
+
+
+
+
+/**********************************************************************
+ *
+ * User Configuration Section
+ */
+
+
+/*
+ * define PTYMODE if you do not like the default of 0622, which allows
+ * public write to your pty.
+ * define PTYGROUP to some numerical group-id if you do not want the
+ * tty to be in "your" group.
+ * Note, screen is unable to change mode or group of the pty if it
+ * is not installed with sufficient privilege. (e.g. set-uid-root)
+ * define PTYROFS if the /dev/pty devices are mounted on a read-only
+ * filesystem so screen should not even attempt to set mode or group
+ * even if running as root (e.g. on TiVo).
+ */
+#undef PTYMODE
+#undef PTYGROUP
+#undef PTYROFS
+
+/*
+ * If screen is NOT installed set-uid root, screen can provide tty
+ * security by exclusively locking the ptys. While this keeps other
+ * users from opening your ptys, it also keeps your own subprocesses
+ * from being able to open /dev/tty. Define LOCKPTY to add this
+ * exclusive locking.
+ */
+#undef LOCKPTY
+
+
+/**********************************************************************
+ *
+ * End of User Configuration Section
+ *
+ * Rest of this file is modified by 'configure'
+ * Change at your own risk!
+ *
+ */
+
+/*
+ * Some defines to identify special unix variants
+ */
+#ifndef SVR4
+#undef SVR4
+#endif
+
+#ifndef _POSIX_SOURCE
+#undef _POSIX_SOURCE
+#endif
+
+/*
+ * Define POSIX if your system supports IEEE Std 1003.1-1988 (POSIX).
+ */
+#undef POSIX
+
+/*
+ * Define TERMIO if you have struct termio instead of struct sgttyb.
+ * This is usually the case for SVID systems, where BSD uses sgttyb.
+ * POSIX systems should define this anyway, even though they use
+ * struct termios.
+ */
+#undef TERMIO
+
+/*
+ * Define CYTERMIO if you have cyrillic termio modes.
+ */
+#undef CYTERMIO
+
+/*
+ * Define TERMINFO if your machine emulates the termcap routines
+ * with the terminfo database.
+ * Thus the .screenrc file is parsed for
+ * the command 'terminfo' and not 'termcap'.
+ */
+#undef TERMINFO
+
+/*
+ * If your library does not define ospeed, define this.
+ */
+#undef NEED_OSPEED
+
+/*
+ * Define SYSV if your machine is SYSV complient (Sys V, HPUX, A/UX)
+ */
+#ifndef SYSV
+#undef SYSV
+#endif
+
+/*
+ * Define SIGVOID if your signal handlers return void. On older
+ * systems, signal returns int, but on newer ones, it returns void.
+ */
+#undef SIGVOID
+
+/*
+ * Define USESIGSET if you have sigset for BSD 4.1 reliable signals.
+ */
+#undef USESIGSET
+
+/*
+ * Define SYSVSIGS if signal handlers must be reinstalled after
+ * they have been called.
+ */
+#undef SYSVSIGS
+
+/*
+ * Define BSDWAIT if your system defines a 'union wait' in <sys/wait.h>
+ *
+ * Only allow BSDWAIT i.e. wait3 on nonposix systems, since
+ * posix implies wait(3) and waitpid(3). vdlinden@fwi.uva.nl
+ *
+ */
+#ifndef POSIX
+#undef BSDWAIT
+#endif
+
+/*
+ * On RISCOS we prefer wait2() over wait3(). rouilj@sni-usa.com
+ */
+#ifdef BSDWAIT
+#undef USE_WAIT2
+#endif
+
+/*
+ * Define if you have the utempter utmp helper program
+ */
+#undef HAVE_UTEMPTER
+
+/*
+ * If ttyslot() breaks getlogin() by returning indexes to utmp entries
+ * of type DEAD_PROCESS, then our getlogin() replacement should be
+ * selected by defining BUGGYGETLOGIN.
+ */
+#undef BUGGYGETLOGIN
+
+/*
+ * If your system has the calls setreuid() and setregid(),
+ * define HAVE_SETREUID. Otherwise screen will use a forked process to
+ * safely create output files without retaining any special privileges.
+ */
+#undef HAVE_SETREUID
+
+/*
+ * If your system supports BSD4.4's seteuid() and setegid(), define
+ * HAVE_SETEUID.
+ */
+#undef HAVE_SETEUID
+
+/*
+ * If you want the "time" command to display the current load average
+ * define LOADAV. Maybe you must install screen with the needed
+ * privileges to read /dev/kmem.
+ * Note that NLIST_ stuff is only checked, when getloadavg() is not available.
+ */
+#undef LOADAV
+
+#undef LOADAV_NUM
+#undef LOADAV_TYPE
+#undef LOADAV_SCALE
+#undef LOADAV_GETLOADAVG
+#undef LOADAV_UNIX
+#undef LOADAV_AVENRUN
+#undef LOADAV_USE_NLIST64
+
+#undef NLIST_DECLARED
+#undef NLIST_STRUCT
+#undef NLIST_NAME_UNION
+
+/*
+ * If your system has the new format /etc/ttys (like 4.3 BSD) and the
+ * getttyent(3) library functions, define GETTTYENT.
+ */
+#undef GETTTYENT
+
+/*
+ * Define USEBCOPY if the bcopy/memcpy from your system's C library
+ * supports the overlapping of source and destination blocks. When
+ * undefined, screen uses its own (probably slower) version of bcopy().
+ *
+ * SYSV machines may have a working memcpy() -- Oh, this is
+ * quite unlikely. Tell me if you see one.
+ * "But then, memmove() should work, if at all available" he thought...
+ * Boing, never say "works everywhere" unless you checked SCO UNIX.
+ * Their memove fails the test in the configure script. Sigh. (Juergen)
+ */
+#undef USEBCOPY
+#undef USEMEMCPY
+#undef USEMEMMOVE
+
+/*
+ * If your system has vsprintf() and requires the use of the macros in
+ * "varargs.h" to use functions with variable arguments,
+ * define USEVARARGS.
+ */
+#undef USEVARARGS
+
+/*
+ * If your system has strerror() define this.
+ */
+#undef HAVE_STRERROR
+
+/*
+ * If the select return value doesn't treat a descriptor that is
+ * usable for reading and writing as two hits, define SELECT_BROKEN.
+ */
+#undef SELECT_BROKEN
+
+/*
+ * Define this if your system supports named pipes.
+ */
+#undef NAMEDPIPE
+
+/*
+ * Define this if your system exits select() immediatly if a pipe is
+ * opened read-only and no writer has opened it.
+ */
+#undef BROKEN_PIPE
+
+/*
+ * Define this if the unix-domain socket implementation doesn't
+ * create a socket in the filesystem.
+ */
+#undef SOCK_NOT_IN_FS
+
+/*
+ * If your system has setenv() and unsetenv() define USESETENV
+ */
+#undef USESETENV
+
+/*
+ * If your system does not come with a setenv()/putenv()/getenv()
+ * functions, you may bring in our own code by defining NEEDPUTENV.
+ */
+#undef NEEDPUTENV
+
+/*
+ * If the passwords are stored in a shadow file and you want the
+ * builtin lock to work properly, define SHADOWPW.
+ */
+#undef SHADOWPW
+
+/*
+ * If you are on a SYS V machine that restricts filename length to 14
+ * characters, you may need to enforce that by setting NAME_MAX to 14
+ */
+#undef NAME_MAX /* KEEP_UNDEF_HERE override system value */
+#undef NAME_MAX
+
+/*
+ * define HAVE_RENAME if your system has a rename() function
+ */
+#undef HAVE_RENAME
+
+/*
+ * define HAVE__EXIT if your system has the _exit() call.
+ */
+#undef HAVE__EXIT
+
+/*
+ * define HAVE_LSTAT if your system has symlinks and the lstat() call.
+ */
+#undef HAVE_LSTAT
+
+/*
+ * define HAVE_UTIMES if your system has the utimes() call.
+ */
+#undef HAVE_UTIMES
+
+/*
+ * define HAVE_FCHOWN if your system has the fchown() call.
+ */
+#undef HAVE_FCHOWN
+
+/*
+ * define HAVE_FCHMOD if your system has the fchmod() call.
+ */
+#undef HAVE_FCHMOD
+
+/*
+ * define HAVE_VSNPRINTF if your system has vsnprintf() (GNU lib).
+ */
+#undef HAVE_VSNPRINTF
+
+/*
+ * define HAVE_GETCWD if your system has the getcwd() call.
+ */
+#undef HAVE_GETCWD
+
+/*
+ * define HAVE_SETLOCALE if your system has the setlocale() call.
+ */
+#undef HAVE_SETLOCALE
+
+/*
+ * define HAVE_STRFTIME if your system has the strftime() call.
+ */
+#undef HAVE_STRFTIME
+
+/*
+ * define HAVE_NL_LANGINFO if your system has the nl_langinfo() call
+ * and <langinfo.h> defines CODESET.
+ */
+#undef HAVE_NL_LANGINFO
+
+/*
+ * Newer versions of Solaris include fdwalk, which can greatly improve
+ * the startup time of screen; otherwise screen spends a lot of time
+ * closing file descriptors.
+ */
+#undef HAVE_FDWALK
+
+/*
+ * define HAVE_DEV_PTC if you have a /dev/ptc character special
+ * device.
+ */
+#undef HAVE_DEV_PTC
+
+/*
+ * define HAVE_SVR4_PTYS if you have a /dev/ptmx character special
+ * device and support the ptsname(), grantpt(), unlockpt() functions.
+ */
+#undef HAVE_SVR4_PTYS
+
+/*
+ * define HAVE_GETPT if you have the getpt() function.
+ */
+#undef HAVE_GETPT
+
+/*
+ * define HAVE_OPENPTY if your system has the openpty() call.
+ */
+#undef HAVE_OPENPTY
+
+/*
+ * define PTYRANGE0 and or PTYRANGE1 if you want to adapt screen
+ * to unusual environments. E.g. For SunOs the defaults are "qpr" and
+ * "0123456789abcdef". For SunOs 4.1.2
+ * #define PTYRANGE0 "pqrstuvwxyzPQRST"
+ * is recommended by Dan Jacobson.
+ */
+#undef PTYRANGE0
+#undef PTYRANGE1
+
+#define USEVARARGS
+
+#undef HAVE_SYS_STROPTS_H
+
+#undef HAVE_SYS_WAIT_H
+
+#undef HAVE_SGTTY_H
+
+#undef HAVE_SYS_SELECT_H
diff --git a/examples/rlfe/configure b/examples/rlfe/configure
new file mode 100755
index 0000000..3928331
--- /dev/null
+++ b/examples/rlfe/configure
@@ -0,0 +1,5637 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ # We cannot yet assume a decent shell, so we have to provide a
+ # neutralization value for shells without unset; and this also
+ # works around shells that cannot unset nonexistent variables.
+ # Preserve -v and -x to the replacement shell.
+ BASH_ENV=/dev/null
+ ENV=/dev/null
+ (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+ export CONFIG_SHELL
+ case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+ esac
+ exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -p'
+ fi
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+ as_test_x='test -x'
+else
+ if ls -dL / >/dev/null 2>&1; then
+ as_ls_L_option=L
+ else
+ as_ls_L_option=
+ fi
+ as_test_x='
+ eval sh -c '\''
+ if test -d "$1"; then
+ test -d "$1/.";
+ else
+ case $1 in #(
+ -*)set "./$1";;
+ esac;
+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+ ???[sx]*):;;*)false;;esac;fi
+ '\'' sh
+ '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+PACKAGE_URL=
+
+ac_unique_file="rlfe.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
+LIBOBJS
+XTERMPATH
+WRITEPATH
+AWK
+EGREP
+GREP
+CPP
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+VERSION
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+with_pty_mode
+with_pty_group
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used" >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-pty-mode=mode default mode for ptys
+ --with-pty-group=group default group for ptys
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to the package provider.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.68. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+VERSION=0.4
+
+
+
+old_CFLAGS="$CFLAGS"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+if test $ac_cv_c_compiler_gnu = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5
+$as_echo_n "checking whether $CC needs -traditional... " >&6; }
+if ${ac_cv_prog_gcc_traditional+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_pattern="Autoconf.*'x'"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sgtty.h>
+Autoconf TIOCGETP
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "$ac_pattern" >/dev/null 2>&1; then :
+ ac_cv_prog_gcc_traditional=yes
+else
+ ac_cv_prog_gcc_traditional=no
+fi
+rm -f conftest*
+
+
+ if test $ac_cv_prog_gcc_traditional = no; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <termio.h>
+Autoconf TCGETA
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "$ac_pattern" >/dev/null 2>&1; then :
+ ac_cv_prog_gcc_traditional=yes
+fi
+rm -f conftest*
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5
+$as_echo "$ac_cv_prog_gcc_traditional" >&6; }
+ if test $ac_cv_prog_gcc_traditional = yes; then
+ CC="$CC -traditional"
+ fi
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5
+$as_echo_n "checking for library containing strerror... " >&6; }
+if ${ac_cv_search_strerror+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char strerror ();
+int
+main ()
+{
+return strerror ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' cposix; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_strerror=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_strerror+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_strerror+:} false; then :
+
+else
+ ac_cv_search_strerror=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5
+$as_echo "$ac_cv_search_strerror" >&6; }
+ac_res=$ac_cv_search_strerror
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+main(){exit(0);}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+
+if test $CC != cc ; then
+echo "Your $CC failed - restarting with CC=cc" 1>&6
+
+echo "" 1>&6
+
+CC=cc
+export CC
+exec $0 $configure_args
+fi
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+main(){exit(0);}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ exec 5>&2
+eval $ac_link
+echo "CC=$CC; CFLAGS=$CFLAGS; LIBS=$LIBS;" 1>&6
+
+echo "$ac_compile" 1>&6
+
+as_fn_error $? "Can't run the compiler - sorry" "$LINENO" 5
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+main()
+{
+ int __something_strange_();
+ __something_strange_(0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ as_fn_error $? "Your compiler does not set the exit status - sorry" "$LINENO" 5
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_AWK="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+
+if test -f etc/toolcheck; then
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for buggy tools..." >&5
+$as_echo "$as_me: checking for buggy tools..." >&6;}
+sh etc/toolcheck 1>&6
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for System V..." >&5
+$as_echo "$as_me: checking for System V..." >&6;}
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <signal.h>
+#include <fcntl.h>
+int
+main ()
+{
+int x = SIGCHLD | FNDELAY;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ $as_echo "#define SYSV 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Solaris 2.x..." >&5
+$as_echo "$as_me: checking for Solaris 2.x..." >&6;}
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined(SVR4) && defined(sun)
+ yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ LIBS="$LIBS -lsocket -lnsl -lkstat"
+fi
+rm -f conftest*
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking select..." >&5
+$as_echo "$as_me: checking select..." >&6;}
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+select(0, 0, 0, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ LIBS="$LIBS -lnet -lnsl"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking select with $LIBS..." >&5
+$as_echo "$as_me: checking select with $LIBS..." >&6;}
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+select(0, 0, 0, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ as_fn_error $? "!!! no select - no screen" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking select return value..." >&5
+$as_echo "$as_me: checking select return value..." >&6;}
+if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+char *nam = "/tmp/conftest$$";
+
+#ifdef NAMEDPIPE
+
+#ifndef O_NONBLOCK
+#define O_NONBLOCK O_NDELAY
+#endif
+#ifndef S_IFIFO
+#define S_IFIFO 0010000
+#endif
+
+
+main()
+{
+#ifdef FD_SET
+ fd_set f;
+#else
+ int f;
+#endif
+
+#ifdef __FreeBSD__
+/* From Andrew A. Chernov (ache@astral.msk.su):
+ * opening RDWR fifo fails in BSD 4.4, but select return values are
+ * right.
+ */
+ exit(0);
+#endif
+ (void)alarm(5);
+#ifdef POSIX
+ if (mkfifo(nam, 0777))
+#else
+ if (mknod(nam, S_IFIFO|0777, 0))
+#endif
+ exit(1);
+ close(0);
+ if (open(nam, O_RDWR | O_NONBLOCK))
+ exit(1);
+ if (write(0, "TEST", 4) == -1)
+ exit(1);
+
+#else
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+
+main()
+{
+ int s1, s2, l;
+ struct sockaddr_un a;
+#ifdef FD_SET
+ fd_set f;
+#else
+ int f;
+#endif
+
+ (void)alarm(5);
+ if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
+ exit(1);
+ a.sun_family = AF_UNIX;
+ strcpy(a.sun_path, nam);
+ (void) unlink(nam);
+ if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1)
+ exit(1);
+ if (listen(s1, 2))
+ exit(1);
+ if (fork() == 0)
+ {
+ if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
+ kill(getppid(), 3);
+ (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2);
+ if (write(s2, "HELLO", 5) == -1)
+ kill(getppid(), 3);
+ exit(0);
+ }
+ l = sizeof(a);
+ close(0);
+ if (accept(s1, (struct sockaddr *)&a, &l))
+ exit(1);
+#endif
+
+
+#ifdef FD_SET
+ FD_SET(0, &f);
+#else
+ f = 1;
+#endif
+ if (select(1, &f, 0, 0, 0) == -1)
+ exit(1);
+ if (select(1, &f, &f, 0, 0) != 2)
+ exit(1);
+ exit(0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ echo "- select is ok" 1>&6
+
+else
+ echo "- select can't count" 1>&6
+ $as_echo "#define SELECT_BROKEN 1" >>confdefs.h
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent..." >&5
+$as_echo "$as_me: checking for tgetent..." >&6;}
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+tgetent((char *)0, (char *)0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ olibs="$LIBS"
+LIBS="-lcurses $olibs"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking libcurses..." >&5
+$as_echo "$as_me: checking libcurses..." >&6;}
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+#ifdef __hpux
+__sorry_hpux_libcurses_is_totally_broken_in_10_10();
+#else
+tgetent((char *)0, (char *)0);
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ LIBS="-ltermcap $olibs"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking libtermcap..." >&5
+$as_echo "$as_me: checking libtermcap..." >&6;}
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+tgetent((char *)0, (char *)0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ LIBS="-ltermlib $olibs"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking libtermlib..." >&5
+$as_echo "$as_me: checking libtermlib..." >&6;}
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+tgetent((char *)0, (char *)0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ LIBS="-lncurses $olibs"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking libncurses..." >&5
+$as_echo "$as_me: checking libncurses..." >&6;}
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+tgetent((char *)0, (char *)0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ as_fn_error $? "!!! no tgetent - no screen" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+extern char *tgoto();
+main()
+{
+ exit(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ echo "- you use the termcap database" 1>&6
+
+else
+ echo "- you use the terminfo database" 1>&6
+ $as_echo "#define TERMINFO 1" >>confdefs.h
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking ospeed..." >&5
+$as_echo "$as_me: checking ospeed..." >&6;}
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern short ospeed;
+int
+main ()
+{
+ospeed=5;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ $as_echo "#define NEED_OSPEED 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc..." >&5
+$as_echo "$as_me: checking for /dev/ptc..." >&6;}
+if test -r /dev/ptc; then
+$as_echo "#define HAVE_DEV_PTC 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SVR4 ptys..." >&5
+$as_echo "$as_me: checking for SVR4 ptys..." >&6;}
+sysvr4ptys=
+if test -c /dev/ptmx ; then
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+ptsname(0);grantpt(0);unlockpt(0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ $as_echo "#define HAVE_SVR4_PTYS 1" >>confdefs.h
+
+sysvr4ptys=1
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+
+for ac_func in getpt
+do :
+ ac_fn_c_check_func "$LINENO" "getpt" "ac_cv_func_getpt"
+if test "x$ac_cv_func_getpt" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_GETPT 1
+_ACEOF
+
+fi
+done
+
+
+if test -z "$sysvr4ptys"; then
+for ac_func in openpty
+do :
+ ac_fn_c_check_func "$LINENO" "openpty" "ac_cv_func_openpty"
+if test "x$ac_cv_func_openpty" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_OPENPTY 1
+_ACEOF
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil" >&5
+$as_echo_n "checking for openpty in -lutil... " >&6; }
+if ${ac_cv_lib_util_openpty+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lutil $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char openpty ();
+int
+main ()
+{
+return openpty ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_util_openpty=yes
+else
+ ac_cv_lib_util_openpty=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty" >&5
+$as_echo "$ac_cv_lib_util_openpty" >&6; }
+if test "x$ac_cv_lib_util_openpty" = xyes; then :
+ $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h
+ LIBS="$LIBS -lutil"
+fi
+
+fi
+done
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ptyranges..." >&5
+$as_echo "$as_me: checking for ptyranges..." >&6;}
+if test -d /dev/ptym ; then
+pdir='/dev/ptym'
+else
+pdir='/dev'
+fi
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef M_UNIX
+ yes;
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ ptys=`echo /dev/ptyp??`
+else
+ ptys=`echo $pdir/pty??`
+fi
+rm -f conftest*
+
+if test "$ptys" != "$pdir/pty??" ; then
+p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'`
+p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | sort -u | tr -d '\012'`
+cat >>confdefs.h <<_ACEOF
+#define PTYRANGE0 "$p0"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PTYRANGE1 "$p1"
+_ACEOF
+
+fi
+
+
+# Check whether --with-pty-mode was given.
+if test "${with_pty_mode+set}" = set; then :
+ withval=$with_pty_mode; ptymode="${withval}"
+fi
+
+
+# Check whether --with-pty-group was given.
+if test "${with_pty_group+set}" = set; then :
+ withval=$with_pty_group; ptygrp="${withval}"
+fi
+
+test -n "$ptymode" || ptymode=0620
+if test -n "$ptygrp" ; then
+cat >>confdefs.h <<_ACEOF
+#define PTYMODE $ptymode
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PTYGROUP $ptygrp
+_ACEOF
+
+else
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking default tty permissions/group..." >&5
+$as_echo "$as_me: checking default tty permissions/group..." >&6;}
+rm -f conftest_grp
+if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+main()
+{
+ struct stat sb;
+ char *x,*ttyname();
+ int om, m;
+ FILE *fp;
+
+ if (!(x = ttyname(0))) exit(1);
+ if (stat(x, &sb)) exit(1);
+ om = sb.st_mode;
+ if (om & 002) exit(0);
+ m = system("mesg y");
+ if (m == -1 || m == 127) exit(1);
+ if (stat(x, &sb)) exit(1);
+ m = sb.st_mode;
+ if (chmod(x, om)) exit(1);
+ if (m & 002) exit(0);
+ if (sb.st_gid == getgid()) exit(1);
+ if (!(fp=fopen("conftest_grp", "w")))
+ exit(1);
+ fprintf(fp, "%d\n", sb.st_gid);
+ fclose(fp);
+ exit(0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+ if test -f conftest_grp; then
+ ptygrp=`cat conftest_grp`
+ echo "- pty mode: $ptymode, group: $ptygrp" 1>&6
+
+ cat >>confdefs.h <<_ACEOF
+#define PTYMODE $ptymode
+_ACEOF
+
+ cat >>confdefs.h <<_ACEOF
+#define PTYGROUP $ptygrp
+_ACEOF
+
+ else
+ echo "- ptys are world accessable" 1>&6
+
+ fi
+
+else
+
+ WRITEPATH=''
+ XTERMPATH=''
+ # Extract the first word of "write", so it can be a program name with args.
+set dummy write; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_WRITEPATH+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $WRITEPATH in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_WRITEPATH="$WRITEPATH" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_WRITEPATH="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+WRITEPATH=$ac_cv_path_WRITEPATH
+if test -n "$WRITEPATH"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WRITEPATH" >&5
+$as_echo "$WRITEPATH" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ # Extract the first word of "xterm", so it can be a program name with args.
+set dummy xterm; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_XTERMPATH+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $XTERMPATH in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_XTERMPATH="$XTERMPATH" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_XTERMPATH="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+XTERMPATH=$ac_cv_path_XTERMPATH
+if test -n "$XTERMPATH"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XTERMPATH" >&5
+$as_echo "$XTERMPATH" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ found=
+ if test -n "$WRITEPATH$XTERMPATH"; then
+ findfollow=
+ lsfollow=
+ found=`find $WRITEPATH $XTERMPATH -follow -print 2>/dev/null`
+ if test -n "$found"; then
+ findfollow=-follow
+ lsfollow=L
+ fi
+ if test -n "$XTERMPATH"; then
+ ptygrpn=`ls -l$lsfollow $XTERMPATH | sed -n -e 1p | $AWK '{print $4}'`
+ if test tty != "$ptygrpn"; then
+ XTERMPATH=
+ fi
+ fi
+ fi
+ if test -n "$WRITEPATH$XTERMPATH"; then
+ found=`find $WRITEPATH $XTERMPATH $findfollow -perm -2000 -print`
+ if test -n "$found"; then
+ ptygrp=`ls -ln$lsfollow $found | sed -n -e 1p | $AWK '{print $4}'`
+ echo "- pty mode: $ptymode, group: $ptygrp" 1>&6
+
+ cat >>confdefs.h <<_ACEOF
+#define PTYMODE $ptymode
+_ACEOF
+
+ cat >>confdefs.h <<_ACEOF
+#define PTYGROUP $ptygrp
+_ACEOF
+
+ else
+ echo "- ptys are world accessable" 1>&6
+
+ fi
+ else
+ echo "- can't determine - assume ptys are world accessable" 1>&6
+
+ fi
+
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+rm -f conftest_grp
+fi
+
+if test -n "$posix" ; then
+
+echo "assuming posix signal definition" 1>&6
+
+$as_echo "#define SIGVOID 1" >>confdefs.h
+
+
+else
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers..." >&5
+$as_echo "$as_me: checking return type of signal handlers..." >&6;}
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+extern void (*signal ()) ();
+int
+main ()
+{
+int i;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ $as_echo "#define SIGVOID 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sigset..." >&5
+$as_echo "$as_me: checking sigset..." >&6;}
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <signal.h>
+
+int
+main ()
+{
+
+#ifdef SIGVOID
+sigset(0, (void (*)())0);
+#else
+sigset(0, (int (*)())0);
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ $as_echo "#define USESIGSET 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking signal implementation..." >&5
+$as_echo "$as_me: checking signal implementation..." >&6;}
+if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <signal.h>
+
+#ifndef SIGCLD
+#define SIGCLD SIGCHLD
+#endif
+#ifdef USESIGSET
+#define signal sigset
+#endif
+
+int got;
+
+#ifdef SIGVOID
+void
+#endif
+hand()
+{
+ got++;
+}
+
+main()
+{
+ /* on hpux we use sigvec to get bsd signals */
+#ifdef __hpux
+ (void)signal(SIGCLD, hand);
+ kill(getpid(), SIGCLD);
+ kill(getpid(), SIGCLD);
+ if (got < 2)
+ exit(1);
+#endif
+ exit(0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ $as_echo "#define SYSVSIGS 1" >>confdefs.h
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in sys/stropts.h sys/wait.h sgtty.h sys/select.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in term.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "term.h" "ac_cv_header_term_h" "$ac_includes_default"
+if test "x$ac_cv_header_term_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_TERM_H 1
+_ACEOF
+
+fi
+
+done
+
+
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -p'
+ fi
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+ as_test_x='test -x'
+else
+ if ls -dL / >/dev/null 2>&1; then
+ as_ls_L_option=L
+ else
+ as_ls_L_option=
+ fi
+ as_test_x='
+ eval sh -c '\''
+ if test -d "$1"; then
+ test -d "$1/.";
+ else
+ case $1 in #(
+ -*)set "./$1";;
+ esac;
+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+ ???[sx]*):;;*)false;;esac;fi
+ '\'' sh
+ '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.68. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to the package provider."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.68,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS "
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+ ;;
+
+
+ esac
+
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/examples/rlfe/configure.in b/examples/rlfe/configure.in
new file mode 100644
index 0000000..ad7ce65
--- /dev/null
+++ b/examples/rlfe/configure.in
@@ -0,0 +1,442 @@
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(rlfe.c)
+AC_CONFIG_HEADER(config.h)
+VERSION=0.4
+AC_SUBST(VERSION)
+
+dnl
+dnl Define some useful macros
+dnl
+AC_DEFUN([AC_PROGRAM_SOURCE],
+[AC_REQUIRE([AC_PROG_CPP])AC_PROVIDE([$0])cat > conftest.c <<EOF
+#include "confdefs.h"
+[$1]
+_CUT_HERE_
+[$2]
+EOF
+eval "$ac_cpp conftest.c 2>&5 | sed -e '1,/_CUT_HERE_/d' -e 's/ //g' > conftest.out"
+. ./conftest.out
+rm -f conftest*
+])dnl
+dnl
+define(AC_NOTE,
+[echo "$1" 1>&AC_FD_MSG
+])dnl
+
+old_CFLAGS="$CFLAGS"
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_GCC_TRADITIONAL
+AC_ISC_POSIX
+
+AC_TRY_RUN(main(){exit(0);},,[
+if test $CC != cc ; then
+AC_NOTE(Your $CC failed - restarting with CC=cc)
+AC_NOTE()
+CC=cc
+export CC
+exec $0 $configure_args
+fi
+])
+
+AC_TRY_RUN(main(){exit(0);},,
+exec 5>&2
+eval $ac_link
+AC_NOTE(CC=$CC; CFLAGS=$CFLAGS; LIBS=$LIBS;)
+AC_NOTE($ac_compile)
+AC_MSG_ERROR(Can't run the compiler - sorry))
+
+AC_TRY_RUN([
+main()
+{
+ int __something_strange_();
+ __something_strange_(0);
+}
+],AC_MSG_ERROR(Your compiler does not set the exit status - sorry))
+
+AC_PROG_AWK
+
+if test -f etc/toolcheck; then
+AC_CHECKING(for buggy tools)
+sh etc/toolcheck 1>&AC_FD_MSG
+fi
+
+dnl
+dnl **** special unix variants ****
+dnl
+
+AC_CHECKING(for System V)
+AC_TRY_COMPILE(
+[#include <sys/types.h>
+#include <signal.h>
+#include <fcntl.h>], [int x = SIGCHLD | FNDELAY;], , AC_DEFINE(SYSV))
+
+AC_CHECKING(for Solaris 2.x)
+AC_EGREP_CPP(yes,
+[#if defined(SVR4) && defined(sun)
+ yes
+#endif
+], LIBS="$LIBS -lsocket -lnsl -lkstat")
+
+dnl
+dnl **** select() ****
+dnl
+
+AC_CHECKING(select)
+AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],,
+LIBS="$LIBS -lnet -lnsl"
+AC_CHECKING(select with $LIBS)
+AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],,
+AC_MSG_ERROR(!!! no select - no screen))
+)
+dnl
+dnl **** check the select implementation ****
+dnl
+
+AC_CHECKING(select return value)
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+char *nam = "/tmp/conftest$$";
+
+#ifdef NAMEDPIPE
+
+#ifndef O_NONBLOCK
+#define O_NONBLOCK O_NDELAY
+#endif
+#ifndef S_IFIFO
+#define S_IFIFO 0010000
+#endif
+
+
+main()
+{
+#ifdef FD_SET
+ fd_set f;
+#else
+ int f;
+#endif
+
+#ifdef __FreeBSD__
+/* From Andrew A. Chernov (ache@astral.msk.su):
+ * opening RDWR fifo fails in BSD 4.4, but select return values are
+ * right.
+ */
+ exit(0);
+#endif
+ (void)alarm(5);
+#ifdef POSIX
+ if (mkfifo(nam, 0777))
+#else
+ if (mknod(nam, S_IFIFO|0777, 0))
+#endif
+ exit(1);
+ close(0);
+ if (open(nam, O_RDWR | O_NONBLOCK))
+ exit(1);
+ if (write(0, "TEST", 4) == -1)
+ exit(1);
+
+#else
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+
+main()
+{
+ int s1, s2, l;
+ struct sockaddr_un a;
+#ifdef FD_SET
+ fd_set f;
+#else
+ int f;
+#endif
+
+ (void)alarm(5);
+ if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
+ exit(1);
+ a.sun_family = AF_UNIX;
+ strcpy(a.sun_path, nam);
+ (void) unlink(nam);
+ if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1)
+ exit(1);
+ if (listen(s1, 2))
+ exit(1);
+ if (fork() == 0)
+ {
+ if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
+ kill(getppid(), 3);
+ (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2);
+ if (write(s2, "HELLO", 5) == -1)
+ kill(getppid(), 3);
+ exit(0);
+ }
+ l = sizeof(a);
+ close(0);
+ if (accept(s1, (struct sockaddr *)&a, &l))
+ exit(1);
+#endif
+
+
+#ifdef FD_SET
+ FD_SET(0, &f);
+#else
+ f = 1;
+#endif
+ if (select(1, &f, 0, 0, 0) == -1)
+ exit(1);
+ if (select(1, &f, &f, 0, 0) != 2)
+ exit(1);
+ exit(0);
+}
+],AC_NOTE(- select is ok),
+AC_NOTE(- select can't count) AC_DEFINE(SELECT_BROKEN))
+
+dnl
+dnl **** termcap or terminfo ****
+dnl
+AC_CHECKING(for tgetent)
+AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+olibs="$LIBS"
+LIBS="-lcurses $olibs"
+AC_CHECKING(libcurses)
+AC_TRY_LINK(,[
+#ifdef __hpux
+__sorry_hpux_libcurses_is_totally_broken_in_10_10();
+#else
+tgetent((char *)0, (char *)0);
+#endif
+],,
+LIBS="-ltermcap $olibs"
+AC_CHECKING(libtermcap)
+AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+LIBS="-ltermlib $olibs"
+AC_CHECKING(libtermlib)
+AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+LIBS="-lncurses $olibs"
+AC_CHECKING(libncurses)
+AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+AC_MSG_ERROR(!!! no tgetent - no screen))))))
+
+AC_TRY_RUN([
+extern char *tgoto();
+main()
+{
+ exit(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1);
+}], AC_NOTE(- you use the termcap database),
+AC_NOTE(- you use the terminfo database) AC_DEFINE(TERMINFO))
+AC_CHECKING(ospeed)
+AC_TRY_LINK(extern short ospeed;,ospeed=5;,,AC_DEFINE(NEED_OSPEED))
+
+dnl
+dnl **** PTY specific things ****
+dnl
+AC_CHECKING(for /dev/ptc)
+if test -r /dev/ptc; then
+AC_DEFINE(HAVE_DEV_PTC)
+fi
+
+AC_CHECKING(for SVR4 ptys)
+sysvr4ptys=
+if test -c /dev/ptmx ; then
+AC_TRY_LINK([],[ptsname(0);grantpt(0);unlockpt(0);],[AC_DEFINE(HAVE_SVR4_PTYS)
+sysvr4ptys=1])
+fi
+
+AC_CHECK_FUNCS(getpt)
+
+dnl check for openpty()
+if test -z "$sysvr4ptys"; then
+AC_CHECK_FUNCS(openpty,,
+[AC_CHECK_LIB(util,openpty, [AC_DEFINE(HAVE_OPENPTY)] [LIBS="$LIBS -lutil"])])
+fi
+
+AC_CHECKING(for ptyranges)
+if test -d /dev/ptym ; then
+pdir='/dev/ptym'
+else
+pdir='/dev'
+fi
+dnl SCO uses ptyp%d
+AC_EGREP_CPP(yes,
+[#ifdef M_UNIX
+ yes;
+#endif
+], ptys=`echo /dev/ptyp??`, ptys=`echo $pdir/pty??`)
+dnl if test -c /dev/ptyp19; then
+dnl ptys=`echo /dev/ptyp??`
+dnl else
+dnl ptys=`echo $pdir/pty??`
+dnl fi
+if test "$ptys" != "$pdir/pty??" ; then
+p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'`
+p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | sort -u | tr -d '\012'`
+AC_DEFINE_UNQUOTED(PTYRANGE0,"$p0")
+AC_DEFINE_UNQUOTED(PTYRANGE1,"$p1")
+fi
+
+dnl **** pty mode/group handling ****
+dnl
+dnl support provided by Luke Mewburn <lm@rmit.edu.au>, 931222
+AC_ARG_WITH(pty-mode, [ --with-pty-mode=mode default mode for ptys], [ ptymode="${withval}" ])
+AC_ARG_WITH(pty-group, [ --with-pty-group=group default group for ptys], [ ptygrp="${withval}" ])
+test -n "$ptymode" || ptymode=0620
+if test -n "$ptygrp" ; then
+AC_DEFINE_UNQUOTED(PTYMODE, $ptymode)
+AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
+else
+
+AC_CHECKING(default tty permissions/group)
+rm -f conftest_grp
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+main()
+{
+ struct stat sb;
+ char *x,*ttyname();
+ int om, m;
+ FILE *fp;
+
+ if (!(x = ttyname(0))) exit(1);
+ if (stat(x, &sb)) exit(1);
+ om = sb.st_mode;
+ if (om & 002) exit(0);
+ m = system("mesg y");
+ if (m == -1 || m == 127) exit(1);
+ if (stat(x, &sb)) exit(1);
+ m = sb.st_mode;
+ if (chmod(x, om)) exit(1);
+ if (m & 002) exit(0);
+ if (sb.st_gid == getgid()) exit(1);
+ if (!(fp=fopen("conftest_grp", "w")))
+ exit(1);
+ fprintf(fp, "%d\n", sb.st_gid);
+ fclose(fp);
+ exit(0);
+}
+],[
+ if test -f conftest_grp; then
+ ptygrp=`cat conftest_grp`
+ AC_NOTE([- pty mode: $ptymode, group: $ptygrp])
+ AC_DEFINE_UNQUOTED(PTYMODE, $ptymode)
+ AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
+ else
+ AC_NOTE(- ptys are world accessable)
+ fi
+],[
+ WRITEPATH=''
+ XTERMPATH=''
+ AC_PATH_PROG(WRITEPATH, write)
+ AC_PATH_PROG(XTERMPATH, xterm)
+ found=
+ if test -n "$WRITEPATH$XTERMPATH"; then
+ findfollow=
+ lsfollow=
+ found=`find $WRITEPATH $XTERMPATH -follow -print 2>/dev/null`
+ if test -n "$found"; then
+ findfollow=-follow
+ lsfollow=L
+ fi
+ if test -n "$XTERMPATH"; then
+ ptygrpn=`ls -l$lsfollow $XTERMPATH | sed -n -e 1p | $AWK '{print $4}'`
+ if test tty != "$ptygrpn"; then
+ XTERMPATH=
+ fi
+ fi
+ fi
+ if test -n "$WRITEPATH$XTERMPATH"; then
+ found=`find $WRITEPATH $XTERMPATH $findfollow -perm -2000 -print`
+ if test -n "$found"; then
+ ptygrp=`ls -ln$lsfollow $found | sed -n -e 1p | $AWK '{print $4}'`
+ AC_NOTE([- pty mode: $ptymode, group: $ptygrp])
+ AC_DEFINE_UNQUOTED(PTYMODE, $ptymode)
+ AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
+ else
+ AC_NOTE(- ptys are world accessable)
+ fi
+ else
+ AC_NOTE(- can't determine - assume ptys are world accessable)
+ fi
+ ]
+)
+rm -f conftest_grp
+fi
+
+dnl
+dnl **** signal handling ****
+dnl
+if test -n "$posix" ; then
+
+dnl POSIX has reliable signals with void return type.
+AC_NOTE(assuming posix signal definition)
+AC_DEFINE(SIGVOID)
+
+else
+
+AC_CHECKING(return type of signal handlers)
+AC_TRY_COMPILE(
+[#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+extern void (*signal ()) ();], [int i;], AC_DEFINE(SIGVOID))
+AC_CHECKING(sigset)
+AC_TRY_LINK([
+#include <sys/types.h>
+#include <signal.h>
+],[
+#ifdef SIGVOID
+sigset(0, (void (*)())0);
+#else
+sigset(0, (int (*)())0);
+#endif
+], AC_DEFINE(USESIGSET))
+AC_CHECKING(signal implementation)
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <signal.h>
+
+#ifndef SIGCLD
+#define SIGCLD SIGCHLD
+#endif
+#ifdef USESIGSET
+#define signal sigset
+#endif
+
+int got;
+
+#ifdef SIGVOID
+void
+#endif
+hand()
+{
+ got++;
+}
+
+main()
+{
+ /* on hpux we use sigvec to get bsd signals */
+#ifdef __hpux
+ (void)signal(SIGCLD, hand);
+ kill(getpid(), SIGCLD);
+ kill(getpid(), SIGCLD);
+ if (got < 2)
+ exit(1);
+#endif
+ exit(0);
+}
+],,AC_DEFINE(SYSVSIGS))
+
+fi
+
+AC_CHECK_HEADERS(sys/stropts.h sys/wait.h sgtty.h sys/select.h)
+AC_CHECK_HEADERS(term.h)
+
+AC_OUTPUT(Makefile)
diff --git a/examples/rlfe/extern.h b/examples/rlfe/extern.h
new file mode 100644
index 0000000..2fe5025
--- /dev/null
+++ b/examples/rlfe/extern.h
@@ -0,0 +1,40 @@
+/* Copyright (c) 1993-2002
+ * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
+ * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
+ * Copyright (c) 1987 Oliver Laumann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, 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 (see the file COPYING); if not, write to the
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ ****************************************************************
+ * $Id: extern.h,v 1.18 1994/05/31 12:31:57 mlschroe Exp $ FAU
+ */
+
+#if !defined(__GNUC__) || __GNUC__ < 2
+#undef __attribute__
+#define __attribute__(x)
+#endif
+
+#if !defined (__P)
+# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus)
+# define __P(protos) protos
+# else
+# define __P(protos) ()
+# endif
+#endif
+
+/* pty.c */
+extern int OpenPTY __P((char **));
+extern void InitPTY __P((int));
diff --git a/examples/rlfe/os.h b/examples/rlfe/os.h
new file mode 100644
index 0000000..df06c75
--- /dev/null
+++ b/examples/rlfe/os.h
@@ -0,0 +1,531 @@
+/* Copyright (c) 1993-2002
+ * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
+ * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
+ * Copyright (c) 1987 Oliver Laumann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, 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 (see the file COPYING); if not, write to the
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ ****************************************************************
+ * $Id: os.h,v 1.10 1994/05/31 12:32:22 mlschroe Exp $ FAU
+ */
+
+#include <stdio.h>
+#include <errno.h>
+
+#include <sys/param.h>
+
+/* In strict ANSI mode, HP-UX machines define __hpux but not hpux */
+#if defined(__hpux) && !defined(hpux)
+# define hpux
+#endif
+
+#if defined(__bsdi__) || defined(__386BSD__) || defined(_CX_UX) || defined(hpux) || defined(_IBMR2) || defined(linux)
+# include <signal.h>
+#endif /* __bsdi__ || __386BSD__ || _CX_UX || hpux || _IBMR2 || linux */
+
+#ifdef ISC
+# ifdef ENAMETOOLONG
+# undef ENAMETOOLONG
+# endif
+# ifdef ENOTEMPTY
+# undef ENOTEMPTY
+# endif
+# include <sys/bsdtypes.h>
+# include <net/errno.h>
+#endif
+
+#ifdef sun
+# define getpgrp __getpgrp
+# define exit __exit
+#endif
+#ifdef POSIX
+# include <unistd.h>
+# if defined(__STDC__)
+# include <stdlib.h>
+# endif /* __STDC__ */
+#endif /* POSIX */
+#ifdef sun
+# undef getpgrp
+# undef exit
+#endif /* sun */
+
+#ifndef linux /* all done in <errno.h> */
+extern int errno;
+#endif /* linux */
+#ifndef HAVE_STRERROR
+/* No macros, please */
+#undef strerror
+#endif
+
+#if !defined(SYSV) && !defined(linux)
+# ifdef NEWSOS
+# define strlen ___strlen___
+# include <strings.h>
+# undef strlen
+# else /* NEWSOS */
+# include <strings.h>
+# endif /* NEWSOS */
+#else /* SYSV */
+# if defined(SVR4) || defined(NEWSOS)
+# define strlen ___strlen___
+# include <string.h>
+# undef strlen
+# if !defined(NEWSOS) && !defined(__hpux)
+ extern size_t strlen(const char *);
+# endif
+# else /* SVR4 */
+# include <string.h>
+# endif /* SVR4 */
+#endif /* SYSV */
+
+#ifdef USEVARARGS
+# if defined(__STDC__)
+# include <stdarg.h>
+# define VA_LIST(var) va_list var;
+# define VA_DOTS ...
+# define VA_DECL
+# define VA_START(ap, fmt) va_start(ap, fmt)
+# define VA_ARGS(ap) ap
+# define VA_END(ap) va_end(ap)
+# else
+# include <varargs.h>
+# define VA_LIST(var) va_list var;
+# define VA_DOTS va_alist
+# define VA_DECL va_dcl
+# define VA_START(ap, fmt) va_start(ap)
+# define VA_ARGS(ap) ap
+# define VA_END(ap) va_end(ap)
+# endif
+#else
+# define VA_LIST(var)
+# define VA_DOTS p1, p2, p3, p4, p5, p6
+# define VA_DECL unsigned long VA_DOTS;
+# define VA_START(ap, fmt)
+# define VA_ARGS(ap) VA_DOTS
+# define VA_END(ap)
+# undef vsnprintf
+# define vsnprintf xsnprintf
+#endif
+
+#if !defined(sun) && !defined(B43) && !defined(ISC) && !defined(pyr) && !defined(_CX_UX)
+# include <time.h>
+#endif
+#include <sys/time.h>
+
+#ifdef M_UNIX /* SCO */
+# include <sys/stream.h>
+# include <sys/ptem.h>
+# define ftruncate(fd, s) chsize(fd, s)
+#endif
+
+#ifdef SYSV
+# define index strchr
+# define rindex strrchr
+# define bzero(poi,len) memset(poi,0,len)
+# define bcmp memcmp
+# define killpg(pgrp,sig) kill( -(pgrp), sig)
+#endif
+
+#ifndef HAVE_GETCWD
+# define getcwd(b,l) getwd(b)
+#endif
+
+#ifndef USEBCOPY
+# ifdef USEMEMMOVE
+# define bcopy(s,d,len) memmove(d,s,len)
+# else
+# ifdef USEMEMCPY
+# define bcopy(s,d,len) memcpy(d,s,len)
+# else
+# define NEED_OWN_BCOPY
+# define bcopy xbcopy
+# endif
+# endif
+#endif
+
+#ifdef hpux
+# define setreuid(ruid, euid) setresuid(ruid, euid, -1)
+# define setregid(rgid, egid) setresgid(rgid, egid, -1)
+#endif
+
+#if defined(HAVE_SETEUID) || defined(HAVE_SETREUID)
+# define USE_SETEUID
+#endif
+
+#if !defined(HAVE__EXIT) && !defined(_exit)
+#define _exit(x) exit(x)
+#endif
+
+#ifndef HAVE_UTIMES
+# define utimes utime
+#endif
+
+#ifdef BUILTIN_TELNET
+# include <netinet/in.h>
+# include <arpa/inet.h>
+#endif
+
+#if defined(USE_LOCALE) && (!defined(HAVE_SETLOCALE) || !defined(HAVE_STRFTIME))
+# undef USE_LOCALE
+#endif
+
+/*****************************************************************
+ * terminal handling
+ */
+
+#if defined (POSIX) || defined (__FreeBSD__)
+# include <termios.h>
+# ifdef hpux
+# include <bsdtty.h>
+# endif /* hpux */
+# ifdef NCCS
+# define MAXCC NCCS
+# else
+# define MAXCC 256
+# endif
+#else /* POSIX */
+# ifdef TERMIO
+# include <termio.h>
+# ifdef NCC
+# define MAXCC NCC
+# else
+# define MAXCC 256
+# endif
+# ifdef CYTERMIO
+# include <cytermio.h>
+# endif
+# else /* TERMIO */
+# if defined (HAVE_SGTTY_H)
+# include <sgtty.h>
+# endif
+# endif /* TERMIO */
+#endif /* POSIX */
+
+#ifndef VDISABLE
+# ifdef _POSIX_VDISABLE
+# define VDISABLE _POSIX_VDISABLE
+# else
+# define VDISABLE 0377
+# endif /* _POSIX_VDISABLE */
+#endif /* !VDISABLE */
+
+
+/* on sgi, regardless of the stream head's read mode (RNORM/RMSGN/RMSGD)
+ * TIOCPKT mode causes data loss if our buffer is too small (IOSIZE)
+ * to hold the whole packet at first read().
+ * (Marc Boucher)
+ *
+ * matthew green:
+ * TIOCPKT is broken on dgux 5.4.1 generic AViiON mc88100
+ *
+ * Joe Traister: On AIX4, programs like irc won't work if screen
+ * uses TIOCPKT (select fails to return on pty read).
+ */
+#if defined(sgi) || defined(DGUX) || defined(_IBMR2)
+# undef TIOCPKT
+#endif
+
+/* linux ncurses is broken, we have to use our own tputs */
+#if defined(linux) && defined(TERMINFO)
+# define tputs xtputs
+#endif
+
+/* Alexandre Oliva: SVR4 style ptys don't work with osf */
+#ifdef __osf__
+# undef HAVE_SVR4_PTYS
+#endif
+
+/*****************************************************************
+ * utmp handling
+ */
+
+#ifdef GETUTENT
+ typedef char *slot_t;
+#else
+ typedef int slot_t;
+#endif
+
+#if defined(UTMPOK) || defined(BUGGYGETLOGIN)
+# if defined(SVR4) && !defined(DGUX) && !defined(__hpux) && !defined(linux)
+# include <utmpx.h>
+# define UTMPFILE UTMPX_FILE
+# define utmp utmpx
+# define getutent getutxent
+# define getutid getutxid
+# define getutline getutxline
+# define pututline pututxline
+# define setutent setutxent
+# define endutent endutxent
+# define ut_time ut_xtime
+# else /* SVR4 */
+# include <utmp.h>
+# endif /* SVR4 */
+# ifdef apollo
+ /*
+ * We don't have GETUTENT, so we dig into utmp ourselves.
+ * But we save the permanent filedescriptor and
+ * open utmp just when we need to.
+ * This code supports an unsorted utmp. jw.
+ */
+# define UTNOKEEP
+# endif /* apollo */
+
+# ifndef UTMPFILE
+# ifdef UTMP_FILE
+# define UTMPFILE UTMP_FILE
+# else
+# ifdef _PATH_UTMP
+# define UTMPFILE _PATH_UTMP
+# else
+# define UTMPFILE "/etc/utmp"
+# endif /* _PATH_UTMP */
+# endif
+# endif
+
+#endif /* UTMPOK || BUGGYGETLOGIN */
+
+#if !defined(UTMPOK) && defined(USRLIMIT)
+# undef USRLIMIT
+#endif
+
+#ifdef LOGOUTOK
+# ifndef LOGINDEFAULT
+# define LOGINDEFAULT 0
+# endif
+#else
+# ifdef LOGINDEFAULT
+# undef LOGINDEFAULT
+# endif
+# define LOGINDEFAULT 1
+#endif
+
+
+/*****************************************************************
+ * file stuff
+ */
+
+#ifndef F_OK
+#define F_OK 0
+#endif
+#ifndef X_OK
+#define X_OK 1
+#endif
+#ifndef W_OK
+#define W_OK 2
+#endif
+#ifndef R_OK
+#define R_OK 4
+#endif
+
+#ifndef S_IFIFO
+#define S_IFIFO 0010000
+#endif
+#ifndef S_IREAD
+#define S_IREAD 0000400
+#endif
+#ifndef S_IWRITE
+#define S_IWRITE 0000200
+#endif
+#ifndef S_IEXEC
+#define S_IEXEC 0000100
+#endif
+
+#if defined(S_IFIFO) && defined(S_IFMT) && !defined(S_ISFIFO)
+#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
+#endif
+#if defined(S_IFSOCK) && defined(S_IFMT) && !defined(S_ISSOCK)
+#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
+#endif
+#if defined(S_IFCHR) && defined(S_IFMT) && !defined(S_ISCHR)
+#define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
+#endif
+#if defined(S_IFDIR) && defined(S_IFMT) && !defined(S_ISDIR)
+#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
+#endif
+#if defined(S_IFLNK) && defined(S_IFMT) && !defined(S_ISLNK)
+#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)
+#endif
+
+/*
+ * SunOS 4.1.3: `man 2V open' has only one line that mentions O_NOBLOCK:
+ *
+ * O_NONBLOCK Same as O_NDELAY above.
+ *
+ * on the very same SunOS 4.1.3, I traced the open system call and found
+ * that an open("/dev/ttyy08", O_RDWR|O_NONBLOCK|O_NOCTTY) was blocked,
+ * whereas open("/dev/ttyy08", O_RDWR|O_NDELAY |O_NOCTTY) went through.
+ *
+ * For this simple reason I now favour O_NDELAY. jw. 4.5.95
+ */
+#if defined(sun) && !defined(SVR4)
+# undef O_NONBLOCK
+#endif
+
+#if !defined(O_NONBLOCK) && defined(O_NDELAY)
+# define O_NONBLOCK O_NDELAY
+#endif
+
+#if !defined(FNBLOCK) && defined(FNONBLOCK)
+# define FNBLOCK FNONBLOCK
+#endif
+#if !defined(FNBLOCK) && defined(FNDELAY)
+# define FNBLOCK FNDELAY
+#endif
+#if !defined(FNBLOCK) && defined(O_NONBLOCK)
+# define FNBLOCK O_NONBLOCK
+#endif
+
+#ifndef POSIX
+#undef mkfifo
+#define mkfifo(n,m) mknod(n,S_IFIFO|(m),0)
+#endif
+
+#if !defined(HAVE_LSTAT) && !defined(lstat)
+# define lstat stat
+#endif
+
+/*****************************************************************
+ * signal handling
+ */
+
+#ifdef SIGVOID
+# define SIGRETURN
+# define sigret_t void
+#else
+# define SIGRETURN return 0;
+# define sigret_t int
+#endif
+
+/* Geeeee, reverse it? */
+#if defined(SVR4) || (defined(SYSV) && defined(ISC)) || defined(_AIX) || defined(linux) || defined(ultrix) || defined(__386BSD__) || defined(__bsdi__) || defined(POSIX) || defined(NeXT)
+# define SIGHASARG
+#endif
+
+#ifdef SIGHASARG
+# define SIGPROTOARG (int)
+# define SIGDEFARG (sigsig) int sigsig;
+# define SIGARG 0
+#else
+# define SIGPROTOARG (void)
+# define SIGDEFARG ()
+# define SIGARG
+#endif
+
+#ifndef SIGCHLD
+#define SIGCHLD SIGCLD
+#endif
+
+#if defined(POSIX) || defined(hpux)
+# define signal xsignal
+#else
+# ifdef USESIGSET
+# define signal sigset
+# endif /* USESIGSET */
+#endif
+
+/* used in screen.c and attacher.c */
+#ifndef NSIG /* kbeal needs these w/o SYSV */
+# define NSIG 32
+#endif /* !NSIG */
+
+
+/*****************************************************************
+ * Wait stuff
+ */
+
+#if (!defined(sysV68) && !defined(M_XENIX)) || defined(NeXT) || defined(M_UNIX)
+# include <sys/wait.h>
+#endif
+
+#ifndef WTERMSIG
+# ifndef BSDWAIT /* if wait is NOT a union: */
+# define WTERMSIG(status) (status & 0177)
+# else
+# define WTERMSIG(status) status.w_T.w_Termsig
+# endif
+#endif
+
+#ifndef WSTOPSIG
+# ifndef BSDWAIT /* if wait is NOT a union: */
+# define WSTOPSIG(status) ((status >> 8) & 0377)
+# else
+# define WSTOPSIG(status) status.w_S.w_Stopsig
+# endif
+#endif
+
+/* NET-2 uses WCOREDUMP */
+#if defined(WCOREDUMP) && !defined(WIFCORESIG)
+# define WIFCORESIG(status) WCOREDUMP(status)
+#endif
+
+#ifndef WIFCORESIG
+# ifndef BSDWAIT /* if wait is NOT a union: */
+# define WIFCORESIG(status) (status & 0200)
+# else
+# define WIFCORESIG(status) status.w_T.w_Coredump
+# endif
+#endif
+
+#ifndef WEXITSTATUS
+# ifndef BSDWAIT /* if wait is NOT a union: */
+# define WEXITSTATUS(status) ((status >> 8) & 0377)
+# else
+# define WEXITSTATUS(status) status.w_T.w_Retcode
+# endif
+#endif
+
+
+/*****************************************************************
+ * select stuff
+ */
+
+#if defined(M_XENIX) || defined(M_UNIX) || defined(_SEQUENT_) || defined (__INTERIX)
+#include <sys/select.h> /* for timeval + FD... */
+#endif
+
+/*
+ * SunOS 3.5 - Tom Schmidt - Micron Semiconductor, Inc - 27-Jul-93
+ * tschmidt@vax.micron.com
+ */
+#ifndef FD_SET
+# ifndef SUNOS3
+typedef struct fd_set { int fds_bits[1]; } fd_set;
+# endif
+# define FD_ZERO(fd) ((fd)->fds_bits[0] = 0)
+# define FD_SET(b, fd) ((fd)->fds_bits[0] |= 1 << (b))
+# define FD_ISSET(b, fd) ((fd)->fds_bits[0] & 1 << (b))
+# define FD_SETSIZE 32
+#endif
+
+
+/*****************************************************************
+ * user defineable stuff
+ */
+
+#ifndef TERMCAP_BUFSIZE
+# define TERMCAP_BUFSIZE 2048
+#endif
+
+#ifndef MAXPATHLEN
+# define MAXPATHLEN 1024
+#endif
+
+/*
+ * you may try to vary this value. Use low values if your (VMS) system
+ * tends to choke when pasting. Use high values if you want to test
+ * how many characters your pty's can buffer.
+ */
+#define IOSIZE 4096
diff --git a/examples/rlfe/pty.c b/examples/rlfe/pty.c
new file mode 100644
index 0000000..5562720
--- /dev/null
+++ b/examples/rlfe/pty.c
@@ -0,0 +1,388 @@
+/* Copyright (c) 1993-2002
+ * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
+ * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
+ * Copyright (c) 1987 Oliver Laumann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, 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 (see the file COPYING); if not, write to the
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ ****************************************************************
+ */
+#include "config.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <signal.h>
+
+#include <unistd.h>
+
+#include "screen.h"
+
+#ifndef sun
+# include <sys/ioctl.h>
+#endif
+
+/* for solaris 2.1, Unixware (SVR4.2) and possibly others */
+#if defined (HAVE_SVR4_PTYS) && defined (HAVE_SYS_STROPTS_H)
+# include <sys/stropts.h>
+#endif
+
+#if defined(sun) && defined(LOCKPTY) && !defined(TIOCEXCL)
+# include <sys/ttold.h>
+#endif
+
+#ifdef ISC
+# include <sys/tty.h>
+# include <sys/sioctl.h>
+# include <sys/pty.h>
+#endif
+
+#ifdef sgi
+# include <sys/sysmacros.h>
+#endif /* sgi */
+
+#include "extern.h"
+
+/*
+ * if no PTYRANGE[01] is in the config file, we pick a default
+ */
+#ifndef PTYRANGE0
+# define PTYRANGE0 "qpr"
+#endif
+#ifndef PTYRANGE1
+# define PTYRANGE1 "0123456789abcdef"
+#endif
+
+/* SVR4 pseudo ttys don't seem to work with SCO-5 */
+#ifdef M_UNIX
+# undef HAVE_SVR4_PTYS
+#endif
+
+extern int eff_uid;
+
+/* used for opening a new pty-pair: */
+static char PtyName[32], TtyName[32];
+
+#if !(defined(sequent) || defined(_SEQUENT_) || defined(HAVE_SVR4_PTYS))
+# ifdef hpux
+static char PtyProto[] = "/dev/ptym/ptyXY";
+static char TtyProto[] = "/dev/pty/ttyXY";
+# else
+# ifdef M_UNIX
+static char PtyProto[] = "/dev/ptypXY";
+static char TtyProto[] = "/dev/ttypXY";
+# else
+static char PtyProto[] = "/dev/ptyXY";
+static char TtyProto[] = "/dev/ttyXY";
+# endif
+# endif /* hpux */
+#endif
+
+static void initmaster __P((int));
+
+#if defined(sun)
+/* sun's utmp_update program opens the salve side, thus corrupting
+ */
+int pty_preopen = 1;
+#else
+int pty_preopen = 0;
+#endif
+
+/*
+ * Open all ptys with O_NOCTTY, just to be on the safe side
+ * (RISCos mips breaks otherwise)
+ */
+#ifndef O_NOCTTY
+# define O_NOCTTY 0
+#endif
+
+/***************************************************************/
+
+static void
+initmaster(f)
+int f;
+{
+#ifdef POSIX
+ tcflush(f, TCIOFLUSH);
+#else
+# ifdef TIOCFLUSH
+ (void) ioctl(f, TIOCFLUSH, (char *) 0);
+# endif
+#endif
+#ifdef LOCKPTY
+ (void) ioctl(f, TIOCEXCL, (char *) 0);
+#endif
+}
+
+void
+InitPTY(f)
+int f;
+{
+ if (f < 0)
+ return;
+#if defined(I_PUSH) && defined(HAVE_SVR4_PTYS) && !defined(sgi) && !defined(linux) && !defined(__osf__) && !defined(M_UNIX)
+ if (ioctl(f, I_PUSH, "ptem"))
+ Panic(errno, "InitPTY: cannot I_PUSH ptem");
+ if (ioctl(f, I_PUSH, "ldterm"))
+ Panic(errno, "InitPTY: cannot I_PUSH ldterm");
+# ifdef sun
+ if (ioctl(f, I_PUSH, "ttcompat"))
+ Panic(errno, "InitPTY: cannot I_PUSH ttcompat");
+# endif
+#endif
+}
+
+/***************************************************************/
+
+#if defined(OSX) && !defined(PTY_DONE)
+#define PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+ register int f;
+ if ((f = open_controlling_pty(TtyName)) < 0)
+ return -1;
+ initmaster(f);
+ *ttyn = TtyName;
+ return f;
+}
+#endif
+
+/***************************************************************/
+
+#if (defined(sequent) || defined(_SEQUENT_)) && !defined(PTY_DONE)
+#define PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+ char *m, *s;
+ register int f;
+
+ if ((f = getpseudotty(&s, &m)) < 0)
+ return -1;
+#ifdef _SEQUENT_
+ fvhangup(s);
+#endif
+ strncpy(PtyName, m, sizeof(PtyName));
+ strncpy(TtyName, s, sizeof(TtyName));
+ initmaster(f);
+ *ttyn = TtyName;
+ return f;
+}
+#endif
+
+/***************************************************************/
+
+#if defined(__sgi) && !defined(PTY_DONE)
+#define PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+ int f;
+ char *name, *_getpty();
+ sigret_t (*sigcld)__P(SIGPROTOARG);
+
+ /*
+ * SIGCHLD set to SIG_DFL for _getpty() because it may fork() and
+ * exec() /usr/adm/mkpts
+ */
+ sigcld = signal(SIGCHLD, SIG_DFL);
+ name = _getpty(&f, O_RDWR | O_NONBLOCK, 0600, 0);
+ signal(SIGCHLD, sigcld);
+
+ if (name == 0)
+ return -1;
+ initmaster(f);
+ *ttyn = name;
+ return f;
+}
+#endif
+
+/***************************************************************/
+
+#if defined(MIPS) && defined(HAVE_DEV_PTC) && !defined(PTY_DONE)
+#define PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+ register int f;
+ struct stat buf;
+
+ strcpy(PtyName, "/dev/ptc");
+ if ((f = open(PtyName, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0)
+ return -1;
+ if (fstat(f, &buf) < 0)
+ {
+ close(f);
+ return -1;
+ }
+ sprintf(TtyName, "/dev/ttyq%d", minor(buf.st_rdev));
+ initmaster(f);
+ *ttyn = TtyName;
+ return f;
+}
+#endif
+
+/***************************************************************/
+
+#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE)
+#define PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+ register int f;
+ char *m, *ptsname();
+ int unlockpt __P((int)), grantpt __P((int));
+#if defined(HAVE_GETPT) && defined(linux)
+ int getpt __P((void));
+#endif
+ sigret_t (*sigcld)__P(SIGPROTOARG);
+
+ strcpy(PtyName, "/dev/ptmx");
+#if defined(HAVE_GETPT) && defined(linux)
+ if ((f = getpt()) == -1)
+#else
+ if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1)
+#endif
+ return -1;
+
+ /*
+ * SIGCHLD set to SIG_DFL for grantpt() because it fork()s and
+ * exec()s pt_chmod
+ */
+ sigcld = signal(SIGCHLD, SIG_DFL);
+ if ((m = ptsname(f)) == NULL || grantpt(f) || unlockpt(f))
+ {
+ signal(SIGCHLD, sigcld);
+ close(f);
+ return -1;
+ }
+ signal(SIGCHLD, sigcld);
+ strncpy(TtyName, m, sizeof(TtyName));
+ initmaster(f);
+ *ttyn = TtyName;
+ return f;
+}
+#endif
+
+/***************************************************************/
+
+#if defined(_AIX) && defined(HAVE_DEV_PTC) && !defined(PTY_DONE)
+#define PTY_DONE
+
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+ register int f;
+
+ /* a dumb looking loop replaced by mycrofts code: */
+ strcpy (PtyName, "/dev/ptc");
+ if ((f = open (PtyName, O_RDWR | O_NOCTTY)) < 0)
+ return -1;
+ strncpy(TtyName, ttyname(f), sizeof(TtyName));
+ if (eff_uid && access(TtyName, R_OK | W_OK))
+ {
+ close(f);
+ return -1;
+ }
+ initmaster(f);
+# ifdef _IBMR2
+ pty_preopen = 1;
+# endif
+ *ttyn = TtyName;
+ return f;
+}
+#endif
+
+/***************************************************************/
+
+#if defined(HAVE_OPENPTY) && !defined(PTY_DONE)
+#define PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+ int f, s;
+ if (openpty(&f, &s, TtyName, NULL, NULL) != 0)
+ return -1;
+ close(s);
+ initmaster(f);
+ pty_preopen = 1;
+ *ttyn = TtyName;
+ return f;
+}
+#endif
+
+/***************************************************************/
+
+#ifndef PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+ register char *p, *q, *l, *d;
+ register int f;
+
+ debug("OpenPTY: Using BSD style ptys.\n");
+ strcpy(PtyName, PtyProto);
+ strcpy(TtyName, TtyProto);
+ for (p = PtyName; *p != 'X'; p++)
+ ;
+ for (q = TtyName; *q != 'X'; q++)
+ ;
+ for (l = PTYRANGE0; (*p = *l) != '\0'; l++)
+ {
+ for (d = PTYRANGE1; (p[1] = *d) != '\0'; d++)
+ {
+ debug1("OpenPTY tries '%s'\n", PtyName);
+ if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1)
+ continue;
+ q[0] = *l;
+ q[1] = *d;
+ if (eff_uid && access(TtyName, R_OK | W_OK))
+ {
+ close(f);
+ continue;
+ }
+#if defined(sun) && defined(TIOCGPGRP) && !defined(SUNOS3)
+ /* Hack to ensure that the slave side of the pty is
+ * unused. May not work in anything other than SunOS4.1
+ */
+ {
+ int pgrp;
+
+ /* tcgetpgrp does not work (uses TIOCGETPGRP)! */
+ if (ioctl(f, TIOCGPGRP, (char *)&pgrp) != -1 || errno != EIO)
+ {
+ close(f);
+ continue;
+ }
+ }
+#endif
+ initmaster(f);
+ *ttyn = TtyName;
+ return f;
+ }
+ }
+ return -1;
+}
+#endif
diff --git a/examples/rlfe/rlfe.c b/examples/rlfe/rlfe.c
new file mode 100644
index 0000000..f40b2dd
--- /dev/null
+++ b/examples/rlfe/rlfe.c
@@ -0,0 +1,792 @@
+/* A front-end using readline to "cook" input lines.
+ *
+ * Copyright (C) 2004, 1999 Per Bothner
+ *
+ * This front-end program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * Some code from Johnson & Troan: "Linux Application Development"
+ * (Addison-Wesley, 1998) was used directly or for inspiration.
+ *
+ * 2003-11-07 Wolfgang Taeuber <wolfgang_taeuber@agilent.com>
+ * Specify a history file and the size of the history file with command
+ * line options; use EDITOR/VISUAL to set vi/emacs preference.
+ */
+
+/* PROBLEMS/TODO:
+ *
+ * Only tested under GNU/Linux and Mac OS 10.x; needs to be ported.
+ *
+ * Switching between line-editing-mode vs raw-char-mode depending on
+ * what tcgetattr returns is inherently not robust, plus it doesn't
+ * work when ssh/telnetting in. A better solution is possible if the
+ * tty system can send in-line escape sequences indicating the current
+ * mode, echo'd input, etc. That would also allow a user preference
+ * to set different colors for prompt, input, stdout, and stderr.
+ *
+ * When running mc -c under the Linux console, mc does not recognize
+ * mouse clicks, which mc does when not running under rlfe.
+ *
+ * Pasting selected text containing tabs is like hitting the tab character,
+ * which invokes readline completion. We don't want this. I don't know
+ * if this is fixable without integrating rlfe into a terminal emulator.
+ *
+ * Echo suppression is a kludge, but can only be avoided with better kernel
+ * support: We need a tty mode to disable "real" echoing, while still
+ * letting the inferior think its tty driver to doing echoing.
+ * Stevens's book claims SCR$ and BSD4.3+ have TIOCREMOTE.
+ *
+ * The latest readline may have some hooks we can use to avoid having
+ * to back up the prompt. (See HAVE_ALREADY_PROMPTED.)
+ *
+ * Desirable readline feature: When in cooked no-echo mode (e.g. password),
+ * echo characters are they are types with '*', but remove them when done.
+ *
+ * Asynchronous output while we're editing an input line should be
+ * inserted in the output view *before* the input line, so that the
+ * lines being edited (with the prompt) float at the end of the input.
+ *
+ * A "page mode" option to emulate more/less behavior: At each page of
+ * output, pause for a user command. This required parsing the output
+ * to keep track of line lengths. It also requires remembering the
+ * output, if we want an option to scroll back, which suggests that
+ * this should be integrated with a terminal emulator like xterm.
+ */
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <signal.h>
+#include <netdb.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <grp.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <termios.h>
+
+#include "config.h"
+#include "extern.h"
+
+#if defined (HAVE_SYS_WAIT_H)
+# include <sys/wait.h>
+#endif
+
+#ifdef READLINE_LIBRARY
+# include "readline.h"
+# include "history.h"
+#else
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
+
+#ifndef COMMAND
+#define COMMAND "/bin/bash"
+#endif
+#ifndef COMMAND_ARGS
+#define COMMAND_ARGS COMMAND
+#endif
+
+#ifndef ALT_COMMAND
+#define ALT_COMMAND "/bin/sh"
+#endif
+#ifndef ALT_COMMAND_ARGS
+#define ALT_COMMAND_ARGS ALT_COMMAND
+#endif
+
+#ifndef HAVE_MEMMOVE
+# if __GNUC__ > 1
+# define memmove(d, s, n) __builtin_memcpy(d, s, n)
+# else
+# define memmove(d, s, n) memcpy(d, s, n)
+# endif
+#else
+# define memmove(d, s, n) memcpy(d, s, n)
+#endif
+
+#define APPLICATION_NAME "rlfe"
+
+static int in_from_inferior_fd;
+static int out_to_inferior_fd;
+static void set_edit_mode ();
+static void usage_exit ();
+static char *hist_file = 0;
+static int hist_size = 0;
+
+/* Unfortunately, we cannot safely display echo from the inferior process.
+ The reason is that the echo bit in the pty is "owned" by the inferior,
+ and if we try to turn it off, we could confuse the inferior.
+ Thus, when echoing, we get echo twice: First readline echoes while
+ we're actually editing. Then we send the line to the inferior, and the
+ terminal driver send back an extra echo.
+ The work-around is to remember the input lines, and when we see that
+ line come back, we supress the output.
+ A better solution (supposedly available on SVR4) would be a smarter
+ terminal driver, with more flags ... */
+#define ECHO_SUPPRESS_MAX 1024
+char echo_suppress_buffer[ECHO_SUPPRESS_MAX];
+int echo_suppress_start = 0;
+int echo_suppress_limit = 0;
+
+/*#define DEBUG*/
+
+#ifdef DEBUG
+FILE *logfile = NULL;
+#define DPRINT0(FMT) (fprintf(logfile, FMT), fflush(logfile))
+#define DPRINT1(FMT, V1) (fprintf(logfile, FMT, V1), fflush(logfile))
+#define DPRINT2(FMT, V1, V2) (fprintf(logfile, FMT, V1, V2), fflush(logfile))
+#else
+#define DPRINT0(FMT) ((void) 0) /* Do nothing */
+#define DPRINT1(FMT, V1) ((void) 0) /* Do nothing */
+#define DPRINT2(FMT, V1, V2) ((void) 0) /* Do nothing */
+#endif
+
+struct termios orig_term;
+
+/* Pid of child process. */
+static pid_t child = -1;
+
+static void
+sig_child (int signo)
+{
+ int status;
+ wait (&status);
+ if (hist_file != 0)
+ {
+ write_history (hist_file);
+ if (hist_size)
+ history_truncate_file (hist_file, hist_size);
+ }
+ DPRINT0 ("(Child process died.)\n");
+ tcsetattr(STDIN_FILENO, TCSANOW, &orig_term);
+ exit (0);
+}
+
+volatile int propagate_sigwinch = 0;
+
+/* sigwinch_handler
+ * propagate window size changes from input file descriptor to
+ * master side of pty.
+ */
+void sigwinch_handler(int signal) {
+ propagate_sigwinch = 1;
+}
+
+
+/* get_slave_pty() returns an integer file descriptor.
+ * If it returns < 0, an error has occurred.
+ * Otherwise, it has returned the slave file descriptor.
+ */
+
+int get_slave_pty(char *name) {
+ struct group *gptr;
+ gid_t gid;
+ int slave = -1;
+
+ /* chown/chmod the corresponding pty, if possible.
+ * This will only work if the process has root permissions.
+ * Alternatively, write and exec a small setuid program that
+ * does just this.
+ */
+ if ((gptr = getgrnam("tty")) != 0) {
+ gid = gptr->gr_gid;
+ } else {
+ /* if the tty group does not exist, don't change the
+ * group on the slave pty, only the owner
+ */
+ gid = -1;
+ }
+
+ /* Note that we do not check for errors here. If this is code
+ * where these actions are critical, check for errors!
+ */
+ chown(name, getuid(), gid);
+ /* This code only makes the slave read/writeable for the user.
+ * If this is for an interactive shell that will want to
+ * receive "write" and "wall" messages, OR S_IWGRP into the
+ * second argument below.
+ */
+ chmod(name, S_IRUSR|S_IWUSR);
+
+ /* open the corresponding slave pty */
+ slave = open(name, O_RDWR);
+ return (slave);
+}
+
+/* Certain special characters, such as ctrl/C, we want to pass directly
+ to the inferior, rather than letting readline handle them. */
+
+static char special_chars[20];
+static int special_chars_count;
+
+static void
+add_special_char(int ch)
+{
+ if (ch != 0)
+ special_chars[special_chars_count++] = ch;
+}
+
+static int eof_char;
+
+static int
+is_special_char(int ch)
+{
+ int i;
+#if 0
+ if (ch == eof_char && rl_point == rl_end)
+ return 1;
+#endif
+ for (i = special_chars_count; --i >= 0; )
+ if (special_chars[i] == ch)
+ return 1;
+ return 0;
+}
+
+static char buf[1024];
+/* buf[0 .. buf_count-1] is the what has been emitted on the current line.
+ It is used as the readline prompt. */
+static int buf_count = 0;
+
+int do_emphasize_input = 1;
+int current_emphasize_input;
+
+char *start_input_mode = "\033[1m";
+char *end_input_mode = "\033[0m";
+
+int num_keys = 0;
+
+static void maybe_emphasize_input (int on)
+{
+ if (on == current_emphasize_input
+ || (on && ! do_emphasize_input))
+ return;
+ fprintf (rl_outstream, on ? start_input_mode : end_input_mode);
+ fflush (rl_outstream);
+ current_emphasize_input = on;
+}
+
+static void
+null_prep_terminal (int meta)
+{
+}
+
+static void
+null_deprep_terminal ()
+{
+ maybe_emphasize_input (0);
+}
+
+static int
+pre_input_change_mode (void)
+{
+ return 0;
+}
+
+char pending_special_char;
+
+static void
+line_handler (char *line)
+{
+ if (line == NULL)
+ {
+ char buf[1];
+ DPRINT0("saw eof!\n");
+ buf[0] = '\004'; /* ctrl/d */
+ write (out_to_inferior_fd, buf, 1);
+ }
+ else
+ {
+ static char enter[] = "\r";
+ /* Send line to inferior: */
+ int length = strlen (line);
+ if (length > ECHO_SUPPRESS_MAX-2)
+ {
+ echo_suppress_start = 0;
+ echo_suppress_limit = 0;
+ }
+ else
+ {
+ if (echo_suppress_limit + length > ECHO_SUPPRESS_MAX - 2)
+ {
+ if (echo_suppress_limit - echo_suppress_start + length
+ <= ECHO_SUPPRESS_MAX - 2)
+ {
+ memmove (echo_suppress_buffer,
+ echo_suppress_buffer + echo_suppress_start,
+ echo_suppress_limit - echo_suppress_start);
+ echo_suppress_limit -= echo_suppress_start;
+ echo_suppress_start = 0;
+ }
+ else
+ {
+ echo_suppress_limit = 0;
+ }
+ echo_suppress_start = 0;
+ }
+ memcpy (echo_suppress_buffer + echo_suppress_limit,
+ line, length);
+ echo_suppress_limit += length;
+ echo_suppress_buffer[echo_suppress_limit++] = '\r';
+ echo_suppress_buffer[echo_suppress_limit++] = '\n';
+ }
+ write (out_to_inferior_fd, line, length);
+ if (pending_special_char == 0)
+ {
+ write (out_to_inferior_fd, enter, sizeof(enter)-1);
+ if (*line)
+ add_history (line);
+ }
+ free (line);
+ }
+ rl_callback_handler_remove ();
+ buf_count = 0;
+ num_keys = 0;
+ if (pending_special_char != 0)
+ {
+ write (out_to_inferior_fd, &pending_special_char, 1);
+ pending_special_char = 0;
+ }
+}
+
+/* Value of rl_getc_function.
+ Use this because readline should read from stdin, not rl_instream,
+ points to the pty (so readline has monitor its terminal modes). */
+
+int
+my_rl_getc (FILE *dummy)
+{
+ int ch = rl_getc (stdin);
+ if (is_special_char (ch))
+ {
+ pending_special_char = ch;
+ return '\r';
+ }
+ return ch;
+}
+
+int
+main(int argc, char** argv)
+{
+ char *path;
+ int i;
+ int master;
+ char *name;
+ int in_from_tty_fd;
+ struct sigaction act;
+ struct winsize ws;
+ struct termios t;
+ int maxfd;
+ fd_set in_set;
+ static char empty_string[1] = "";
+ char *prompt = empty_string;
+ int ioctl_err = 0;
+ int arg_base = 1;
+
+#ifdef DEBUG
+ logfile = fopen("/tmp/rlfe.log", "w");
+#endif
+
+ while (arg_base<argc)
+ {
+ if (argv[arg_base][0] != '-')
+ break;
+ if (arg_base+1 >= argc )
+ usage_exit();
+ switch(argv[arg_base][1])
+ {
+ case 'h':
+ arg_base++;
+ hist_file = argv[arg_base];
+ break;
+ case 's':
+ arg_base++;
+ hist_size = atoi(argv[arg_base]);
+ if (hist_size<0)
+ usage_exit();
+ break;
+ default:
+ usage_exit();
+ }
+ arg_base++;
+ }
+ if (hist_file)
+ read_history (hist_file);
+
+ set_edit_mode ();
+
+ rl_readline_name = APPLICATION_NAME;
+
+ if ((master = OpenPTY (&name)) < 0)
+ {
+ perror("ptypair: could not open master pty");
+ exit(1);
+ }
+
+ DPRINT1("pty name: '%s'\n", name);
+
+ /* set up SIGWINCH handler */
+ act.sa_handler = sigwinch_handler;
+ sigemptyset(&(act.sa_mask));
+ act.sa_flags = 0;
+ if (sigaction(SIGWINCH, &act, NULL) < 0)
+ {
+ perror("ptypair: could not handle SIGWINCH ");
+ exit(1);
+ }
+
+ if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0)
+ {
+ perror("ptypair: could not get window size");
+ exit(1);
+ }
+
+ if ((child = fork()) < 0)
+ {
+ perror("cannot fork");
+ exit(1);
+ }
+
+ if (child == 0)
+ {
+ int slave; /* file descriptor for slave pty */
+
+ /* We are in the child process */
+ close(master);
+
+#ifdef TIOCSCTTY
+ if ((slave = get_slave_pty(name)) < 0)
+ {
+ perror("ptypair: could not open slave pty");
+ exit(1);
+ }
+#endif
+
+ /* We need to make this process a session group leader, because
+ * it is on a new PTY, and things like job control simply will
+ * not work correctly unless there is a session group leader
+ * and process group leader (which a session group leader
+ * automatically is). This also disassociates us from our old
+ * controlling tty.
+ */
+ if (setsid() < 0)
+ {
+ perror("could not set session leader");
+ }
+
+ /* Tie us to our new controlling tty. */
+#ifdef TIOCSCTTY
+ if (ioctl(slave, TIOCSCTTY, NULL))
+ {
+ perror("could not set new controlling tty");
+ }
+#else
+ if ((slave = get_slave_pty(name)) < 0)
+ {
+ perror("ptypair: could not open slave pty");
+ exit(1);
+ }
+#endif
+
+ /* make slave pty be standard in, out, and error */
+ dup2(slave, STDIN_FILENO);
+ dup2(slave, STDOUT_FILENO);
+ dup2(slave, STDERR_FILENO);
+
+ /* at this point the slave pty should be standard input */
+ if (slave > 2)
+ {
+ close(slave);
+ }
+
+ /* Try to restore window size; failure isn't critical */
+ if (ioctl(STDOUT_FILENO, TIOCSWINSZ, &ws) < 0)
+ {
+ perror("could not restore window size");
+ }
+
+ /* now start the shell */
+ {
+ static char* command_args[] = { COMMAND_ARGS, NULL };
+ static char* alt_command_args[] = { ALT_COMMAND_ARGS, NULL };
+ if (argc <= 1)
+ {
+ execvp (COMMAND, command_args);
+ execvp (ALT_COMMAND, alt_command_args);
+ }
+ else
+ execvp (argv[arg_base], &argv[arg_base]);
+ }
+
+ /* should never be reached */
+ exit(1);
+ }
+
+ /* parent */
+ signal (SIGCHLD, sig_child);
+
+ /* Note that we only set termios settings for standard input;
+ * the master side of a pty is NOT a tty.
+ */
+ tcgetattr(STDIN_FILENO, &orig_term);
+
+ t = orig_term;
+ eof_char = t.c_cc[VEOF];
+ /* add_special_char(t.c_cc[VEOF]);*/
+ add_special_char(t.c_cc[VINTR]);
+ add_special_char(t.c_cc[VQUIT]);
+ add_special_char(t.c_cc[VSUSP]);
+#if defined (VDISCARD)
+ add_special_char(t.c_cc[VDISCARD]);
+#endif
+
+ t.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOCTL | ECHOE | \
+ ECHOK | ECHONL
+#if defined (ECHOKE)
+ | ECHOKE
+#endif
+#if defined (ECHOPRT)
+ | ECHOPRT
+#endif
+ );
+ t.c_iflag &= ~ICRNL;
+ t.c_iflag |= IGNBRK;
+ t.c_cc[VMIN] = 1;
+ t.c_cc[VTIME] = 0;
+ tcsetattr(STDIN_FILENO, TCSANOW, &t);
+ in_from_inferior_fd = master;
+ out_to_inferior_fd = master;
+ rl_instream = fdopen (master, "r");
+ rl_getc_function = my_rl_getc;
+
+ rl_prep_term_function = null_prep_terminal;
+ rl_deprep_term_function = null_deprep_terminal;
+ rl_pre_input_hook = pre_input_change_mode;
+ rl_callback_handler_install (prompt, line_handler);
+
+ in_from_tty_fd = STDIN_FILENO;
+ FD_ZERO (&in_set);
+ maxfd = in_from_inferior_fd > in_from_tty_fd ? in_from_inferior_fd
+ : in_from_tty_fd;
+ for (;;)
+ {
+ int num;
+ FD_SET (in_from_inferior_fd, &in_set);
+ FD_SET (in_from_tty_fd, &in_set);
+
+ num = select(maxfd+1, &in_set, NULL, NULL, NULL);
+
+ if (propagate_sigwinch)
+ {
+ struct winsize ws;
+ if (ioctl (STDIN_FILENO, TIOCGWINSZ, &ws) >= 0)
+ {
+ ioctl (master, TIOCSWINSZ, &ws);
+ }
+ propagate_sigwinch = 0;
+ continue;
+ }
+
+ if (num <= 0)
+ {
+ perror ("select");
+ exit (-1);
+ }
+ if (FD_ISSET (in_from_tty_fd, &in_set))
+ {
+ extern int _rl_echoing_p;
+ struct termios term_master;
+ int do_canon = 1;
+ int do_icrnl = 1;
+ int ioctl_ret;
+
+ DPRINT1("[tty avail num_keys:%d]\n", num_keys);
+
+ /* If we can't get tty modes for the master side of the pty, we
+ can't handle non-canonical-mode programs. Always assume the
+ master is in canonical echo mode if we can't tell. */
+ ioctl_ret = tcgetattr(master, &term_master);
+
+ if (ioctl_ret >= 0)
+ {
+ do_canon = (term_master.c_lflag & ICANON) != 0;
+ do_icrnl = (term_master.c_lflag & ICRNL) != 0;
+ _rl_echoing_p = (term_master.c_lflag & ECHO) != 0;
+ DPRINT1 ("echo,canon,crnl:%03d\n",
+ 100 * _rl_echoing_p
+ + 10 * do_canon
+ + 1 * do_icrnl);
+ }
+ else
+ {
+ if (ioctl_err == 0)
+ DPRINT1("tcgetattr on master fd failed: errno = %d\n", errno);
+ ioctl_err = 1;
+ }
+
+ if (do_canon == 0 && num_keys == 0)
+ {
+ char ch[10];
+ int count = read (STDIN_FILENO, ch, sizeof(ch));
+ DPRINT1("[read %d chars from stdin: ", count);
+ DPRINT2(" \"%.*s\"]\n", count, ch);
+ if (do_icrnl)
+ {
+ int i = count;
+ while (--i >= 0)
+ {
+ if (ch[i] == '\r')
+ ch[i] = '\n';
+ }
+ }
+ maybe_emphasize_input (1);
+ write (out_to_inferior_fd, ch, count);
+ }
+ else
+ {
+ if (num_keys == 0)
+ {
+ int i;
+ /* Re-install callback handler for new prompt. */
+ if (prompt != empty_string)
+ free (prompt);
+ if (prompt == NULL)
+ {
+ DPRINT0("New empty prompt\n");
+ prompt = empty_string;
+ }
+ else
+ {
+ if (do_emphasize_input && buf_count > 0)
+ {
+ prompt = malloc (buf_count + strlen (end_input_mode)
+ + strlen (start_input_mode) + 5);
+ sprintf (prompt, "\001%s\002%.*s\001%s\002",
+ end_input_mode,
+ buf_count, buf,
+ start_input_mode);
+ }
+ else
+ {
+ prompt = malloc (buf_count + 1);
+ memcpy (prompt, buf, buf_count);
+ prompt[buf_count] = '\0';
+ }
+ DPRINT1("New prompt '%s'\n", prompt);
+#if 0 /* ifdef HAVE_RL_ALREADY_PROMPTED */
+ /* Doesn't quite work when do_emphasize_input is 1. */
+ rl_already_prompted = buf_count > 0;
+#else
+ if (buf_count > 0)
+ write (1, "\r", 1);
+#endif
+ }
+
+ rl_callback_handler_install (prompt, line_handler);
+ }
+ num_keys++;
+ maybe_emphasize_input (1);
+ rl_callback_read_char ();
+ }
+ }
+ else /* output from inferior. */
+ {
+ int i;
+ int count;
+ int old_count;
+ if (buf_count > (sizeof(buf) >> 2))
+ buf_count = 0;
+ count = read (in_from_inferior_fd, buf+buf_count,
+ sizeof(buf) - buf_count);
+ DPRINT2("read %d from inferior, buf_count=%d", count, buf_count);
+ DPRINT2(": \"%.*s\"", count, buf+buf_count);
+ maybe_emphasize_input (0);
+ if (count <= 0)
+ {
+ DPRINT0 ("(Connection closed by foreign host.)\n");
+ tcsetattr(STDIN_FILENO, TCSANOW, &orig_term);
+ exit (0);
+ }
+ old_count = buf_count;
+
+ /* Look for any pending echo that we need to suppress. */
+ while (echo_suppress_start < echo_suppress_limit
+ && count > 0
+ && buf[buf_count] == echo_suppress_buffer[echo_suppress_start])
+ {
+ count--;
+ buf_count++;
+ echo_suppress_start++;
+ }
+ DPRINT1("suppressed %d characters of echo.\n", buf_count-old_count);
+
+ /* Write to the terminal anything that was not suppressed. */
+ if (count > 0)
+ write (1, buf + buf_count, count);
+
+ /* Finally, look for a prompt candidate.
+ * When we get around to going input (from the keyboard),
+ * we will consider the prompt to be anything since the last
+ * line terminator. So we need to save that text in the
+ * initial part of buf. However, anything before the
+ * most recent end-of-line is not interesting. */
+ buf_count += count;
+#if 1
+ for (i = buf_count; --i >= old_count; )
+#else
+ for (i = buf_count - 1; i-- >= buf_count - count; )
+#endif
+ {
+ if (buf[i] == '\n' || buf[i] == '\r')
+ {
+ i++;
+ memmove (buf, buf+i, buf_count - i);
+ buf_count -= i;
+ break;
+ }
+ }
+ DPRINT2("-> i: %d, buf_count: %d\n", i, buf_count);
+ }
+ }
+}
+
+static void set_edit_mode ()
+{
+ int vi = 0;
+ char *shellopts;
+
+ shellopts = getenv ("SHELLOPTS");
+ while (shellopts != 0)
+ {
+ if (strncmp ("vi", shellopts, 2) == 0)
+ {
+ vi = 1;
+ break;
+ }
+ shellopts = strchr (shellopts + 1, ':');
+ }
+
+ if (!vi)
+ {
+ if (getenv ("EDITOR") != 0)
+ vi |= strcmp (getenv ("EDITOR"), "vi") == 0;
+ }
+
+ if (vi)
+ rl_variable_bind ("editing-mode", "vi");
+ else
+ rl_variable_bind ("editing-mode", "emacs");
+}
+
+
+static void usage_exit ()
+{
+ fprintf (stderr, "Usage: rlfe [-h histfile] [-s size] cmd [arg1] [arg2] ...\n\n");
+ exit (1);
+}
diff --git a/examples/rlfe/screen.h b/examples/rlfe/screen.h
new file mode 100644
index 0000000..5b040c3
--- /dev/null
+++ b/examples/rlfe/screen.h
@@ -0,0 +1,2 @@
+/* Dummy header to avoid modifying pty.c */
+#include "os.h"
diff --git a/examples/rlkeymaps.c b/examples/rlkeymaps.c
new file mode 100644
index 0000000..fef77b3
--- /dev/null
+++ b/examples/rlkeymaps.c
@@ -0,0 +1,61 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+
+#if defined (READLINE_LIBRARY)
+# include "readline.h"
+# include "history.h"
+#else
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
+
+int
+main (int c, char **v)
+{
+ Keymap nmap, emacsmap, newemacs;
+ int r, errs;
+
+ errs = 0;
+ nmap = rl_make_keymap ();
+
+ r = rl_set_keymap_name ("emacs", nmap);
+ if (r >= 0)
+ {
+ fprintf (stderr, "rlkeymaps: error: able to rename `emacs' keymap\n");
+ errs++;
+ }
+
+ emacsmap = rl_get_keymap_by_name ("emacs");
+ r = rl_set_keymap_name ("newemacs", emacsmap);
+ if (r >= 0)
+ {
+ fprintf (stderr, "rlkeymaps: error: able to set new name for emacs keymap\n");
+ errs++;
+ }
+
+ r = rl_set_keymap_name ("newemacs", nmap);
+ if (r < 0)
+ {
+ fprintf (stderr, "rlkeymaps: error: newemacs: could not set keymap name\n");
+ errs++;
+ }
+
+ newemacs = rl_copy_keymap (emacsmap);
+ r = rl_set_keymap_name ("newemacs", newemacs);
+ if (r < 0)
+ {
+ fprintf (stderr, "rlkeymaps: error: newemacs: could not set `newemacs' keymap to new map\n");
+ errs++;
+ }
+
+ r = rl_set_keymap_name ("emacscopy", newemacs);
+ if (r < 0)
+ {
+ fprintf (stderr, "rlkeymaps: error: emacscopy: could not rename created keymap\n");
+ errs++;
+ }
+
+ exit (errs);
+}
diff --git a/examples/rlptytest.c b/examples/rlptytest.c
new file mode 100644
index 0000000..d170f62
--- /dev/null
+++ b/examples/rlptytest.c
@@ -0,0 +1,354 @@
+/*
+ *
+ * Another test harness for the readline callback interface.
+ *
+ * Author: Bob Rossi <bob@brasko.net>
+ */
+
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <curses.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <signal.h>
+
+#if 1 /* LINUX */
+#include <pty.h>
+#else
+#include <util.h>
+#endif
+
+#ifdef HAVE_LOCALE_H
+# include <locale.h>
+#endif
+
+#ifdef READLINE_LIBRARY
+# include "readline.h"
+#else
+# include <readline/readline.h>
+#endif
+
+/**
+ * Master/Slave PTY used to keep readline off of stdin/stdout.
+ */
+static int masterfd = -1;
+static int slavefd;
+
+void
+sigint (s)
+ int s;
+{
+ tty_reset (STDIN_FILENO);
+ close (masterfd);
+ close (slavefd);
+ printf ("\n");
+ exit (0);
+}
+
+void
+sigwinch (s)
+ int s;
+{
+ rl_resize_terminal ();
+}
+
+static int
+user_input()
+{
+ int size;
+ const int MAX = 1024;
+ char *buf = (char *)malloc(MAX+1);
+
+ size = read (STDIN_FILENO, buf, MAX);
+ if (size == -1)
+ return -1;
+
+ size = write (masterfd, buf, size);
+ if (size == -1)
+ return -1;
+
+ return 0;
+}
+
+static int
+readline_input()
+{
+ const int MAX = 1024;
+ char *buf = (char *)malloc(MAX+1);
+ int size;
+
+ size = read (masterfd, buf, MAX);
+ if (size == -1)
+ {
+ free( buf );
+ buf = NULL;
+ return -1;
+ }
+
+ buf[size] = 0;
+
+ /* Display output from readline */
+ if ( size > 0 )
+ fprintf(stderr, "%s", buf);
+
+ free( buf );
+ buf = NULL;
+ return 0;
+}
+
+static void
+rlctx_send_user_command(char *line)
+{
+ /* This happens when rl_callback_read_char gets EOF */
+ if ( line == NULL )
+ return;
+
+ if (strcmp (line, "exit") == 0) {
+ tty_reset (STDIN_FILENO);
+ close (masterfd);
+ close (slavefd);
+ printf ("\n");
+ exit (0);
+ }
+
+ /* Don't add the enter command */
+ if ( line && *line != '\0' )
+ add_history(line);
+}
+
+static void
+custom_deprep_term_function ()
+{
+}
+
+static int
+init_readline (int inputfd, int outputfd)
+{
+ FILE *inputFILE, *outputFILE;
+
+ inputFILE = fdopen (inputfd, "r");
+ if (!inputFILE)
+ return -1;
+
+ outputFILE = fdopen (outputfd, "w");
+ if (!outputFILE)
+ return -1;
+
+ rl_instream = inputFILE;
+ rl_outstream = outputFILE;
+
+ /* Tell readline what the prompt is if it needs to put it back */
+ rl_callback_handler_install("(rltest): ", rlctx_send_user_command);
+
+ /* Set the terminal type to dumb so the output of readline can be
+ * understood by tgdb */
+ if ( rl_reset_terminal("dumb") == -1 )
+ return -1;
+
+ /* For some reason, readline can not deprep the terminal.
+ * However, it doesn't matter because no other application is working on
+ * the terminal besides readline */
+ rl_deprep_term_function = custom_deprep_term_function;
+
+ using_history();
+ read_history(".history");
+
+ return 0;
+}
+
+static int
+main_loop(void)
+{
+ fd_set rset;
+ int max;
+
+ max = (masterfd > STDIN_FILENO) ? masterfd : STDIN_FILENO;
+ max = (max > slavefd) ? max : slavefd;
+
+ for (;;)
+ {
+ /* Reset the fd_set, and watch for input from GDB or stdin */
+ FD_ZERO(&rset);
+
+ FD_SET(STDIN_FILENO, &rset);
+ FD_SET(slavefd, &rset);
+ FD_SET(masterfd, &rset);
+
+ /* Wait for input */
+ if (select(max + 1, &rset, NULL, NULL, NULL) == -1)
+ {
+ if (errno == EINTR)
+ continue;
+ else
+ return -1;
+ }
+
+ /* Input received through the pty: Handle it
+ * Wrote to masterfd, slave fd has that input, alert readline to read it.
+ */
+ if (FD_ISSET(slavefd, &rset))
+ rl_callback_read_char();
+
+ /* Input received through the pty.
+ * Readline read from slavefd, and it wrote to the masterfd.
+ */
+ if (FD_ISSET(masterfd, &rset))
+ if ( readline_input() == -1 )
+ return -1;
+
+ /* Input received: Handle it, write to masterfd (input to readline) */
+ if (FD_ISSET(STDIN_FILENO, &rset))
+ if ( user_input() == -1 )
+ return -1;
+ }
+
+ return 0;
+}
+
+/* The terminal attributes before calling tty_cbreak */
+static struct termios save_termios;
+static struct winsize size;
+static enum { RESET, TCBREAK } ttystate = RESET;
+
+/* tty_cbreak: Sets terminal to cbreak mode. Also known as noncanonical mode.
+ * 1. Signal handling is still turned on, so the user can still type those.
+ * 2. echo is off
+ * 3. Read in one char at a time.
+ *
+ * fd - The file descriptor of the terminal
+ *
+ * Returns: 0 on success, -1 on error
+ */
+int tty_cbreak(int fd){
+ struct termios buf;
+ int ttysavefd = -1;
+
+ if(tcgetattr(fd, &save_termios) < 0)
+ return -1;
+
+ buf = save_termios;
+ buf.c_lflag &= ~(ECHO | ICANON);
+ buf.c_iflag &= ~(ICRNL | INLCR);
+ buf.c_cc[VMIN] = 1;
+ buf.c_cc[VTIME] = 0;
+
+#if defined (VLNEXT) && defined (_POSIX_VDISABLE)
+ buf.c_cc[VLNEXT] = _POSIX_VDISABLE;
+#endif
+
+#if defined (VDSUSP) && defined (_POSIX_VDISABLE)
+ buf.c_cc[VDSUSP] = _POSIX_VDISABLE;
+#endif
+
+ /* enable flow control; only stty start char can restart output */
+#if 0
+ buf.c_iflag |= (IXON|IXOFF);
+#ifdef IXANY
+ buf.c_iflag &= ~IXANY;
+#endif
+#endif
+
+ /* disable flow control; let ^S and ^Q through to pty */
+ buf.c_iflag &= ~(IXON|IXOFF);
+#ifdef IXANY
+ buf.c_iflag &= ~IXANY;
+#endif
+
+ if(tcsetattr(fd, TCSAFLUSH, &buf) < 0)
+ return -1;
+
+ ttystate = TCBREAK;
+ ttysavefd = fd;
+
+ /* set size */
+ if(ioctl(fd, TIOCGWINSZ, (char *)&size) < 0)
+ return -1;
+
+#ifdef DEBUG
+ err_msg("%d rows and %d cols\n", size.ws_row, size.ws_col);
+#endif
+
+ return (0);
+}
+
+int
+tty_off_xon_xoff (int fd)
+{
+ struct termios buf;
+ int ttysavefd = -1;
+
+ if(tcgetattr(fd, &buf) < 0)
+ return -1;
+
+ buf.c_iflag &= ~(IXON|IXOFF);
+
+ if(tcsetattr(fd, TCSAFLUSH, &buf) < 0)
+ return -1;
+
+ return 0;
+}
+
+/* tty_reset: Sets the terminal attributes back to their previous state.
+ * PRE: tty_cbreak must have already been called.
+ *
+ * fd - The file descrioptor of the terminal to reset.
+ *
+ * Returns: 0 on success, -1 on error
+ */
+int tty_reset(int fd)
+{
+ if(ttystate != TCBREAK)
+ return (0);
+
+ if(tcsetattr(fd, TCSAFLUSH, &save_termios) < 0)
+ return (-1);
+
+ ttystate = RESET;
+
+ return 0;
+}
+
+int
+main()
+{
+ int val;
+
+#ifdef HAVE_SETLOCALE
+ setlocale (LC_ALL, "");
+#endif
+
+ val = openpty (&masterfd, &slavefd, NULL, NULL, NULL);
+ if (val == -1)
+ return -1;
+
+ val = tty_off_xon_xoff (masterfd);
+ if (val == -1)
+ return -1;
+
+ signal (SIGWINCH, sigwinch);
+ signal (SIGINT, sigint);
+
+ val = init_readline (slavefd, slavefd);
+ if (val == -1)
+ return -1;
+
+ val = tty_cbreak (STDIN_FILENO);
+ if (val == -1)
+ return -1;
+
+ val = main_loop ();
+
+ tty_reset (STDIN_FILENO);
+
+ if (val == -1)
+ return -1;
+
+ return 0;
+}
diff --git a/examples/rltest.c b/examples/rltest.c
new file mode 100644
index 0000000..8b7c00c
--- /dev/null
+++ b/examples/rltest.c
@@ -0,0 +1,101 @@
+/* **************************************************************** */
+/* */
+/* Testing Readline */
+/* */
+/* **************************************************************** */
+
+/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library for
+ reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+extern void exit();
+#endif
+
+#ifdef HAVE_LOCALE_H
+# include <locale.h>
+#endif
+
+#ifdef READLINE_LIBRARY
+# include "readline.h"
+# include "history.h"
+#else
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
+
+extern HIST_ENTRY **history_list ();
+
+int
+main ()
+{
+ char *temp, *prompt;
+ int done;
+
+#ifdef HAVE_SETLOCALE
+ setlocale (LC_ALL, "");
+#endif
+
+ temp = (char *)NULL;
+ prompt = "readline$ ";
+ done = 0;
+
+ while (!done)
+ {
+ temp = readline (prompt);
+
+ /* Test for EOF. */
+ if (!temp)
+ exit (1);
+
+ /* If there is anything on the line, print it and remember it. */
+ if (*temp)
+ {
+ fprintf (stderr, "%s\r\n", temp);
+ add_history (temp);
+ }
+
+ /* Check for `command' that we handle. */
+ if (strcmp (temp, "quit") == 0)
+ done = 1;
+
+ if (strcmp (temp, "list") == 0)
+ {
+ HIST_ENTRY **list;
+ register int i;
+
+ list = history_list ();
+ if (list)
+ {
+ for (i = 0; list[i]; i++)
+ fprintf (stderr, "%d: %s\r\n", i, list[i]->line);
+ }
+ }
+ free (temp);
+ }
+ exit (0);
+}
diff --git a/examples/rlversion.c b/examples/rlversion.c
new file mode 100644
index 0000000..f36567b
--- /dev/null
+++ b/examples/rlversion.c
@@ -0,0 +1,49 @@
+/*
+ * rlversion -- print out readline's version number
+ */
+
+/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library for
+ reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include "posixstat.h"
+
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+extern void exit();
+#endif
+
+#ifdef READLINE_LIBRARY
+# include "readline.h"
+#else
+# include <readline/readline.h>
+#endif
+
+int
+main()
+{
+ printf ("%s\n", rl_library_version ? rl_library_version : "unknown");
+ exit (0);
+}
diff --git a/examples/rlwrap-0.30.tar.gz b/examples/rlwrap-0.30.tar.gz
new file mode 100644
index 0000000..73381a2
--- /dev/null
+++ b/examples/rlwrap-0.30.tar.gz
Binary files differ
diff --git a/funmap.c b/funmap.c
new file mode 100644
index 0000000..8b1cb40
--- /dev/null
+++ b/funmap.c
@@ -0,0 +1,273 @@
+/* funmap.c -- attach names to functions. */
+
+/* Copyright (C) 1987-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#if !defined (BUFSIZ)
+#include <stdio.h>
+#endif /* BUFSIZ */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include "rlconf.h"
+#include "readline.h"
+
+#include "xmalloc.h"
+
+#ifdef __STDC__
+typedef int QSFUNC (const void *, const void *);
+#else
+typedef int QSFUNC ();
+#endif
+
+extern int _rl_qsort_string_compare (char **, char **);
+
+FUNMAP **funmap;
+static int funmap_size;
+static int funmap_entry;
+
+/* After initializing the function map, this is the index of the first
+ program specific function. */
+int funmap_program_specific_entry_start;
+
+static const FUNMAP default_funmap[] = {
+ { "abort", rl_abort },
+ { "accept-line", rl_newline },
+ { "arrow-key-prefix", rl_arrow_keys },
+ { "backward-byte", rl_backward_byte },
+ { "backward-char", rl_backward_char },
+ { "backward-delete-char", rl_rubout },
+ { "backward-kill-line", rl_backward_kill_line },
+ { "backward-kill-word", rl_backward_kill_word },
+ { "backward-word", rl_backward_word },
+ { "beginning-of-history", rl_beginning_of_history },
+ { "beginning-of-line", rl_beg_of_line },
+ { "bracketed-paste-begin", rl_bracketed_paste_begin },
+ { "call-last-kbd-macro", rl_call_last_kbd_macro },
+ { "capitalize-word", rl_capitalize_word },
+ { "character-search", rl_char_search },
+ { "character-search-backward", rl_backward_char_search },
+ { "clear-display", rl_clear_display },
+ { "clear-screen", rl_clear_screen },
+ { "complete", rl_complete },
+ { "copy-backward-word", rl_copy_backward_word },
+ { "copy-forward-word", rl_copy_forward_word },
+ { "copy-region-as-kill", rl_copy_region_to_kill },
+ { "delete-char", rl_delete },
+ { "delete-char-or-list", rl_delete_or_show_completions },
+ { "delete-horizontal-space", rl_delete_horizontal_space },
+ { "digit-argument", rl_digit_argument },
+ { "do-lowercase-version", rl_do_lowercase_version },
+ { "downcase-word", rl_downcase_word },
+ { "dump-functions", rl_dump_functions },
+ { "dump-macros", rl_dump_macros },
+ { "dump-variables", rl_dump_variables },
+ { "emacs-editing-mode", rl_emacs_editing_mode },
+ { "end-kbd-macro", rl_end_kbd_macro },
+ { "end-of-history", rl_end_of_history },
+ { "end-of-line", rl_end_of_line },
+ { "exchange-point-and-mark", rl_exchange_point_and_mark },
+ { "fetch-history", rl_fetch_history },
+ { "forward-backward-delete-char", rl_rubout_or_delete },
+ { "forward-byte", rl_forward_byte },
+ { "forward-char", rl_forward_char },
+ { "forward-search-history", rl_forward_search_history },
+ { "forward-word", rl_forward_word },
+ { "history-search-backward", rl_history_search_backward },
+ { "history-search-forward", rl_history_search_forward },
+ { "history-substring-search-backward", rl_history_substr_search_backward },
+ { "history-substring-search-forward", rl_history_substr_search_forward },
+ { "insert-comment", rl_insert_comment },
+ { "insert-completions", rl_insert_completions },
+ { "kill-whole-line", rl_kill_full_line },
+ { "kill-line", rl_kill_line },
+ { "kill-region", rl_kill_region },
+ { "kill-word", rl_kill_word },
+ { "menu-complete", rl_menu_complete },
+ { "menu-complete-backward", rl_backward_menu_complete },
+ { "next-history", rl_get_next_history },
+ { "next-screen-line", rl_next_screen_line },
+ { "non-incremental-forward-search-history", rl_noninc_forward_search },
+ { "non-incremental-reverse-search-history", rl_noninc_reverse_search },
+ { "non-incremental-forward-search-history-again", rl_noninc_forward_search_again },
+ { "non-incremental-reverse-search-history-again", rl_noninc_reverse_search_again },
+ { "old-menu-complete", rl_old_menu_complete },
+ { "operate-and-get-next", rl_operate_and_get_next },
+ { "overwrite-mode", rl_overwrite_mode },
+#if defined (_WIN32)
+ { "paste-from-clipboard", rl_paste_from_clipboard },
+#endif
+ { "possible-completions", rl_possible_completions },
+ { "previous-history", rl_get_previous_history },
+ { "previous-screen-line", rl_previous_screen_line },
+ { "print-last-kbd-macro", rl_print_last_kbd_macro },
+ { "quoted-insert", rl_quoted_insert },
+ { "re-read-init-file", rl_re_read_init_file },
+ { "redraw-current-line", rl_refresh_line},
+ { "reverse-search-history", rl_reverse_search_history },
+ { "revert-line", rl_revert_line },
+ { "self-insert", rl_insert },
+ { "set-mark", rl_set_mark },
+ { "skip-csi-sequence", rl_skip_csi_sequence },
+ { "start-kbd-macro", rl_start_kbd_macro },
+ { "tab-insert", rl_tab_insert },
+ { "tilde-expand", rl_tilde_expand },
+ { "transpose-chars", rl_transpose_chars },
+ { "transpose-words", rl_transpose_words },
+ { "tty-status", rl_tty_status },
+ { "undo", rl_undo_command },
+ { "universal-argument", rl_universal_argument },
+ { "unix-filename-rubout", rl_unix_filename_rubout },
+ { "unix-line-discard", rl_unix_line_discard },
+ { "unix-word-rubout", rl_unix_word_rubout },
+ { "upcase-word", rl_upcase_word },
+ { "yank", rl_yank },
+ { "yank-last-arg", rl_yank_last_arg },
+ { "yank-nth-arg", rl_yank_nth_arg },
+ { "yank-pop", rl_yank_pop },
+
+#if defined (VI_MODE)
+ { "vi-append-eol", rl_vi_append_eol },
+ { "vi-append-mode", rl_vi_append_mode },
+ { "vi-arg-digit", rl_vi_arg_digit },
+ { "vi-back-to-indent", rl_vi_back_to_indent },
+ { "vi-backward-bigword", rl_vi_bWord },
+ { "vi-backward-word", rl_vi_bword },
+ { "vi-bWord", rl_vi_bWord },
+ { "vi-bword", rl_vi_bword }, /* BEWARE: name matching is case insensitive */
+ { "vi-change-case", rl_vi_change_case },
+ { "vi-change-char", rl_vi_change_char },
+ { "vi-change-to", rl_vi_change_to },
+ { "vi-char-search", rl_vi_char_search },
+ { "vi-column", rl_vi_column },
+ { "vi-complete", rl_vi_complete },
+ { "vi-delete", rl_vi_delete },
+ { "vi-delete-to", rl_vi_delete_to },
+ { "vi-eWord", rl_vi_eWord },
+ { "vi-editing-mode", rl_vi_editing_mode },
+ { "vi-end-bigword", rl_vi_eWord },
+ { "vi-end-word", rl_vi_end_word },
+ { "vi-eof-maybe", rl_vi_eof_maybe },
+ { "vi-eword", rl_vi_eword }, /* BEWARE: name matching is case insensitive */
+ { "vi-fWord", rl_vi_fWord },
+ { "vi-fetch-history", rl_vi_fetch_history },
+ { "vi-first-print", rl_vi_first_print },
+ { "vi-forward-bigword", rl_vi_fWord },
+ { "vi-forward-word", rl_vi_fword },
+ { "vi-fword", rl_vi_fword }, /* BEWARE: name matching is case insensitive */
+ { "vi-goto-mark", rl_vi_goto_mark },
+ { "vi-insert-beg", rl_vi_insert_beg },
+ { "vi-insertion-mode", rl_vi_insert_mode },
+ { "vi-match", rl_vi_match },
+ { "vi-movement-mode", rl_vi_movement_mode },
+ { "vi-next-word", rl_vi_next_word },
+ { "vi-overstrike", rl_vi_overstrike },
+ { "vi-overstrike-delete", rl_vi_overstrike_delete },
+ { "vi-prev-word", rl_vi_prev_word },
+ { "vi-put", rl_vi_put },
+ { "vi-redo", rl_vi_redo },
+ { "vi-replace", rl_vi_replace },
+ { "vi-rubout", rl_vi_rubout },
+ { "vi-search", rl_vi_search },
+ { "vi-search-again", rl_vi_search_again },
+ { "vi-set-mark", rl_vi_set_mark },
+ { "vi-subst", rl_vi_subst },
+ { "vi-tilde-expand", rl_vi_tilde_expand },
+ { "vi-undo", rl_vi_undo },
+ { "vi-unix-word-rubout", rl_vi_unix_word_rubout },
+ { "vi-yank-arg", rl_vi_yank_arg },
+ { "vi-yank-pop", rl_vi_yank_pop },
+ { "vi-yank-to", rl_vi_yank_to },
+#endif /* VI_MODE */
+
+ {(char *)NULL, (rl_command_func_t *)NULL }
+};
+
+int
+rl_add_funmap_entry (const char *name, rl_command_func_t *function)
+{
+ if (funmap_entry + 2 >= funmap_size)
+ {
+ funmap_size += 64;
+ funmap = (FUNMAP **)xrealloc (funmap, funmap_size * sizeof (FUNMAP *));
+ }
+
+ funmap[funmap_entry] = (FUNMAP *)xmalloc (sizeof (FUNMAP));
+ funmap[funmap_entry]->name = name;
+ funmap[funmap_entry]->function = function;
+
+ funmap[++funmap_entry] = (FUNMAP *)NULL;
+ return funmap_entry;
+}
+
+static int funmap_initialized;
+
+/* Make the funmap contain all of the default entries. */
+void
+rl_initialize_funmap (void)
+{
+ register int i;
+
+ if (funmap_initialized)
+ return;
+
+ for (i = 0; default_funmap[i].name; i++)
+ rl_add_funmap_entry (default_funmap[i].name, default_funmap[i].function);
+
+ funmap_initialized = 1;
+ funmap_program_specific_entry_start = i;
+}
+
+/* Produce a NULL terminated array of known function names. The array
+ is sorted. The array itself is allocated, but not the strings inside.
+ You should free () the array when you done, but not the pointers. */
+const char **
+rl_funmap_names (void)
+{
+ const char **result;
+ int result_size, result_index;
+
+ /* Make sure that the function map has been initialized. */
+ rl_initialize_funmap ();
+
+ for (result_index = result_size = 0, result = (const char **)NULL; funmap[result_index]; result_index++)
+ {
+ if (result_index + 2 > result_size)
+ {
+ result_size += 20;
+ result = (const char **)xrealloc (result, result_size * sizeof (char *));
+ }
+
+ result[result_index] = funmap[result_index]->name;
+ result[result_index + 1] = (char *)NULL;
+ }
+
+ qsort (result, result_index, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
+ return (result);
+}
diff --git a/histexpand.c b/histexpand.c
new file mode 100644
index 0000000..8ab6809
--- /dev/null
+++ b/histexpand.c
@@ -0,0 +1,1718 @@
+/* histexpand.c -- history expansion. */
+
+/* Copyright (C) 1989-2021 Free Software Foundation, Inc.
+
+ This file contains the GNU History Library (History), a set of
+ routines for managing the text of previously typed lines.
+
+ History 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.
+
+ History 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 History. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+# ifndef _MINIX
+# include <sys/types.h>
+# endif
+# include <unistd.h>
+#endif
+
+#include "rlmbutil.h"
+
+#include "history.h"
+#include "histlib.h"
+#include "chardefs.h"
+
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#define HISTORY_WORD_DELIMITERS " \t\n;&()|<>"
+#define HISTORY_QUOTE_CHARACTERS "\"'`"
+#define HISTORY_EVENT_DELIMITERS "^$*%-"
+
+#define slashify_in_quotes "\\`\"$"
+
+#define fielddelim(c) (whitespace(c) || (c) == '\n')
+
+typedef int _hist_search_func_t (const char *, int);
+
+static char error_pointer;
+
+static char *subst_lhs;
+static char *subst_rhs;
+static int subst_lhs_len;
+static int subst_rhs_len;
+
+/* Characters that delimit history event specifications and separate event
+ specifications from word designators. Static for now */
+static char *history_event_delimiter_chars = HISTORY_EVENT_DELIMITERS;
+
+static char *get_history_word_specifier (char *, char *, int *);
+static int history_tokenize_word (const char *, int);
+static char **history_tokenize_internal (const char *, int, int *);
+static char *history_substring (const char *, int, int);
+static void freewords (char **, int);
+static char *history_find_word (char *, int);
+
+static char *quote_breaks (char *);
+
+/* Variables exported by this file. */
+/* The character that represents the start of a history expansion
+ request. This is usually `!'. */
+char history_expansion_char = '!';
+
+/* The character that invokes word substitution if found at the start of
+ a line. This is usually `^'. */
+char history_subst_char = '^';
+
+/* During tokenization, if this character is seen as the first character
+ of a word, then it, and all subsequent characters up to a newline are
+ ignored. For a Bourne shell, this should be '#'. Bash special cases
+ the interactive comment character to not be a comment delimiter. */
+char history_comment_char = '\0';
+
+/* The list of characters which inhibit the expansion of text if found
+ immediately following history_expansion_char. */
+char *history_no_expand_chars = " \t\n\r=";
+
+/* If set to a non-zero value, single quotes inhibit history expansion.
+ The default is 0. */
+int history_quotes_inhibit_expansion = 0;
+
+/* Used to split words by history_tokenize_internal. */
+char *history_word_delimiters = HISTORY_WORD_DELIMITERS;
+
+/* If set, this points to a function that is called to verify that a
+ particular history expansion should be performed. */
+rl_linebuf_func_t *history_inhibit_expansion_function;
+
+int history_quoting_state = 0;
+
+/* **************************************************************** */
+/* */
+/* History Expansion */
+/* */
+/* **************************************************************** */
+
+/* Hairy history expansion on text, not tokens. This is of general
+ use, and thus belongs in this library. */
+
+/* The last string searched for by a !?string? search. */
+static char *search_string;
+/* The last string matched by a !?string? search. */
+static char *search_match;
+
+/* Return the event specified at TEXT + OFFSET modifying OFFSET to
+ point to after the event specifier. Just a pointer to the history
+ line is returned; NULL is returned in the event of a bad specifier.
+ You pass STRING with *INDEX equal to the history_expansion_char that
+ begins this specification.
+ DELIMITING_QUOTE is a character that is allowed to end the string
+ specification for what to search for in addition to the normal
+ characters `:', ` ', `\t', `\n', and sometimes `?'.
+ So you might call this function like:
+ line = get_history_event ("!echo:p", &index, 0); */
+char *
+get_history_event (const char *string, int *caller_index, int delimiting_quote)
+{
+ register int i;
+ register char c;
+ HIST_ENTRY *entry;
+ int which, sign, local_index, substring_okay;
+ _hist_search_func_t *search_func;
+ char *temp;
+
+ /* The event can be specified in a number of ways.
+
+ !! the previous command
+ !n command line N
+ !-n current command-line minus N
+ !str the most recent command starting with STR
+ !?str[?]
+ the most recent command containing STR
+
+ All values N are determined via HISTORY_BASE. */
+
+ i = *caller_index;
+
+ if (string[i] != history_expansion_char)
+ return ((char *)NULL);
+
+ /* Move on to the specification. */
+ i++;
+
+ sign = 1;
+ substring_okay = 0;
+
+#define RETURN_ENTRY(e, w) \
+ return ((e = history_get (w)) ? e->line : (char *)NULL)
+
+ /* Handle !! case. */
+ if (string[i] == history_expansion_char)
+ {
+ i++;
+ which = history_base + (history_length - 1);
+ *caller_index = i;
+ RETURN_ENTRY (entry, which);
+ }
+
+ /* Hack case of numeric line specification. */
+ if (string[i] == '-' && _rl_digit_p (string[i+1]))
+ {
+ sign = -1;
+ i++;
+ }
+
+ if (_rl_digit_p (string[i]))
+ {
+ /* Get the extent of the digits and compute the value. */
+ for (which = 0; _rl_digit_p (string[i]); i++)
+ which = (which * 10) + _rl_digit_value (string[i]);
+
+ *caller_index = i;
+
+ if (sign < 0)
+ which = (history_length + history_base) - which;
+
+ RETURN_ENTRY (entry, which);
+ }
+
+ /* This must be something to search for. If the spec begins with
+ a '?', then the string may be anywhere on the line. Otherwise,
+ the string must be found at the start of a line. */
+ if (string[i] == '?')
+ {
+ substring_okay++;
+ i++;
+ }
+
+ /* Only a closing `?' or a newline delimit a substring search string. */
+ for (local_index = i; c = string[i]; i++)
+ {
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ int v;
+ mbstate_t ps;
+
+ memset (&ps, 0, sizeof (mbstate_t));
+ /* These produce warnings because we're passing a const string to a
+ function that takes a non-const string. */
+ _rl_adjust_point ((char *)string, i, &ps);
+ if ((v = _rl_get_char_len ((char *)string + i, &ps)) > 1)
+ {
+ i += v - 1;
+ continue;
+ }
+ }
+
+#endif /* HANDLE_MULTIBYTE */
+ if ((!substring_okay &&
+ (whitespace (c) || c == ':' ||
+ (i > local_index && history_event_delimiter_chars && c == '-') ||
+ (c != '-' && history_event_delimiter_chars && member (c, history_event_delimiter_chars)) ||
+ (history_search_delimiter_chars && member (c, history_search_delimiter_chars)) ||
+ string[i] == delimiting_quote)) ||
+ string[i] == '\n' ||
+ (substring_okay && string[i] == '?'))
+ break;
+ }
+
+ which = i - local_index;
+ temp = (char *)xmalloc (1 + which);
+ if (which)
+ strncpy (temp, string + local_index, which);
+ temp[which] = '\0';
+
+ if (substring_okay && string[i] == '?')
+ i++;
+
+ *caller_index = i;
+
+#define FAIL_SEARCH() \
+ do { \
+ history_offset = history_length; xfree (temp) ; return (char *)NULL; \
+ } while (0)
+
+ /* If there is no search string, try to use the previous search string,
+ if one exists. If not, fail immediately. */
+ if (*temp == '\0' && substring_okay)
+ {
+ if (search_string)
+ {
+ xfree (temp);
+ temp = savestring (search_string);
+ }
+ else
+ FAIL_SEARCH ();
+ }
+
+ search_func = substring_okay ? history_search : history_search_prefix;
+ while (1)
+ {
+ local_index = (*search_func) (temp, -1);
+
+ if (local_index < 0)
+ FAIL_SEARCH ();
+
+ if (local_index == 0 || substring_okay)
+ {
+ entry = current_history ();
+ if (entry == 0)
+ FAIL_SEARCH ();
+ history_offset = history_length;
+
+ /* If this was a substring search, then remember the
+ string that we matched for word substitution. */
+ if (substring_okay)
+ {
+ FREE (search_string);
+ search_string = temp;
+
+ FREE (search_match);
+ search_match = history_find_word (entry->line, local_index);
+ }
+ else
+ xfree (temp);
+
+ return (entry->line);
+ }
+
+ if (history_offset)
+ history_offset--;
+ else
+ FAIL_SEARCH ();
+ }
+#undef FAIL_SEARCH
+#undef RETURN_ENTRY
+}
+
+/* Function for extracting single-quoted strings. Used for inhibiting
+ history expansion within single quotes. */
+
+/* Extract the contents of STRING as if it is enclosed in single quotes.
+ SINDEX, when passed in, is the offset of the character immediately
+ following the opening single quote; on exit, SINDEX is left pointing
+ to the closing single quote. FLAGS currently used to allow backslash
+ to escape a single quote (e.g., for bash $'...'). */
+static void
+hist_string_extract_single_quoted (char *string, int *sindex, int flags)
+{
+ register int i;
+
+ for (i = *sindex; string[i] && string[i] != '\''; i++)
+ {
+ if ((flags & 1) && string[i] == '\\' && string[i+1])
+ i++;
+ }
+
+ *sindex = i;
+}
+
+static char *
+quote_breaks (char *s)
+{
+ register char *p, *r;
+ char *ret;
+ int len = 3;
+
+ for (p = s; p && *p; p++, len++)
+ {
+ if (*p == '\'')
+ len += 3;
+ else if (whitespace (*p) || *p == '\n')
+ len += 2;
+ }
+
+ r = ret = (char *)xmalloc (len);
+ *r++ = '\'';
+ for (p = s; p && *p; )
+ {
+ if (*p == '\'')
+ {
+ *r++ = '\'';
+ *r++ = '\\';
+ *r++ = '\'';
+ *r++ = '\'';
+ p++;
+ }
+ else if (whitespace (*p) || *p == '\n')
+ {
+ *r++ = '\'';
+ *r++ = *p++;
+ *r++ = '\'';
+ }
+ else
+ *r++ = *p++;
+ }
+ *r++ = '\'';
+ *r = '\0';
+ return ret;
+}
+
+static char *
+hist_error(char *s, int start, int current, int errtype)
+{
+ char *temp;
+ const char *emsg;
+ int ll, elen;
+
+ ll = current - start;
+
+ switch (errtype)
+ {
+ case EVENT_NOT_FOUND:
+ emsg = "event not found";
+ elen = 15;
+ break;
+ case BAD_WORD_SPEC:
+ emsg = "bad word specifier";
+ elen = 18;
+ break;
+ case SUBST_FAILED:
+ emsg = "substitution failed";
+ elen = 19;
+ break;
+ case BAD_MODIFIER:
+ emsg = "unrecognized history modifier";
+ elen = 29;
+ break;
+ case NO_PREV_SUBST:
+ emsg = "no previous substitution";
+ elen = 24;
+ break;
+ default:
+ emsg = "unknown expansion error";
+ elen = 23;
+ break;
+ }
+
+ temp = (char *)xmalloc (ll + elen + 3);
+ if (s[start])
+ strncpy (temp, s + start, ll);
+ else
+ ll = 0;
+ temp[ll] = ':';
+ temp[ll + 1] = ' ';
+ strcpy (temp + ll + 2, emsg);
+ return (temp);
+}
+
+/* Get a history substitution string from STR starting at *IPTR
+ and return it. The length is returned in LENPTR.
+
+ A backslash can quote the delimiter. If the string is the
+ empty string, the previous pattern is used. If there is
+ no previous pattern for the lhs, the last history search
+ string is used.
+
+ If IS_RHS is 1, we ignore empty strings and set the pattern
+ to "" anyway. subst_lhs is not changed if the lhs is empty;
+ subst_rhs is allowed to be set to the empty string. */
+
+static char *
+get_subst_pattern (char *str, int *iptr, int delimiter, int is_rhs, int *lenptr)
+{
+ register int si, i, j, k;
+ char *s;
+#if defined (HANDLE_MULTIBYTE)
+ mbstate_t ps;
+#endif
+
+ s = (char *)NULL;
+ i = *iptr;
+
+#if defined (HANDLE_MULTIBYTE)
+ memset (&ps, 0, sizeof (mbstate_t));
+ _rl_adjust_point (str, i, &ps);
+#endif
+
+ for (si = i; str[si] && str[si] != delimiter; si++)
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ int v;
+ if ((v = _rl_get_char_len (str + si, &ps)) > 1)
+ si += v - 1;
+ else if (str[si] == '\\' && str[si + 1] == delimiter)
+ si++;
+ }
+ else
+#endif /* HANDLE_MULTIBYTE */
+ if (str[si] == '\\' && str[si + 1] == delimiter)
+ si++;
+
+ if (si > i || is_rhs)
+ {
+ s = (char *)xmalloc (si - i + 1);
+ for (j = 0, k = i; k < si; j++, k++)
+ {
+ /* Remove a backslash quoting the search string delimiter. */
+ if (str[k] == '\\' && str[k + 1] == delimiter)
+ k++;
+ s[j] = str[k];
+ }
+ s[j] = '\0';
+ if (lenptr)
+ *lenptr = j;
+ }
+
+ i = si;
+ if (str[i])
+ i++;
+ *iptr = i;
+
+ return s;
+}
+
+static void
+postproc_subst_rhs (void)
+{
+ char *new;
+ int i, j, new_size;
+
+ new = (char *)xmalloc (new_size = subst_rhs_len + subst_lhs_len);
+ for (i = j = 0; i < subst_rhs_len; i++)
+ {
+ if (subst_rhs[i] == '&')
+ {
+ if (j + subst_lhs_len >= new_size)
+ new = (char *)xrealloc (new, (new_size = new_size * 2 + subst_lhs_len));
+ strcpy (new + j, subst_lhs);
+ j += subst_lhs_len;
+ }
+ else
+ {
+ /* a single backslash protects the `&' from lhs interpolation */
+ if (subst_rhs[i] == '\\' && subst_rhs[i + 1] == '&')
+ i++;
+ if (j >= new_size)
+ new = (char *)xrealloc (new, new_size *= 2);
+ new[j++] = subst_rhs[i];
+ }
+ }
+ new[j] = '\0';
+ xfree (subst_rhs);
+ subst_rhs = new;
+ subst_rhs_len = j;
+}
+
+/* Expand the bulk of a history specifier starting at STRING[START].
+ Returns 0 if everything is OK, -1 if an error occurred, and 1
+ if the `p' modifier was supplied and the caller should just print
+ the returned string. Returns the new index into string in
+ *END_INDEX_PTR, and the expanded specifier in *RET_STRING. */
+/* need current line for !# */
+static int
+history_expand_internal (char *string, int start, int qc, int *end_index_ptr, char **ret_string, char *current_line)
+{
+ int i, n, starting_index;
+ int substitute_globally, subst_bywords, want_quotes, print_only;
+ char *event, *temp, *result, *tstr, *t, c, *word_spec;
+ int result_len;
+#if defined (HANDLE_MULTIBYTE)
+ mbstate_t ps;
+
+ memset (&ps, 0, sizeof (mbstate_t));
+#endif
+
+ result = (char *)xmalloc (result_len = 128);
+
+ i = start;
+
+ /* If it is followed by something that starts a word specifier,
+ then !! is implied as the event specifier. */
+
+ if (member (string[i + 1], ":$*%^"))
+ {
+ char fake_s[3];
+ int fake_i = 0;
+ i++;
+ fake_s[0] = fake_s[1] = history_expansion_char;
+ fake_s[2] = '\0';
+ event = get_history_event (fake_s, &fake_i, 0);
+ }
+ else if (string[i + 1] == '#')
+ {
+ i += 2;
+ event = current_line;
+ }
+ else
+ event = get_history_event (string, &i, qc);
+
+ if (event == 0)
+ {
+ *ret_string = hist_error (string, start, i, EVENT_NOT_FOUND);
+ xfree (result);
+ return (-1);
+ }
+
+ /* If a word specifier is found, then do what that requires. */
+ starting_index = i;
+ word_spec = get_history_word_specifier (string, event, &i);
+
+ /* There is no such thing as a `malformed word specifier'. However,
+ it is possible for a specifier that has no match. In that case,
+ we complain. */
+ if (word_spec == (char *)&error_pointer)
+ {
+ *ret_string = hist_error (string, starting_index, i, BAD_WORD_SPEC);
+ xfree (result);
+ return (-1);
+ }
+
+ /* If no word specifier, than the thing of interest was the event. */
+ temp = word_spec ? savestring (word_spec) : savestring (event);
+ FREE (word_spec);
+
+ /* Perhaps there are other modifiers involved. Do what they say. */
+ want_quotes = substitute_globally = subst_bywords = print_only = 0;
+ starting_index = i;
+
+ while (string[i] == ':')
+ {
+ c = string[i + 1];
+
+ if (c == 'g' || c == 'a')
+ {
+ substitute_globally = 1;
+ i++;
+ c = string[i + 1];
+ }
+ else if (c == 'G')
+ {
+ subst_bywords = 1;
+ i++;
+ c = string[i + 1];
+ }
+
+ switch (c)
+ {
+ default:
+ *ret_string = hist_error (string, i+1, i+2, BAD_MODIFIER);
+ xfree (result);
+ xfree (temp);
+ return -1;
+
+ case 'q':
+ want_quotes = 'q';
+ break;
+
+ case 'x':
+ want_quotes = 'x';
+ break;
+
+ /* :p means make this the last executed line. So we
+ return an error state after adding this line to the
+ history. */
+ case 'p':
+ print_only = 1;
+ break;
+
+ /* :t discards all but the last part of the pathname. */
+ case 't':
+ tstr = strrchr (temp, '/');
+ if (tstr)
+ {
+ tstr++;
+ t = savestring (tstr);
+ xfree (temp);
+ temp = t;
+ }
+ break;
+
+ /* :h discards the last part of a pathname. */
+ case 'h':
+ tstr = strrchr (temp, '/');
+ if (tstr)
+ *tstr = '\0';
+ break;
+
+ /* :r discards the suffix. */
+ case 'r':
+ tstr = strrchr (temp, '.');
+ if (tstr)
+ *tstr = '\0';
+ break;
+
+ /* :e discards everything but the suffix. */
+ case 'e':
+ tstr = strrchr (temp, '.');
+ if (tstr)
+ {
+ t = savestring (tstr);
+ xfree (temp);
+ temp = t;
+ }
+ break;
+
+ /* :s/this/that substitutes `that' for the first
+ occurrence of `this'. :gs/this/that substitutes `that'
+ for each occurrence of `this'. :& repeats the last
+ substitution. :g& repeats the last substitution
+ globally. */
+
+ case '&':
+ case 's':
+ {
+ char *new_event;
+ int delimiter, failed, si, l_temp, ws, we;
+
+ if (c == 's')
+ {
+ if (i + 2 < (int)strlen (string))
+ {
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ _rl_adjust_point (string, i + 2, &ps);
+ if (_rl_get_char_len (string + i + 2, &ps) > 1)
+ delimiter = 0;
+ else
+ delimiter = string[i + 2];
+ }
+ else
+#endif /* HANDLE_MULTIBYTE */
+ delimiter = string[i + 2];
+ }
+ else
+ break; /* no search delimiter */
+
+ i += 3;
+
+ t = get_subst_pattern (string, &i, delimiter, 0, &subst_lhs_len);
+ /* An empty substitution lhs with no previous substitution
+ uses the last search string as the lhs. */
+ if (t)
+ {
+ FREE (subst_lhs);
+ subst_lhs = t;
+ }
+ else if (!subst_lhs)
+ {
+ if (search_string && *search_string)
+ {
+ subst_lhs = savestring (search_string);
+ subst_lhs_len = strlen (subst_lhs);
+ }
+ else
+ {
+ subst_lhs = (char *) NULL;
+ subst_lhs_len = 0;
+ }
+ }
+
+ FREE (subst_rhs);
+ subst_rhs = get_subst_pattern (string, &i, delimiter, 1, &subst_rhs_len);
+
+ /* If `&' appears in the rhs, it's supposed to be replaced
+ with the lhs. */
+ if (member ('&', subst_rhs))
+ postproc_subst_rhs ();
+ }
+ else
+ i += 2;
+
+ /* If there is no lhs, the substitution can't succeed. */
+ if (subst_lhs_len == 0)
+ {
+ *ret_string = hist_error (string, starting_index, i, NO_PREV_SUBST);
+ xfree (result);
+ xfree (temp);
+ return -1;
+ }
+
+ l_temp = strlen (temp);
+ /* Ignore impossible cases. */
+ if (subst_lhs_len > l_temp)
+ {
+ *ret_string = hist_error (string, starting_index, i, SUBST_FAILED);
+ xfree (result);
+ xfree (temp);
+ return (-1);
+ }
+
+ /* Find the first occurrence of THIS in TEMP. */
+ /* Substitute SUBST_RHS for SUBST_LHS in TEMP. There are three
+ cases to consider:
+
+ 1. substitute_globally == subst_bywords == 0
+ 2. substitute_globally == 1 && subst_bywords == 0
+ 3. substitute_globally == 0 && subst_bywords == 1
+
+ In the first case, we substitute for the first occurrence only.
+ In the second case, we substitute for every occurrence.
+ In the third case, we tokenize into words and substitute the
+ first occurrence of each word. */
+
+ si = we = 0;
+ for (failed = 1; (si + subst_lhs_len) <= l_temp; si++)
+ {
+ /* First skip whitespace and find word boundaries if
+ we're past the end of the word boundary we found
+ the last time. */
+ if (subst_bywords && si > we)
+ {
+ for (; temp[si] && fielddelim (temp[si]); si++)
+ ;
+ ws = si;
+ we = history_tokenize_word (temp, si);
+ }
+
+ if (STREQN (temp+si, subst_lhs, subst_lhs_len))
+ {
+ int len = subst_rhs_len - subst_lhs_len + l_temp;
+ new_event = (char *)xmalloc (1 + len);
+ strncpy (new_event, temp, si);
+ strncpy (new_event + si, subst_rhs, subst_rhs_len);
+ strncpy (new_event + si + subst_rhs_len,
+ temp + si + subst_lhs_len,
+ l_temp - (si + subst_lhs_len));
+ new_event[len] = '\0';
+ xfree (temp);
+ temp = new_event;
+
+ failed = 0;
+
+ if (substitute_globally)
+ {
+ /* Reported to fix a bug that causes it to skip every
+ other match when matching a single character. Was
+ si += subst_rhs_len previously. */
+ si += subst_rhs_len - 1;
+ l_temp = strlen (temp);
+ substitute_globally++;
+ continue;
+ }
+ else if (subst_bywords)
+ {
+ si = we;
+ l_temp = strlen (temp);
+ continue;
+ }
+ else
+ break;
+ }
+ }
+
+ if (substitute_globally > 1)
+ {
+ substitute_globally = 0;
+ continue; /* don't want to increment i */
+ }
+
+ if (failed == 0)
+ continue; /* don't want to increment i */
+
+ *ret_string = hist_error (string, starting_index, i, SUBST_FAILED);
+ xfree (result);
+ xfree (temp);
+ return (-1);
+ }
+ }
+ i += 2;
+ }
+ /* Done with modifiers. */
+ /* Believe it or not, we have to back the pointer up by one. */
+ --i;
+
+ if (want_quotes)
+ {
+ char *x;
+
+ if (want_quotes == 'q')
+ x = sh_single_quote (temp);
+ else if (want_quotes == 'x')
+ x = quote_breaks (temp);
+ else
+ x = savestring (temp);
+
+ xfree (temp);
+ temp = x;
+ }
+
+ n = strlen (temp);
+ if (n >= result_len)
+ result = (char *)xrealloc (result, n + 2);
+ strcpy (result, temp);
+ xfree (temp);
+
+ *end_index_ptr = i;
+ *ret_string = result;
+ return (print_only);
+}
+
+/* Expand the string STRING, placing the result into OUTPUT, a pointer
+ to a string. Returns:
+
+ -1) If there was an error in expansion.
+ 0) If no expansions took place (or, if the only change in
+ the text was the de-slashifying of the history expansion
+ character)
+ 1) If expansions did take place
+ 2) If the `p' modifier was given and the caller should print the result
+
+ If an error occurred in expansion, then OUTPUT contains a descriptive
+ error message. */
+
+#define ADD_STRING(s) \
+ do \
+ { \
+ int sl = strlen (s); \
+ j += sl; \
+ if (j >= result_len) \
+ { \
+ while (j >= result_len) \
+ result_len += 128; \
+ result = (char *)xrealloc (result, result_len); \
+ } \
+ strcpy (result + j - sl, s); \
+ } \
+ while (0)
+
+#define ADD_CHAR(c) \
+ do \
+ { \
+ if (j >= result_len - 1) \
+ result = (char *)xrealloc (result, result_len += 64); \
+ result[j++] = c; \
+ result[j] = '\0'; \
+ } \
+ while (0)
+
+int
+history_expand (char *hstring, char **output)
+{
+ register int j;
+ int i, r, l, passc, cc, modified, eindex, only_printing, dquote, squote, flag;
+ char *string;
+
+ /* The output string, and its length. */
+ int result_len;
+ char *result;
+
+#if defined (HANDLE_MULTIBYTE)
+ char mb[MB_LEN_MAX];
+ mbstate_t ps;
+#endif
+
+ /* Used when adding the string. */
+ char *temp;
+
+ if (output == 0)
+ return 0;
+
+ /* Setting the history expansion character to 0 inhibits all
+ history expansion. */
+ if (history_expansion_char == 0)
+ {
+ *output = savestring (hstring);
+ return (0);
+ }
+
+ /* Prepare the buffer for printing error messages. */
+ result = (char *)xmalloc (result_len = 256);
+ result[0] = '\0';
+
+ only_printing = modified = 0;
+ l = strlen (hstring);
+
+ /* Grovel the string. Only backslash and single quotes can quote the
+ history escape character. We also handle arg specifiers. */
+
+ /* Before we grovel forever, see if the history_expansion_char appears
+ anywhere within the text. */
+
+ /* The quick substitution character is a history expansion all right. That
+ is to say, "^this^that^" is equivalent to "!!:s^this^that^", and in fact,
+ that is the substitution that we do. */
+ if (hstring[0] == history_subst_char)
+ {
+ string = (char *)xmalloc (l + 5);
+
+ string[0] = string[1] = history_expansion_char;
+ string[2] = ':';
+ string[3] = 's';
+ strcpy (string + 4, hstring);
+ l += 4;
+ }
+ else
+ {
+#if defined (HANDLE_MULTIBYTE)
+ memset (&ps, 0, sizeof (mbstate_t));
+#endif
+
+ string = hstring;
+ /* If not quick substitution, still maybe have to do expansion. */
+
+ /* `!' followed by one of the characters in history_no_expand_chars
+ is NOT an expansion. */
+ dquote = history_quoting_state == '"';
+ squote = history_quoting_state == '\'';
+
+ /* If the calling application tells us we are already reading a
+ single-quoted string, consume the rest of the string right now
+ and then go on. */
+ i = 0;
+ if (squote && history_quotes_inhibit_expansion)
+ {
+ hist_string_extract_single_quoted (string, &i, 0);
+ squote = 0;
+ if (string[i])
+ i++;
+ }
+
+ for ( ; string[i]; i++)
+ {
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ int v;
+ v = _rl_get_char_len (string + i, &ps);
+ if (v > 1)
+ {
+ i += v - 1;
+ continue;
+ }
+ }
+#endif /* HANDLE_MULTIBYTE */
+
+ cc = string[i + 1];
+ /* The history_comment_char, if set, appearing at the beginning
+ of a word signifies that the rest of the line should not have
+ history expansion performed on it.
+ Skip the rest of the line and break out of the loop. */
+ if (history_comment_char && string[i] == history_comment_char &&
+ dquote == 0 &&
+ (i == 0 || member (string[i - 1], history_word_delimiters)))
+ {
+ while (string[i])
+ i++;
+ break;
+ }
+ else if (string[i] == history_expansion_char)
+ {
+ if (cc == 0 || member (cc, history_no_expand_chars))
+ continue;
+ /* DQUOTE won't be set unless history_quotes_inhibit_expansion
+ is set. The idea here is to treat double-quoted strings the
+ same as the word outside double quotes; in effect making the
+ double quote part of history_no_expand_chars when DQUOTE is
+ set. */
+ else if (dquote && cc == '"')
+ continue;
+ /* If the calling application has set
+ history_inhibit_expansion_function to a function that checks
+ for special cases that should not be history expanded,
+ call the function and skip the expansion if it returns a
+ non-zero value. */
+ else if (history_inhibit_expansion_function &&
+ (*history_inhibit_expansion_function) (string, i))
+ continue;
+ else
+ break;
+ }
+ /* Shell-like quoting: allow backslashes to quote double quotes
+ inside a double-quoted string. */
+ else if (dquote && string[i] == '\\' && cc == '"')
+ i++;
+ /* More shell-like quoting: if we're paying attention to single
+ quotes and letting them quote the history expansion character,
+ then we need to pay attention to double quotes, because single
+ quotes are not special inside double-quoted strings. */
+ else if (history_quotes_inhibit_expansion && string[i] == '"')
+ {
+ dquote = 1 - dquote;
+ }
+ else if (dquote == 0 && history_quotes_inhibit_expansion && string[i] == '\'')
+ {
+ /* If this is bash, single quotes inhibit history expansion. */
+ flag = (i > 0 && string[i - 1] == '$');
+ i++;
+ hist_string_extract_single_quoted (string, &i, flag);
+ }
+ else if (history_quotes_inhibit_expansion && string[i] == '\\')
+ {
+ /* If this is bash, allow backslashes to quote single
+ quotes and the history expansion character. */
+ if (cc == '\'' || cc == history_expansion_char)
+ i++;
+ }
+
+ }
+
+ if (string[i] != history_expansion_char)
+ {
+ xfree (result);
+ *output = savestring (string);
+ return (0);
+ }
+ }
+
+ /* Extract and perform the substitution. */
+ dquote = history_quoting_state == '"';
+ squote = history_quoting_state == '\'';
+
+ /* If the calling application tells us we are already reading a
+ single-quoted string, consume the rest of the string right now
+ and then go on. */
+ i = j = 0;
+ if (squote && history_quotes_inhibit_expansion)
+ {
+ int c;
+
+ hist_string_extract_single_quoted (string, &i, 0);
+ squote = 0;
+ for (c = 0; c < i; c++)
+ ADD_CHAR (string[c]);
+ if (string[i])
+ {
+ ADD_CHAR (string[i]);
+ i++;
+ }
+ }
+
+ for (passc = 0; i < l; i++)
+ {
+ int qc, tchar = string[i];
+
+ if (passc)
+ {
+ passc = 0;
+ ADD_CHAR (tchar);
+ continue;
+ }
+
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ int k, c;
+
+ c = tchar;
+ memset (mb, 0, sizeof (mb));
+ for (k = 0; k < MB_LEN_MAX; k++)
+ {
+ mb[k] = (char)c;
+ memset (&ps, 0, sizeof (mbstate_t));
+ if (_rl_get_char_len (mb, &ps) == -2)
+ c = string[++i];
+ else
+ break;
+ }
+ if (strlen (mb) > 1)
+ {
+ ADD_STRING (mb);
+ continue;
+ }
+ }
+#endif /* HANDLE_MULTIBYTE */
+
+ if (tchar == history_expansion_char)
+ tchar = -3;
+ else if (tchar == history_comment_char)
+ tchar = -2;
+
+ switch (tchar)
+ {
+ default:
+ ADD_CHAR (string[i]);
+ break;
+
+ case '\\':
+ passc++;
+ ADD_CHAR (tchar);
+ break;
+
+ case '"':
+ dquote = 1 - dquote;
+ ADD_CHAR (tchar);
+ break;
+
+ case '\'':
+ {
+ /* If history_quotes_inhibit_expansion is set, single quotes
+ inhibit history expansion, otherwise they are treated like
+ double quotes. */
+ if (squote)
+ {
+ squote = 0;
+ ADD_CHAR (tchar);
+ }
+ else if (dquote == 0 && history_quotes_inhibit_expansion)
+ {
+ int quote, slen;
+
+ flag = (i > 0 && string[i - 1] == '$');
+ quote = i++;
+ hist_string_extract_single_quoted (string, &i, flag);
+
+ slen = i - quote + 2;
+ temp = (char *)xmalloc (slen);
+ strncpy (temp, string + quote, slen);
+ temp[slen - 1] = '\0';
+ ADD_STRING (temp);
+ xfree (temp);
+ }
+ else if (dquote == 0 && squote == 0 && history_quotes_inhibit_expansion == 0)
+ {
+ squote = 1;
+ ADD_CHAR (string[i]);
+ }
+ else
+ ADD_CHAR (string[i]);
+ break;
+ }
+
+ case -2: /* history_comment_char */
+ if ((dquote == 0 || history_quotes_inhibit_expansion == 0) &&
+ (i == 0 || member (string[i - 1], history_word_delimiters)))
+ {
+ temp = (char *)xmalloc (l - i + 1);
+ strcpy (temp, string + i);
+ ADD_STRING (temp);
+ xfree (temp);
+ i = l;
+ }
+ else
+ ADD_CHAR (string[i]);
+ break;
+
+ case -3: /* history_expansion_char */
+ cc = string[i + 1];
+
+ /* If the history_expansion_char is followed by one of the
+ characters in history_no_expand_chars, then it is not a
+ candidate for expansion of any kind. */
+ if (cc == 0 || member (cc, history_no_expand_chars) ||
+ (dquote && cc == '"'))
+ {
+ ADD_CHAR (string[i]);
+ break;
+ }
+
+ /* If the application has defined a function to determine whether
+ or not a history expansion should be performed, call it here. */
+ /* We check against what we've expanded so far, with the current
+ expansion appended, because that seems to be what csh does. We
+ decide to expand based on what we have to this point, not what
+ we started with. */
+ if (history_inhibit_expansion_function)
+ {
+ int save_j, temp;
+
+ save_j = j;
+ ADD_CHAR (string[i]);
+ ADD_CHAR (cc);
+
+ temp = (*history_inhibit_expansion_function) (result, save_j);
+ if (temp)
+ {
+ result[--j] = '\0'; /* `unadd' cc, leaving ADD_CHAR(string[i]) */
+ break;
+ }
+ else
+ result[j = save_j] = '\0';
+ }
+
+#if defined (NO_BANG_HASH_MODIFIERS)
+ /* There is something that is listed as a `word specifier' in csh
+ documentation which means `the expanded text to this point'.
+ That is not a word specifier, it is an event specifier. If we
+ don't want to allow modifiers with `!#', just stick the current
+ output line in again. */
+ if (cc == '#')
+ {
+ if (result)
+ {
+ temp = (char *)xmalloc (1 + strlen (result));
+ strcpy (temp, result);
+ ADD_STRING (temp);
+ xfree (temp);
+ }
+ i++;
+ break;
+ }
+#endif
+ qc = squote ? '\'' : (dquote ? '"' : 0);
+ r = history_expand_internal (string, i, qc, &eindex, &temp, result);
+ if (r < 0)
+ {
+ *output = temp;
+ xfree (result);
+ if (string != hstring)
+ xfree (string);
+ return -1;
+ }
+ else
+ {
+ if (temp)
+ {
+ modified++;
+ if (*temp)
+ ADD_STRING (temp);
+ xfree (temp);
+ }
+ only_printing += r == 1;
+ i = eindex;
+ }
+ break;
+ }
+ }
+
+ *output = result;
+ if (string != hstring)
+ xfree (string);
+
+ if (only_printing)
+ {
+#if 0
+ add_history (result);
+#endif
+ return (2);
+ }
+
+ return (modified != 0);
+}
+
+/* Return a consed string which is the word specified in SPEC, and found
+ in FROM. NULL is returned if there is no spec. The address of
+ ERROR_POINTER is returned if the word specified cannot be found.
+ CALLER_INDEX is the offset in SPEC to start looking; it is updated
+ to point to just after the last character parsed. */
+static char *
+get_history_word_specifier (char *spec, char *from, int *caller_index)
+{
+ register int i = *caller_index;
+ int first, last;
+ int expecting_word_spec = 0;
+ char *result;
+
+ /* The range of words to return doesn't exist yet. */
+ first = last = 0;
+ result = (char *)NULL;
+
+ /* If we found a colon, then this *must* be a word specification. If
+ it isn't, then it is an error. */
+ if (spec[i] == ':')
+ {
+ i++;
+ expecting_word_spec++;
+ }
+
+ /* Handle special cases first. */
+
+ /* `%' is the word last searched for. */
+ if (spec[i] == '%')
+ {
+ *caller_index = i + 1;
+ return (search_match ? savestring (search_match) : savestring (""));
+ }
+
+ /* `*' matches all of the arguments, but not the command. */
+ if (spec[i] == '*')
+ {
+ *caller_index = i + 1;
+ result = history_arg_extract (1, '$', from);
+ return (result ? result : savestring (""));
+ }
+
+ /* `$' is last arg. */
+ if (spec[i] == '$')
+ {
+ *caller_index = i + 1;
+ return (history_arg_extract ('$', '$', from));
+ }
+
+ /* Try to get FIRST and LAST figured out. */
+
+ if (spec[i] == '-')
+ first = 0;
+ else if (spec[i] == '^')
+ {
+ first = 1;
+ i++;
+ }
+ else if (_rl_digit_p (spec[i]) && expecting_word_spec)
+ {
+ for (first = 0; _rl_digit_p (spec[i]); i++)
+ first = (first * 10) + _rl_digit_value (spec[i]);
+ }
+ else
+ return ((char *)NULL); /* no valid `first' for word specifier */
+
+ if (spec[i] == '^' || spec[i] == '*')
+ {
+ last = (spec[i] == '^') ? 1 : '$'; /* x* abbreviates x-$ */
+ i++;
+ }
+ else if (spec[i] != '-')
+ last = first;
+ else
+ {
+ i++;
+
+ if (_rl_digit_p (spec[i]))
+ {
+ for (last = 0; _rl_digit_p (spec[i]); i++)
+ last = (last * 10) + _rl_digit_value (spec[i]);
+ }
+ else if (spec[i] == '$')
+ {
+ i++;
+ last = '$';
+ }
+ else if (spec[i] == '^')
+ {
+ i++;
+ last = 1;
+ }
+#if 0
+ else if (!spec[i] || spec[i] == ':')
+ /* check against `:' because there could be a modifier separator */
+#else
+ else
+ /* csh seems to allow anything to terminate the word spec here,
+ leaving it as an abbreviation. */
+#endif
+ last = -1; /* x- abbreviates x-$ omitting word `$' */
+ }
+
+ *caller_index = i;
+
+ if (last >= first || last == '$' || last < 0)
+ result = history_arg_extract (first, last, from);
+
+ return (result ? result : (char *)&error_pointer);
+}
+
+/* Extract the args specified, starting at FIRST, and ending at LAST.
+ The args are taken from STRING. If either FIRST or LAST is < 0,
+ then make that arg count from the right (subtract from the number of
+ tokens, so that FIRST = -1 means the next to last token on the line).
+ If LAST is `$' the last arg from STRING is used. */
+char *
+history_arg_extract (int first, int last, const char *string)
+{
+ register int i, len;
+ char *result;
+ int size, offset;
+ char **list;
+
+ /* XXX - think about making history_tokenize return a struct array,
+ each struct in array being a string and a length to avoid the
+ calls to strlen below. */
+ if ((list = history_tokenize (string)) == NULL)
+ return ((char *)NULL);
+
+ for (len = 0; list[len]; len++)
+ ;
+
+ if (last < 0)
+ last = len + last - 1;
+
+ if (first < 0)
+ first = len + first - 1;
+
+ if (last == '$')
+ last = len - 1;
+
+ if (first == '$')
+ first = len - 1;
+
+ last++;
+
+ if (first >= len || last > len || first < 0 || last < 0 || first > last)
+ result = ((char *)NULL);
+ else
+ {
+ for (size = 0, i = first; i < last; i++)
+ size += strlen (list[i]) + 1;
+ result = (char *)xmalloc (size + 1);
+ result[0] = '\0';
+
+ for (i = first, offset = 0; i < last; i++)
+ {
+ strcpy (result + offset, list[i]);
+ offset += strlen (list[i]);
+ if (i + 1 < last)
+ {
+ result[offset++] = ' ';
+ result[offset] = 0;
+ }
+ }
+ }
+
+ for (i = 0; i < len; i++)
+ xfree (list[i]);
+ xfree (list);
+
+ return (result);
+}
+
+static int
+history_tokenize_word (const char *string, int ind)
+{
+ register int i, j;
+ int delimiter, nestdelim, delimopen;
+
+ i = ind;
+ delimiter = nestdelim = 0;
+
+ if (member (string[i], "()\n")) /* XXX - included \n, but why? been here forever */
+ {
+ i++;
+ return i;
+ }
+
+ if (ISDIGIT (string[i]))
+ {
+ j = i;
+ while (string[j] && ISDIGIT (string[j]))
+ j++;
+ if (string[j] == 0)
+ return (j);
+ if (string[j] == '<' || string[j] == '>')
+ i = j; /* digit sequence is a file descriptor */
+ else
+ {
+ i = j;
+ goto get_word; /* digit sequence is part of a word */
+ }
+ }
+
+ if (member (string[i], "<>;&|"))
+ {
+ int peek = string[i + 1];
+
+ if (peek == string[i])
+ {
+ if (peek == '<' && string[i + 2] == '-')
+ i++;
+ else if (peek == '<' && string[i + 2] == '<')
+ i++;
+ i += 2;
+ return i;
+ }
+ else if (peek == '&' && (string[i] == '>' || string[i] == '<'))
+ {
+ j = i + 2;
+ while (string[j] && ISDIGIT (string[j])) /* file descriptor */
+ j++;
+ if (string[j] =='-') /* <&[digits]-, >&[digits]- */
+ j++;
+ return j;
+ }
+ else if ((peek == '>' && string[i] == '&') || (peek == '|' && string[i] == '>'))
+ {
+ i += 2;
+ return i;
+ }
+ /* XXX - process substitution -- separated out for later -- bash-4.2 */
+ else if (peek == '(' && (string[i] == '>' || string[i] == '<')) /*)*/
+ {
+ i += 2;
+ delimopen = '(';
+ delimiter = ')';
+ nestdelim = 1;
+ goto get_word;
+ }
+
+ i++;
+ return i;
+ }
+
+get_word:
+ /* Get word from string + i; */
+
+ if (delimiter == 0 && member (string[i], HISTORY_QUOTE_CHARACTERS))
+ delimiter = string[i++];
+
+ for (; string[i]; i++)
+ {
+ if (string[i] == '\\' && string[i + 1] == '\n')
+ {
+ i++;
+ continue;
+ }
+
+ if (string[i] == '\\' && delimiter != '\'' &&
+ (delimiter != '"' || member (string[i], slashify_in_quotes)))
+ {
+ i++;
+ continue;
+ }
+
+ /* delimiter must be set and set to something other than a quote if
+ nestdelim is set, so these tests are safe. */
+ if (nestdelim && string[i] == delimopen)
+ {
+ nestdelim++;
+ continue;
+ }
+ if (nestdelim && string[i] == delimiter)
+ {
+ nestdelim--;
+ if (nestdelim == 0)
+ delimiter = 0;
+ continue;
+ }
+
+ if (delimiter && string[i] == delimiter)
+ {
+ delimiter = 0;
+ continue;
+ }
+
+ /* Command and process substitution; shell extended globbing patterns */
+ if (nestdelim == 0 && delimiter == 0 && member (string[i], "<>$!@?+*") && string[i+1] == '(') /*)*/
+ {
+ i += 2;
+ delimopen = '(';
+ delimiter = ')';
+ nestdelim = 1;
+ continue;
+ }
+
+ if (delimiter == 0 && (member (string[i], history_word_delimiters)))
+ break;
+
+ if (delimiter == 0 && member (string[i], HISTORY_QUOTE_CHARACTERS))
+ delimiter = string[i];
+ }
+
+ return i;
+}
+
+static char *
+history_substring (const char *string, int start, int end)
+{
+ register int len;
+ register char *result;
+
+ len = end - start;
+ result = (char *)xmalloc (len + 1);
+ strncpy (result, string + start, len);
+ result[len] = '\0';
+ return result;
+}
+
+/* Parse STRING into tokens and return an array of strings. If WIND is
+ not -1 and INDP is not null, we also want the word surrounding index
+ WIND. The position in the returned array of strings is returned in
+ *INDP. */
+static char **
+history_tokenize_internal (const char *string, int wind, int *indp)
+{
+ char **result;
+ register int i, start, result_index, size;
+
+ /* If we're searching for a string that's not part of a word (e.g., " "),
+ make sure we set *INDP to a reasonable value. */
+ if (indp && wind != -1)
+ *indp = -1;
+
+ /* Get a token, and stuff it into RESULT. The tokens are split
+ exactly where the shell would split them. */
+ for (i = result_index = size = 0, result = (char **)NULL; string[i]; )
+ {
+ /* Skip leading whitespace. */
+ for (; string[i] && fielddelim (string[i]); i++)
+ ;
+ if (string[i] == 0 || string[i] == history_comment_char)
+ return (result);
+
+ start = i;
+
+ i = history_tokenize_word (string, start);
+
+ /* If we have a non-whitespace delimiter character (which would not be
+ skipped by the loop above), use it and any adjacent delimiters to
+ make a separate field. Any adjacent white space will be skipped the
+ next time through the loop. */
+ if (i == start && history_word_delimiters)
+ {
+ i++;
+ while (string[i] && member (string[i], history_word_delimiters))
+ i++;
+ }
+
+ /* If we are looking for the word in which the character at a
+ particular index falls, remember it. */
+ if (indp && wind != -1 && wind >= start && wind < i)
+ *indp = result_index;
+
+ if (result_index + 2 >= size)
+ result = (char **)xrealloc (result, ((size += 10) * sizeof (char *)));
+
+ result[result_index++] = history_substring (string, start, i);
+ result[result_index] = (char *)NULL;
+ }
+
+ return (result);
+}
+
+/* Return an array of tokens, much as the shell might. The tokens are
+ parsed out of STRING. */
+char **
+history_tokenize (const char *string)
+{
+ return (history_tokenize_internal (string, -1, (int *)NULL));
+}
+
+/* Free members of WORDS from START to an empty string */
+static void
+freewords (char **words, int start)
+{
+ register int i;
+
+ for (i = start; words[i]; i++)
+ xfree (words[i]);
+}
+
+/* Find and return the word which contains the character at index IND
+ in the history line LINE. Used to save the word matched by the
+ last history !?string? search. */
+static char *
+history_find_word (char *line, int ind)
+{
+ char **words, *s;
+ int i, wind;
+
+ words = history_tokenize_internal (line, ind, &wind);
+ if (wind == -1 || words == 0)
+ {
+ if (words)
+ freewords (words, 0);
+ FREE (words);
+ return ((char *)NULL);
+ }
+ s = words[wind];
+ for (i = 0; i < wind; i++)
+ xfree (words[i]);
+ freewords (words, wind + 1);
+ xfree (words);
+ return s;
+}
diff --git a/histfile.c b/histfile.c
new file mode 100644
index 0000000..3bfec55
--- /dev/null
+++ b/histfile.c
@@ -0,0 +1,833 @@
+/* histfile.c - functions to manipulate the history file. */
+
+/* Copyright (C) 1989-2019 Free Software Foundation, Inc.
+
+ This file contains the GNU History Library (History), a set of
+ routines for managing the text of previously typed lines.
+
+ History 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.
+
+ History 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 History. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* The goal is to make the implementation transparent, so that you
+ don't have to know what data types are used, just what functions
+ you can call. I think I have done that. */
+
+#define READLINE_LIBRARY
+
+#if defined (__TANDEM)
+# define _XOPEN_SOURCE_EXTENDED 1
+# include <unistd.h>
+# include <floss.h>
+#endif
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if defined (HAVE_LIMITS_H)
+# include <limits.h>
+#endif
+
+#include <sys/types.h>
+#if ! defined (_MINIX) && defined (HAVE_SYS_FILE_H)
+# include <sys/file.h>
+#endif
+#include "posixstat.h"
+#include <fcntl.h>
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
+
+#include <ctype.h>
+
+#if defined (__EMX__)
+# undef HAVE_MMAP
+#endif
+
+#ifdef HISTORY_USE_MMAP
+# include <sys/mman.h>
+
+# ifdef MAP_FILE
+# define MAP_RFLAGS (MAP_FILE|MAP_PRIVATE)
+# define MAP_WFLAGS (MAP_FILE|MAP_SHARED)
+# else
+# define MAP_RFLAGS MAP_PRIVATE
+# define MAP_WFLAGS MAP_SHARED
+# endif
+
+# ifndef MAP_FAILED
+# define MAP_FAILED ((void *)-1)
+# endif
+
+#endif /* HISTORY_USE_MMAP */
+
+#if defined(_WIN32)
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+/* If we're compiling for __EMX__ (OS/2) or __CYGWIN__ (cygwin32 environment
+ on win 95/98/nt), we want to open files with O_BINARY mode so that there
+ is no \n -> \r\n conversion performed. On other systems, we don't want to
+ mess around with O_BINARY at all, so we ensure that it's defined to 0. */
+#if defined (__EMX__) || defined (__CYGWIN__)
+# ifndef O_BINARY
+# define O_BINARY 0
+# endif
+#else /* !__EMX__ && !__CYGWIN__ */
+# undef O_BINARY
+# define O_BINARY 0
+#endif /* !__EMX__ && !__CYGWIN__ */
+
+#include <errno.h>
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+#include "history.h"
+#include "histlib.h"
+
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#if !defined (PATH_MAX)
+# define PATH_MAX 1024 /* default */
+#endif
+
+/* history file version; currently unused */
+int history_file_version = 1;
+
+/* If non-zero, we write timestamps to the history file in history_do_write() */
+int history_write_timestamps = 0;
+
+/* If non-zero, we assume that a history file that starts with a timestamp
+ uses timestamp-delimited entries and can include multi-line history
+ entries. Used by read_history_range */
+int history_multiline_entries = 0;
+
+/* Immediately after a call to read_history() or read_history_range(), this
+ will return the number of lines just read from the history file in that
+ call. */
+int history_lines_read_from_file = 0;
+
+/* Immediately after a call to write_history() or history_do_write(), this
+ will return the number of lines just written to the history file in that
+ call. This also works with history_truncate_file. */
+int history_lines_written_to_file = 0;
+
+/* Does S look like the beginning of a history timestamp entry? Placeholder
+ for more extensive tests. */
+#define HIST_TIMESTAMP_START(s) (*(s) == history_comment_char && isdigit ((unsigned char)(s)[1]) )
+
+static char *history_backupfile (const char *);
+static char *history_tempfile (const char *);
+static int histfile_backup (const char *, const char *);
+static int histfile_restore (const char *, const char *);
+static int history_rename (const char *, const char *);
+
+/* Return the string that should be used in the place of this
+ filename. This only matters when you don't specify the
+ filename to read_history (), or write_history (). */
+static char *
+history_filename (const char *filename)
+{
+ char *return_val;
+ const char *home;
+ int home_len;
+
+ return_val = filename ? savestring (filename) : (char *)NULL;
+
+ if (return_val)
+ return (return_val);
+
+ home = sh_get_env_value ("HOME");
+#if defined (_WIN32)
+ if (home == 0)
+ home = sh_get_env_value ("APPDATA");
+#endif
+
+ if (home == 0)
+ return (NULL);
+ else
+ home_len = strlen (home);
+
+ return_val = (char *)xmalloc (2 + home_len + 8); /* strlen(".history") == 8 */
+ strcpy (return_val, home);
+ return_val[home_len] = '/';
+#if defined (__MSDOS__)
+ strcpy (return_val + home_len + 1, "_history");
+#else
+ strcpy (return_val + home_len + 1, ".history");
+#endif
+
+ return (return_val);
+}
+
+static char *
+history_backupfile (const char *filename)
+{
+ const char *fn;
+ char *ret, linkbuf[PATH_MAX+1];
+ size_t len;
+ ssize_t n;
+ struct stat fs;
+
+ fn = filename;
+#if defined (HAVE_READLINK)
+ /* Follow symlink to avoid backing up symlink itself; call will fail if
+ not a symlink */
+ if ((n = readlink (filename, linkbuf, sizeof (linkbuf) - 1)) > 0)
+ {
+ linkbuf[n] = '\0';
+ fn = linkbuf;
+ }
+#endif
+
+ len = strlen (fn);
+ ret = xmalloc (len + 2);
+ strcpy (ret, fn);
+ ret[len] = '-';
+ ret[len+1] = '\0';
+ return ret;
+}
+
+static char *
+history_tempfile (const char *filename)
+{
+ const char *fn;
+ char *ret, linkbuf[PATH_MAX+1];
+ size_t len;
+ ssize_t n;
+ struct stat fs;
+ int pid;
+
+ fn = filename;
+#if defined (HAVE_READLINK)
+ /* Follow symlink so tempfile created in the same directory as any symlinked
+ history file; call will fail if not a symlink */
+ if ((n = readlink (filename, linkbuf, sizeof (linkbuf) - 1)) > 0)
+ {
+ linkbuf[n] = '\0';
+ fn = linkbuf;
+ }
+#endif
+
+ len = strlen (fn);
+ ret = xmalloc (len + 11);
+ strcpy (ret, fn);
+
+ pid = (int)getpid ();
+
+ /* filename-PID.tmp */
+ ret[len] = '-';
+ ret[len+1] = (pid / 10000 % 10) + '0';
+ ret[len+2] = (pid / 1000 % 10) + '0';
+ ret[len+3] = (pid / 100 % 10) + '0';
+ ret[len+4] = (pid / 10 % 10) + '0';
+ ret[len+5] = (pid % 10) + '0';
+ strcpy (ret + len + 6, ".tmp");
+
+ return ret;
+}
+
+/* Add the contents of FILENAME to the history list, a line at a time.
+ If FILENAME is NULL, then read from ~/.history. Returns 0 if
+ successful, or errno if not. */
+int
+read_history (const char *filename)
+{
+ return (read_history_range (filename, 0, -1));
+}
+
+/* Read a range of lines from FILENAME, adding them to the history list.
+ Start reading at the FROM'th line and end at the TO'th. If FROM
+ is zero, start at the beginning. If TO is less than FROM, read
+ until the end of the file. If FILENAME is NULL, then read from
+ ~/.history. Returns 0 if successful, or errno if not. */
+int
+read_history_range (const char *filename, int from, int to)
+{
+ register char *line_start, *line_end, *p;
+ char *input, *buffer, *bufend, *last_ts;
+ int file, current_line, chars_read, has_timestamps, reset_comment_char;
+ struct stat finfo;
+ size_t file_size;
+#if defined (EFBIG)
+ int overflow_errno = EFBIG;
+#elif defined (EOVERFLOW)
+ int overflow_errno = EOVERFLOW;
+#else
+ int overflow_errno = EIO;
+#endif
+
+ history_lines_read_from_file = 0;
+
+ buffer = last_ts = (char *)NULL;
+ input = history_filename (filename);
+ file = input ? open (input, O_RDONLY|O_BINARY, 0666) : -1;
+
+ if ((file < 0) || (fstat (file, &finfo) == -1))
+ goto error_and_exit;
+
+ if (S_ISREG (finfo.st_mode) == 0)
+ {
+#ifdef EFTYPE
+ errno = EFTYPE;
+#else
+ errno = EINVAL;
+#endif
+ goto error_and_exit;
+ }
+
+ file_size = (size_t)finfo.st_size;
+
+ /* check for overflow on very large files */
+ if (file_size != finfo.st_size || file_size + 1 < file_size)
+ {
+ errno = overflow_errno;
+ goto error_and_exit;
+ }
+
+ if (file_size == 0)
+ {
+ xfree (input);
+ close (file);
+ return 0; /* don't waste time if we don't have to */
+ }
+
+#ifdef HISTORY_USE_MMAP
+ /* We map read/write and private so we can change newlines to NULs without
+ affecting the underlying object. */
+ buffer = (char *)mmap (0, file_size, PROT_READ|PROT_WRITE, MAP_RFLAGS, file, 0);
+ if ((void *)buffer == MAP_FAILED)
+ {
+ errno = overflow_errno;
+ goto error_and_exit;
+ }
+ chars_read = file_size;
+#else
+ buffer = (char *)malloc (file_size + 1);
+ if (buffer == 0)
+ {
+ errno = overflow_errno;
+ goto error_and_exit;
+ }
+
+ chars_read = read (file, buffer, file_size);
+#endif
+ if (chars_read < 0)
+ {
+ error_and_exit:
+ if (errno != 0)
+ chars_read = errno;
+ else
+ chars_read = EIO;
+ if (file >= 0)
+ close (file);
+
+ FREE (input);
+#ifndef HISTORY_USE_MMAP
+ FREE (buffer);
+#endif
+
+ return (chars_read);
+ }
+
+ close (file);
+
+ /* Set TO to larger than end of file if negative. */
+ if (to < 0)
+ to = chars_read;
+
+ /* Start at beginning of file, work to end. */
+ bufend = buffer + chars_read;
+ *bufend = '\0'; /* null-terminate buffer for timestamp checks */
+ current_line = 0;
+
+ /* Heuristic: the history comment character rarely changes, so assume we
+ have timestamps if the buffer starts with `#[:digit:]' and temporarily
+ set history_comment_char so timestamp parsing works right */
+ reset_comment_char = 0;
+ if (history_comment_char == '\0' && buffer[0] == '#' && isdigit ((unsigned char)buffer[1]))
+ {
+ history_comment_char = '#';
+ reset_comment_char = 1;
+ }
+
+ has_timestamps = HIST_TIMESTAMP_START (buffer);
+ history_multiline_entries += has_timestamps && history_write_timestamps;
+
+ /* Skip lines until we are at FROM. */
+ if (has_timestamps)
+ last_ts = buffer;
+ for (line_start = line_end = buffer; line_end < bufend && current_line < from; line_end++)
+ if (*line_end == '\n')
+ {
+ p = line_end + 1;
+ /* If we see something we think is a timestamp, continue with this
+ line. We should check more extensively here... */
+ if (HIST_TIMESTAMP_START(p) == 0)
+ current_line++;
+ else
+ last_ts = p;
+ line_start = p;
+ /* If we are at the last line (current_line == from) but we have
+ timestamps (has_timestamps), then line_start points to the
+ text of the last command, and we need to skip to its end. */
+ if (current_line >= from && has_timestamps)
+ {
+ for (line_end = p; line_end < bufend && *line_end != '\n'; line_end++)
+ ;
+ line_start = (*line_end == '\n') ? line_end + 1 : line_end;
+ }
+ }
+
+ /* If there are lines left to gobble, then gobble them now. */
+ for (line_end = line_start; line_end < bufend; line_end++)
+ if (*line_end == '\n')
+ {
+ /* Change to allow Windows-like \r\n end of line delimiter. */
+ if (line_end > line_start && line_end[-1] == '\r')
+ line_end[-1] = '\0';
+ else
+ *line_end = '\0';
+
+ if (*line_start)
+ {
+ if (HIST_TIMESTAMP_START(line_start) == 0)
+ {
+ if (last_ts == NULL && history_length > 0 && history_multiline_entries)
+ _hs_append_history_line (history_length - 1, line_start);
+ else
+ add_history (line_start);
+ if (last_ts)
+ {
+ add_history_time (last_ts);
+ last_ts = NULL;
+ }
+ }
+ else
+ {
+ last_ts = line_start;
+ current_line--;
+ }
+ }
+
+ current_line++;
+
+ if (current_line >= to)
+ break;
+
+ line_start = line_end + 1;
+ }
+
+ history_lines_read_from_file = current_line;
+ if (reset_comment_char)
+ history_comment_char = '\0';
+
+ FREE (input);
+#ifndef HISTORY_USE_MMAP
+ FREE (buffer);
+#else
+ munmap (buffer, file_size);
+#endif
+
+ return (0);
+}
+
+/* We need a special version for WIN32 because Windows rename() refuses to
+ overwrite an existing file. */
+static int
+history_rename (const char *old, const char *new)
+{
+#if defined (_WIN32)
+ return (MoveFileEx (old, new, MOVEFILE_REPLACE_EXISTING) == 0 ? -1 : 0);
+#else
+ return (rename (old, new));
+#endif
+}
+
+/* Save FILENAME to BACK, handling case where FILENAME is a symlink
+ (e.g., ~/.bash_history -> .histfiles/.bash_history.$HOSTNAME) */
+static int
+histfile_backup (const char *filename, const char *back)
+{
+#if defined (HAVE_READLINK)
+ char linkbuf[PATH_MAX+1];
+ ssize_t n;
+
+ /* Follow to target of symlink to avoid renaming symlink itself */
+ if ((n = readlink (filename, linkbuf, sizeof (linkbuf) - 1)) > 0)
+ {
+ linkbuf[n] = '\0';
+ return (history_rename (linkbuf, back));
+ }
+#endif
+ return (history_rename (filename, back));
+}
+
+/* Restore ORIG from BACKUP handling case where ORIG is a symlink
+ (e.g., ~/.bash_history -> .histfiles/.bash_history.$HOSTNAME) */
+static int
+histfile_restore (const char *backup, const char *orig)
+{
+#if defined (HAVE_READLINK)
+ char linkbuf[PATH_MAX+1];
+ ssize_t n;
+
+ /* Follow to target of symlink to avoid renaming symlink itself */
+ if ((n = readlink (orig, linkbuf, sizeof (linkbuf) - 1)) > 0)
+ {
+ linkbuf[n] = '\0';
+ return (history_rename (backup, linkbuf));
+ }
+#endif
+ return (history_rename (backup, orig));
+}
+
+/* Should we call chown, based on whether finfo and nfinfo describe different
+ files with different owners? */
+
+#define SHOULD_CHOWN(finfo, nfinfo) \
+ (finfo.st_uid != nfinfo.st_uid || finfo.st_gid != nfinfo.st_gid)
+
+/* Truncate the history file FNAME, leaving only LINES trailing lines.
+ If FNAME is NULL, then use ~/.history. Writes a new file and renames
+ it to the original name. Returns 0 on success, errno on failure. */
+int
+history_truncate_file (const char *fname, int lines)
+{
+ char *buffer, *filename, *tempname, *bp, *bp1; /* bp1 == bp+1 */
+ int file, chars_read, rv, orig_lines, exists, r;
+ struct stat finfo, nfinfo;
+ size_t file_size;
+
+ history_lines_written_to_file = 0;
+
+ buffer = (char *)NULL;
+ filename = history_filename (fname);
+ tempname = 0;
+ file = filename ? open (filename, O_RDONLY|O_BINARY, 0666) : -1;
+ rv = exists = 0;
+
+ /* Don't try to truncate non-regular files. */
+ if (file == -1 || fstat (file, &finfo) == -1)
+ {
+ rv = errno;
+ if (file != -1)
+ close (file);
+ goto truncate_exit;
+ }
+ exists = 1;
+
+ nfinfo.st_uid = finfo.st_uid;
+ nfinfo.st_gid = finfo.st_gid;
+
+ if (S_ISREG (finfo.st_mode) == 0)
+ {
+ close (file);
+#ifdef EFTYPE
+ rv = EFTYPE;
+#else
+ rv = EINVAL;
+#endif
+ goto truncate_exit;
+ }
+
+ file_size = (size_t)finfo.st_size;
+
+ /* check for overflow on very large files */
+ if (file_size != finfo.st_size || file_size + 1 < file_size)
+ {
+ close (file);
+#if defined (EFBIG)
+ rv = errno = EFBIG;
+#elif defined (EOVERFLOW)
+ rv = errno = EOVERFLOW;
+#else
+ rv = errno = EINVAL;
+#endif
+ goto truncate_exit;
+ }
+
+ buffer = (char *)malloc (file_size + 1);
+ if (buffer == 0)
+ {
+ rv = errno;
+ close (file);
+ goto truncate_exit;
+ }
+
+ chars_read = read (file, buffer, file_size);
+ close (file);
+
+ if (chars_read <= 0)
+ {
+ rv = (chars_read < 0) ? errno : 0;
+ goto truncate_exit;
+ }
+
+ orig_lines = lines;
+ /* Count backwards from the end of buffer until we have passed
+ LINES lines. bp1 is set funny initially. But since bp[1] can't
+ be a comment character (since it's off the end) and *bp can't be
+ both a newline and the history comment character, it should be OK. */
+ for (bp1 = bp = buffer + chars_read - 1; lines && bp > buffer; bp--)
+ {
+ if (*bp == '\n' && HIST_TIMESTAMP_START(bp1) == 0)
+ lines--;
+ bp1 = bp;
+ }
+
+ /* If this is the first line, then the file contains exactly the
+ number of lines we want to truncate to, so we don't need to do
+ anything. It's the first line if we don't find a newline between
+ the current value of i and 0. Otherwise, write from the start of
+ this line until the end of the buffer. */
+ for ( ; bp > buffer; bp--)
+ {
+ if (*bp == '\n' && HIST_TIMESTAMP_START(bp1) == 0)
+ {
+ bp++;
+ break;
+ }
+ bp1 = bp;
+ }
+
+ /* Write only if there are more lines in the file than we want to
+ truncate to. */
+ if (bp <= buffer)
+ {
+ rv = 0;
+ /* No-op if LINES == 0 at this point */
+ history_lines_written_to_file = orig_lines - lines;
+ goto truncate_exit;
+ }
+
+ tempname = history_tempfile (filename);
+
+ if ((file = open (tempname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0600)) != -1)
+ {
+ if (write (file, bp, chars_read - (bp - buffer)) < 0)
+ rv = errno;
+
+ if (fstat (file, &nfinfo) < 0 && rv == 0)
+ rv = errno;
+
+ if (close (file) < 0 && rv == 0)
+ rv = errno;
+ }
+ else
+ rv = errno;
+
+ truncate_exit:
+ FREE (buffer);
+
+ history_lines_written_to_file = orig_lines - lines;
+
+ if (rv == 0 && filename && tempname)
+ rv = histfile_restore (tempname, filename);
+
+ if (rv != 0)
+ {
+ rv = errno;
+ if (tempname)
+ unlink (tempname);
+ history_lines_written_to_file = 0;
+ }
+
+#if defined (HAVE_CHOWN)
+ /* Make sure the new filename is owned by the same user as the old. If one
+ user is running this, it's a no-op. If the shell is running after sudo
+ with a shared history file, we don't want to leave the history file
+ owned by root. */
+ if (rv == 0 && exists && SHOULD_CHOWN (finfo, nfinfo))
+ r = chown (filename, finfo.st_uid, finfo.st_gid);
+#endif
+
+ xfree (filename);
+ FREE (tempname);
+
+ return rv;
+}
+
+/* Workhorse function for writing history. Writes the last NELEMENT entries
+ from the history list to FILENAME. OVERWRITE is non-zero if you
+ wish to replace FILENAME with the entries. */
+static int
+history_do_write (const char *filename, int nelements, int overwrite)
+{
+ register int i;
+ char *output, *tempname, *histname;
+ int file, mode, rv, exists;
+ struct stat finfo, nfinfo;
+#ifdef HISTORY_USE_MMAP
+ size_t cursize;
+
+ history_lines_written_to_file = 0;
+
+ mode = overwrite ? O_RDWR|O_CREAT|O_TRUNC|O_BINARY : O_RDWR|O_APPEND|O_BINARY;
+#else
+ mode = overwrite ? O_WRONLY|O_CREAT|O_TRUNC|O_BINARY : O_WRONLY|O_APPEND|O_BINARY;
+#endif
+ histname = history_filename (filename);
+ exists = histname ? (stat (histname, &finfo) == 0) : 0;
+
+ tempname = (overwrite && exists && S_ISREG (finfo.st_mode)) ? history_tempfile (histname) : 0;
+ output = tempname ? tempname : histname;
+
+ file = output ? open (output, mode, 0600) : -1;
+ rv = 0;
+
+ if (file == -1)
+ {
+ rv = errno;
+ FREE (histname);
+ FREE (tempname);
+ return (rv);
+ }
+
+#ifdef HISTORY_USE_MMAP
+ cursize = overwrite ? 0 : lseek (file, 0, SEEK_END);
+#endif
+
+ if (nelements > history_length)
+ nelements = history_length;
+
+ /* Build a buffer of all the lines to write, and write them in one syscall.
+ Suggested by Peter Ho (peter@robosts.oxford.ac.uk). */
+ {
+ HIST_ENTRY **the_history; /* local */
+ register int j;
+ int buffer_size;
+ char *buffer;
+
+ the_history = history_list ();
+ /* Calculate the total number of bytes to write. */
+ for (buffer_size = 0, i = history_length - nelements; i < history_length; i++)
+ {
+ if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0])
+ buffer_size += strlen (the_history[i]->timestamp) + 1;
+ buffer_size += strlen (the_history[i]->line) + 1;
+ }
+
+ /* Allocate the buffer, and fill it. */
+#ifdef HISTORY_USE_MMAP
+ if (ftruncate (file, buffer_size+cursize) == -1)
+ goto mmap_error;
+ buffer = (char *)mmap (0, buffer_size, PROT_READ|PROT_WRITE, MAP_WFLAGS, file, cursize);
+ if ((void *)buffer == MAP_FAILED)
+ {
+mmap_error:
+ rv = errno;
+ close (file);
+ if (tempname)
+ unlink (tempname);
+ FREE (histname);
+ FREE (tempname);
+ return rv;
+ }
+#else
+ buffer = (char *)malloc (buffer_size);
+ if (buffer == 0)
+ {
+ rv = errno;
+ close (file);
+ if (tempname)
+ unlink (tempname);
+ FREE (histname);
+ FREE (tempname);
+ return rv;
+ }
+#endif
+
+ for (j = 0, i = history_length - nelements; i < history_length; i++)
+ {
+ if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0])
+ {
+ strcpy (buffer + j, the_history[i]->timestamp);
+ j += strlen (the_history[i]->timestamp);
+ buffer[j++] = '\n';
+ }
+ strcpy (buffer + j, the_history[i]->line);
+ j += strlen (the_history[i]->line);
+ buffer[j++] = '\n';
+ }
+
+#ifdef HISTORY_USE_MMAP
+ if (msync (buffer, buffer_size, MS_ASYNC) != 0 || munmap (buffer, buffer_size) != 0)
+ rv = errno;
+#else
+ if (write (file, buffer, buffer_size) < 0)
+ rv = errno;
+ xfree (buffer);
+#endif
+ }
+
+ history_lines_written_to_file = nelements;
+
+ if (close (file) < 0 && rv == 0)
+ rv = errno;
+
+ if (rv == 0 && histname && tempname)
+ rv = histfile_restore (tempname, histname);
+
+ if (rv != 0)
+ {
+ rv = errno;
+ if (tempname)
+ unlink (tempname);
+ history_lines_written_to_file = 0;
+ }
+
+#if defined (HAVE_CHOWN)
+ /* Make sure the new filename is owned by the same user as the old. If one
+ user is running this, it's a no-op. If the shell is running after sudo
+ with a shared history file, we don't want to leave the history file
+ owned by root. */
+ if (rv == 0 && exists)
+ mode = chown (histname, finfo.st_uid, finfo.st_gid);
+#endif
+
+ FREE (histname);
+ FREE (tempname);
+
+ return (rv);
+}
+
+/* Append NELEMENT entries to FILENAME. The entries appended are from
+ the end of the list minus NELEMENTs up to the end of the list. */
+int
+append_history (int nelements, const char *filename)
+{
+ return (history_do_write (filename, nelements, HISTORY_APPEND));
+}
+
+/* Overwrite FILENAME with the current history. If FILENAME is NULL,
+ then write the history list to ~/.history. Values returned
+ are as in read_history ().*/
+int
+write_history (const char *filename)
+{
+ return (history_do_write (filename, history_length, HISTORY_OVERWRITE));
+}
diff --git a/histlib.h b/histlib.h
new file mode 100644
index 0000000..29fc4d2
--- /dev/null
+++ b/histlib.h
@@ -0,0 +1,92 @@
+/* histlib.h -- internal definitions for the history library. */
+
+/* Copyright (C) 1989-2009,2021-2022 Free Software Foundation, Inc.
+
+ This file contains the GNU History Library (History), a set of
+ routines for managing the text of previously typed lines.
+
+ History 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.
+
+ History 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 History. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_HISTLIB_H_)
+#define _HISTLIB_H_
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#if !defined (STREQ)
+#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0))
+#define STREQN(a, b, n) (((n) == 0) ? (1) \
+ : ((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0))
+#endif
+
+#ifndef savestring
+#define savestring(x) strcpy (xmalloc (1 + strlen (x)), (x))
+#endif
+
+#ifndef whitespace
+#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
+#endif
+
+#ifndef _rl_digit_p
+#define _rl_digit_p(c) ((c) >= '0' && (c) <= '9')
+#endif
+
+#ifndef _rl_digit_value
+#define _rl_digit_value(c) ((c) - '0')
+#endif
+
+#ifndef member
+# if !defined (strchr) && !defined (__STDC__)
+extern char *strchr ();
+# endif /* !strchr && !__STDC__ */
+#define member(c, s) ((c) ? ((char *)strchr ((s), (c)) != (char *)NULL) : 0)
+#endif
+
+#ifndef FREE
+# define FREE(x) if (x) free (x)
+#endif
+
+/* Possible history errors passed to hist_error. */
+#define EVENT_NOT_FOUND 0
+#define BAD_WORD_SPEC 1
+#define SUBST_FAILED 2
+#define BAD_MODIFIER 3
+#define NO_PREV_SUBST 4
+
+/* Possible definitions for history starting point specification. */
+#define NON_ANCHORED_SEARCH 0
+#define ANCHORED_SEARCH 0x01
+#define PATTERN_SEARCH 0x02
+
+/* Possible definitions for what style of writing the history file we want. */
+#define HISTORY_APPEND 0
+#define HISTORY_OVERWRITE 1
+
+/* internal extern function declarations used by other parts of the library */
+
+/* histsearch.c */
+extern int _hs_history_patsearch (const char *, int, int);
+
+/* history.c */
+extern void _hs_replace_history_data (int, histdata_t *, histdata_t *);
+extern int _hs_at_end_of_history (void);
+
+/* histfile.c */
+extern void _hs_append_history_line (int, const char *);
+
+#endif /* !_HISTLIB_H_ */
diff --git a/history.c b/history.c
new file mode 100644
index 0000000..81d4c16
--- /dev/null
+++ b/history.c
@@ -0,0 +1,614 @@
+/* history.c -- standalone history library */
+
+/* Copyright (C) 1989-2021 Free Software Foundation, Inc.
+
+ This file contains the GNU History Library (History), a set of
+ routines for managing the text of previously typed lines.
+
+ History 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.
+
+ History 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 History. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* The goal is to make the implementation transparent, so that you
+ don't have to know what data types are used, just what functions
+ you can call. I think I have done that. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+# ifdef _MINIX
+# include <sys/types.h>
+# endif
+# include <unistd.h>
+#endif
+
+#include <errno.h>
+
+#include "history.h"
+#include "histlib.h"
+
+#include "xmalloc.h"
+
+#if !defined (errno)
+extern int errno;
+#endif
+
+/* How big to make the_history when we first allocate it. */
+#define DEFAULT_HISTORY_INITIAL_SIZE 502
+
+#define MAX_HISTORY_INITIAL_SIZE 8192
+
+/* The number of slots to increase the_history by. */
+#define DEFAULT_HISTORY_GROW_SIZE 50
+
+static char *hist_inittime (void);
+
+/* **************************************************************** */
+/* */
+/* History Functions */
+/* */
+/* **************************************************************** */
+
+/* An array of HIST_ENTRY. This is where we store the history. */
+static HIST_ENTRY **the_history = (HIST_ENTRY **)NULL;
+
+/* Non-zero means that we have enforced a limit on the amount of
+ history that we save. */
+static int history_stifled;
+
+/* The current number of slots allocated to the input_history. */
+static int history_size;
+
+/* If HISTORY_STIFLED is non-zero, then this is the maximum number of
+ entries to remember. */
+int history_max_entries;
+int max_input_history; /* backwards compatibility */
+
+/* The current location of the interactive history pointer. Just makes
+ life easier for outside callers. */
+int history_offset;
+
+/* The number of strings currently stored in the history list. */
+int history_length;
+
+/* The logical `base' of the history array. It defaults to 1. */
+int history_base = 1;
+
+/* Return the current HISTORY_STATE of the history. */
+HISTORY_STATE *
+history_get_history_state (void)
+{
+ HISTORY_STATE *state;
+
+ state = (HISTORY_STATE *)xmalloc (sizeof (HISTORY_STATE));
+ state->entries = the_history;
+ state->offset = history_offset;
+ state->length = history_length;
+ state->size = history_size;
+ state->flags = 0;
+ if (history_stifled)
+ state->flags |= HS_STIFLED;
+
+ return (state);
+}
+
+/* Set the state of the current history array to STATE. */
+void
+history_set_history_state (HISTORY_STATE *state)
+{
+ the_history = state->entries;
+ history_offset = state->offset;
+ history_length = state->length;
+ history_size = state->size;
+ if (state->flags & HS_STIFLED)
+ history_stifled = 1;
+}
+
+/* Begin a session in which the history functions might be used. This
+ initializes interactive variables. */
+void
+using_history (void)
+{
+ history_offset = history_length;
+}
+
+/* Return the number of bytes that the primary history entries are using.
+ This just adds up the lengths of the_history->lines and the associated
+ timestamps. */
+int
+history_total_bytes (void)
+{
+ register int i, result;
+
+ for (i = result = 0; the_history && the_history[i]; i++)
+ result += HISTENT_BYTES (the_history[i]);
+
+ return (result);
+}
+
+/* Returns the magic number which says what history element we are
+ looking at now. In this implementation, it returns history_offset. */
+int
+where_history (void)
+{
+ return (history_offset);
+}
+
+/* Make the current history item be the one at POS, an absolute index.
+ Returns zero if POS is out of range, else non-zero. */
+int
+history_set_pos (int pos)
+{
+ if (pos > history_length || pos < 0 || !the_history)
+ return (0);
+ history_offset = pos;
+ return (1);
+}
+
+/* Are we currently at the end of the history list? */
+int
+_hs_at_end_of_history (void)
+{
+ return (the_history == 0 || history_offset == history_length);
+}
+
+/* Return the current history array. The caller has to be careful, since this
+ is the actual array of data, and could be bashed or made corrupt easily.
+ The array is terminated with a NULL pointer. */
+HIST_ENTRY **
+history_list (void)
+{
+ return (the_history);
+}
+
+/* Return the history entry at the current position, as determined by
+ history_offset. If there is no entry there, return a NULL pointer. */
+HIST_ENTRY *
+current_history (void)
+{
+ return ((history_offset == history_length) || the_history == 0)
+ ? (HIST_ENTRY *)NULL
+ : the_history[history_offset];
+}
+
+/* Back up history_offset to the previous history entry, and return
+ a pointer to that entry. If there is no previous entry then return
+ a NULL pointer. */
+HIST_ENTRY *
+previous_history (void)
+{
+ return history_offset ? the_history[--history_offset] : (HIST_ENTRY *)NULL;
+}
+
+/* Move history_offset forward to the next history entry, and return
+ a pointer to that entry. If there is no next entry then return a
+ NULL pointer. */
+HIST_ENTRY *
+next_history (void)
+{
+ return (history_offset == history_length) ? (HIST_ENTRY *)NULL : the_history[++history_offset];
+}
+
+/* Return the history entry which is logically at OFFSET in the history array.
+ OFFSET is relative to history_base. */
+HIST_ENTRY *
+history_get (int offset)
+{
+ int local_index;
+
+ local_index = offset - history_base;
+ return (local_index >= history_length || local_index < 0 || the_history == 0)
+ ? (HIST_ENTRY *)NULL
+ : the_history[local_index];
+}
+
+HIST_ENTRY *
+alloc_history_entry (char *string, char *ts)
+{
+ HIST_ENTRY *temp;
+
+ temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
+
+ temp->line = string ? savestring (string) : string;
+ temp->data = (char *)NULL;
+ temp->timestamp = ts;
+
+ return temp;
+}
+
+time_t
+history_get_time (HIST_ENTRY *hist)
+{
+ char *ts;
+ time_t t;
+
+ if (hist == 0 || hist->timestamp == 0)
+ return 0;
+ ts = hist->timestamp;
+ if (ts[0] != history_comment_char)
+ return 0;
+ errno = 0;
+ t = (time_t) strtol (ts + 1, (char **)NULL, 10); /* XXX - should use strtol() here */
+ if (errno == ERANGE)
+ return (time_t)0;
+ return t;
+}
+
+static char *
+hist_inittime (void)
+{
+ time_t t;
+ char ts[64], *ret;
+
+ t = (time_t) time ((time_t *)0);
+#if defined (HAVE_VSNPRINTF) /* assume snprintf if vsnprintf exists */
+ snprintf (ts, sizeof (ts) - 1, "X%lu", (unsigned long) t);
+#else
+ sprintf (ts, "X%lu", (unsigned long) t);
+#endif
+ ret = savestring (ts);
+ ret[0] = history_comment_char;
+
+ return ret;
+}
+
+/* Place STRING at the end of the history list. The data field
+ is set to NULL. */
+void
+add_history (const char *string)
+{
+ HIST_ENTRY *temp;
+ int new_length;
+
+ if (history_stifled && (history_length == history_max_entries))
+ {
+ register int i;
+
+ /* If the history is stifled, and history_length is zero,
+ and it equals history_max_entries, we don't save items. */
+ if (history_length == 0)
+ return;
+
+ /* If there is something in the slot, then remove it. */
+ if (the_history[0])
+ (void) free_history_entry (the_history[0]);
+
+ /* Copy the rest of the entries, moving down one slot. Copy includes
+ trailing NULL. */
+ memmove (the_history, the_history + 1, history_length * sizeof (HIST_ENTRY *));
+
+ new_length = history_length;
+ history_base++;
+ }
+ else
+ {
+ if (history_size == 0)
+ {
+ if (history_stifled && history_max_entries > 0)
+ history_size = (history_max_entries > MAX_HISTORY_INITIAL_SIZE)
+ ? MAX_HISTORY_INITIAL_SIZE
+ : history_max_entries + 2;
+ else
+ history_size = DEFAULT_HISTORY_INITIAL_SIZE;
+ the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *));
+ new_length = 1;
+ }
+ else
+ {
+ if (history_length == (history_size - 1))
+ {
+ history_size += DEFAULT_HISTORY_GROW_SIZE;
+ the_history = (HIST_ENTRY **)
+ xrealloc (the_history, history_size * sizeof (HIST_ENTRY *));
+ }
+ new_length = history_length + 1;
+ }
+ }
+
+ temp = alloc_history_entry ((char *)string, hist_inittime ());
+
+ the_history[new_length] = (HIST_ENTRY *)NULL;
+ the_history[new_length - 1] = temp;
+ history_length = new_length;
+}
+
+/* Change the time stamp of the most recent history entry to STRING. */
+void
+add_history_time (const char *string)
+{
+ HIST_ENTRY *hs;
+
+ if (string == 0 || history_length < 1)
+ return;
+ hs = the_history[history_length - 1];
+ FREE (hs->timestamp);
+ hs->timestamp = savestring (string);
+}
+
+/* Free HIST and return the data so the calling application can free it
+ if necessary and desired. */
+histdata_t
+free_history_entry (HIST_ENTRY *hist)
+{
+ histdata_t x;
+
+ if (hist == 0)
+ return ((histdata_t) 0);
+ FREE (hist->line);
+ FREE (hist->timestamp);
+ x = hist->data;
+ xfree (hist);
+ return (x);
+}
+
+HIST_ENTRY *
+copy_history_entry (HIST_ENTRY *hist)
+{
+ HIST_ENTRY *ret;
+ char *ts;
+
+ if (hist == 0)
+ return hist;
+
+ ret = alloc_history_entry (hist->line, (char *)NULL);
+
+ ts = hist->timestamp ? savestring (hist->timestamp) : hist->timestamp;
+ ret->timestamp = ts;
+
+ ret->data = hist->data;
+
+ return ret;
+}
+
+/* Make the history entry at WHICH have LINE and DATA. This returns
+ the old entry so you can dispose of the data. In the case of an
+ invalid WHICH, a NULL pointer is returned. */
+HIST_ENTRY *
+replace_history_entry (int which, const char *line, histdata_t data)
+{
+ HIST_ENTRY *temp, *old_value;
+
+ if (which < 0 || which >= history_length)
+ return ((HIST_ENTRY *)NULL);
+
+ temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
+ old_value = the_history[which];
+
+ temp->line = savestring (line);
+ temp->data = data;
+ temp->timestamp = old_value->timestamp ? savestring (old_value->timestamp) : 0;
+ the_history[which] = temp;
+
+ return (old_value);
+}
+
+/* Append LINE to the history line at offset WHICH, adding a newline to the
+ end of the current line first. This can be used to construct multi-line
+ history entries while reading lines from the history file. */
+void
+_hs_append_history_line (int which, const char *line)
+{
+ HIST_ENTRY *hent;
+ size_t newlen, curlen, minlen;
+ char *newline;
+
+ hent = the_history[which];
+ curlen = strlen (hent->line);
+ minlen = curlen + strlen (line) + 2; /* min space needed */
+ if (curlen > 256) /* XXX - for now */
+ {
+ newlen = 512; /* now realloc in powers of 2 */
+ /* we recalcluate every time; the operations are cheap */
+ while (newlen < minlen)
+ newlen <<= 1;
+ }
+ else
+ newlen = minlen;
+ /* Assume that realloc returns the same pointer and doesn't try a new
+ alloc/copy if the new size is the same as the one last passed. */
+ newline = realloc (hent->line, newlen);
+ if (newline)
+ {
+ hent->line = newline;
+ hent->line[curlen++] = '\n';
+ strcpy (hent->line + curlen, line);
+ }
+}
+
+/* Replace the DATA in the specified history entries, replacing OLD with
+ NEW. WHICH says which one(s) to replace: WHICH == -1 means to replace
+ all of the history entries where entry->data == OLD; WHICH == -2 means
+ to replace the `newest' history entry where entry->data == OLD; and
+ WHICH >= 0 means to replace that particular history entry's data, as
+ long as it matches OLD. */
+void
+_hs_replace_history_data (int which, histdata_t *old, histdata_t *new)
+{
+ HIST_ENTRY *entry;
+ register int i, last;
+
+ if (which < -2 || which >= history_length || history_length == 0 || the_history == 0)
+ return;
+
+ if (which >= 0)
+ {
+ entry = the_history[which];
+ if (entry && entry->data == old)
+ entry->data = new;
+ return;
+ }
+
+ last = -1;
+ for (i = 0; i < history_length; i++)
+ {
+ entry = the_history[i];
+ if (entry == 0)
+ continue;
+ if (entry->data == old)
+ {
+ last = i;
+ if (which == -1)
+ entry->data = new;
+ }
+ }
+ if (which == -2 && last >= 0)
+ {
+ entry = the_history[last];
+ entry->data = new; /* XXX - we don't check entry->old */
+ }
+}
+
+/* Remove history element WHICH from the history. The removed
+ element is returned to you so you can free the line, data,
+ and containing structure. */
+HIST_ENTRY *
+remove_history (int which)
+{
+ HIST_ENTRY *return_value;
+ register int i;
+#if 1
+ int nentries;
+ HIST_ENTRY **start, **end;
+#endif
+
+ if (which < 0 || which >= history_length || history_length == 0 || the_history == 0)
+ return ((HIST_ENTRY *)NULL);
+
+ return_value = the_history[which];
+
+#if 1
+ /* Copy the rest of the entries, moving down one slot. Copy includes
+ trailing NULL. */
+ nentries = history_length - which;
+ start = the_history + which;
+ end = start + 1;
+ memmove (start, end, nentries * sizeof (HIST_ENTRY *));
+#else
+ for (i = which; i < history_length; i++)
+ the_history[i] = the_history[i + 1];
+#endif
+
+ history_length--;
+
+ return (return_value);
+}
+
+HIST_ENTRY **
+remove_history_range (int first, int last)
+{
+ HIST_ENTRY **return_value;
+ register int i;
+ int nentries;
+ HIST_ENTRY **start, **end;
+
+ if (the_history == 0 || history_length == 0)
+ return ((HIST_ENTRY **)NULL);
+ if (first < 0 || first >= history_length || last < 0 || last >= history_length)
+ return ((HIST_ENTRY **)NULL);
+ if (first > last)
+ return (HIST_ENTRY **)NULL;
+
+ nentries = last - first + 1;
+ return_value = (HIST_ENTRY **)malloc ((nentries + 1) * sizeof (HIST_ENTRY *));
+ if (return_value == 0)
+ return return_value;
+
+ /* Return all the deleted entries in a list */
+ for (i = first ; i <= last; i++)
+ return_value[i - first] = the_history[i];
+ return_value[i - first] = (HIST_ENTRY *)NULL;
+
+ /* Copy the rest of the entries, moving down NENTRIES slots. Copy includes
+ trailing NULL. */
+ start = the_history + first;
+ end = the_history + last + 1;
+ memmove (start, end, (history_length - last) * sizeof (HIST_ENTRY *));
+
+ history_length -= nentries;
+
+ return (return_value);
+}
+
+/* Stifle the history list, remembering only MAX number of lines. */
+void
+stifle_history (int max)
+{
+ register int i, j;
+
+ if (max < 0)
+ max = 0;
+
+ if (history_length > max)
+ {
+ /* This loses because we cannot free the data. */
+ for (i = 0, j = history_length - max; i < j; i++)
+ free_history_entry (the_history[i]);
+
+ history_base = i;
+ for (j = 0, i = history_length - max; j < max; i++, j++)
+ the_history[j] = the_history[i];
+ the_history[j] = (HIST_ENTRY *)NULL;
+ history_length = j;
+ }
+
+ history_stifled = 1;
+ max_input_history = history_max_entries = max;
+}
+
+/* Stop stifling the history. This returns the previous maximum
+ number of history entries. The value is positive if the history
+ was stifled, negative if it wasn't. */
+int
+unstifle_history (void)
+{
+ if (history_stifled)
+ {
+ history_stifled = 0;
+ return (history_max_entries);
+ }
+ else
+ return (-history_max_entries);
+}
+
+int
+history_is_stifled (void)
+{
+ return (history_stifled);
+}
+
+void
+clear_history (void)
+{
+ register int i;
+
+ /* This loses because we cannot free the data. */
+ for (i = 0; i < history_length; i++)
+ {
+ free_history_entry (the_history[i]);
+ the_history[i] = (HIST_ENTRY *)NULL;
+ }
+
+ history_offset = history_length = 0;
+ history_base = 1; /* reset history base to default */
+}
diff --git a/history.h b/history.h
new file mode 100644
index 0000000..5208f9a
--- /dev/null
+++ b/history.h
@@ -0,0 +1,291 @@
+/* history.h -- the names of functions that you can call in history. */
+
+/* Copyright (C) 1989-2022 Free Software Foundation, Inc.
+
+ This file contains the GNU History Library (History), a set of
+ routines for managing the text of previously typed lines.
+
+ History 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.
+
+ History 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 History. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _HISTORY_H_
+#define _HISTORY_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <time.h> /* XXX - for history timestamp code */
+
+#if defined READLINE_LIBRARY
+# include "rlstdc.h"
+# include "rltypedefs.h"
+#else
+# include <readline/rlstdc.h>
+# include <readline/rltypedefs.h>
+#endif
+
+#ifdef __STDC__
+typedef void *histdata_t;
+#else
+typedef char *histdata_t;
+#endif
+
+/* Let's not step on anyone else's define for now, since we don't use this yet. */
+#ifndef HS_HISTORY_VERSION
+# define HS_HISTORY_VERSION 0x0802 /* History 8.2 */
+#endif
+
+/* The structure used to store a history entry. */
+typedef struct _hist_entry {
+ char *line;
+ char *timestamp; /* char * rather than time_t for read/write */
+ histdata_t data;
+} HIST_ENTRY;
+
+/* Size of the history-library-managed space in history entry HS. */
+#define HISTENT_BYTES(hs) (strlen ((hs)->line) + strlen ((hs)->timestamp))
+
+/* A structure used to pass the current state of the history stuff around. */
+typedef struct _hist_state {
+ HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+ int offset; /* The location pointer within this array. */
+ int length; /* Number of elements within this array. */
+ int size; /* Number of slots allocated to this array. */
+ int flags;
+} HISTORY_STATE;
+
+/* Flag values for the `flags' member of HISTORY_STATE. */
+#define HS_STIFLED 0x01
+
+/* Initialization and state management. */
+
+/* Begin a session in which the history functions might be used. This
+ just initializes the interactive variables. */
+extern void using_history (void);
+
+/* Return the current HISTORY_STATE of the history. */
+extern HISTORY_STATE *history_get_history_state (void);
+
+/* Set the state of the current history array to STATE. */
+extern void history_set_history_state (HISTORY_STATE *);
+
+/* Manage the history list. */
+
+/* Place STRING at the end of the history list.
+ The associated data field (if any) is set to NULL. */
+extern void add_history (const char *);
+
+/* Change the timestamp associated with the most recent history entry to
+ STRING. */
+extern void add_history_time (const char *);
+
+/* Remove an entry from the history list. WHICH is the magic number that
+ tells us which element to delete. The elements are numbered from 0. */
+extern HIST_ENTRY *remove_history (int);
+
+/* Remove a set of entries from the history list: FIRST to LAST, inclusive */
+extern HIST_ENTRY **remove_history_range (int, int);
+
+/* Allocate a history entry consisting of STRING and TIMESTAMP and return
+ a pointer to it. */
+extern HIST_ENTRY *alloc_history_entry (char *, char *);
+
+/* Copy the history entry H, but not the (opaque) data pointer */
+extern HIST_ENTRY *copy_history_entry (HIST_ENTRY *);
+
+/* Free the history entry H and return any application-specific data
+ associated with it. */
+extern histdata_t free_history_entry (HIST_ENTRY *);
+
+/* Make the history entry at WHICH have LINE and DATA. This returns
+ the old entry so you can dispose of the data. In the case of an
+ invalid WHICH, a NULL pointer is returned. */
+extern HIST_ENTRY *replace_history_entry (int, const char *, histdata_t);
+
+/* Clear the history list and start over. */
+extern void clear_history (void);
+
+/* Stifle the history list, remembering only MAX number of entries. */
+extern void stifle_history (int);
+
+/* Stop stifling the history. This returns the previous amount the
+ history was stifled by. The value is positive if the history was
+ stifled, negative if it wasn't. */
+extern int unstifle_history (void);
+
+/* Return 1 if the history is stifled, 0 if it is not. */
+extern int history_is_stifled (void);
+
+/* Information about the history list. */
+
+/* Return a NULL terminated array of HIST_ENTRY which is the current input
+ history. Element 0 of this list is the beginning of time. If there
+ is no history, return NULL. */
+extern HIST_ENTRY **history_list (void);
+
+/* Returns the number which says what history element we are now
+ looking at. */
+extern int where_history (void);
+
+/* Return the history entry at the current position, as determined by
+ history_offset. If there is no entry there, return a NULL pointer. */
+extern HIST_ENTRY *current_history (void);
+
+/* Return the history entry which is logically at OFFSET in the history
+ array. OFFSET is relative to history_base. */
+extern HIST_ENTRY *history_get (int);
+
+/* Return the timestamp associated with the HIST_ENTRY * passed as an
+ argument */
+extern time_t history_get_time (HIST_ENTRY *);
+
+/* Return the number of bytes that the primary history entries are using.
+ This just adds up the lengths of the_history->lines. */
+extern int history_total_bytes (void);
+
+/* Moving around the history list. */
+
+/* Set the position in the history list to POS. */
+extern int history_set_pos (int);
+
+/* Back up history_offset to the previous history entry, and return
+ a pointer to that entry. If there is no previous entry, return
+ a NULL pointer. */
+extern HIST_ENTRY *previous_history (void);
+
+/* Move history_offset forward to the next item in the input_history,
+ and return the a pointer to that entry. If there is no next entry,
+ return a NULL pointer. */
+extern HIST_ENTRY *next_history (void);
+
+/* Searching the history list. */
+
+/* Search the history for STRING, starting at history_offset.
+ If DIRECTION < 0, then the search is through previous entries,
+ else through subsequent. If the string is found, then
+ current_history () is the history entry, and the value of this function
+ is the offset in the line of that history entry that the string was
+ found in. Otherwise, nothing is changed, and a -1 is returned. */
+extern int history_search (const char *, int);
+
+/* Search the history for STRING, starting at history_offset.
+ The search is anchored: matching lines must begin with string.
+ DIRECTION is as in history_search(). */
+extern int history_search_prefix (const char *, int);
+
+/* Search for STRING in the history list, starting at POS, an
+ absolute index into the list. DIR, if negative, says to search
+ backwards from POS, else forwards.
+ Returns the absolute index of the history element where STRING
+ was found, or -1 otherwise. */
+extern int history_search_pos (const char *, int, int);
+
+/* Managing the history file. */
+
+/* Add the contents of FILENAME to the history list, a line at a time.
+ If FILENAME is NULL, then read from ~/.history. Returns 0 if
+ successful, or errno if not. */
+extern int read_history (const char *);
+
+/* Read a range of lines from FILENAME, adding them to the history list.
+ Start reading at the FROM'th line and end at the TO'th. If FROM
+ is zero, start at the beginning. If TO is less than FROM, read
+ until the end of the file. If FILENAME is NULL, then read from
+ ~/.history. Returns 0 if successful, or errno if not. */
+extern int read_history_range (const char *, int, int);
+
+/* Write the current history to FILENAME. If FILENAME is NULL,
+ then write the history list to ~/.history. Values returned
+ are as in read_history (). */
+extern int write_history (const char *);
+
+/* Append NELEMENT entries to FILENAME. The entries appended are from
+ the end of the list minus NELEMENTs up to the end of the list. */
+extern int append_history (int, const char *);
+
+/* Truncate the history file, leaving only the last NLINES lines. */
+extern int history_truncate_file (const char *, int);
+
+/* History expansion. */
+
+/* Expand the string STRING, placing the result into OUTPUT, a pointer
+ to a string. Returns:
+
+ 0) If no expansions took place (or, if the only change in
+ the text was the de-slashifying of the history expansion
+ character)
+ 1) If expansions did take place
+ -1) If there was an error in expansion.
+ 2) If the returned line should just be printed.
+
+ If an error occurred in expansion, then OUTPUT contains a descriptive
+ error message. */
+extern int history_expand (char *, char **);
+
+/* Extract a string segment consisting of the FIRST through LAST
+ arguments present in STRING. Arguments are broken up as in
+ the shell. */
+extern char *history_arg_extract (int, int, const char *);
+
+/* Return the text of the history event beginning at the current
+ offset into STRING. Pass STRING with *INDEX equal to the
+ history_expansion_char that begins this specification.
+ DELIMITING_QUOTE is a character that is allowed to end the string
+ specification for what to search for in addition to the normal
+ characters `:', ` ', `\t', `\n', and sometimes `?'. */
+extern char *get_history_event (const char *, int *, int);
+
+/* Return an array of tokens, much as the shell might. The tokens are
+ parsed out of STRING. */
+extern char **history_tokenize (const char *);
+
+/* Exported history variables. */
+extern int history_base;
+extern int history_length;
+extern int history_max_entries;
+extern int history_offset;
+
+extern int history_lines_read_from_file;
+extern int history_lines_written_to_file;
+
+extern char history_expansion_char;
+extern char history_subst_char;
+extern char *history_word_delimiters;
+extern char history_comment_char;
+extern char *history_no_expand_chars;
+extern char *history_search_delimiter_chars;
+
+extern int history_quotes_inhibit_expansion;
+extern int history_quoting_state;
+
+extern int history_write_timestamps;
+
+/* These two are undocumented; the second is reserved for future use */
+extern int history_multiline_entries;
+extern int history_file_version;
+
+/* Backwards compatibility */
+extern int max_input_history;
+
+/* If set, this function is called to decide whether or not a particular
+ history expansion should be treated as a special case for the calling
+ application and not expanded. */
+extern rl_linebuf_func_t *history_inhibit_expansion_function;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_HISTORY_H_ */
diff --git a/history.pc.in b/history.pc.in
new file mode 100644
index 0000000..8a80775
--- /dev/null
+++ b/history.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: History
+Description: Gnu History library for managing previously-entered lines
+URL: http://tiswww.cwru.edu/php/chet/readline/rltop.html
+Version: @LIBVERSION@
+Libs: -L${libdir} -lhistory
+Cflags: -I${includedir}
diff --git a/histsearch.c b/histsearch.c
new file mode 100644
index 0000000..b62c06b
--- /dev/null
+++ b/histsearch.c
@@ -0,0 +1,287 @@
+/* histsearch.c -- searching the history list. */
+
+/* Copyright (C) 1989, 1992-2009,2017,2021 Free Software Foundation, Inc.
+
+ This file contains the GNU History Library (History), a set of
+ routines for managing the text of previously typed lines.
+
+ History 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.
+
+ History 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 History. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+# ifdef _MINIX
+# include <sys/types.h>
+# endif
+# include <unistd.h>
+#endif
+
+#if defined (HAVE_FNMATCH)
+# include <fnmatch.h>
+#endif
+
+#include "history.h"
+#include "histlib.h"
+#include "xmalloc.h"
+
+/* The list of alternate characters that can delimit a history search
+ string. */
+char *history_search_delimiter_chars = (char *)NULL;
+
+static int history_search_internal (const char *, int, int);
+
+/* Search the history for STRING, starting at history_offset.
+ If DIRECTION < 0, then the search is through previous entries, else
+ through subsequent. If ANCHORED is non-zero, the string must
+ appear at the beginning of a history line, otherwise, the string
+ may appear anywhere in the line. If the string is found, then
+ current_history () is the history entry, and the value of this
+ function is the offset in the line of that history entry that the
+ string was found in. Otherwise, nothing is changed, and a -1 is
+ returned. */
+
+static int
+history_search_internal (const char *string, int direction, int flags)
+{
+ register int i, reverse;
+ register char *line;
+ register int line_index;
+ int string_len, anchored, patsearch;
+ HIST_ENTRY **the_history; /* local */
+
+ i = history_offset;
+ reverse = (direction < 0);
+ anchored = (flags & ANCHORED_SEARCH);
+#if defined (HAVE_FNMATCH)
+ patsearch = (flags & PATTERN_SEARCH);
+#else
+ patsearch = 0;
+#endif
+
+ /* Take care of trivial cases first. */
+ if (string == 0 || *string == '\0')
+ return (-1);
+
+ if (!history_length || ((i >= history_length) && !reverse))
+ return (-1);
+
+ if (reverse && (i >= history_length))
+ i = history_length - 1;
+
+#define NEXT_LINE() do { if (reverse) i--; else i++; } while (0)
+
+ the_history = history_list ();
+ string_len = strlen (string);
+ while (1)
+ {
+ /* Search each line in the history list for STRING. */
+
+ /* At limit for direction? */
+ if ((reverse && i < 0) || (!reverse && i == history_length))
+ return (-1);
+
+ line = the_history[i]->line;
+ line_index = strlen (line);
+
+ /* If STRING is longer than line, no match. */
+ if (patsearch == 0 && (string_len > line_index))
+ {
+ NEXT_LINE ();
+ continue;
+ }
+
+ /* Handle anchored searches first. */
+ if (anchored == ANCHORED_SEARCH)
+ {
+#if defined (HAVE_FNMATCH)
+ if (patsearch)
+ {
+ if (fnmatch (string, line, 0) == 0)
+ {
+ history_offset = i;
+ return (0);
+ }
+ }
+ else
+#endif
+ if (STREQN (string, line, string_len))
+ {
+ history_offset = i;
+ return (0);
+ }
+
+ NEXT_LINE ();
+ continue;
+ }
+
+ /* Do substring search. */
+ if (reverse)
+ {
+ line_index -= (patsearch == 0) ? string_len : 1;
+
+ while (line_index >= 0)
+ {
+#if defined (HAVE_FNMATCH)
+ if (patsearch)
+ {
+ if (fnmatch (string, line + line_index, 0) == 0)
+ {
+ history_offset = i;
+ return (line_index);
+ }
+ }
+ else
+#endif
+ if (STREQN (string, line + line_index, string_len))
+ {
+ history_offset = i;
+ return (line_index);
+ }
+ line_index--;
+ }
+ }
+ else
+ {
+ register int limit;
+
+ limit = line_index - string_len + 1;
+ line_index = 0;
+
+ while (line_index < limit)
+ {
+#if defined (HAVE_FNMATCH)
+ if (patsearch)
+ {
+ if (fnmatch (string, line + line_index, 0) == 0)
+ {
+ history_offset = i;
+ return (line_index);
+ }
+ }
+ else
+#endif
+ if (STREQN (string, line + line_index, string_len))
+ {
+ history_offset = i;
+ return (line_index);
+ }
+ line_index++;
+ }
+ }
+ NEXT_LINE ();
+ }
+}
+
+int
+_hs_history_patsearch (const char *string, int direction, int flags)
+{
+ char *pat;
+ size_t len, start;
+ int ret, unescaped_backslash;
+
+#if defined (HAVE_FNMATCH)
+ /* Assume that the string passed does not have a leading `^' and any
+ anchored search request is captured in FLAGS */
+ len = strlen (string);
+ ret = len - 1;
+ /* fnmatch is required to reject a pattern that ends with an unescaped
+ backslash */
+ if (unescaped_backslash = (string[ret] == '\\'))
+ {
+ while (ret > 0 && string[--ret] == '\\')
+ unescaped_backslash = 1 - unescaped_backslash;
+ }
+ if (unescaped_backslash)
+ return -1;
+ pat = (char *)xmalloc (len + 3);
+ /* If the search string is not anchored, we'll be calling fnmatch (assuming
+ we have it). Prefix a `*' to the front of the search string so we search
+ anywhere in the line. */
+ if ((flags & ANCHORED_SEARCH) == 0 && string[0] != '*')
+ {
+ pat[0] = '*';
+ start = 1;
+ len++;
+ }
+ else
+ {
+ start = 0;
+ }
+
+ /* Attempt to reduce the number of searches by tacking a `*' onto the end
+ of a pattern that doesn't have one. Assume a pattern that ends in a
+ backslash contains an even number of trailing backslashes; we check
+ above */
+ strcpy (pat + start, string);
+ if (pat[len - 1] != '*')
+ {
+ pat[len] = '*'; /* XXX */
+ pat[len+1] = '\0';
+ }
+#else
+ pat = string;
+#endif
+
+ ret = history_search_internal (pat, direction, flags|PATTERN_SEARCH);
+
+ if (pat != string)
+ xfree (pat);
+ return ret;
+}
+
+/* Do a non-anchored search for STRING through the history in DIRECTION. */
+int
+history_search (const char *string, int direction)
+{
+ return (history_search_internal (string, direction, NON_ANCHORED_SEARCH));
+}
+
+/* Do an anchored search for string through the history in DIRECTION. */
+int
+history_search_prefix (const char *string, int direction)
+{
+ return (history_search_internal (string, direction, ANCHORED_SEARCH));
+}
+
+/* Search for STRING in the history list. DIR is < 0 for searching
+ backwards. POS is an absolute index into the history list at
+ which point to begin searching. */
+int
+history_search_pos (const char *string, int dir, int pos)
+{
+ int ret, old;
+
+ old = where_history ();
+ history_set_pos (pos);
+ if (history_search (string, dir) == -1)
+ {
+ history_set_pos (old);
+ return (-1);
+ }
+ ret = where_history ();
+ history_set_pos (old);
+ return ret;
+}
diff --git a/input.c b/input.c
new file mode 100644
index 0000000..6f038d4
--- /dev/null
+++ b/input.c
@@ -0,0 +1,1000 @@
+/* input.c -- character input functions for readline. */
+
+/* Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (__TANDEM)
+# define _XOPEN_SOURCE_EXTENDED 1
+# define _TANDEM_SOURCE 1
+# include <floss.h>
+#endif
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+# include <sys/file.h>
+#endif /* HAVE_SYS_FILE_H */
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <signal.h>
+
+#include "posixselect.h"
+#include "posixtime.h"
+
+#if defined (FIONREAD_IN_SYS_IOCTL)
+# include <sys/ioctl.h>
+#endif
+
+#include <stdio.h>
+#include <errno.h>
+
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+
+#include "rlprivate.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+/* What kind of non-blocking I/O do we have? */
+#if !defined (O_NDELAY) && defined (O_NONBLOCK)
+# define O_NDELAY O_NONBLOCK /* Posix style */
+#endif
+
+#if defined (HAVE_PSELECT) || defined (HAVE_SELECT)
+extern sigset_t _rl_orig_sigset;
+#endif
+
+/* Non-null means it is a pointer to a function to run while waiting for
+ character input. */
+rl_hook_func_t *rl_event_hook = (rl_hook_func_t *)NULL;
+
+/* A function to call if a read(2) is interrupted by a signal. */
+rl_hook_func_t *rl_signal_event_hook = (rl_hook_func_t *)NULL;
+
+/* A function to call when readline times out after a time is specified. */
+rl_hook_func_t *rl_timeout_event_hook = (rl_hook_func_t *)NULL;
+
+/* A function to replace _rl_input_available for applications using the
+ callback interface. */
+rl_hook_func_t *rl_input_available_hook = (rl_hook_func_t *)NULL;
+
+rl_getc_func_t *rl_getc_function = rl_getc;
+
+static int _keyboard_input_timeout = 100000; /* 0.1 seconds; it's in usec */
+
+static int ibuffer_space (void);
+static int rl_get_char (int *);
+static int rl_gather_tyi (void);
+
+/* Windows isatty returns true for every character device, including the null
+ device, so we need to perform additional checks. */
+#if defined (_WIN32) && !defined (__CYGWIN__)
+#include <io.h>
+#include <conio.h>
+#define WIN32_LEAN_AND_MEAN 1
+#include <windows.h>
+
+int
+win32_isatty (int fd)
+{
+ if (_isatty(fd))
+ {
+ HANDLE h;
+ DWORD ignored;
+
+ if ((h = (HANDLE) _get_osfhandle (fd)) == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return 0;
+ }
+ if (GetConsoleMode (h, &ignored) != 0)
+ return 1;
+ }
+ errno = ENOTTY;
+ return 0;
+}
+
+#define isatty(x) win32_isatty(x)
+#endif
+
+/* Readline timeouts */
+
+/* I don't know how to set a timeout for _getch() in MinGW32, so we use
+ SIGALRM. */
+#if (defined (HAVE_PSELECT) || defined (HAVE_SELECT)) && !defined (__MINGW32__)
+# define RL_TIMEOUT_USE_SELECT
+#else
+# define RL_TIMEOUT_USE_SIGALRM
+#endif
+
+int rl_set_timeout (unsigned int, unsigned int);
+int rl_timeout_remaining (unsigned int *, unsigned int *);
+
+int _rl_timeout_init (void);
+int _rl_timeout_sigalrm_handler (void);
+int _rl_timeout_select (int, fd_set *, fd_set *, fd_set *, const struct timeval *, const sigset_t *);
+
+static void _rl_timeout_handle (void);
+#if defined (RL_TIMEOUT_USE_SIGALRM)
+static int set_alarm (unsigned int *, unsigned int *);
+static void reset_alarm (void);
+#endif
+
+/* We implement timeouts as a future time using a supplied interval
+ (timeout_duration) from when the timeout is set (timeout_point).
+ That allows us to easily determine whether the timeout has occurred
+ and compute the time remaining until it does. */
+static struct timeval timeout_point;
+static struct timeval timeout_duration;
+
+/* **************************************************************** */
+/* */
+/* Character Input Buffering */
+/* */
+/* **************************************************************** */
+
+static int pop_index, push_index;
+static unsigned char ibuffer[512];
+static int ibuffer_len = sizeof (ibuffer) - 1;
+
+#define any_typein (push_index != pop_index)
+
+int
+_rl_any_typein (void)
+{
+ return any_typein;
+}
+
+int
+_rl_pushed_input_available (void)
+{
+ return (push_index != pop_index);
+}
+
+/* Return the amount of space available in the buffer for stuffing
+ characters. */
+static int
+ibuffer_space (void)
+{
+ if (pop_index > push_index)
+ return (pop_index - push_index - 1);
+ else
+ return (ibuffer_len - (push_index - pop_index));
+}
+
+/* Get a key from the buffer of characters to be read.
+ Return the key in KEY.
+ Result is non-zero if there was a key, or 0 if there wasn't. */
+static int
+rl_get_char (int *key)
+{
+ if (push_index == pop_index)
+ return (0);
+
+ *key = ibuffer[pop_index++];
+#if 0
+ if (pop_index >= ibuffer_len)
+#else
+ if (pop_index > ibuffer_len)
+#endif
+ pop_index = 0;
+
+ return (1);
+}
+
+/* Stuff KEY into the *front* of the input buffer.
+ Returns non-zero if successful, zero if there is
+ no space left in the buffer. */
+int
+_rl_unget_char (int key)
+{
+ if (ibuffer_space ())
+ {
+ pop_index--;
+ if (pop_index < 0)
+ pop_index = ibuffer_len;
+ ibuffer[pop_index] = key;
+ return (1);
+ }
+ return (0);
+}
+
+/* If a character is available to be read, then read it and stuff it into
+ IBUFFER. Otherwise, just return. Returns number of characters read
+ (0 if none available) and -1 on error (EIO). */
+static int
+rl_gather_tyi (void)
+{
+ int tty;
+ register int tem, result;
+ int chars_avail, k;
+ char input;
+#if defined(HAVE_SELECT)
+ fd_set readfds, exceptfds;
+ struct timeval timeout;
+#endif
+
+ chars_avail = 0;
+ input = 0;
+ tty = fileno (rl_instream);
+
+#if defined (HAVE_PSELECT) || defined (HAVE_SELECT)
+ FD_ZERO (&readfds);
+ FD_ZERO (&exceptfds);
+ FD_SET (tty, &readfds);
+ FD_SET (tty, &exceptfds);
+ USEC_TO_TIMEVAL (_keyboard_input_timeout, timeout);
+#if defined (RL_TIMEOUT_USE_SELECT)
+ result = _rl_timeout_select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout, NULL);
+#else
+ result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout);
+#endif
+ if (result <= 0)
+ return 0; /* Nothing to read. */
+#endif
+
+ result = -1;
+ errno = 0;
+#if defined (FIONREAD)
+ result = ioctl (tty, FIONREAD, &chars_avail);
+ if (result == -1 && errno == EIO)
+ return -1;
+ if (result == -1)
+ chars_avail = 0;
+#endif
+
+#if defined (O_NDELAY)
+ if (result == -1)
+ {
+ tem = fcntl (tty, F_GETFL, 0);
+
+ fcntl (tty, F_SETFL, (tem | O_NDELAY));
+ chars_avail = read (tty, &input, 1);
+
+ fcntl (tty, F_SETFL, tem);
+ if (chars_avail == -1 && errno == EAGAIN)
+ return 0;
+ if (chars_avail == -1 && errno == EIO)
+ return -1;
+ if (chars_avail == 0) /* EOF */
+ {
+ rl_stuff_char (EOF);
+ return (0);
+ }
+ }
+#endif /* O_NDELAY */
+
+#if defined (__MINGW32__)
+ /* Use getch/_kbhit to check for available console input, in the same way
+ that we read it normally. */
+ chars_avail = isatty (tty) ? _kbhit () : 0;
+ result = 0;
+#endif
+
+ /* If there's nothing available, don't waste time trying to read
+ something. */
+ if (chars_avail <= 0)
+ return 0;
+
+ tem = ibuffer_space ();
+
+ if (chars_avail > tem)
+ chars_avail = tem;
+
+ /* One cannot read all of the available input. I can only read a single
+ character at a time, or else programs which require input can be
+ thwarted. If the buffer is larger than one character, I lose.
+ Damn! */
+ if (tem < ibuffer_len)
+ chars_avail = 0;
+
+ if (result != -1)
+ {
+ while (chars_avail--)
+ {
+ RL_CHECK_SIGNALS ();
+ k = (*rl_getc_function) (rl_instream);
+ if (rl_stuff_char (k) == 0)
+ break; /* some problem; no more room */
+ if (k == NEWLINE || k == RETURN)
+ break;
+ }
+ }
+ else
+ {
+ if (chars_avail)
+ rl_stuff_char (input);
+ }
+
+ return 1;
+}
+
+int
+rl_set_keyboard_input_timeout (int u)
+{
+ int o;
+
+ o = _keyboard_input_timeout;
+ if (u >= 0)
+ _keyboard_input_timeout = u;
+ return (o);
+}
+
+/* Is there input available to be read on the readline input file
+ descriptor? Only works if the system has select(2) or FIONREAD.
+ Uses the value of _keyboard_input_timeout as the timeout; if another
+ readline function wants to specify a timeout and not leave it up to
+ the user, it should use _rl_input_queued(timeout_value_in_microseconds)
+ instead. */
+int
+_rl_input_available (void)
+{
+#if defined (HAVE_PSELECT) || defined (HAVE_SELECT)
+ fd_set readfds, exceptfds;
+ struct timeval timeout;
+#endif
+#if !defined (HAVE_SELECT) && defined (FIONREAD)
+ int chars_avail;
+#endif
+ int tty;
+
+ if (rl_input_available_hook)
+ return (*rl_input_available_hook) ();
+
+ tty = fileno (rl_instream);
+
+#if defined (HAVE_PSELECT) || defined (HAVE_SELECT)
+ FD_ZERO (&readfds);
+ FD_ZERO (&exceptfds);
+ FD_SET (tty, &readfds);
+ FD_SET (tty, &exceptfds);
+ USEC_TO_TIMEVAL (_keyboard_input_timeout, timeout);
+# if defined (RL_TIMEOUT_USE_SELECT)
+ return (_rl_timeout_select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout, NULL) > 0);
+# else
+ return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0);
+# endif
+#else
+
+#if defined (FIONREAD)
+ if (ioctl (tty, FIONREAD, &chars_avail) == 0)
+ return (chars_avail);
+#endif
+
+#endif
+
+#if defined (__MINGW32__)
+ if (isatty (tty))
+ return (_kbhit ());
+#endif
+
+ return 0;
+}
+
+int
+_rl_nchars_available ()
+{
+ int chars_avail, fd, result;
+
+ chars_avail = 0;
+
+#if defined (FIONREAD)
+ fd = fileno (rl_instream);
+ errno = 0;
+ result = ioctl (fd, FIONREAD, &chars_avail);
+ if (result == -1 && errno == EIO)
+ return -1;
+#endif
+
+ return chars_avail;
+}
+
+int
+_rl_input_queued (int t)
+{
+ int old_timeout, r;
+
+ old_timeout = rl_set_keyboard_input_timeout (t);
+ r = _rl_input_available ();
+ rl_set_keyboard_input_timeout (old_timeout);
+ return r;
+}
+
+void
+_rl_insert_typein (int c)
+{
+ int key, t, i;
+ char *string;
+
+ i = key = 0;
+ string = (char *)xmalloc (ibuffer_len + 1);
+ string[i++] = (char) c;
+
+ while ((t = rl_get_char (&key)) &&
+ _rl_keymap[key].type == ISFUNC &&
+ _rl_keymap[key].function == rl_insert)
+ string[i++] = key;
+
+ if (t)
+ _rl_unget_char (key);
+
+ string[i] = '\0';
+ rl_insert_text (string);
+ xfree (string);
+}
+
+/* Add KEY to the buffer of characters to be read. Returns 1 if the
+ character was stuffed correctly; 0 otherwise. */
+int
+rl_stuff_char (int key)
+{
+ if (ibuffer_space () == 0)
+ return 0;
+
+ if (key == EOF)
+ {
+ key = NEWLINE;
+ rl_pending_input = EOF;
+ RL_SETSTATE (RL_STATE_INPUTPENDING);
+ }
+ ibuffer[push_index++] = key;
+#if 0
+ if (push_index >= ibuffer_len)
+#else
+ if (push_index > ibuffer_len)
+#endif
+ push_index = 0;
+
+ return 1;
+}
+
+/* Make C be the next command to be executed. */
+int
+rl_execute_next (int c)
+{
+ rl_pending_input = c;
+ RL_SETSTATE (RL_STATE_INPUTPENDING);
+ return 0;
+}
+
+/* Clear any pending input pushed with rl_execute_next() */
+int
+rl_clear_pending_input (void)
+{
+ rl_pending_input = 0;
+ RL_UNSETSTATE (RL_STATE_INPUTPENDING);
+ return 0;
+}
+
+/* **************************************************************** */
+/* */
+/* Timeout utility */
+/* */
+/* **************************************************************** */
+
+#if defined (RL_TIMEOUT_USE_SIGALRM)
+# if defined (HAVE_SETITIMER)
+
+static int
+set_alarm (unsigned int *secs, unsigned int *usecs)
+{
+ struct itimerval it;
+
+ timerclear (&it.it_interval);
+ timerset (&it.it_value, *secs, *usecs);
+ return setitimer (ITIMER_REAL, &it, NULL);
+}
+
+static void
+reset_alarm ()
+{
+ struct itimerval it;
+
+ timerclear (&it.it_interval);
+ timerclear (&it.it_value);
+ setitimer (ITIMER_REAL, &it, NULL);
+}
+# else
+static int
+set_alarm (unsigned int *secs, unsigned int *usecs)
+{
+ if (*secs == 0 || *usecs >= USEC_PER_SEC / 2)
+ (*secs)++;
+ *usecs = 0;
+
+ return alarm (*secs);
+}
+static void
+reset_alarm ()
+{
+ alarm (0);
+}
+# endif
+#endif
+
+/* Set a timeout which will be used for the next call of `readline
+ ()'. When (0, 0) are specified the timeout is cleared. */
+int
+rl_set_timeout (unsigned int secs, unsigned int usecs)
+{
+ timeout_duration.tv_sec = secs + usecs / USEC_PER_SEC;
+ timeout_duration.tv_usec = usecs % USEC_PER_SEC;
+
+ return 0;
+}
+
+/* Start measuring the time. Returns 0 on success. Returns -1 on
+ error. */
+int
+_rl_timeout_init (void)
+{
+ unsigned int secs, usecs;
+
+ /* Clear the timeout state of the previous edit */
+ RL_UNSETSTATE(RL_STATE_TIMEOUT);
+ timerclear (&timeout_point);
+
+ /* Return 0 when timeout is unset. */
+ if (timerisunset (&timeout_duration))
+ return 0;
+
+ /* Return -1 on gettimeofday error. */
+ if (gettimeofday(&timeout_point, 0) != 0)
+ {
+ timerclear (&timeout_point);
+ return -1;
+ }
+
+ secs = timeout_duration.tv_sec;
+ usecs = timeout_duration.tv_usec;
+
+#if defined (RL_TIMEOUT_USE_SIGALRM)
+ /* If select(2)/pselect(2) is unavailable, use SIGALRM. */
+ if (set_alarm (&secs, &usecs) < 0)
+ return -1;
+#endif
+
+ timeout_point.tv_sec += secs;
+ timeout_point.tv_usec += usecs;
+ if (timeout_point.tv_usec >= USEC_PER_SEC)
+ {
+ timeout_point.tv_sec++;
+ timeout_point.tv_usec -= USEC_PER_SEC;
+ }
+
+ return 0;
+}
+
+/* Get the remaining time until the scheduled timeout. Returns -1 on
+ error or no timeout set with secs and usecs unchanged. Returns 0
+ on an expired timeout with secs and usecs unchanged. Returns 1
+ when the timeout has not yet expired. The remaining time is stored
+ in secs and usecs. When NULL is specified to either of the
+ arguments, just the expiration is tested. */
+int
+rl_timeout_remaining (unsigned int *secs, unsigned int *usecs)
+{
+ struct timeval current_time;
+
+ /* Return -1 when timeout is unset. */
+ if (timerisunset (&timeout_point))
+ {
+ errno = 0;
+ return -1;
+ }
+
+ /* Return -1 on error. errno is set by gettimeofday. */
+ if (gettimeofday(&current_time, 0) != 0)
+ return -1;
+
+ /* Return 0 when timeout has already expired. */
+ /* could use timercmp (&timeout_point, &current_time, <) here */
+ if (current_time.tv_sec > timeout_point.tv_sec ||
+ (current_time.tv_sec == timeout_point.tv_sec &&
+ current_time.tv_usec >= timeout_point.tv_usec))
+ return 0;
+
+ if (secs && usecs)
+ {
+ *secs = timeout_point.tv_sec - current_time.tv_sec;
+ *usecs = timeout_point.tv_usec - current_time.tv_usec;
+ if (timeout_point.tv_usec < current_time.tv_usec)
+ {
+ (*secs)--;
+ *usecs += USEC_PER_SEC;
+ }
+ }
+
+ return 1;
+}
+
+/* This should only be called if RL_TIMEOUT_USE_SELECT is defined. */
+
+#if defined (HAVE_PSELECT) || defined (HAVE_SELECT)
+int
+_rl_timeout_select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout, const sigset_t *sigmask)
+{
+ int result;
+#if defined (HAVE_PSELECT)
+ struct timespec ts;
+#else
+ sigset_t origmask;
+ struct timeval tv;
+#endif
+ int tmout_status;
+ struct timeval tmout;
+ unsigned int sec, usec;
+
+ /* When the remaining time for rl_timeout is shorter than the
+ keyboard input timeout, replace `timeout' with the remaining time
+ for `rl_timeout' and set `tmout_status = 1'. */
+ tmout_status = rl_timeout_remaining (&sec, &usec);
+ tmout.tv_sec = sec;
+ tmout.tv_usec = usec;
+
+ if (tmout_status == 0)
+ _rl_timeout_handle ();
+ else if (tmout_status == 1)
+ {
+ if (timeout == NULL || timercmp (&tmout, timeout, <))
+ timeout = &tmout;
+ else
+ tmout_status = -1;
+ }
+
+#if defined (HAVE_PSELECT)
+ if (timeout)
+ {
+ TIMEVAL_TO_TIMESPEC (timeout, &ts);
+ result = pselect (nfds, readfds, writefds, exceptfds, &ts, sigmask);
+ }
+ else
+ result = pselect (nfds, readfds, writefds, exceptfds, NULL, sigmask);
+#else
+ if (sigmask)
+ sigprocmask (SIG_SETMASK, sigmask, &origmask);
+
+ if (timeout)
+ {
+ tv.tv_sec = timeout->tv_sec;
+ tv.tv_usec = timeout->tv_usec;
+ result = select (nfds, readfds, writefds, exceptfds, &tv);
+ }
+ else
+ result = select (nfds, readfds, writefds, exceptfds, NULL);
+
+ if (sigmask)
+ sigprocmask (SIG_SETMASK, &origmask, NULL);
+#endif
+
+ if (tmout_status == 1 && result == 0)
+ _rl_timeout_handle ();
+
+ return result;
+}
+#endif
+
+static void
+_rl_timeout_handle ()
+{
+ if (rl_timeout_event_hook)
+ (*rl_timeout_event_hook) ();
+
+ RL_SETSTATE(RL_STATE_TIMEOUT);
+ _rl_abort_internal ();
+}
+
+int
+_rl_timeout_handle_sigalrm ()
+{
+#if defined (RL_TIMEOUT_USE_SIGALRM)
+ if (timerisunset (&timeout_point))
+ return -1;
+
+ /* Reset `timeout_point' to the current time to ensure that later
+ calls of `rl_timeout_pending ()' return 0 (timeout expired). */
+ if (gettimeofday(&timeout_point, 0) != 0)
+ timerclear (&timeout_point);
+
+ reset_alarm ();
+
+ _rl_timeout_handle ();
+#endif
+ return -1;
+}
+/* **************************************************************** */
+/* */
+/* Character Input */
+/* */
+/* **************************************************************** */
+
+/* Read a key, including pending input. */
+int
+rl_read_key (void)
+{
+ int c, r;
+
+ if (rl_pending_input)
+ {
+ c = rl_pending_input; /* XXX - cast to unsigned char if > 0? */
+ rl_clear_pending_input ();
+ }
+ else
+ {
+ /* If input is coming from a macro, then use that. */
+ if (c = _rl_next_macro_key ())
+ return ((unsigned char)c);
+
+ /* If the user has an event function, then call it periodically. */
+ if (rl_event_hook)
+ {
+ while (rl_event_hook)
+ {
+ if (rl_get_char (&c) != 0)
+ break;
+
+ if ((r = rl_gather_tyi ()) < 0) /* XXX - EIO */
+ {
+ rl_done = 1;
+ RL_SETSTATE (RL_STATE_DONE);
+ return (errno == EIO ? (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF) : '\n');
+ }
+ else if (r > 0) /* read something */
+ continue;
+
+ RL_CHECK_SIGNALS ();
+ if (rl_done) /* XXX - experimental */
+ return ('\n');
+ (*rl_event_hook) ();
+ }
+ }
+ else
+ {
+ if (rl_get_char (&c) == 0)
+ c = (*rl_getc_function) (rl_instream);
+/* fprintf(stderr, "rl_read_key: calling RL_CHECK_SIGNALS: _rl_caught_signal = %d\r\n", _rl_caught_signal); */
+ RL_CHECK_SIGNALS ();
+ }
+ }
+
+ return (c);
+}
+
+int
+rl_getc (FILE *stream)
+{
+ int result;
+ unsigned char c;
+ int fd;
+#if defined (HAVE_PSELECT)
+ sigset_t empty_set;
+ fd_set readfds;
+#endif
+
+ fd = fileno (stream);
+ while (1)
+ {
+ RL_CHECK_SIGNALS ();
+
+ /* We know at this point that _rl_caught_signal == 0 */
+
+#if defined (__MINGW32__)
+ if (isatty (fd)
+ return (_getch ()); /* "There is no error return." */
+#endif
+ result = 0;
+#if defined (HAVE_PSELECT) || defined (HAVE_SELECT)
+ /* At this point, if we have pselect, we're using select/pselect for the
+ timeouts. We handled MinGW above. */
+ FD_ZERO (&readfds);
+ FD_SET (fd, &readfds);
+# if defined (HANDLE_SIGNALS)
+ result = _rl_timeout_select (fd + 1, &readfds, NULL, NULL, NULL, &_rl_orig_sigset);
+# else
+ sigemptyset (&empty_set);
+ sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &empty_set);
+ result = _rl_timeout_select (fd + 1, &readfds, NULL, NULL, NULL, &empty_set);
+# endif /* HANDLE_SIGNALS */
+ if (result == 0)
+ _rl_timeout_handle (); /* check the timeout */
+#endif
+ if (result >= 0)
+ result = read (fd, &c, sizeof (unsigned char));
+
+ if (result == sizeof (unsigned char))
+ return (c);
+
+ /* If zero characters are returned, then the file that we are
+ reading from is empty! Return EOF in that case. */
+ if (result == 0)
+ return (EOF);
+
+#if defined (__BEOS__)
+ if (errno == EINTR)
+ continue;
+#endif
+
+#if defined (EWOULDBLOCK)
+# define X_EWOULDBLOCK EWOULDBLOCK
+#else
+# define X_EWOULDBLOCK -99
+#endif
+
+#if defined (EAGAIN)
+# define X_EAGAIN EAGAIN
+#else
+# define X_EAGAIN -99
+#endif
+
+ if (errno == X_EWOULDBLOCK || errno == X_EAGAIN)
+ {
+ if (sh_unset_nodelay_mode (fd) < 0)
+ return (EOF);
+ continue;
+ }
+
+#undef X_EWOULDBLOCK
+#undef X_EAGAIN
+
+/* fprintf(stderr, "rl_getc: result = %d errno = %d\n", result, errno); */
+
+handle_error:
+ /* If the error that we received was EINTR, then try again,
+ this is simply an interrupted system call to read (). We allow
+ the read to be interrupted if we caught SIGHUP, SIGTERM, or any
+ of the other signals readline treats specially. If the
+ application sets an event hook, call it for other signals.
+ Otherwise (not EINTR), some error occurred, also signifying EOF. */
+ if (errno != EINTR)
+ return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
+ /* fatal signals of interest */
+#if defined (SIGHUP)
+ else if (_rl_caught_signal == SIGHUP || _rl_caught_signal == SIGTERM)
+#else
+ else if (_rl_caught_signal == SIGTERM)
+#endif
+ return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
+ /* keyboard-generated signals of interest */
+#if defined (SIGQUIT)
+ else if (_rl_caught_signal == SIGINT || _rl_caught_signal == SIGQUIT)
+#else
+ else if (_rl_caught_signal == SIGINT)
+#endif
+ RL_CHECK_SIGNALS ();
+#if defined (SIGTSTP)
+ else if (_rl_caught_signal == SIGTSTP)
+ RL_CHECK_SIGNALS ();
+#endif
+ /* non-keyboard-generated signals of interest */
+#if defined (SIGWINCH)
+ else if (_rl_caught_signal == SIGWINCH)
+ RL_CHECK_SIGNALS ();
+#endif /* SIGWINCH */
+#if defined (SIGALRM)
+ else if (_rl_caught_signal == SIGALRM
+# if defined (SIGVTALRM)
+ || _rl_caught_signal == SIGVTALRM
+# endif
+ )
+ RL_CHECK_SIGNALS ();
+#endif /* SIGALRM */
+
+ if (rl_signal_event_hook)
+ (*rl_signal_event_hook) ();
+ }
+}
+
+#if defined (HANDLE_MULTIBYTE)
+/* read multibyte char */
+int
+_rl_read_mbchar (char *mbchar, int size)
+{
+ int mb_len, c;
+ size_t mbchar_bytes_length;
+ WCHAR_T wc;
+ mbstate_t ps, ps_back;
+
+ memset(&ps, 0, sizeof (mbstate_t));
+ memset(&ps_back, 0, sizeof (mbstate_t));
+
+ mb_len = 0;
+ while (mb_len < size)
+ {
+ c = (mb_len == 0) ? _rl_bracketed_read_key () : rl_read_key ();
+
+ if (c < 0)
+ break;
+
+ mbchar[mb_len++] = c;
+
+ mbchar_bytes_length = MBRTOWC (&wc, mbchar, mb_len, &ps);
+ if (mbchar_bytes_length == (size_t)(-1))
+ break; /* invalid byte sequence for the current locale */
+ else if (mbchar_bytes_length == (size_t)(-2))
+ {
+ /* shorted bytes */
+ ps = ps_back;
+ continue;
+ }
+ else if (mbchar_bytes_length == 0)
+ {
+ mbchar[0] = '\0'; /* null wide character */
+ mb_len = 1;
+ break;
+ }
+ else if (mbchar_bytes_length > (size_t)(0))
+ break;
+ }
+
+ return mb_len;
+}
+
+/* Read a multibyte-character string whose first character is FIRST into
+ the buffer MB of length MLEN. Returns the last character read, which
+ may be FIRST. Used by the search functions, among others. Very similar
+ to _rl_read_mbchar. */
+int
+_rl_read_mbstring (int first, char *mb, int mlen)
+{
+ int i, c, n;
+ mbstate_t ps;
+
+ c = first;
+ memset (mb, 0, mlen);
+ for (i = 0; c >= 0 && i < mlen; i++)
+ {
+ mb[i] = (char)c;
+ memset (&ps, 0, sizeof (mbstate_t));
+ n = _rl_get_char_len (mb, &ps);
+ if (n == -2)
+ {
+ /* Read more for multibyte character */
+ RL_SETSTATE (RL_STATE_MOREINPUT);
+ c = rl_read_key ();
+ RL_UNSETSTATE (RL_STATE_MOREINPUT);
+ }
+ else
+ break;
+ }
+ return c;
+}
+#endif /* HANDLE_MULTIBYTE */
diff --git a/isearch.c b/isearch.c
new file mode 100644
index 0000000..c2d4d23
--- /dev/null
+++ b/isearch.c
@@ -0,0 +1,893 @@
+/* isearch.c - incremental searching */
+
+/* **************************************************************** */
+/* */
+/* I-Search and Searching */
+/* */
+/* **************************************************************** */
+
+/* Copyright (C) 1987-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#include <stdio.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif
+
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+/* Variables exported to other files in the readline library. */
+char *_rl_isearch_terminators = (char *)NULL;
+
+_rl_search_cxt *_rl_iscxt = 0;
+
+static int rl_search_history (int, int);
+
+static _rl_search_cxt *_rl_isearch_init (int);
+static void _rl_isearch_fini (_rl_search_cxt *);
+
+/* Last line found by the current incremental search, so we don't `find'
+ identical lines many times in a row. Now part of isearch context. */
+/* static char *prev_line_found; */
+
+/* Last search string and its length. */
+static char *last_isearch_string;
+static int last_isearch_string_len;
+
+static char * const default_isearch_terminators = "\033\012";
+
+_rl_search_cxt *
+_rl_scxt_alloc (int type, int flags)
+{
+ _rl_search_cxt *cxt;
+
+ cxt = (_rl_search_cxt *)xmalloc (sizeof (_rl_search_cxt));
+
+ cxt->type = type;
+ cxt->sflags = flags;
+
+ cxt->search_string = 0;
+ cxt->search_string_size = cxt->search_string_index = 0;
+
+ cxt->lines = 0;
+ cxt->allocated_line = 0;
+ cxt->hlen = cxt->hindex = 0;
+
+ cxt->save_point = rl_point;
+ cxt->save_mark = rl_mark;
+ cxt->save_line = where_history ();
+ cxt->last_found_line = cxt->save_line;
+ cxt->prev_line_found = 0;
+
+ cxt->save_undo_list = 0;
+
+ cxt->keymap = _rl_keymap;
+ cxt->okeymap = _rl_keymap;
+
+ cxt->history_pos = 0;
+ cxt->direction = 0;
+
+ cxt->prevc = cxt->lastc = 0;
+
+ cxt->sline = 0;
+ cxt->sline_len = cxt->sline_index = 0;
+
+ cxt->search_terminators = 0;
+
+ return cxt;
+}
+
+void
+_rl_scxt_dispose (_rl_search_cxt *cxt, int flags)
+{
+ FREE (cxt->search_string);
+ FREE (cxt->allocated_line);
+ FREE (cxt->lines);
+
+ xfree (cxt);
+}
+
+/* Search backwards through the history looking for a string which is typed
+ interactively. Start with the current line. */
+int
+rl_reverse_search_history (int sign, int key)
+{
+ return (rl_search_history (-sign, key));
+}
+
+/* Search forwards through the history looking for a string which is typed
+ interactively. Start with the current line. */
+int
+rl_forward_search_history (int sign, int key)
+{
+ return (rl_search_history (sign, key));
+}
+
+/* Display the current state of the search in the echo-area.
+ SEARCH_STRING contains the string that is being searched for,
+ DIRECTION is zero for forward, or non-zero for reverse,
+ WHERE is the history list number of the current line. If it is
+ -1, then this line is the starting one. */
+static void
+rl_display_search (char *search_string, int flags, int where)
+{
+ char *message;
+ int msglen, searchlen;
+
+ searchlen = (search_string && *search_string) ? strlen (search_string) : 0;
+
+ message = (char *)xmalloc (searchlen + 64);
+ msglen = 0;
+
+#if defined (NOTDEF)
+ if (where != -1)
+ {
+ sprintf (message, "[%d]", where + history_base);
+ msglen = strlen (message);
+ }
+#endif /* NOTDEF */
+
+ message[msglen++] = '(';
+
+ if (flags & SF_FAILED)
+ {
+ strcpy (message + msglen, "failed ");
+ msglen += 7;
+ }
+
+ if (flags & SF_REVERSE)
+ {
+ strcpy (message + msglen, "reverse-");
+ msglen += 8;
+ }
+
+ strcpy (message + msglen, "i-search)`");
+ msglen += 10;
+
+ if (search_string && *search_string)
+ {
+ strcpy (message + msglen, search_string);
+ msglen += searchlen;
+ }
+ else
+ _rl_optimize_redisplay ();
+
+ strcpy (message + msglen, "': ");
+
+ rl_message ("%s", message);
+ xfree (message);
+#if 0
+ /* rl_message calls this */
+ (*rl_redisplay_function) ();
+#endif
+}
+
+static _rl_search_cxt *
+_rl_isearch_init (int direction)
+{
+ _rl_search_cxt *cxt;
+ register int i;
+ HIST_ENTRY **hlist;
+
+ cxt = _rl_scxt_alloc (RL_SEARCH_ISEARCH, 0);
+ if (direction < 0)
+ cxt->sflags |= SF_REVERSE;
+
+ cxt->search_terminators = _rl_isearch_terminators ? _rl_isearch_terminators
+ : default_isearch_terminators;
+
+ /* Create an array of pointers to the lines that we want to search. */
+ hlist = history_list ();
+ rl_maybe_replace_line ();
+ i = 0;
+ if (hlist)
+ for (i = 0; hlist[i]; i++);
+
+ /* Allocate space for this many lines, +1 for the current input line,
+ and remember those lines. */
+ cxt->lines = (char **)xmalloc ((1 + (cxt->hlen = i)) * sizeof (char *));
+ for (i = 0; i < cxt->hlen; i++)
+ cxt->lines[i] = hlist[i]->line;
+
+ if (_rl_saved_line_for_history)
+ cxt->lines[i] = _rl_saved_line_for_history->line;
+ else
+ {
+ /* Keep track of this so we can free it. */
+ cxt->allocated_line = (char *)xmalloc (1 + strlen (rl_line_buffer));
+ strcpy (cxt->allocated_line, &rl_line_buffer[0]);
+ cxt->lines[i] = cxt->allocated_line;
+ }
+
+ cxt->hlen++;
+
+ /* The line where we start the search. */
+ cxt->history_pos = cxt->save_line;
+
+ rl_save_prompt ();
+
+ /* Initialize search parameters. */
+ cxt->search_string = (char *)xmalloc (cxt->search_string_size = 128);
+ cxt->search_string[cxt->search_string_index = 0] = '\0';
+
+ /* Normalize DIRECTION into 1 or -1. */
+ cxt->direction = (direction >= 0) ? 1 : -1;
+
+ cxt->sline = rl_line_buffer;
+ cxt->sline_len = strlen (cxt->sline);
+ cxt->sline_index = rl_point;
+
+ _rl_iscxt = cxt; /* save globally */
+
+ /* experimental right now */
+ _rl_init_executing_keyseq ();
+
+ return cxt;
+}
+
+static void
+_rl_isearch_fini (_rl_search_cxt *cxt)
+{
+ /* First put back the original state. */
+ rl_replace_line (cxt->lines[cxt->save_line], 0);
+
+ rl_restore_prompt ();
+
+ /* Save the search string for possible later use. */
+ FREE (last_isearch_string);
+ last_isearch_string = cxt->search_string;
+ last_isearch_string_len = cxt->search_string_index;
+ cxt->search_string = 0;
+ cxt->search_string_size = 0;
+ cxt->search_string_index = 0;
+
+ if (cxt->last_found_line < cxt->save_line)
+ rl_get_previous_history (cxt->save_line - cxt->last_found_line, 0);
+ else
+ rl_get_next_history (cxt->last_found_line - cxt->save_line, 0);
+
+ /* If the string was not found, put point at the end of the last matching
+ line. If last_found_line == orig_line, we didn't find any matching
+ history lines at all, so put point back in its original position. */
+ if (cxt->sline_index < 0)
+ {
+ if (cxt->last_found_line == cxt->save_line)
+ cxt->sline_index = cxt->save_point;
+ else
+ cxt->sline_index = strlen (rl_line_buffer);
+ rl_mark = cxt->save_mark;
+ rl_deactivate_mark ();
+ }
+
+ rl_point = cxt->sline_index;
+ /* Don't worry about where to put the mark here; rl_get_previous_history
+ and rl_get_next_history take care of it.
+ If we want to highlight the search string, this is where to set the
+ point and mark to do it. */
+ _rl_fix_point (0);
+ rl_deactivate_mark ();
+
+/* _rl_optimize_redisplay (); */
+ rl_clear_message ();
+}
+
+/* XXX - we could use _rl_bracketed_read_mbstring () here. */
+int
+_rl_search_getchar (_rl_search_cxt *cxt)
+{
+ int c;
+
+ /* Read a key and decide how to proceed. */
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ c = cxt->lastc = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+#if defined (HANDLE_MULTIBYTE)
+ /* This ends up with C (and LASTC) being set to the last byte of the
+ multibyte character. In most cases c == lastc == mb[0] */
+ if (c >= 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ c = cxt->lastc = _rl_read_mbstring (cxt->lastc, cxt->mb, MB_LEN_MAX);
+#endif
+
+ RL_CHECK_SIGNALS ();
+ return c;
+}
+
+#define ENDSRCH_CHAR(c) \
+ ((CTRL_CHAR (c) || META_CHAR (c) || (c) == RUBOUT) && ((c) != CTRL ('G')))
+
+/* Process just-read character C according to isearch context CXT. Return
+ -1 if the caller should just free the context and return, 0 if we should
+ break out of the loop, and 1 if we should continue to read characters. */
+int
+_rl_isearch_dispatch (_rl_search_cxt *cxt, int c)
+{
+ int n, wstart, wlen, limit, cval, incr;
+ char *paste;
+ size_t pastelen;
+ int j;
+ rl_command_func_t *f;
+
+ f = (rl_command_func_t *)NULL;
+
+ if (c < 0)
+ {
+ cxt->sflags |= SF_FAILED;
+ cxt->history_pos = cxt->last_found_line;
+ return -1;
+ }
+
+ _rl_add_executing_keyseq (c);
+
+ /* XXX - experimental code to allow users to bracketed-paste into the search
+ string even when ESC is one of the isearch-terminators. Not perfect yet. */
+ if (_rl_enable_bracketed_paste && c == ESC && strchr (cxt->search_terminators, c) && (n = _rl_nchars_available ()) > (BRACK_PASTE_SLEN-1))
+ {
+ j = _rl_read_bracketed_paste_prefix (c);
+ if (j == 1)
+ {
+ cxt->lastc = -7; /* bracketed paste, see below */
+ goto opcode_dispatch;
+ }
+ else if (_rl_pushed_input_available ()) /* eat extra char we pushed back */
+ c = cxt->lastc = rl_read_key ();
+ else
+ c = cxt->lastc; /* last ditch */
+ }
+
+ /* If we are moving into a new keymap, modify cxt->keymap and go on.
+ This can be a problem if c == ESC and we want to terminate the
+ incremental search, so we check */
+ if (c >= 0 && cxt->keymap[c].type == ISKMAP && strchr (cxt->search_terminators, cxt->lastc) == 0)
+ {
+ /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued
+ takes microseconds, so multiply by 1000. If we don't get any
+ additional input and this keymap shadows another function, process
+ that key as if it was all we read. */
+ if (_rl_keyseq_timeout > 0 &&
+ RL_ISSTATE (RL_STATE_CALLBACK) == 0 &&
+ RL_ISSTATE (RL_STATE_INPUTPENDING) == 0 &&
+ _rl_pushed_input_available () == 0 &&
+ ((Keymap)(cxt->keymap[c].function))[ANYOTHERKEY].function &&
+ _rl_input_queued (_rl_keyseq_timeout*1000) == 0)
+ goto add_character;
+
+ cxt->okeymap = cxt->keymap;
+ cxt->keymap = FUNCTION_TO_KEYMAP (cxt->keymap, c);
+ cxt->sflags |= SF_CHGKMAP;
+ /* XXX - we should probably save this sequence, so we can do
+ something useful if this doesn't end up mapping to a command we
+ interpret here. Right now we just save the most recent character
+ that caused the index into a new keymap. */
+ cxt->prevc = c;
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ if (cxt->mb[1] == 0)
+ {
+ cxt->pmb[0] = c; /* XXX should be == cxt->mb[0] */
+ cxt->pmb[1] = '\0';
+ }
+ else
+ memcpy (cxt->pmb, cxt->mb, sizeof (cxt->pmb));
+ }
+#endif
+ return 1;
+ }
+
+add_character:
+
+ /* Translate the keys we do something with to opcodes. */
+ if (c >= 0 && cxt->keymap[c].type == ISFUNC)
+ {
+ /* If we have a multibyte character, see if it's bound to something that
+ affects the search. */
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0 && cxt->mb[1])
+ f = rl_function_of_keyseq (cxt->mb, cxt->keymap, (int *)NULL);
+ else
+#endif
+ {
+ f = cxt->keymap[c].function;
+ if (f == rl_do_lowercase_version)
+ f = cxt->keymap[_rl_to_lower (c)].function;
+ }
+
+ if (f == rl_reverse_search_history)
+ cxt->lastc = (cxt->sflags & SF_REVERSE) ? -1 : -2;
+ else if (f == rl_forward_search_history)
+ cxt->lastc = (cxt->sflags & SF_REVERSE) ? -2 : -1;
+ else if (f == rl_rubout)
+ cxt->lastc = -3;
+ else if (c == CTRL ('G') || f == rl_abort)
+ cxt->lastc = -4;
+ else if (c == CTRL ('W') || f == rl_unix_word_rubout) /* XXX */
+ cxt->lastc = -5;
+ else if (c == CTRL ('Y') || f == rl_yank) /* XXX */
+ cxt->lastc = -6;
+ else if (f == rl_bracketed_paste_begin)
+ cxt->lastc = -7;
+ }
+
+ /* If we changed the keymap earlier while translating a key sequence into
+ a command, restore it now that we've succeeded. */
+ if (cxt->sflags & SF_CHGKMAP)
+ {
+ cxt->keymap = cxt->okeymap;
+ cxt->sflags &= ~SF_CHGKMAP;
+ /* If we indexed into a new keymap, but didn't map to a command that
+ affects the search (lastc > 0), and the character that mapped to a
+ new keymap would have ended the search (ENDSRCH_CHAR(cxt->prevc)),
+ handle that now as if the previous char would have ended the search
+ and we would have read the current character. */
+ /* XXX - should we check cxt->mb? */
+ if (cxt->lastc > 0 && ENDSRCH_CHAR (cxt->prevc))
+ {
+ rl_stuff_char (cxt->lastc);
+ rl_execute_next (cxt->prevc);
+ /* XXX - do we insert everything in cxt->pmb? */
+ return (0);
+ }
+ /* Otherwise, if the current character is mapped to self-insert or
+ nothing (i.e., not an editing command), and the previous character
+ was a keymap index, then we need to insert both the previous
+ character and the current character into the search string. */
+ else if (cxt->lastc > 0 && cxt->prevc > 0 &&
+ cxt->keymap[cxt->prevc].type == ISKMAP &&
+ (f == 0 || f == rl_insert))
+ {
+ /* Make lastc be the next character read */
+ /* XXX - do we insert everything in cxt->mb? */
+ rl_execute_next (cxt->lastc);
+ /* Dispatch on the previous character (insert into search string) */
+ cxt->lastc = cxt->prevc;
+#if defined (HANDLE_MULTIBYTE)
+ /* Have to overwrite cxt->mb here because dispatch uses it below */
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ if (cxt->pmb[1] == 0)
+ {
+ cxt->mb[0] = cxt->lastc; /* == cxt->prevc */
+ cxt->mb[1] = '\0';
+ }
+ else
+ memcpy (cxt->mb, cxt->pmb, sizeof (cxt->mb));
+ }
+#endif
+ cxt->prevc = 0;
+ }
+ else if (cxt->lastc > 0 && cxt->prevc > 0 && f && f != rl_insert)
+ {
+ _rl_term_executing_keyseq (); /* should this go in the caller? */
+
+ _rl_pending_command.map = cxt->keymap;
+ _rl_pending_command.count = 1; /* XXX */
+ _rl_pending_command.key = cxt->lastc;
+ _rl_pending_command.func = f;
+ _rl_command_to_execute = &_rl_pending_command;
+
+ return (0);
+ }
+ }
+
+ /* The characters in isearch_terminators (set from the user-settable
+ variable isearch-terminators) are used to terminate the search but
+ not subsequently execute the character as a command. The default
+ value is "\033\012" (ESC and C-J). */
+ if (cxt->lastc > 0 && strchr (cxt->search_terminators, cxt->lastc))
+ {
+ /* ESC still terminates the search, but if there is pending
+ input or if input arrives within 0.1 seconds (on systems
+ with select(2)) it is used as a prefix character
+ with rl_execute_next. WATCH OUT FOR THIS! This is intended
+ to allow the arrow keys to be used like ^F and ^B are used
+ to terminate the search and execute the movement command.
+ XXX - since _rl_input_available depends on the application-
+ settable keyboard timeout value, this could alternatively
+ use _rl_input_queued(100000) */
+ if (cxt->lastc == ESC && (_rl_pushed_input_available () || _rl_input_available ()))
+ rl_execute_next (ESC);
+ return (0);
+ }
+
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ if (cxt->lastc >= 0 && (cxt->mb[0] && cxt->mb[1] == '\0') && ENDSRCH_CHAR (cxt->lastc))
+ {
+ /* This sets rl_pending_input to LASTC; it will be picked up the next
+ time rl_read_key is called. */
+ rl_execute_next (cxt->lastc);
+ return (0);
+ }
+ }
+ else
+#endif
+ if (cxt->lastc >= 0 && ENDSRCH_CHAR (cxt->lastc))
+ {
+ /* This sets rl_pending_input to LASTC; it will be picked up the next
+ time rl_read_key is called. */
+ rl_execute_next (cxt->lastc);
+ return (0);
+ }
+
+ _rl_init_executing_keyseq ();
+
+opcode_dispatch:
+ /* Now dispatch on the character. `Opcodes' affect the search string or
+ state. Other characters are added to the string. */
+ switch (cxt->lastc)
+ {
+ /* search again */
+ case -1:
+ if (cxt->search_string_index == 0)
+ {
+ if (last_isearch_string)
+ {
+ cxt->search_string_size = 64 + last_isearch_string_len;
+ cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size);
+ strcpy (cxt->search_string, last_isearch_string);
+ cxt->search_string_index = last_isearch_string_len;
+ rl_display_search (cxt->search_string, cxt->sflags, -1);
+ break;
+ }
+ /* XXX - restore keymap here? */
+ return (1);
+ }
+ else if ((cxt->sflags & SF_REVERSE) && cxt->sline_index >= 0)
+ cxt->sline_index--;
+ else if (cxt->sline_index != cxt->sline_len)
+ cxt->sline_index++;
+ else
+ rl_ding ();
+ break;
+
+ /* switch directions */
+ case -2:
+ cxt->direction = -cxt->direction;
+ if (cxt->direction < 0)
+ cxt->sflags |= SF_REVERSE;
+ else
+ cxt->sflags &= ~SF_REVERSE;
+ break;
+
+ /* delete character from search string. */
+ case -3: /* C-H, DEL */
+ /* This is tricky. To do this right, we need to keep a
+ stack of search positions for the current search, with
+ sentinels marking the beginning and end. But this will
+ do until we have a real isearch-undo. */
+ if (cxt->search_string_index == 0)
+ rl_ding ();
+ else if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ cxt->search_string[--cxt->search_string_index] = '\0';
+ else
+ {
+ wstart = _rl_find_prev_mbchar (cxt->search_string, cxt->search_string_index, MB_FIND_NONZERO);
+ if (wstart >= 0)
+ cxt->search_string[cxt->search_string_index = wstart] = '\0';
+ else
+ cxt->search_string[cxt->search_string_index = 0] = '\0';
+ }
+
+ if (cxt->search_string_index == 0)
+ rl_ding ();
+
+ break;
+
+ case -4: /* C-G, abort */
+ rl_replace_line (cxt->lines[cxt->save_line], 0);
+ rl_point = cxt->save_point;
+ rl_mark = cxt->save_mark;
+ rl_deactivate_mark ();
+ rl_restore_prompt();
+ rl_clear_message ();
+
+ _rl_fix_point (1); /* in case save_line and save_point are out of sync */
+ return -1;
+
+ case -5: /* C-W */
+ /* skip over portion of line we already matched and yank word */
+ wstart = rl_point + cxt->search_string_index;
+ if (wstart >= rl_end)
+ {
+ rl_ding ();
+ break;
+ }
+
+ /* if not in a word, move to one. */
+ cval = _rl_char_value (rl_line_buffer, wstart);
+ if (_rl_walphabetic (cval) == 0)
+ {
+ rl_ding ();
+ break;
+ }
+ n = MB_NEXTCHAR (rl_line_buffer, wstart, 1, MB_FIND_NONZERO);;
+ while (n < rl_end)
+ {
+ cval = _rl_char_value (rl_line_buffer, n);
+ if (_rl_walphabetic (cval) == 0)
+ break;
+ n = MB_NEXTCHAR (rl_line_buffer, n, 1, MB_FIND_NONZERO);;
+ }
+ wlen = n - wstart + 1;
+ if (cxt->search_string_index + wlen + 1 >= cxt->search_string_size)
+ {
+ cxt->search_string_size += wlen + 1;
+ cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size);
+ }
+ for (; wstart < n; wstart++)
+ cxt->search_string[cxt->search_string_index++] = rl_line_buffer[wstart];
+ cxt->search_string[cxt->search_string_index] = '\0';
+ break;
+
+ case -6: /* C-Y */
+ /* skip over portion of line we already matched and yank rest */
+ wstart = rl_point + cxt->search_string_index;
+ if (wstart >= rl_end)
+ {
+ rl_ding ();
+ break;
+ }
+ n = rl_end - wstart + 1;
+ if (cxt->search_string_index + n + 1 >= cxt->search_string_size)
+ {
+ cxt->search_string_size += n + 1;
+ cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size);
+ }
+ for (n = wstart; n < rl_end; n++)
+ cxt->search_string[cxt->search_string_index++] = rl_line_buffer[n];
+ cxt->search_string[cxt->search_string_index] = '\0';
+ break;
+
+ case -7: /* bracketed paste */
+ paste = _rl_bracketed_text (&pastelen);
+ if (paste == 0 || *paste == 0)
+ {
+ xfree (paste);
+ break;
+ }
+ if (_rl_enable_active_region)
+ rl_activate_mark ();
+ if (cxt->search_string_index + pastelen + 1 >= cxt->search_string_size)
+ {
+ cxt->search_string_size += pastelen + 2;
+ cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size);
+ }
+ memcpy (cxt->search_string + cxt->search_string_index, paste, pastelen);
+ cxt->search_string_index += pastelen;
+ cxt->search_string[cxt->search_string_index] = '\0';
+ xfree (paste);
+ break;
+
+ /* Add character to search string and continue search. */
+ default:
+#if defined (HANDLE_MULTIBYTE)
+ wlen = (cxt->mb[0] == 0 || cxt->mb[1] == 0) ? 1 : RL_STRLEN (cxt->mb);
+#else
+ wlen = 1;
+#endif
+ if (cxt->search_string_index + wlen + 1 >= cxt->search_string_size)
+ {
+ cxt->search_string_size += 128; /* 128 much greater than MB_CUR_MAX */
+ cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size);
+ }
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ int j;
+
+ if (cxt->mb[0] == 0 || cxt->mb[1] == 0)
+ cxt->search_string[cxt->search_string_index++] = cxt->mb[0];
+ else
+ for (j = 0; j < wlen; )
+ cxt->search_string[cxt->search_string_index++] = cxt->mb[j++];
+ }
+ else
+#endif
+ cxt->search_string[cxt->search_string_index++] = cxt->lastc; /* XXX - was c instead of lastc */
+ cxt->search_string[cxt->search_string_index] = '\0';
+ break;
+ }
+
+ for (cxt->sflags &= ~(SF_FOUND|SF_FAILED);; )
+ {
+ if (cxt->search_string_index == 0)
+ {
+ cxt->sflags |= SF_FAILED;
+ break;
+ }
+
+ limit = cxt->sline_len - cxt->search_string_index + 1;
+
+ /* Search the current line. */
+ while ((cxt->sflags & SF_REVERSE) ? (cxt->sline_index >= 0) : (cxt->sline_index < limit))
+ {
+ if (STREQN (cxt->search_string, cxt->sline + cxt->sline_index, cxt->search_string_index))
+ {
+ cxt->sflags |= SF_FOUND;
+ break;
+ }
+ else
+ cxt->sline_index += cxt->direction;
+
+ if (cxt->sline_index < 0)
+ {
+ cxt->sline_index = 0;
+ break;
+ }
+ }
+ if (cxt->sflags & SF_FOUND)
+ break;
+
+ /* Move to the next line, but skip new copies of the line
+ we just found and lines shorter than the string we're
+ searching for. */
+ do
+ {
+ /* Move to the next line. */
+ cxt->history_pos += cxt->direction;
+
+ /* At limit for direction? */
+ if ((cxt->sflags & SF_REVERSE) ? (cxt->history_pos < 0) : (cxt->history_pos == cxt->hlen))
+ {
+ cxt->sflags |= SF_FAILED;
+ break;
+ }
+
+ /* We will need these later. */
+ cxt->sline = cxt->lines[cxt->history_pos];
+ cxt->sline_len = strlen (cxt->sline);
+ }
+ while ((cxt->prev_line_found && STREQ (cxt->prev_line_found, cxt->lines[cxt->history_pos])) ||
+ (cxt->search_string_index > cxt->sline_len));
+
+ if (cxt->sflags & SF_FAILED)
+ {
+ /* XXX - reset sline_index if < 0 */
+ if (cxt->sline_index < 0)
+ cxt->sline_index = 0;
+ break;
+ }
+
+ /* Now set up the line for searching... */
+ cxt->sline_index = (cxt->sflags & SF_REVERSE) ? cxt->sline_len - cxt->search_string_index : 0;
+ }
+
+ /* reset the keymaps for the next time through the loop */
+ cxt->keymap = cxt->okeymap = _rl_keymap;
+
+ if (cxt->sflags & SF_FAILED)
+ {
+ /* We cannot find the search string. Ding the bell. */
+ rl_ding ();
+ cxt->history_pos = cxt->last_found_line;
+ rl_deactivate_mark ();
+ rl_display_search (cxt->search_string, cxt->sflags, (cxt->history_pos == cxt->save_line) ? -1 : cxt->history_pos);
+ return 1;
+ }
+
+ /* We have found the search string. Just display it. But don't
+ actually move there in the history list until the user accepts
+ the location. */
+ if (cxt->sflags & SF_FOUND)
+ {
+ cxt->prev_line_found = cxt->lines[cxt->history_pos];
+ rl_replace_line (cxt->lines[cxt->history_pos], 0);
+ if (_rl_enable_active_region)
+ rl_activate_mark ();
+ rl_point = cxt->sline_index;
+ if (rl_mark_active_p () && cxt->search_string_index > 0)
+ rl_mark = rl_point + cxt->search_string_index;
+ cxt->last_found_line = cxt->history_pos;
+ rl_display_search (cxt->search_string, cxt->sflags, (cxt->history_pos == cxt->save_line) ? -1 : cxt->history_pos);
+ }
+
+ return 1;
+}
+
+int
+_rl_isearch_cleanup (_rl_search_cxt *cxt, int r)
+{
+ if (r >= 0)
+ _rl_isearch_fini (cxt);
+ _rl_scxt_dispose (cxt, 0);
+ _rl_iscxt = 0;
+
+ RL_UNSETSTATE(RL_STATE_ISEARCH);
+
+ return (r != 0);
+}
+
+/* Search through the history looking for an interactively typed string.
+ This is analogous to i-search. We start the search in the current line.
+ DIRECTION is which direction to search; >= 0 means forward, < 0 means
+ backwards. */
+static int
+rl_search_history (int direction, int invoking_key)
+{
+ _rl_search_cxt *cxt; /* local for now, but saved globally */
+ int c, r;
+
+ RL_SETSTATE(RL_STATE_ISEARCH);
+ cxt = _rl_isearch_init (direction);
+
+ rl_display_search (cxt->search_string, cxt->sflags, -1);
+
+ /* If we are using the callback interface, all we do is set up here and
+ return. The key is that we leave RL_STATE_ISEARCH set. */
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ return (0);
+
+ r = -1;
+ for (;;)
+ {
+ c = _rl_search_getchar (cxt);
+ /* We might want to handle EOF here (c == 0) */
+ r = _rl_isearch_dispatch (cxt, cxt->lastc);
+ if (r <= 0)
+ break;
+ }
+
+ /* The searching is over. The user may have found the string that she
+ was looking for, or else she may have exited a failing search. If
+ LINE_INDEX is -1, then that shows that the string searched for was
+ not found. We use this to determine where to place rl_point. */
+ return (_rl_isearch_cleanup (cxt, r));
+}
+
+#if defined (READLINE_CALLBACKS)
+/* Called from the callback functions when we are ready to read a key. The
+ callback functions know to call this because RL_ISSTATE(RL_STATE_ISEARCH).
+ If _rl_isearch_dispatch finishes searching, this function is responsible
+ for turning off RL_STATE_ISEARCH, which it does using _rl_isearch_cleanup. */
+int
+_rl_isearch_callback (_rl_search_cxt *cxt)
+{
+ int c, r;
+
+ c = _rl_search_getchar (cxt);
+ /* We might want to handle EOF here */
+ r = _rl_isearch_dispatch (cxt, cxt->lastc);
+
+ return (r <= 0) ? _rl_isearch_cleanup (cxt, r) : 0;
+}
+#endif
diff --git a/keymaps.c b/keymaps.c
new file mode 100644
index 0000000..4ade30b
--- /dev/null
+++ b/keymaps.c
@@ -0,0 +1,174 @@
+/* keymaps.c -- Functions and keymaps for the GNU Readline library. */
+
+/* Copyright (C) 1988,1989-2009,2017 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h> /* for FILE * definition for readline.h */
+
+#include "readline.h"
+#include "rlconf.h"
+
+#include "emacs_keymap.c"
+
+#if defined (VI_MODE)
+#include "vi_keymap.c"
+#endif
+
+#include "xmalloc.h"
+
+/* **************************************************************** */
+/* */
+/* Functions for manipulating Keymaps. */
+/* */
+/* **************************************************************** */
+
+
+/* Return a new, empty keymap.
+ Free it with free() when you are done. */
+Keymap
+rl_make_bare_keymap (void)
+{
+ register int i;
+ Keymap keymap;
+
+ keymap = (Keymap)xmalloc (KEYMAP_SIZE * sizeof (KEYMAP_ENTRY));
+ for (i = 0; i < KEYMAP_SIZE; i++)
+ {
+ keymap[i].type = ISFUNC;
+ keymap[i].function = (rl_command_func_t *)NULL;
+ }
+
+#if 0
+ for (i = 'A'; i < ('Z' + 1); i++)
+ {
+ keymap[i].type = ISFUNC;
+ keymap[i].function = rl_do_lowercase_version;
+ }
+#endif
+
+ return (keymap);
+}
+
+/* A convenience function that returns 1 if there are no keys bound to
+ functions in KEYMAP */
+int
+rl_empty_keymap (Keymap keymap)
+{
+ int i;
+
+ for (i = 0; i < ANYOTHERKEY; i++)
+ {
+ if (keymap[i].type != ISFUNC || keymap[i].function)
+ return 0;
+ }
+ return 1;
+}
+
+/* Return a new keymap which is a copy of MAP. Just copies pointers, does
+ not copy text of macros or descend into child keymaps. */
+Keymap
+rl_copy_keymap (Keymap map)
+{
+ register int i;
+ Keymap temp;
+
+ temp = rl_make_bare_keymap ();
+ for (i = 0; i < KEYMAP_SIZE; i++)
+ {
+ temp[i].type = map[i].type;
+ temp[i].function = map[i].function;
+ }
+ return (temp);
+}
+
+/* Return a new keymap with the printing characters bound to rl_insert,
+ the uppercase Meta characters bound to run their lowercase equivalents,
+ and the Meta digits bound to produce numeric arguments. */
+Keymap
+rl_make_keymap (void)
+{
+ register int i;
+ Keymap newmap;
+
+ newmap = rl_make_bare_keymap ();
+
+ /* All ASCII printing characters are self-inserting. */
+ for (i = ' '; i < 127; i++)
+ newmap[i].function = rl_insert;
+
+ newmap[TAB].function = rl_insert;
+ newmap[RUBOUT].function = rl_rubout; /* RUBOUT == 127 */
+ newmap[CTRL('H')].function = rl_rubout;
+
+#if KEYMAP_SIZE > 128
+ /* Printing characters in ISO Latin-1 and some 8-bit character sets. */
+ for (i = 128; i < 256; i++)
+ newmap[i].function = rl_insert;
+#endif /* KEYMAP_SIZE > 128 */
+
+ return (newmap);
+}
+
+/* Free the storage associated with MAP. */
+void
+rl_discard_keymap (Keymap map)
+{
+ int i;
+
+ if (map == 0)
+ return;
+
+ for (i = 0; i < KEYMAP_SIZE; i++)
+ {
+ switch (map[i].type)
+ {
+ case ISFUNC:
+ break;
+
+ case ISKMAP:
+ rl_discard_keymap ((Keymap)map[i].function);
+ xfree ((char *)map[i].function);
+ break;
+
+ case ISMACR:
+ xfree ((char *)map[i].function);
+ break;
+ }
+ }
+}
+
+/* Convenience function that discards, then frees, MAP. */
+void
+rl_free_keymap (Keymap map)
+{
+ rl_discard_keymap (map);
+ xfree ((char *)map);
+}
diff --git a/keymaps.h b/keymaps.h
new file mode 100644
index 0000000..2903814
--- /dev/null
+++ b/keymaps.h
@@ -0,0 +1,100 @@
+/* keymaps.h -- Manipulation of readline keymaps. */
+
+/* Copyright (C) 1987, 1989, 1992-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _KEYMAPS_H_
+#define _KEYMAPS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined (READLINE_LIBRARY)
+# include "rlstdc.h"
+# include "chardefs.h"
+# include "rltypedefs.h"
+#else
+# include <readline/rlstdc.h>
+# include <readline/chardefs.h>
+# include <readline/rltypedefs.h>
+#endif
+
+/* A keymap contains one entry for each key in the ASCII set.
+ Each entry consists of a type and a pointer.
+ FUNCTION is the address of a function to run, or the
+ address of a keymap to indirect through.
+ TYPE says which kind of thing FUNCTION is. */
+typedef struct _keymap_entry {
+ char type;
+ rl_command_func_t *function;
+} KEYMAP_ENTRY;
+
+/* This must be large enough to hold bindings for all of the characters
+ in a desired character set (e.g, 128 for ASCII, 256 for ISO Latin-x,
+ and so on) plus one for subsequence matching. */
+#define KEYMAP_SIZE 257
+#define ANYOTHERKEY KEYMAP_SIZE-1
+
+typedef KEYMAP_ENTRY KEYMAP_ENTRY_ARRAY[KEYMAP_SIZE];
+typedef KEYMAP_ENTRY *Keymap;
+
+/* The values that TYPE can have in a keymap entry. */
+#define ISFUNC 0
+#define ISKMAP 1
+#define ISMACR 2
+
+extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap, emacs_meta_keymap, emacs_ctlx_keymap;
+extern KEYMAP_ENTRY_ARRAY vi_insertion_keymap, vi_movement_keymap;
+
+/* Return a new, empty keymap.
+ Free it with free() when you are done. */
+extern Keymap rl_make_bare_keymap (void);
+
+/* Return a new keymap which is a copy of MAP. */
+extern Keymap rl_copy_keymap (Keymap);
+
+/* Return a new keymap with the printing characters bound to rl_insert,
+ the lowercase Meta characters bound to run their equivalents, and
+ the Meta digits bound to produce numeric arguments. */
+extern Keymap rl_make_keymap (void);
+
+/* Free the storage associated with a keymap. */
+extern void rl_discard_keymap (Keymap);
+
+/* These functions actually appear in bind.c */
+
+/* Return the keymap corresponding to a given name. Names look like
+ `emacs' or `emacs-meta' or `vi-insert'. */
+extern Keymap rl_get_keymap_by_name (const char *);
+
+/* Return the current keymap. */
+extern Keymap rl_get_keymap (void);
+
+/* Set the current keymap to MAP. */
+extern void rl_set_keymap (Keymap);
+
+/* Set the name of MAP to NAME */
+extern int rl_set_keymap_name (const char *, Keymap);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _KEYMAPS_H_ */
diff --git a/kill.c b/kill.c
new file mode 100644
index 0000000..4cf933b
--- /dev/null
+++ b/kill.c
@@ -0,0 +1,900 @@
+/* kill.c -- kill ring management. */
+
+/* Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h> /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+/* **************************************************************** */
+/* */
+/* Killing Mechanism */
+/* */
+/* **************************************************************** */
+
+/* What we assume for a max number of kills. */
+#define DEFAULT_MAX_KILLS 10
+
+/* The real variable to look at to find out when to flush kills. */
+static int rl_max_kills = DEFAULT_MAX_KILLS;
+
+/* Where to store killed text. */
+static char **rl_kill_ring = (char **)NULL;
+
+/* Where we are in the kill ring. */
+static int rl_kill_index;
+
+/* How many slots we have in the kill ring. */
+static int rl_kill_ring_length;
+
+static int _rl_copy_to_kill_ring (char *, int);
+static int region_kill_internal (int);
+static int _rl_copy_word_as_kill (int, int);
+static int rl_yank_nth_arg_internal (int, int, int);
+
+/* How to say that you only want to save a certain amount
+ of kill material. */
+int
+rl_set_retained_kills (int num)
+{
+ return 0;
+}
+
+/* Add TEXT to the kill ring, allocating a new kill ring slot as necessary.
+ This uses TEXT directly, so the caller must not free it. If APPEND is
+ non-zero, and the last command was a kill, the text is appended to the
+ current kill ring slot, otherwise prepended. */
+static int
+_rl_copy_to_kill_ring (char *text, int append)
+{
+ char *old, *new;
+ int slot;
+
+ /* First, find the slot to work with. */
+ if (_rl_last_command_was_kill == 0 || rl_kill_ring == 0)
+ {
+ /* Get a new slot. */
+ if (rl_kill_ring == 0)
+ {
+ /* If we don't have any defined, then make one. */
+ rl_kill_ring = (char **)
+ xmalloc (((rl_kill_ring_length = 1) + 1) * sizeof (char *));
+ rl_kill_ring[slot = 0] = (char *)NULL;
+ }
+ else
+ {
+ /* We have to add a new slot on the end, unless we have
+ exceeded the max limit for remembering kills. */
+ slot = rl_kill_ring_length;
+ if (slot == rl_max_kills)
+ {
+ register int i;
+ xfree (rl_kill_ring[0]);
+ for (i = 0; i < slot; i++)
+ rl_kill_ring[i] = rl_kill_ring[i + 1];
+ }
+ else
+ {
+ slot = rl_kill_ring_length += 1;
+ rl_kill_ring = (char **)xrealloc (rl_kill_ring, (slot + 1) * sizeof (char *));
+ }
+ rl_kill_ring[--slot] = (char *)NULL;
+ }
+ }
+ else
+ slot = rl_kill_ring_length - 1;
+
+ /* If the last command was a kill, prepend or append. */
+ if (_rl_last_command_was_kill && rl_kill_ring[slot] && rl_editing_mode != vi_mode)
+ {
+ old = rl_kill_ring[slot];
+ new = (char *)xmalloc (1 + strlen (old) + strlen (text));
+
+ if (append)
+ {
+ strcpy (new, old);
+ strcat (new, text);
+ }
+ else
+ {
+ strcpy (new, text);
+ strcat (new, old);
+ }
+ xfree (old);
+ xfree (text);
+ rl_kill_ring[slot] = new;
+ }
+ else
+ rl_kill_ring[slot] = text;
+
+ rl_kill_index = slot;
+ return 0;
+}
+
+/* The way to kill something. This appends or prepends to the last
+ kill, if the last command was a kill command. if FROM is less
+ than TO, then the text is appended, otherwise prepended. If the
+ last command was not a kill command, then a new slot is made for
+ this kill. */
+int
+rl_kill_text (int from, int to)
+{
+ char *text;
+
+ /* Is there anything to kill? */
+ if (from == to)
+ {
+ _rl_last_command_was_kill++;
+ return 0;
+ }
+
+ text = rl_copy_text (from, to);
+
+ /* Delete the copied text from the line. */
+ rl_delete_text (from, to);
+
+ _rl_copy_to_kill_ring (text, from < to);
+
+ _rl_last_command_was_kill++;
+ return 0;
+}
+
+/* Now REMEMBER! In order to do prepending or appending correctly, kill
+ commands always make rl_point's original position be the FROM argument,
+ and rl_point's extent be the TO argument. */
+
+/* **************************************************************** */
+/* */
+/* Killing Commands */
+/* */
+/* **************************************************************** */
+
+/* Delete the word at point, saving the text in the kill ring. */
+int
+rl_kill_word (int count, int key)
+{
+ int orig_point;
+
+ if (count < 0)
+ return (rl_backward_kill_word (-count, key));
+ else
+ {
+ orig_point = rl_point;
+ rl_forward_word (count, key);
+
+ if (rl_point != orig_point)
+ rl_kill_text (orig_point, rl_point);
+
+ rl_point = orig_point;
+ if (rl_editing_mode == emacs_mode)
+ rl_mark = rl_point;
+ }
+ return 0;
+}
+
+/* Rubout the word before point, placing it on the kill ring. */
+int
+rl_backward_kill_word (int count, int key)
+{
+ int orig_point;
+
+ if (count < 0)
+ return (rl_kill_word (-count, key));
+ else
+ {
+ orig_point = rl_point;
+ rl_backward_word (count, key);
+
+ if (rl_point != orig_point)
+ rl_kill_text (orig_point, rl_point);
+
+ if (rl_editing_mode == emacs_mode)
+ rl_mark = rl_point;
+ }
+ return 0;
+}
+
+/* Kill from here to the end of the line. If DIRECTION is negative, kill
+ back to the line start instead. */
+int
+rl_kill_line (int direction, int key)
+{
+ int orig_point;
+
+ if (direction < 0)
+ return (rl_backward_kill_line (1, key));
+ else
+ {
+ orig_point = rl_point;
+ rl_end_of_line (1, key);
+ if (orig_point != rl_point)
+ rl_kill_text (orig_point, rl_point);
+ rl_point = orig_point;
+ if (rl_editing_mode == emacs_mode)
+ rl_mark = rl_point;
+ }
+ return 0;
+}
+
+/* Kill backwards to the start of the line. If DIRECTION is negative, kill
+ forwards to the line end instead. */
+int
+rl_backward_kill_line (int direction, int key)
+{
+ int orig_point;
+
+ if (direction < 0)
+ return (rl_kill_line (1, key));
+ else
+ {
+ if (rl_point == 0)
+ rl_ding ();
+ else
+ {
+ orig_point = rl_point;
+ rl_beg_of_line (1, key);
+ if (rl_point != orig_point)
+ rl_kill_text (orig_point, rl_point);
+ if (rl_editing_mode == emacs_mode)
+ rl_mark = rl_point;
+ }
+ }
+ return 0;
+}
+
+/* Kill the whole line, no matter where point is. */
+int
+rl_kill_full_line (int count, int key)
+{
+ rl_begin_undo_group ();
+ rl_point = 0;
+ rl_kill_text (rl_point, rl_end);
+ rl_mark = 0;
+ rl_end_undo_group ();
+ return 0;
+}
+
+/* The next two functions mimic unix line editing behaviour, except they
+ save the deleted text on the kill ring. This is safer than not saving
+ it, and since we have a ring, nobody should get screwed. */
+
+/* This does what C-w does in Unix. We can't prevent people from
+ using behaviour that they expect. */
+int
+rl_unix_word_rubout (int count, int key)
+{
+ int orig_point;
+
+ if (rl_point == 0)
+ rl_ding ();
+ else
+ {
+ orig_point = rl_point;
+ if (count <= 0)
+ count = 1;
+
+ while (count--)
+ {
+ while (rl_point && whitespace (rl_line_buffer[rl_point - 1]))
+ rl_point--;
+
+ while (rl_point && (whitespace (rl_line_buffer[rl_point - 1]) == 0))
+ rl_point--; /* XXX - multibyte? */
+ }
+
+ rl_kill_text (orig_point, rl_point);
+ if (rl_editing_mode == emacs_mode)
+ rl_mark = rl_point;
+ }
+
+ return 0;
+}
+
+/* This deletes one filename component in a Unix pathname. That is, it
+ deletes backward to directory separator (`/') or whitespace. */
+int
+rl_unix_filename_rubout (int count, int key)
+{
+ int orig_point, c;
+
+ if (rl_point == 0)
+ rl_ding ();
+ else
+ {
+ orig_point = rl_point;
+ if (count <= 0)
+ count = 1;
+
+ while (count--)
+ {
+ c = rl_line_buffer[rl_point - 1];
+
+ /* First move backwards through whitespace */
+ while (rl_point && whitespace (c))
+ {
+ rl_point--;
+ c = rl_line_buffer[rl_point - 1];
+ }
+
+ /* Consume one or more slashes. */
+ if (c == '/')
+ {
+ int i;
+
+ i = rl_point - 1;
+ while (i > 0 && c == '/')
+ c = rl_line_buffer[--i];
+ if (i == 0 || whitespace (c))
+ {
+ rl_point = i + whitespace (c);
+ continue; /* slashes only */
+ }
+ c = '/';
+ }
+
+ while (rl_point && (whitespace (c) || c == '/'))
+ {
+ rl_point--;
+ c = rl_line_buffer[rl_point - 1];
+ }
+
+ while (rl_point && (whitespace (c) == 0) && c != '/')
+ {
+ rl_point--; /* XXX - multibyte? */
+ c = rl_line_buffer[rl_point - 1];
+ }
+ }
+
+ rl_kill_text (orig_point, rl_point);
+ if (rl_editing_mode == emacs_mode)
+ rl_mark = rl_point;
+ }
+
+ return 0;
+}
+
+/* Here is C-u doing what Unix does. You don't *have* to use these
+ key-bindings. We have a choice of killing the entire line, or
+ killing from where we are to the start of the line. We choose the
+ latter, because if you are a Unix weenie, then you haven't backspaced
+ into the line at all, and if you aren't, then you know what you are
+ doing. */
+int
+rl_unix_line_discard (int count, int key)
+{
+ if (rl_point == 0)
+ rl_ding ();
+ else
+ {
+ rl_kill_text (rl_point, 0);
+ rl_point = 0;
+ if (rl_editing_mode == emacs_mode)
+ rl_mark = rl_point;
+ }
+ return 0;
+}
+
+/* Copy the text in the `region' to the kill ring. If DELETE is non-zero,
+ delete the text from the line as well. */
+static int
+region_kill_internal (int delete)
+{
+ char *text;
+
+ if (rl_mark != rl_point)
+ {
+ text = rl_copy_text (rl_point, rl_mark);
+ if (delete)
+ rl_delete_text (rl_point, rl_mark);
+ _rl_copy_to_kill_ring (text, rl_point < rl_mark);
+ }
+
+ _rl_fix_point (1);
+ _rl_last_command_was_kill++;
+ return 0;
+}
+
+/* Copy the text in the region to the kill ring. */
+int
+rl_copy_region_to_kill (int count, int key)
+{
+ return (region_kill_internal (0));
+}
+
+/* Kill the text between the point and mark. */
+int
+rl_kill_region (int count, int key)
+{
+ int r, npoint;
+
+ npoint = (rl_point < rl_mark) ? rl_point : rl_mark;
+ r = region_kill_internal (1);
+ rl_point = npoint;
+ _rl_fix_point (1);
+ return r;
+}
+
+/* Copy COUNT words to the kill ring. DIR says which direction we look
+ to find the words. */
+static int
+_rl_copy_word_as_kill (int count, int dir)
+{
+ int om, op, r;
+
+ om = rl_mark;
+ op = rl_point;
+
+ if (dir > 0)
+ rl_forward_word (count, 0);
+ else
+ rl_backward_word (count, 0);
+
+ rl_mark = rl_point;
+
+ if (dir > 0)
+ rl_backward_word (count, 0);
+ else
+ rl_forward_word (count, 0);
+
+ r = region_kill_internal (0);
+
+ rl_mark = om;
+ rl_point = op;
+
+ return r;
+}
+
+int
+rl_copy_forward_word (int count, int key)
+{
+ if (count < 0)
+ return (rl_copy_backward_word (-count, key));
+
+ return (_rl_copy_word_as_kill (count, 1));
+}
+
+int
+rl_copy_backward_word (int count, int key)
+{
+ if (count < 0)
+ return (rl_copy_forward_word (-count, key));
+
+ return (_rl_copy_word_as_kill (count, -1));
+}
+
+/* Yank back the last killed text. This ignores arguments. */
+int
+rl_yank (int count, int key)
+{
+ if (rl_kill_ring == 0)
+ {
+ _rl_abort_internal ();
+ return 1;
+ }
+
+ _rl_set_mark_at_pos (rl_point);
+ rl_insert_text (rl_kill_ring[rl_kill_index]);
+ return 0;
+}
+
+/* If the last command was yank, or yank_pop, and the text just
+ before point is identical to the current kill item, then
+ delete that text from the line, rotate the index down, and
+ yank back some other text. */
+int
+rl_yank_pop (int count, int key)
+{
+ int l, n;
+
+ if (((rl_last_func != rl_yank_pop) && (rl_last_func != rl_yank)) ||
+ !rl_kill_ring)
+ {
+ _rl_abort_internal ();
+ return 1;
+ }
+
+ l = strlen (rl_kill_ring[rl_kill_index]);
+ n = rl_point - l;
+ if (n >= 0 && STREQN (rl_line_buffer + n, rl_kill_ring[rl_kill_index], l))
+ {
+ rl_delete_text (n, rl_point);
+ rl_point = n;
+ rl_kill_index--;
+ if (rl_kill_index < 0)
+ rl_kill_index = rl_kill_ring_length - 1;
+ rl_yank (1, 0);
+ return 0;
+ }
+ else
+ {
+ _rl_abort_internal ();
+ return 1;
+ }
+}
+
+#if defined (VI_MODE)
+int
+rl_vi_yank_pop (int count, int key)
+{
+ int l, n, origpoint;
+
+ if (((rl_last_func != rl_vi_yank_pop) && (rl_last_func != rl_vi_put)) ||
+ !rl_kill_ring)
+ {
+ _rl_abort_internal ();
+ return 1;
+ }
+
+ l = strlen (rl_kill_ring[rl_kill_index]);
+#if 0 /* TAG:readline-8.3 8/29/2022 matteopaolini1995@gmail.com */
+ origpoint = rl_point;
+ n = rl_point - l + 1;
+#else
+ n = rl_point - l;
+#endif
+ if (n >= 0 && STREQN (rl_line_buffer + n, rl_kill_ring[rl_kill_index], l))
+ {
+#if 0 /* TAG:readline-8.3 */
+ rl_delete_text (n, n + l); /* remember vi cursor positioning */
+ rl_point = origpoint - l;
+#else
+ rl_delete_text (n, rl_point);
+ rl_point = n;
+#endif
+ rl_kill_index--;
+ if (rl_kill_index < 0)
+ rl_kill_index = rl_kill_ring_length - 1;
+ rl_vi_put (1, 'p');
+ return 0;
+ }
+ else
+ {
+ _rl_abort_internal ();
+ return 1;
+ }
+}
+#endif /* VI_MODE */
+
+/* Yank the COUNTh argument from the previous history line, skipping
+ HISTORY_SKIP lines before looking for the `previous line'. */
+static int
+rl_yank_nth_arg_internal (int count, int key, int history_skip)
+{
+ register HIST_ENTRY *entry;
+ char *arg;
+ int i, pos;
+
+ pos = where_history ();
+
+ if (history_skip)
+ {
+ for (i = 0; i < history_skip; i++)
+ entry = previous_history ();
+ }
+
+ entry = previous_history ();
+
+ history_set_pos (pos);
+
+ if (entry == 0)
+ {
+ rl_ding ();
+ return 1;
+ }
+
+ arg = history_arg_extract (count, count, entry->line);
+ if (!arg || !*arg)
+ {
+ rl_ding ();
+ FREE (arg);
+ return 1;
+ }
+
+ rl_begin_undo_group ();
+
+ _rl_set_mark_at_pos (rl_point);
+
+#if defined (VI_MODE)
+ /* Vi mode always inserts a space before yanking the argument, and it
+ inserts it right *after* rl_point. */
+ if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap)
+ {
+ rl_vi_append_mode (1, key);
+ rl_insert_text (" ");
+ }
+#endif /* VI_MODE */
+
+ rl_insert_text (arg);
+ xfree (arg);
+
+ rl_end_undo_group ();
+ return 0;
+}
+
+/* Yank the COUNTth argument from the previous history line. */
+int
+rl_yank_nth_arg (int count, int key)
+{
+ return (rl_yank_nth_arg_internal (count, key, 0));
+}
+
+/* Yank the last argument from the previous history line. This `knows'
+ how rl_yank_nth_arg treats a count of `$'. With an argument, this
+ behaves the same as rl_yank_nth_arg. */
+int
+rl_yank_last_arg (int count, int key)
+{
+ static int history_skip = 0;
+ static int explicit_arg_p = 0;
+ static int count_passed = 1;
+ static int direction = 1;
+ static int undo_needed = 0;
+ int retval;
+
+ if (rl_last_func != rl_yank_last_arg)
+ {
+ history_skip = 0;
+ explicit_arg_p = rl_explicit_arg;
+ count_passed = count;
+ direction = 1;
+ }
+ else
+ {
+ if (undo_needed)
+ rl_do_undo ();
+ if (count < 0) /* XXX - was < 1 */
+ direction = -direction;
+ history_skip += direction;
+ if (history_skip < 0)
+ history_skip = 0;
+ }
+
+ if (explicit_arg_p)
+ retval = rl_yank_nth_arg_internal (count_passed, key, history_skip);
+ else
+ retval = rl_yank_nth_arg_internal ('$', key, history_skip);
+
+ undo_needed = retval == 0;
+ return retval;
+}
+
+/* Having read the special escape sequence denoting the beginning of a
+ `bracketed paste' sequence, read the rest of the pasted input until the
+ closing sequence and return the pasted text. */
+char *
+_rl_bracketed_text (size_t *lenp)
+{
+ int c;
+ size_t len, cap;
+ char *buf;
+
+ len = 0;
+ buf = xmalloc (cap = 64);
+ buf[0] = '\0';
+
+ RL_SETSTATE (RL_STATE_MOREINPUT);
+ while ((c = rl_read_key ()) >= 0)
+ {
+ if (RL_ISSTATE (RL_STATE_MACRODEF))
+ _rl_add_macro_char (c);
+
+ if (c == '\r') /* XXX */
+ c = '\n';
+
+ if (len == cap)
+ buf = xrealloc (buf, cap *= 2);
+
+ buf[len++] = c;
+ if (len >= BRACK_PASTE_SLEN && c == BRACK_PASTE_LAST &&
+ STREQN (buf + len - BRACK_PASTE_SLEN, BRACK_PASTE_SUFF, BRACK_PASTE_SLEN))
+ {
+ len -= BRACK_PASTE_SLEN;
+ break;
+ }
+ }
+ RL_UNSETSTATE (RL_STATE_MOREINPUT);
+
+ if (c >= 0)
+ {
+ if (len == cap)
+ buf = xrealloc (buf, cap + 1);
+ buf[len] = '\0';
+ }
+
+ if (lenp)
+ *lenp = len;
+ return (buf);
+}
+
+/* Having read the special escape sequence denoting the beginning of a
+ `bracketed paste' sequence, read the rest of the pasted input until the
+ closing sequence and insert the pasted text as a single unit without
+ interpretation. Temporarily highlight the inserted text. */
+int
+rl_bracketed_paste_begin (int count, int key)
+{
+ int retval, c;
+ size_t len, cap;
+ char *buf;
+
+ buf = _rl_bracketed_text (&len);
+ rl_mark = rl_point;
+ retval = rl_insert_text (buf) == len ? 0 : 1;
+ if (_rl_enable_active_region)
+ rl_activate_mark ();
+
+ xfree (buf);
+ return (retval);
+}
+
+int
+_rl_read_bracketed_paste_prefix (int c)
+{
+ char pbuf[BRACK_PASTE_SLEN+1], *pbpref;
+ int key, ind, j;
+
+ pbpref = BRACK_PASTE_PREF; /* XXX - debugging */
+ if (c != pbpref[0])
+ return (0);
+ pbuf[ind = 0] = c;
+ while (ind < BRACK_PASTE_SLEN-1 &&
+ (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) &&
+ _rl_pushed_input_available () == 0 &&
+ _rl_input_queued (0))
+ {
+ key = rl_read_key (); /* XXX - for now */
+ if (key < 0)
+ break;
+ pbuf[++ind] = key;
+ if (pbuf[ind] != pbpref[ind])
+ break;
+ }
+
+ if (ind < BRACK_PASTE_SLEN-1) /* read incomplete sequence */
+ {
+ while (ind >= 0)
+ _rl_unget_char (pbuf[ind--]);
+ return (key < 0 ? key : 0);
+ }
+ return (key < 0 ? key : 1);
+}
+
+/* Get a character from wherever we read input, handling input in bracketed
+ paste mode. If we don't have or use bracketed paste mode, this can be
+ used in place of rl_read_key(). */
+int
+_rl_bracketed_read_key ()
+{
+ int c, r;
+ char *pbuf;
+ size_t pblen;
+
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+ if (c < 0)
+ return -1;
+
+ /* read pasted data with bracketed-paste mode enabled. */
+ if (_rl_enable_bracketed_paste && c == ESC && (r = _rl_read_bracketed_paste_prefix (c)) == 1)
+ {
+ pbuf = _rl_bracketed_text (&pblen);
+ if (pblen == 0)
+ {
+ xfree (pbuf);
+ return 0; /* XXX */
+ }
+ c = (unsigned char)pbuf[0];
+ if (pblen > 1)
+ {
+ while (--pblen > 0)
+ _rl_unget_char ((unsigned char)pbuf[pblen]);
+ }
+ xfree (pbuf);
+ }
+
+ return c;
+}
+
+/* Get a character from wherever we read input, handling input in bracketed
+ paste mode. If we don't have or use bracketed paste mode, this can be
+ used in place of rl_read_key(). */
+int
+_rl_bracketed_read_mbstring (char *mb, int mlen)
+{
+ int c, r;
+
+ c = _rl_bracketed_read_key ();
+ if (c < 0)
+ return -1;
+
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ c = _rl_read_mbstring (c, mb, mlen);
+ else
+#endif
+ mb[0] = c;
+ mb[mlen] = '\0'; /* just in case */
+
+ return c;
+}
+
+/* A special paste command for Windows users. */
+#if defined (_WIN32)
+#include <windows.h>
+
+int
+rl_paste_from_clipboard (int count, int key)
+{
+ char *data, *ptr;
+ int len;
+
+ if (OpenClipboard (NULL) == 0)
+ return (0);
+
+ data = (char *)GetClipboardData (CF_TEXT);
+ if (data)
+ {
+ ptr = strchr (data, '\r');
+ if (ptr)
+ {
+ len = ptr - data;
+ ptr = (char *)xmalloc (len + 1);
+ ptr[len] = '\0';
+ strncpy (ptr, data, len);
+ }
+ else
+ ptr = data;
+ _rl_set_mark_at_pos (rl_point);
+ rl_insert_text (ptr);
+ if (ptr != data)
+ xfree (ptr);
+ CloseClipboard ();
+ }
+ return (0);
+}
+#endif /* _WIN32 */
diff --git a/m4/codeset.m4 b/m4/codeset.m4
new file mode 100644
index 0000000..280f556
--- /dev/null
+++ b/m4/codeset.m4
@@ -0,0 +1,24 @@
+# codeset.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2000-2002, 2006, 2008-2014, 2016, 2019 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+ AC_CACHE_CHECK([for nl_langinfo and CODESET], [am_cv_langinfo_codeset],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <langinfo.h>]],
+ [[char* cs = nl_langinfo(CODESET); return !cs;]])],
+ [am_cv_langinfo_codeset=yes],
+ [am_cv_langinfo_codeset=no])
+ ])
+ if test $am_cv_langinfo_codeset = yes; then
+ AC_DEFINE([HAVE_LANGINFO_CODESET], [1],
+ [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+ fi
+])
diff --git a/macro.c b/macro.c
new file mode 100644
index 0000000..231a24b
--- /dev/null
+++ b/macro.c
@@ -0,0 +1,334 @@
+/* macro.c -- keyboard macros for readline. */
+
+/* Copyright (C) 1994-2009,2017 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h> /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+#define MAX_MACRO_LEVEL 16
+
+/* **************************************************************** */
+/* */
+/* Hacking Keyboard Macros */
+/* */
+/* **************************************************************** */
+
+/* The currently executing macro string. If this is non-zero,
+ then it is a malloc ()'ed string where input is coming from. */
+char *rl_executing_macro = (char *)NULL;
+
+/* The offset in the above string to the next character to be read. */
+static int executing_macro_index;
+
+/* The current macro string being built. Characters get stuffed
+ in here by add_macro_char (). */
+static char *current_macro = (char *)NULL;
+
+/* The size of the buffer allocated to current_macro. */
+static int current_macro_size;
+
+/* The index at which characters are being added to current_macro. */
+static int current_macro_index;
+
+/* A structure used to save nested macro strings.
+ It is a linked list of string/index for each saved macro. */
+struct saved_macro {
+ struct saved_macro *next;
+ char *string;
+ int sindex;
+};
+
+/* The list of saved macros. */
+static struct saved_macro *macro_list = (struct saved_macro *)NULL;
+
+static int macro_level = 0;
+
+/* Set up to read subsequent input from STRING.
+ STRING is free ()'ed when we are done with it. */
+void
+_rl_with_macro_input (char *string)
+{
+ if (macro_level > MAX_MACRO_LEVEL)
+ {
+ _rl_errmsg ("maximum macro execution nesting level exceeded");
+ _rl_abort_internal ();
+ return;
+ }
+
+#if 0
+ if (rl_executing_macro) /* XXX - later */
+#endif
+ _rl_push_executing_macro ();
+ rl_executing_macro = string;
+ executing_macro_index = 0;
+ RL_SETSTATE(RL_STATE_MACROINPUT);
+}
+
+/* Return the next character available from a macro, or 0 if
+ there are no macro characters. */
+int
+_rl_next_macro_key (void)
+{
+ int c;
+
+ if (rl_executing_macro == 0)
+ return (0);
+
+ if (rl_executing_macro[executing_macro_index] == 0)
+ {
+ _rl_pop_executing_macro ();
+ return (_rl_next_macro_key ());
+ }
+
+#if defined (READLINE_CALLBACKS)
+ c = rl_executing_macro[executing_macro_index++];
+ if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD|RL_STATE_MOREINPUT) && rl_executing_macro[executing_macro_index] == 0)
+ _rl_pop_executing_macro ();
+ return c;
+#else
+ /* XXX - consider doing the same as the callback code, just not testing
+ whether we're running in callback mode */
+ return (rl_executing_macro[executing_macro_index++]);
+#endif
+}
+
+int
+_rl_peek_macro_key (void)
+{
+ if (rl_executing_macro == 0)
+ return (0);
+ if (rl_executing_macro[executing_macro_index] == 0 && (macro_list == 0 || macro_list->string == 0))
+ return (0);
+ if (rl_executing_macro[executing_macro_index] == 0 && macro_list && macro_list->string)
+ return (macro_list->string[0]);
+ return (rl_executing_macro[executing_macro_index]);
+}
+
+int
+_rl_prev_macro_key (void)
+{
+ if (rl_executing_macro == 0)
+ return (0);
+
+ if (executing_macro_index == 0)
+ return (0);
+
+ executing_macro_index--;
+ return (rl_executing_macro[executing_macro_index]);
+}
+
+/* Save the currently executing macro on a stack of saved macros. */
+void
+_rl_push_executing_macro (void)
+{
+ struct saved_macro *saver;
+
+ saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro));
+ saver->next = macro_list;
+ saver->sindex = executing_macro_index;
+ saver->string = rl_executing_macro;
+
+ macro_list = saver;
+
+ macro_level++;
+}
+
+/* Discard the current macro, replacing it with the one
+ on the top of the stack of saved macros. */
+void
+_rl_pop_executing_macro (void)
+{
+ struct saved_macro *macro;
+
+ FREE (rl_executing_macro);
+ rl_executing_macro = (char *)NULL;
+ executing_macro_index = 0;
+
+ if (macro_list)
+ {
+ macro = macro_list;
+ rl_executing_macro = macro_list->string;
+ executing_macro_index = macro_list->sindex;
+ macro_list = macro_list->next;
+ xfree (macro);
+ }
+
+ macro_level--;
+
+ if (rl_executing_macro == 0)
+ RL_UNSETSTATE(RL_STATE_MACROINPUT);
+}
+
+/* Add a character to the macro being built. */
+void
+_rl_add_macro_char (int c)
+{
+ if (current_macro_index + 1 >= current_macro_size)
+ {
+ if (current_macro == 0)
+ current_macro = (char *)xmalloc (current_macro_size = 25);
+ else
+ current_macro = (char *)xrealloc (current_macro, current_macro_size += 25);
+ }
+
+ current_macro[current_macro_index++] = c;
+ current_macro[current_macro_index] = '\0';
+}
+
+void
+_rl_kill_kbd_macro (void)
+{
+ if (current_macro)
+ {
+ xfree (current_macro);
+ current_macro = (char *) NULL;
+ }
+ current_macro_size = current_macro_index = 0;
+
+ FREE (rl_executing_macro);
+ rl_executing_macro = (char *) NULL;
+ executing_macro_index = 0;
+
+ RL_UNSETSTATE(RL_STATE_MACRODEF);
+}
+
+/* Begin defining a keyboard macro.
+ Keystrokes are recorded as they are executed.
+ End the definition with rl_end_kbd_macro ().
+ If a numeric argument was explicitly typed, then append this
+ definition to the end of the existing macro, and start by
+ re-executing the existing macro. */
+int
+rl_start_kbd_macro (int ignore1, int ignore2)
+{
+ if (RL_ISSTATE (RL_STATE_MACRODEF))
+ {
+ _rl_abort_internal ();
+ return 1;
+ }
+
+ if (rl_explicit_arg)
+ {
+ if (current_macro)
+ _rl_with_macro_input (savestring (current_macro));
+ }
+ else
+ current_macro_index = 0;
+
+ RL_SETSTATE(RL_STATE_MACRODEF);
+ return 0;
+}
+
+/* Stop defining a keyboard macro.
+ A numeric argument says to execute the macro right now,
+ that many times, counting the definition as the first time. */
+int
+rl_end_kbd_macro (int count, int ignore)
+{
+ if (RL_ISSTATE (RL_STATE_MACRODEF) == 0)
+ {
+ _rl_abort_internal ();
+ return 1;
+ }
+
+ current_macro_index -= rl_key_sequence_length;
+ if (current_macro_index < 0)
+ current_macro_index = 0;
+ current_macro[current_macro_index] = '\0';
+
+ RL_UNSETSTATE(RL_STATE_MACRODEF);
+
+ return (rl_call_last_kbd_macro (--count, 0));
+}
+
+/* Execute the most recently defined keyboard macro.
+ COUNT says how many times to execute it. */
+int
+rl_call_last_kbd_macro (int count, int ignore)
+{
+ if (current_macro == 0)
+ _rl_abort_internal ();
+
+ if (RL_ISSTATE (RL_STATE_MACRODEF))
+ {
+ rl_ding (); /* no recursive macros */
+ current_macro[--current_macro_index] = '\0'; /* erase this char */
+ return 0;
+ }
+
+ while (count--)
+ _rl_with_macro_input (savestring (current_macro));
+ return 0;
+}
+
+int
+rl_print_last_kbd_macro (int count, int ignore)
+{
+ char *m;
+
+ if (current_macro == 0)
+ {
+ rl_ding ();
+ return 0;
+ }
+ m = _rl_untranslate_macro_value (current_macro, 1);
+ rl_crlf ();
+ printf ("%s", m);
+ fflush (stdout);
+ rl_crlf ();
+ FREE (m);
+ rl_forced_update_display ();
+ rl_display_fixed = 1;
+
+ return 0;
+}
+
+void
+rl_push_macro_input (char *macro)
+{
+ _rl_with_macro_input (macro);
+}
diff --git a/mbutil.c b/mbutil.c
new file mode 100644
index 0000000..47e9100
--- /dev/null
+++ b/mbutil.c
@@ -0,0 +1,524 @@
+/* mbutil.c -- readline multibyte character utility functions */
+
+/* Copyright (C) 2001-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include "posixjmp.h"
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h> /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+#include <ctype.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#if defined (TIOCSTAT_IN_SYS_IOCTL)
+# include <sys/ioctl.h>
+#endif /* TIOCSTAT_IN_SYS_IOCTL */
+
+/* Some standard library routines. */
+#include "readline.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+/* Declared here so it can be shared between the readline and history
+ libraries. */
+#if defined (HANDLE_MULTIBYTE)
+int rl_byte_oriented = 0;
+#else
+int rl_byte_oriented = 1;
+#endif
+
+/* Ditto */
+int _rl_utf8locale = 0;
+
+/* **************************************************************** */
+/* */
+/* Multibyte Character Utility Functions */
+/* */
+/* **************************************************************** */
+
+#if defined(HANDLE_MULTIBYTE)
+
+/* **************************************************************** */
+/* */
+/* UTF-8 specific Character Utility Functions */
+/* */
+/* **************************************************************** */
+
+/* Return the length in bytes of the possibly-multibyte character beginning
+ at S. Encoding is UTF-8. */
+static int
+_rl_utf8_mblen (const char *s, size_t n)
+{
+ unsigned char c, c1, c2, c3;
+
+ if (s == 0)
+ return (0); /* no shift states */
+ if (n <= 0)
+ return (-1);
+
+ c = (unsigned char)*s;
+ if (c < 0x80)
+ return (c != 0);
+ if (c >= 0xc2)
+ {
+ c1 = (unsigned char)s[1];
+ if (c < 0xe0)
+ {
+ if (n == 1)
+ return -2;
+ if (n >= 2 && (c1 ^ 0x80) < 0x40)
+ return 2;
+ }
+ else if (c < 0xf0)
+ {
+ if (n == 1)
+ return -2;
+ if ((c1 ^ 0x80) < 0x40
+ && (c >= 0xe1 || c1 >= 0xa0)
+ && (c != 0xed || c1 < 0xa0))
+ {
+ if (n == 2)
+ return -2;
+ c2 = (unsigned char)s[2];
+ if ((c2 ^ 0x80) < 0x40)
+ return 3;
+ }
+ }
+ else if (c < 0xf4)
+ {
+ if (n == 1)
+ return -2;
+ if (((c1 ^ 0x80) < 0x40)
+ && (c >= 0xf1 || c1 >= 0x90)
+ && (c < 0xf4 || (c == 0xf4 && c1 < 0x90)))
+ {
+ if (n == 2)
+ return -2;
+ c2 = (unsigned char)s[2];
+ if ((c2 ^ 0x80) < 0x40)
+ {
+ if (n == 3)
+ return -2;
+ c3 = (unsigned char)s[3];
+ if ((c3 ^ 0x80) < 0x40)
+ return 4;
+ }
+ }
+ }
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
+
+static int
+_rl_find_next_mbchar_internal (char *string, int seed, int count, int find_non_zero)
+{
+ size_t tmp, len;
+ mbstate_t ps;
+ int point;
+ WCHAR_T wc;
+
+ tmp = 0;
+
+ memset(&ps, 0, sizeof (mbstate_t));
+ if (seed < 0)
+ seed = 0;
+ if (count <= 0)
+ return seed;
+
+ point = seed + _rl_adjust_point (string, seed, &ps);
+ /* if _rl_adjust_point returns -1, the character or string is invalid.
+ treat as a byte. */
+ if (point == seed - 1) /* invalid */
+ return seed + 1;
+
+ /* if this is true, means that seed was not pointing to a byte indicating
+ the beginning of a multibyte character. Correct the point and consume
+ one char. */
+ if (seed < point)
+ count--;
+
+ while (count > 0)
+ {
+ len = strlen (string + point);
+ if (len == 0)
+ break;
+ if (_rl_utf8locale && UTF8_SINGLEBYTE(string[point]))
+ {
+ tmp = 1;
+ wc = (WCHAR_T) string[point];
+ memset(&ps, 0, sizeof(mbstate_t));
+ }
+ else
+ tmp = MBRTOWC (&wc, string+point, len, &ps);
+ if (MB_INVALIDCH ((size_t)tmp))
+ {
+ /* invalid bytes. assume a byte represents a character */
+ point++;
+ count--;
+ /* reset states. */
+ memset(&ps, 0, sizeof(mbstate_t));
+ }
+ else if (MB_NULLWCH (tmp))
+ break; /* found wide '\0' */
+ else
+ {
+ /* valid bytes */
+ point += tmp;
+ if (find_non_zero)
+ {
+ if (WCWIDTH (wc) == 0)
+ continue;
+ else
+ count--;
+ }
+ else
+ count--;
+ }
+ }
+
+ if (find_non_zero)
+ {
+ tmp = MBRTOWC (&wc, string + point, strlen (string + point), &ps);
+ while (MB_NULLWCH (tmp) == 0 && MB_INVALIDCH (tmp) == 0 && WCWIDTH (wc) == 0)
+ {
+ point += tmp;
+ tmp = MBRTOWC (&wc, string + point, strlen (string + point), &ps);
+ }
+ }
+
+ return point;
+}
+
+static inline int
+_rl_test_nonzero (char *string, int ind, int len)
+{
+ size_t tmp;
+ WCHAR_T wc;
+ mbstate_t ps;
+
+ memset (&ps, 0, sizeof (mbstate_t));
+ tmp = MBRTOWC (&wc, string + ind, len - ind, &ps);
+ /* treat invalid multibyte sequences as non-zero-width */
+ return (MB_INVALIDCH (tmp) || MB_NULLWCH (tmp) || WCWIDTH (wc) > 0);
+}
+
+/* experimental -- needs to handle zero-width characters better */
+static int
+_rl_find_prev_utf8char (char *string, int seed, int find_non_zero)
+{
+ char *s;
+ unsigned char b;
+ int save, prev;
+ size_t len;
+
+ if (find_non_zero)
+ len = RL_STRLEN (string);
+
+ prev = seed - 1;
+ while (prev >= 0)
+ {
+ b = (unsigned char)string[prev];
+ if (UTF8_SINGLEBYTE (b))
+ return (prev);
+
+ save = prev;
+
+ /* Move back until we're not in the middle of a multibyte char */
+ if (UTF8_MBCHAR (b))
+ {
+ while (prev > 0 && (b = (unsigned char)string[--prev]) && UTF8_MBCHAR (b))
+ ;
+ }
+
+ if (UTF8_MBFIRSTCHAR (b))
+ {
+ if (find_non_zero)
+ {
+ if (_rl_test_nonzero (string, prev, len))
+ return (prev);
+ else /* valid but WCWIDTH (wc) == 0 */
+ prev = prev - 1;
+ }
+ else
+ return (prev);
+ }
+ else
+ return (save); /* invalid utf-8 multibyte sequence */
+ }
+
+ return ((prev < 0) ? 0 : prev);
+}
+
+/*static*/ int
+_rl_find_prev_mbchar_internal (char *string, int seed, int find_non_zero)
+{
+ mbstate_t ps;
+ int prev, non_zero_prev, point, length;
+ size_t tmp;
+ WCHAR_T wc;
+
+ if (_rl_utf8locale)
+ return (_rl_find_prev_utf8char (string, seed, find_non_zero));
+
+ memset(&ps, 0, sizeof(mbstate_t));
+ length = strlen(string);
+
+ if (seed < 0)
+ return 0;
+ else if (length < seed)
+ return length;
+
+ prev = non_zero_prev = point = 0;
+ while (point < seed)
+ {
+ if (_rl_utf8locale && UTF8_SINGLEBYTE(string[point]))
+ {
+ tmp = 1;
+ wc = (WCHAR_T) string[point];
+ memset(&ps, 0, sizeof(mbstate_t));
+ }
+ else
+ tmp = MBRTOWC (&wc, string + point, length - point, &ps);
+ if (MB_INVALIDCH ((size_t)tmp))
+ {
+ /* in this case, bytes are invalid or too short to compose
+ multibyte char, so assume that the first byte represents
+ a single character anyway. */
+ tmp = 1;
+ /* clear the state of the byte sequence, because
+ in this case effect of mbstate is undefined */
+ memset(&ps, 0, sizeof (mbstate_t));
+
+ /* Since we're assuming that this byte represents a single
+ non-zero-width character, don't forget about it. */
+ prev = point;
+ }
+ else if (MB_NULLWCH (tmp))
+ break; /* Found '\0' char. Can this happen? */
+ else
+ {
+ if (find_non_zero)
+ {
+ if (WCWIDTH (wc) != 0)
+ prev = point;
+ }
+ else
+ prev = point;
+ }
+
+ point += tmp;
+ }
+
+ return prev;
+}
+
+/* return the number of bytes parsed from the multibyte sequence starting
+ at src, if a non-L'\0' wide character was recognized. It returns 0,
+ if a L'\0' wide character was recognized. It returns (size_t)(-1),
+ if an invalid multibyte sequence was encountered. It returns (size_t)(-2)
+ if it couldn't parse a complete multibyte character. */
+int
+_rl_get_char_len (char *src, mbstate_t *ps)
+{
+ size_t tmp, l;
+ int mb_cur_max;
+
+ /* Look at no more than MB_CUR_MAX characters */
+ l = (size_t)strlen (src);
+ if (_rl_utf8locale && l > 0 && UTF8_SINGLEBYTE(*src))
+ tmp = (*src != 0) ? 1 : 0;
+ else
+ {
+ mb_cur_max = MB_CUR_MAX;
+ tmp = mbrlen((const char *)src, (l < mb_cur_max) ? l : mb_cur_max, ps);
+ }
+ if (tmp == (size_t)(-2))
+ {
+ /* too short to compose multibyte char */
+ if (ps)
+ memset (ps, 0, sizeof(mbstate_t));
+ return -2;
+ }
+ else if (tmp == (size_t)(-1))
+ {
+ /* invalid to compose multibyte char */
+ /* initialize the conversion state */
+ if (ps)
+ memset (ps, 0, sizeof(mbstate_t));
+ return -1;
+ }
+ else if (tmp == (size_t)0)
+ return 0;
+ else
+ return (int)tmp;
+}
+
+/* compare the specified two characters. If the characters matched,
+ return 1. Otherwise return 0. */
+int
+_rl_compare_chars (char *buf1, int pos1, mbstate_t *ps1, char *buf2, int pos2, mbstate_t *ps2)
+{
+ int i, w1, w2;
+
+ if ((w1 = _rl_get_char_len (&buf1[pos1], ps1)) <= 0 ||
+ (w2 = _rl_get_char_len (&buf2[pos2], ps2)) <= 0 ||
+ (w1 != w2) ||
+ (buf1[pos1] != buf2[pos2]))
+ return 0;
+
+ for (i = 1; i < w1; i++)
+ if (buf1[pos1+i] != buf2[pos2+i])
+ return 0;
+
+ return 1;
+}
+
+/* adjust pointed byte and find mbstate of the point of string.
+ adjusted point will be point <= adjusted_point, and returns
+ differences of the byte(adjusted_point - point).
+ if point is invalid (point < 0 || more than string length),
+ it returns -1 */
+int
+_rl_adjust_point (char *string, int point, mbstate_t *ps)
+{
+ size_t tmp;
+ int length, pos;
+
+ tmp = 0;
+ pos = 0;
+ length = strlen(string);
+ if (point < 0)
+ return -1;
+ if (length < point)
+ return -1;
+
+ while (pos < point)
+ {
+ if (_rl_utf8locale && UTF8_SINGLEBYTE(string[pos]))
+ tmp = 1;
+ else
+ tmp = mbrlen (string + pos, length - pos, ps);
+ if (MB_INVALIDCH ((size_t)tmp))
+ {
+ /* in this case, bytes are invalid or too short to compose
+ multibyte char, so assume that the first byte represents
+ a single character anyway. */
+ pos++;
+ /* clear the state of the byte sequence, because
+ in this case effect of mbstate is undefined */
+ if (ps)
+ memset (ps, 0, sizeof (mbstate_t));
+ }
+ else if (MB_NULLWCH (tmp))
+ pos++;
+ else
+ pos += tmp;
+ }
+
+ return (pos - point);
+}
+
+int
+_rl_is_mbchar_matched (char *string, int seed, int end, char *mbchar, int length)
+{
+ int i;
+
+ if ((end - seed) < length)
+ return 0;
+
+ for (i = 0; i < length; i++)
+ if (string[seed + i] != mbchar[i])
+ return 0;
+ return 1;
+}
+
+WCHAR_T
+_rl_char_value (char *buf, int ind)
+{
+ size_t tmp;
+ WCHAR_T wc;
+ mbstate_t ps;
+ int l;
+
+ if (MB_LEN_MAX == 1 || rl_byte_oriented)
+ return ((WCHAR_T) buf[ind]);
+ if (_rl_utf8locale && UTF8_SINGLEBYTE(buf[ind]))
+ return ((WCHAR_T) buf[ind]);
+ l = strlen (buf);
+ if (ind >= l - 1)
+ return ((WCHAR_T) buf[ind]);
+ if (l < ind) /* Sanity check */
+ l = strlen (buf+ind);
+ memset (&ps, 0, sizeof (mbstate_t));
+ tmp = MBRTOWC (&wc, buf + ind, l - ind, &ps);
+ if (MB_INVALIDCH (tmp) || MB_NULLWCH (tmp))
+ return ((WCHAR_T) buf[ind]);
+ return wc;
+}
+#endif /* HANDLE_MULTIBYTE */
+
+/* Find next `count' characters started byte point of the specified seed.
+ If flags is MB_FIND_NONZERO, we look for non-zero-width multibyte
+ characters. */
+#undef _rl_find_next_mbchar
+int
+_rl_find_next_mbchar (char *string, int seed, int count, int flags)
+{
+#if defined (HANDLE_MULTIBYTE)
+ return _rl_find_next_mbchar_internal (string, seed, count, flags);
+#else
+ return (seed + count);
+#endif
+}
+
+/* Find previous character started byte point of the specified seed.
+ Returned point will be point <= seed. If flags is MB_FIND_NONZERO,
+ we look for non-zero-width multibyte characters. */
+#undef _rl_find_prev_mbchar
+int
+_rl_find_prev_mbchar (char *string, int seed, int flags)
+{
+#if defined (HANDLE_MULTIBYTE)
+ return _rl_find_prev_mbchar_internal (string, seed, flags);
+#else
+ return ((seed == 0) ? seed : seed - 1);
+#endif
+}
diff --git a/misc.c b/misc.c
new file mode 100644
index 0000000..4bca9c5
--- /dev/null
+++ b/misc.c
@@ -0,0 +1,781 @@
+/* misc.c -- miscellaneous bindable readline functions. */
+
+/* Copyright (C) 1987-2022 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_LOCALE_H)
+# include <locale.h>
+#endif
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "histlib.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+static int rl_digit_loop (void);
+static void _rl_history_set_point (void);
+
+/* If non-zero, rl_get_previous_history and rl_get_next_history attempt
+ to preserve the value of rl_point from line to line. */
+int _rl_history_preserve_point = 0;
+
+_rl_arg_cxt _rl_argcxt;
+
+/* Saved target point for when _rl_history_preserve_point is set. Special
+ value of -1 means that point is at the end of the line. */
+int _rl_history_saved_point = -1;
+
+/* **************************************************************** */
+/* */
+/* Numeric Arguments */
+/* */
+/* **************************************************************** */
+
+int
+_rl_arg_overflow (void)
+{
+ if (rl_numeric_arg > 1000000)
+ {
+ _rl_argcxt = 0;
+ rl_explicit_arg = rl_numeric_arg = 0;
+ rl_ding ();
+ rl_restore_prompt ();
+ rl_clear_message ();
+ RL_UNSETSTATE(RL_STATE_NUMERICARG);
+ return 1;
+ }
+ return 0;
+}
+
+void
+_rl_arg_init (void)
+{
+ rl_save_prompt ();
+ _rl_argcxt = 0;
+ RL_SETSTATE(RL_STATE_NUMERICARG);
+}
+
+int
+_rl_arg_getchar (void)
+{
+ int c;
+
+ rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg);
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+ return c;
+}
+
+/* Process C as part of the current numeric argument. Return -1 if the
+ argument should be aborted, 0 if we should not read any more chars, and
+ 1 if we should continue to read chars. */
+int
+_rl_arg_dispatch (_rl_arg_cxt cxt, int c)
+{
+ int key, r;
+
+ key = c;
+
+ /* If we see a key bound to `universal-argument' after seeing digits,
+ it ends the argument but is otherwise ignored. */
+ if (c >= 0 && _rl_keymap[c].type == ISFUNC && _rl_keymap[c].function == rl_universal_argument)
+ {
+ if ((cxt & NUM_SAWDIGITS) == 0)
+ {
+ rl_numeric_arg *= 4;
+ return 1;
+ }
+ else if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ _rl_argcxt |= NUM_READONE;
+ return 0; /* XXX */
+ }
+ else
+ {
+ key = _rl_bracketed_read_key ();
+ rl_restore_prompt ();
+ rl_clear_message ();
+ RL_UNSETSTATE(RL_STATE_NUMERICARG);
+ if (key < 0)
+ return -1;
+ return (_rl_dispatch (key, _rl_keymap));
+ }
+ }
+
+ c = UNMETA (c);
+
+ if (_rl_digit_p (c))
+ {
+ r = _rl_digit_value (c);
+ rl_numeric_arg = rl_explicit_arg ? (rl_numeric_arg * 10) + r : r;
+ rl_explicit_arg = 1;
+ _rl_argcxt |= NUM_SAWDIGITS;
+ }
+ else if (c == '-' && rl_explicit_arg == 0)
+ {
+ rl_numeric_arg = 1;
+ _rl_argcxt |= NUM_SAWMINUS;
+ rl_arg_sign = -1;
+ }
+ else
+ {
+ /* Make M-- command equivalent to M--1 command. */
+ if ((_rl_argcxt & NUM_SAWMINUS) && rl_numeric_arg == 1 && rl_explicit_arg == 0)
+ rl_explicit_arg = 1;
+ rl_restore_prompt ();
+ rl_clear_message ();
+ RL_UNSETSTATE(RL_STATE_NUMERICARG);
+
+ r = _rl_dispatch (key, _rl_keymap);
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ /* At worst, this will cause an extra redisplay. Otherwise,
+ we have to wait until the next character comes in. */
+ if (rl_done == 0)
+ (*rl_redisplay_function) ();
+ r = 0;
+ }
+ return r;
+ }
+
+ return 1;
+}
+
+/* Handle C-u style numeric args, as well as M--, and M-digits. */
+static int
+rl_digit_loop (void)
+{
+ int c, r;
+
+ while (1)
+ {
+ if (_rl_arg_overflow ())
+ return 1;
+
+ c = _rl_arg_getchar ();
+
+ if (c < 0)
+ {
+ _rl_abort_internal ();
+ return -1;
+ }
+
+ r = _rl_arg_dispatch (_rl_argcxt, c);
+ if (r <= 0 || (RL_ISSTATE (RL_STATE_NUMERICARG) == 0))
+ break;
+ }
+
+ return r;
+}
+
+/* Create a default argument. */
+void
+_rl_reset_argument (void)
+{
+ rl_numeric_arg = rl_arg_sign = 1;
+ rl_explicit_arg = 0;
+ _rl_argcxt = 0;
+}
+
+/* Start a numeric argument with initial value KEY */
+int
+rl_digit_argument (int ignore, int key)
+{
+ _rl_arg_init ();
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ _rl_arg_dispatch (_rl_argcxt, key);
+ rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg);
+ return 0;
+ }
+ else
+ {
+ rl_execute_next (key);
+ return (rl_digit_loop ());
+ }
+}
+
+/* C-u, universal argument. Multiply the current argument by 4.
+ Read a key. If the key has nothing to do with arguments, then
+ dispatch on it. If the key is the abort character then abort. */
+int
+rl_universal_argument (int count, int key)
+{
+ _rl_arg_init ();
+ rl_numeric_arg *= 4;
+
+ return (RL_ISSTATE (RL_STATE_CALLBACK) ? 0 : rl_digit_loop ());
+}
+
+int
+_rl_arg_callback (_rl_arg_cxt cxt)
+{
+ int c, r;
+
+ c = _rl_arg_getchar ();
+ if (c < 0)
+ return (1); /* EOF */
+
+ if (_rl_argcxt & NUM_READONE)
+ {
+ _rl_argcxt &= ~NUM_READONE;
+ rl_restore_prompt ();
+ rl_clear_message ();
+ RL_UNSETSTATE(RL_STATE_NUMERICARG);
+ rl_execute_next (c);
+ return 0;
+ }
+
+ r = _rl_arg_dispatch (cxt, c);
+ if (r > 0)
+ rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg);
+ return (r != 1);
+}
+
+/* What to do when you abort reading an argument. */
+int
+rl_discard_argument (void)
+{
+ rl_ding ();
+ rl_clear_message ();
+ _rl_reset_argument ();
+
+ return 0;
+}
+
+/* **************************************************************** */
+/* */
+/* History Utilities */
+/* */
+/* **************************************************************** */
+
+/* We already have a history library, and that is what we use to control
+ the history features of readline. This is our local interface to
+ the history mechanism. */
+
+/* While we are editing the history, this is the saved
+ version of the original line. */
+HIST_ENTRY *_rl_saved_line_for_history = (HIST_ENTRY *)NULL;
+
+/* Set the history pointer back to the last entry in the history. */
+void
+_rl_start_using_history (void)
+{
+ using_history ();
+ if (_rl_saved_line_for_history)
+ _rl_free_saved_history_line ();
+ _rl_saved_line_for_history = (HIST_ENTRY *)NULL;
+ _rl_history_search_pos = -99; /* some random invalid history position */
+}
+
+/* Free the contents (and containing structure) of a HIST_ENTRY. */
+void
+_rl_free_history_entry (HIST_ENTRY *entry)
+{
+ if (entry == 0)
+ return;
+
+ FREE (entry->line);
+ FREE (entry->timestamp);
+
+ xfree (entry);
+}
+
+/* Perhaps put back the current line if it has changed. */
+int
+rl_maybe_replace_line (void)
+{
+ HIST_ENTRY *temp;
+
+ temp = current_history ();
+ /* If the current line has changed, save the changes. */
+ if (temp && ((UNDO_LIST *)(temp->data) != rl_undo_list))
+ {
+ temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list);
+ xfree (temp->line);
+ FREE (temp->timestamp);
+ xfree (temp);
+ }
+ return 0;
+}
+
+/* Restore the _rl_saved_line_for_history if there is one. */
+int
+rl_maybe_unsave_line (void)
+{
+ if (_rl_saved_line_for_history)
+ {
+ /* Can't call with `1' because rl_undo_list might point to an undo
+ list from a history entry, as in rl_replace_from_history() below. */
+ rl_replace_line (_rl_saved_line_for_history->line, 0);
+ rl_undo_list = (UNDO_LIST *)_rl_saved_line_for_history->data;
+
+ /* Doesn't free `data'. */
+ _rl_free_history_entry (_rl_saved_line_for_history);
+ _rl_saved_line_for_history = (HIST_ENTRY *)NULL;
+ rl_point = rl_end; /* rl_replace_line sets rl_end */
+ }
+ else
+ rl_ding ();
+ return 0;
+}
+
+/* Save the current line in _rl_saved_line_for_history. */
+int
+rl_maybe_save_line (void)
+{
+ if (_rl_saved_line_for_history == 0)
+ {
+ _rl_saved_line_for_history = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
+ _rl_saved_line_for_history->line = savestring (rl_line_buffer);
+ _rl_saved_line_for_history->timestamp = (char *)NULL;
+ _rl_saved_line_for_history->data = (char *)rl_undo_list;
+ }
+
+ return 0;
+}
+
+int
+_rl_free_saved_history_line (void)
+{
+ UNDO_LIST *orig;
+
+ if (_rl_saved_line_for_history)
+ {
+ if (rl_undo_list && rl_undo_list == (UNDO_LIST *)_rl_saved_line_for_history->data)
+ rl_undo_list = 0;
+ /* Have to free this separately because _rl_free_history entry can't:
+ it doesn't know whether or not this has application data. Only the
+ callers that know this is _rl_saved_line_for_history can know that
+ it's an undo list. */
+ if (_rl_saved_line_for_history->data)
+ _rl_free_undo_list ((UNDO_LIST *)_rl_saved_line_for_history->data);
+ _rl_free_history_entry (_rl_saved_line_for_history);
+ _rl_saved_line_for_history = (HIST_ENTRY *)NULL;
+ }
+ return 0;
+}
+
+static void
+_rl_history_set_point (void)
+{
+ rl_point = (_rl_history_preserve_point && _rl_history_saved_point != -1)
+ ? _rl_history_saved_point
+ : rl_end;
+ if (rl_point > rl_end)
+ rl_point = rl_end;
+
+#if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode && _rl_keymap != vi_insertion_keymap)
+ rl_point = 0;
+#endif /* VI_MODE */
+
+ if (rl_editing_mode == emacs_mode)
+ rl_mark = (rl_point == rl_end ? 0 : rl_end);
+}
+
+void
+rl_replace_from_history (HIST_ENTRY *entry, int flags)
+{
+ /* Can't call with `1' because rl_undo_list might point to an undo list
+ from a history entry, just like we're setting up here. */
+ rl_replace_line (entry->line, 0);
+ rl_undo_list = (UNDO_LIST *)entry->data;
+ rl_point = rl_end;
+ rl_mark = 0;
+
+#if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode)
+ {
+ rl_point = 0;
+ rl_mark = rl_end;
+ }
+#endif
+}
+
+/* Process and free undo lists attached to each history entry prior to the
+ current entry, inclusive, reverting each line to its saved state. This
+ is destructive, and state about the current line is lost. This is not
+ intended to be called while actively editing, and the current line is
+ not assumed to have been added to the history list. */
+void
+_rl_revert_previous_lines (void)
+{
+ int hpos;
+ HIST_ENTRY *entry;
+ UNDO_LIST *ul, *saved_undo_list;
+ char *lbuf;
+
+ lbuf = savestring (rl_line_buffer);
+ saved_undo_list = rl_undo_list;
+ hpos = where_history ();
+
+ entry = (hpos == history_length) ? previous_history () : current_history ();
+ while (entry)
+ {
+ if (ul = (UNDO_LIST *)entry->data)
+ {
+ if (ul == saved_undo_list)
+ saved_undo_list = 0;
+ /* Set up rl_line_buffer and other variables from history entry */
+ rl_replace_from_history (entry, 0); /* entry->line is now current */
+ entry->data = 0; /* entry->data is now current undo list */
+ /* Undo all changes to this history entry */
+ while (rl_undo_list)
+ rl_do_undo ();
+ /* And copy the reverted line back to the history entry, preserving
+ the timestamp. */
+ FREE (entry->line);
+ entry->line = savestring (rl_line_buffer);
+ }
+ entry = previous_history ();
+ }
+
+ /* Restore history state */
+ rl_undo_list = saved_undo_list; /* may have been set to null */
+ history_set_pos (hpos);
+
+ /* reset the line buffer */
+ rl_replace_line (lbuf, 0);
+ _rl_set_the_line ();
+
+ /* and clean up */
+ xfree (lbuf);
+}
+
+/* Revert all lines in the history by making sure we are at the end of the
+ history before calling _rl_revert_previous_lines() */
+void
+_rl_revert_all_lines (void)
+{
+ int pos;
+
+ pos = where_history ();
+ using_history ();
+ _rl_revert_previous_lines ();
+ history_set_pos (pos);
+}
+
+/* Free the history list, including private readline data and take care
+ of pointer aliases to history data. Resets rl_undo_list if it points
+ to an UNDO_LIST * saved as some history entry's data member. This
+ should not be called while editing is active. */
+void
+rl_clear_history (void)
+{
+ HIST_ENTRY **hlist, *hent;
+ register int i;
+ UNDO_LIST *ul, *saved_undo_list;
+
+ saved_undo_list = rl_undo_list;
+ hlist = history_list (); /* direct pointer, not copy */
+
+ for (i = 0; i < history_length; i++)
+ {
+ hent = hlist[i];
+ if (ul = (UNDO_LIST *)hent->data)
+ {
+ if (ul == saved_undo_list)
+ saved_undo_list = 0;
+ _rl_free_undo_list (ul);
+ hent->data = 0;
+ }
+ _rl_free_history_entry (hent);
+ }
+
+ history_offset = history_length = 0;
+ rl_undo_list = saved_undo_list; /* should be NULL */
+}
+
+/* **************************************************************** */
+/* */
+/* History Commands */
+/* */
+/* **************************************************************** */
+
+/* Meta-< goes to the start of the history. */
+int
+rl_beginning_of_history (int count, int key)
+{
+ return (rl_get_previous_history (1 + where_history (), key));
+}
+
+/* Meta-> goes to the end of the history. (The current line). */
+int
+rl_end_of_history (int count, int key)
+{
+ rl_maybe_replace_line ();
+ using_history ();
+ rl_maybe_unsave_line ();
+ return 0;
+}
+
+/* Move down to the next history line. */
+int
+rl_get_next_history (int count, int key)
+{
+ HIST_ENTRY *temp;
+
+ if (count < 0)
+ return (rl_get_previous_history (-count, key));
+
+ if (count == 0)
+ return 0;
+
+ rl_maybe_replace_line ();
+
+ /* either not saved by rl_newline or at end of line, so set appropriately. */
+ if (_rl_history_saved_point == -1 && (rl_point || rl_end))
+ _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point;
+
+ temp = (HIST_ENTRY *)NULL;
+ while (count)
+ {
+ temp = next_history ();
+ if (!temp)
+ break;
+ --count;
+ }
+
+ if (temp == 0)
+ rl_maybe_unsave_line ();
+ else
+ {
+ rl_replace_from_history (temp, 0);
+ _rl_history_set_point ();
+ }
+ return 0;
+}
+
+/* Get the previous item out of our interactive history, making it the current
+ line. If there is no previous history, just ding. */
+int
+rl_get_previous_history (int count, int key)
+{
+ HIST_ENTRY *old_temp, *temp;
+ int had_saved_line;
+
+ if (count < 0)
+ return (rl_get_next_history (-count, key));
+
+ if (count == 0 || history_list () == 0)
+ return 0;
+
+ /* either not saved by rl_newline or at end of line, so set appropriately. */
+ if (_rl_history_saved_point == -1 && (rl_point || rl_end))
+ _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point;
+
+ /* If we don't have a line saved, then save this one. */
+ had_saved_line = _rl_saved_line_for_history != 0;
+ rl_maybe_save_line ();
+
+ /* If the current line has changed, save the changes. */
+ rl_maybe_replace_line ();
+
+ temp = old_temp = (HIST_ENTRY *)NULL;
+ while (count)
+ {
+ temp = previous_history ();
+ if (temp == 0)
+ break;
+
+ old_temp = temp;
+ --count;
+ }
+
+ /* If there was a large argument, and we moved back to the start of the
+ history, that is not an error. So use the last value found. */
+ if (!temp && old_temp)
+ temp = old_temp;
+
+ if (temp == 0)
+ {
+ if (had_saved_line == 0)
+ _rl_free_saved_history_line ();
+ rl_ding ();
+ }
+ else
+ {
+ rl_replace_from_history (temp, 0);
+ _rl_history_set_point ();
+ }
+
+ return 0;
+}
+
+/* With an argument, move back that many history lines, else move to the
+ beginning of history. */
+int
+rl_fetch_history (int count, int c)
+{
+ int wanted, nhist;
+
+ /* Giving an argument of n means we want the nth command in the history
+ file. The command number is interpreted the same way that the bash
+ `history' command does it -- that is, giving an argument count of 450
+ to this command would get the command listed as number 450 in the
+ output of `history'. */
+ if (rl_explicit_arg)
+ {
+ nhist = history_base + where_history ();
+ /* Negative arguments count back from the end of the history list. */
+ wanted = (count >= 0) ? nhist - count : -count;
+
+ if (wanted <= 0 || wanted >= nhist)
+ {
+ /* In vi mode, we don't change the line with an out-of-range
+ argument, as for the `G' command. */
+ if (rl_editing_mode == vi_mode)
+ rl_ding ();
+ else
+ rl_beginning_of_history (0, 0);
+ }
+ else
+ rl_get_previous_history (wanted, c);
+ }
+ else
+ rl_beginning_of_history (count, 0);
+
+ return (0);
+}
+
+/* The equivalent of the Korn shell C-o operate-and-get-next-history-line
+ editing command. */
+
+/* This could stand to be global to the readline library */
+static rl_hook_func_t *_rl_saved_internal_startup_hook = 0;
+static int saved_history_logical_offset = -1;
+
+#define HISTORY_FULL() (history_is_stifled () && history_length >= history_max_entries)
+
+static int
+set_saved_history ()
+{
+ int absolute_offset, count;
+
+ if (saved_history_logical_offset >= 0)
+ {
+ absolute_offset = saved_history_logical_offset - history_base;
+ count = where_history () - absolute_offset;
+ rl_get_previous_history (count, 0);
+ }
+ saved_history_logical_offset = -1;
+ _rl_internal_startup_hook = _rl_saved_internal_startup_hook;
+
+ return (0);
+}
+
+int
+rl_operate_and_get_next (int count, int c)
+{
+ /* Accept the current line. */
+ rl_newline (1, c);
+
+ saved_history_logical_offset = rl_explicit_arg ? count : where_history () + history_base + 1;
+
+ _rl_saved_internal_startup_hook = _rl_internal_startup_hook;
+ _rl_internal_startup_hook = set_saved_history;
+
+ return 0;
+}
+
+/* **************************************************************** */
+/* */
+/* Editing Modes */
+/* */
+/* **************************************************************** */
+/* How to toggle back and forth between editing modes. */
+int
+rl_vi_editing_mode (int count, int key)
+{
+#if defined (VI_MODE)
+ _rl_set_insert_mode (RL_IM_INSERT, 1); /* vi mode ignores insert mode */
+ rl_editing_mode = vi_mode;
+ rl_vi_insert_mode (1, key);
+#endif /* VI_MODE */
+
+ return 0;
+}
+
+int
+rl_emacs_editing_mode (int count, int key)
+{
+ rl_editing_mode = emacs_mode;
+ _rl_set_insert_mode (RL_IM_INSERT, 1); /* emacs mode default is insert mode */
+ _rl_keymap = emacs_standard_keymap;
+
+ if (_rl_show_mode_in_prompt)
+ _rl_reset_prompt ();
+
+ return 0;
+}
+
+/* Function for the rest of the library to use to set insert/overwrite mode. */
+void
+_rl_set_insert_mode (int im, int force)
+{
+#ifdef CURSOR_MODE
+ _rl_set_cursor (im, force);
+#endif
+
+ rl_insert_mode = im;
+}
+
+/* Toggle overwrite mode. A positive explicit argument selects overwrite
+ mode. A negative or zero explicit argument selects insert mode. */
+int
+rl_overwrite_mode (int count, int key)
+{
+ if (rl_explicit_arg == 0)
+ _rl_set_insert_mode (rl_insert_mode ^ 1, 0);
+ else if (count > 0)
+ _rl_set_insert_mode (RL_IM_OVERWRITE, 0);
+ else
+ _rl_set_insert_mode (RL_IM_INSERT, 0);
+
+ return 0;
+}
diff --git a/nls.c b/nls.c
new file mode 100644
index 0000000..5c6a13b
--- /dev/null
+++ b/nls.c
@@ -0,0 +1,344 @@
+/* nls.c -- skeletal internationalization code. */
+
+/* Copyright (C) 1996-2022 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#include <stdio.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_LOCALE_H)
+# include <locale.h>
+#endif
+
+#if defined (HAVE_LANGINFO_CODESET)
+# include <langinfo.h>
+#endif
+
+#include <ctype.h>
+
+#include "rldefs.h"
+#include "readline.h"
+#include "rlshell.h"
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+static int utf8locale (char *);
+
+#define RL_DEFAULT_LOCALE "C"
+static char *_rl_current_locale = 0;
+
+#if !defined (HAVE_SETLOCALE)
+/* A list of legal values for the LANG or LC_CTYPE environment variables.
+ If a locale name in this list is the value for the LC_ALL, LC_CTYPE,
+ or LANG environment variable (using the first of those with a value),
+ readline eight-bit mode is enabled. */
+static char *legal_lang_values[] =
+{
+ "iso88591",
+ "iso88592",
+ "iso88593",
+ "iso88594",
+ "iso88595",
+ "iso88596",
+ "iso88597",
+ "iso88598",
+ "iso88599",
+ "iso885910",
+ "koi8r",
+ "utf8",
+ 0
+};
+
+static char *normalize_codeset (char *);
+#endif /* !HAVE_SETLOCALE */
+
+static char *find_codeset (char *, size_t *);
+
+static char *_rl_get_locale_var (const char *);
+
+static char *
+_rl_get_locale_var (const char *v)
+{
+ char *lspec;
+
+ lspec = sh_get_env_value ("LC_ALL");
+ if (lspec == 0 || *lspec == 0)
+ lspec = sh_get_env_value (v);
+ if (lspec == 0 || *lspec == 0)
+ lspec = sh_get_env_value ("LANG");
+
+ return lspec;
+}
+
+static int
+utf8locale (char *lspec)
+{
+ char *cp;
+ size_t len;
+
+#if HAVE_LANGINFO_CODESET
+ cp = nl_langinfo (CODESET);
+ return (STREQ (cp, "UTF-8") || STREQ (cp, "utf8"));
+#else
+ cp = find_codeset (lspec, &len);
+
+ if (cp == 0 || len < 4 || len > 5)
+ return 0;
+ return ((len == 5) ? strncmp (cp, "UTF-8", len) == 0 : strncmp (cp, "utf8", 4) == 0);
+#endif
+}
+
+/* Query the right environment variables and call setlocale() to initialize
+ the C library locale settings. */
+char *
+_rl_init_locale (void)
+{
+ char *ret, *lspec;
+
+ /* Set the LC_CTYPE locale category from environment variables. */
+ lspec = _rl_get_locale_var ("LC_CTYPE");
+ /* Since _rl_get_locale_var queries the right environment variables,
+ we query the current locale settings with setlocale(), and, if
+ that doesn't return anything, we set lspec to the empty string to
+ force the subsequent call to setlocale() to define the `native'
+ environment. */
+#if defined (HAVE_SETLOCALE)
+ if (lspec == 0 || *lspec == 0)
+ lspec = setlocale (LC_CTYPE, (char *)NULL);
+ if (lspec == 0)
+ lspec = "";
+ ret = setlocale (LC_CTYPE, lspec); /* ok, since it does not change locale */
+#else
+ ret = (lspec == 0 || *lspec == 0) ? RL_DEFAULT_LOCALE : lspec;
+#endif
+
+ _rl_utf8locale = (ret && *ret) ? utf8locale (ret) : 0;
+
+ _rl_current_locale = savestring (ret);
+ return ret;
+}
+
+/* If we have setlocale(3), just check the current LC_CTYPE category
+ value (passed as LOCALESTR), and go into eight-bit mode if it's not "C"
+ or "POSIX". If FORCE is non-zero, we reset the locale variables to values
+ appropriate for the C locale if the locale is "C" or "POSIX". FORCE is 0
+ when this is called from _rl_init_eightbit, since we're modifying the
+ default initial values and don't need to change anything else. If we
+ don't have setlocale(3), we check the codeset portion of LOCALESTR against
+ a set of known values and go into eight-bit mode if it matches one of those.
+ Returns 1 if we set eight-bit (multibyte) mode. */
+static int
+_rl_set_localevars (char *localestr, int force)
+{
+#if defined (HAVE_SETLOCALE)
+ if (localestr && *localestr && (localestr[0] != 'C' || localestr[1]) && (STREQ (localestr, "POSIX") == 0))
+ {
+ _rl_meta_flag = 1;
+ _rl_convert_meta_chars_to_ascii = 0;
+ _rl_output_meta_chars = 1;
+ return (1);
+ }
+ else if (force)
+ {
+ /* Default "C" locale settings. */
+ _rl_meta_flag = 0;
+ _rl_convert_meta_chars_to_ascii = 1;
+ _rl_output_meta_chars = 0;
+ return (0);
+ }
+ else
+ return (0);
+
+#else /* !HAVE_SETLOCALE */
+ char *t;
+ int i;
+
+ /* We don't have setlocale. Finesse it. Check the environment for the
+ appropriate variables and set eight-bit mode if they have the right
+ values. */
+ if (localestr == 0 || (t = normalize_codeset (localestr)) == 0)
+ return (0);
+ for (i = 0; t && legal_lang_values[i]; i++)
+ if (STREQ (t, legal_lang_values[i]))
+ {
+ _rl_meta_flag = 1;
+ _rl_convert_meta_chars_to_ascii = 0;
+ _rl_output_meta_chars = 1;
+ break;
+ }
+
+ if (force && legal_lang_values[i] == 0) /* didn't find it */
+ {
+ /* Default "C" locale settings. */
+ _rl_meta_flag = 0;
+ _rl_convert_meta_chars_to_ascii = 1;
+ _rl_output_meta_chars = 0;
+ }
+
+ _rl_utf8locale = *t ? STREQ (t, "utf8") : 0;
+
+ xfree (t);
+ return (legal_lang_values[i] ? 1 : 0);
+#endif /* !HAVE_SETLOCALE */
+}
+
+/* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value
+ to decide the defaults for 8-bit character input and output. Returns
+ 1 if we set eight-bit mode. */
+int
+_rl_init_eightbit (void)
+{
+ char *t, *ol;
+
+ ol = _rl_current_locale;
+ t = _rl_init_locale (); /* resets _rl_current_locale, returns static pointer */
+ xfree (ol);
+
+ return (_rl_set_localevars (t, 0));
+}
+
+#if !defined (HAVE_SETLOCALE)
+static char *
+normalize_codeset (char *codeset)
+{
+ size_t namelen, i;
+ int len, all_digits;
+ char *wp, *retval;
+
+ codeset = find_codeset (codeset, &namelen);
+
+ if (codeset == 0)
+ return (codeset);
+
+ all_digits = 1;
+ for (len = 0, i = 0; i < namelen; i++)
+ {
+ if (ISALNUM ((unsigned char)codeset[i]))
+ {
+ len++;
+ all_digits &= _rl_digit_p (codeset[i]);
+ }
+ }
+
+ retval = (char *)malloc ((all_digits ? 3 : 0) + len + 1);
+ if (retval == 0)
+ return ((char *)0);
+
+ wp = retval;
+ /* Add `iso' to beginning of an all-digit codeset */
+ if (all_digits)
+ {
+ *wp++ = 'i';
+ *wp++ = 's';
+ *wp++ = 'o';
+ }
+
+ for (i = 0; i < namelen; i++)
+ if (ISALPHA ((unsigned char)codeset[i]))
+ *wp++ = _rl_to_lower (codeset[i]);
+ else if (_rl_digit_p (codeset[i]))
+ *wp++ = codeset[i];
+ *wp = '\0';
+
+ return retval;
+}
+#endif /* !HAVE_SETLOCALE */
+
+/* Isolate codeset portion of locale specification. */
+static char *
+find_codeset (char *name, size_t *lenp)
+{
+ char *cp, *language, *result;
+
+ cp = language = name;
+ result = (char *)0;
+
+ while (*cp && *cp != '_' && *cp != '@' && *cp != '+' && *cp != ',')
+ cp++;
+
+ /* This does not make sense: language has to be specified. As
+ an exception we allow the variable to contain only the codeset
+ name. Perhaps there are funny codeset names. */
+ if (language == cp)
+ {
+ *lenp = strlen (language);
+ result = language;
+ }
+ else
+ {
+ /* Next is the territory. */
+ if (*cp == '_')
+ do
+ ++cp;
+ while (*cp && *cp != '.' && *cp != '@' && *cp != '+' && *cp != ',' && *cp != '_');
+
+ /* Now, finally, is the codeset. */
+ result = cp;
+ if (*cp == '.')
+ do
+ ++cp;
+ while (*cp && *cp != '@');
+
+ if (cp - result > 2)
+ {
+ result++;
+ *lenp = cp - result;
+ }
+ else
+ {
+ *lenp = strlen (language);
+ result = language;
+ }
+ }
+
+ return result;
+}
+
+void
+_rl_reset_locale (void)
+{
+ char *ol, *nl;
+
+ /* This should not be NULL; _rl_init_eightbit sets it on the first call to
+ readline() or rl_initialize(). */
+ ol = _rl_current_locale;
+ nl = _rl_init_locale (); /* resets _rl_current_locale */
+
+ if ((ol == 0 && nl) || (ol && nl && (STREQ (ol, nl) == 0)))
+ (void)_rl_set_localevars (nl, 1);
+
+ xfree (ol);
+}
diff --git a/parens.c b/parens.c
new file mode 100644
index 0000000..57ce704
--- /dev/null
+++ b/parens.c
@@ -0,0 +1,184 @@
+/* parens.c -- implementation of matching parentheses feature. */
+
+/* Copyright (C) 1987, 1989, 1992-2015, 2017, 2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (__TANDEM)
+# include <floss.h>
+#endif
+
+#include "rlconf.h"
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
+
+#include "posixselect.h"
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else /* !HAVE_STRING_H */
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strchr (), *strrchr ();
+#endif /* !strchr && !__STDC__ */
+
+#include "readline.h"
+#include "rlprivate.h"
+
+static int find_matching_open (char *, int, int);
+
+/* Non-zero means try to blink the matching open parenthesis when the
+ close parenthesis is inserted. */
+int rl_blink_matching_paren = 0;
+
+static int _paren_blink_usec = 500000;
+
+/* Change emacs_standard_keymap to have bindings for paren matching when
+ ON_OR_OFF is 1, change them back to self_insert when ON_OR_OFF == 0. */
+void
+_rl_enable_paren_matching (int on_or_off)
+{
+ if (on_or_off)
+ {
+ /* ([{ */
+ rl_bind_key_in_map (')', rl_insert_close, emacs_standard_keymap);
+ rl_bind_key_in_map (']', rl_insert_close, emacs_standard_keymap);
+ rl_bind_key_in_map ('}', rl_insert_close, emacs_standard_keymap);
+
+#if defined (VI_MODE)
+ /* ([{ */
+ rl_bind_key_in_map (')', rl_insert_close, vi_insertion_keymap);
+ rl_bind_key_in_map (']', rl_insert_close, vi_insertion_keymap);
+ rl_bind_key_in_map ('}', rl_insert_close, vi_insertion_keymap);
+#endif
+ }
+ else
+ {
+ /* ([{ */
+ rl_bind_key_in_map (')', rl_insert, emacs_standard_keymap);
+ rl_bind_key_in_map (']', rl_insert, emacs_standard_keymap);
+ rl_bind_key_in_map ('}', rl_insert, emacs_standard_keymap);
+
+#if defined (VI_MODE)
+ /* ([{ */
+ rl_bind_key_in_map (')', rl_insert, vi_insertion_keymap);
+ rl_bind_key_in_map (']', rl_insert, vi_insertion_keymap);
+ rl_bind_key_in_map ('}', rl_insert, vi_insertion_keymap);
+#endif
+ }
+}
+
+int
+rl_set_paren_blink_timeout (int u)
+{
+ int o;
+
+ o = _paren_blink_usec;
+ if (u > 0)
+ _paren_blink_usec = u;
+ return (o);
+}
+
+int
+rl_insert_close (int count, int invoking_key)
+{
+ if (rl_explicit_arg || !rl_blink_matching_paren)
+ _rl_insert_char (count, invoking_key);
+ else
+ {
+#if defined (HAVE_SELECT)
+ int orig_point, match_point, ready;
+ struct timeval timer;
+ fd_set readfds;
+
+ _rl_insert_char (1, invoking_key);
+ (*rl_redisplay_function) ();
+ match_point =
+ find_matching_open (rl_line_buffer, rl_point - 2, invoking_key);
+
+ /* Emacs might message or ring the bell here, but I don't. */
+ if (match_point < 0)
+ return 1;
+
+ FD_ZERO (&readfds);
+ FD_SET (fileno (rl_instream), &readfds);
+ USEC_TO_TIMEVAL (_paren_blink_usec, timer);
+
+ orig_point = rl_point;
+ rl_point = match_point;
+ (*rl_redisplay_function) ();
+# if defined (RL_TIMEOUT_USE_SELECT)
+ ready = _rl_timeout_select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer, NULL);
+# else
+ ready = select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer);
+# endif
+ rl_point = orig_point;
+#else /* !HAVE_SELECT */
+ _rl_insert_char (count, invoking_key);
+#endif /* !HAVE_SELECT */
+ }
+ return 0;
+}
+
+static int
+find_matching_open (char *string, int from, int closer)
+{
+ register int i;
+ int opener, level, delimiter;
+
+ switch (closer)
+ {
+ case ']': opener = '['; break;
+ case '}': opener = '{'; break;
+ case ')': opener = '('; break;
+ default:
+ return (-1);
+ }
+
+ level = 1; /* The closer passed in counts as 1. */
+ delimiter = 0; /* Delimited state unknown. */
+
+ for (i = from; i > -1; i--)
+ {
+ if (delimiter && (string[i] == delimiter))
+ delimiter = 0;
+ else if (rl_basic_quote_characters && strchr (rl_basic_quote_characters, string[i]))
+ delimiter = string[i];
+ else if (!delimiter && (string[i] == closer))
+ level++;
+ else if (!delimiter && (string[i] == opener))
+ level--;
+
+ if (!level)
+ break;
+ }
+ return (i);
+}
diff --git a/parse-colors.c b/parse-colors.c
new file mode 100644
index 0000000..05ec9bc
--- /dev/null
+++ b/parse-colors.c
@@ -0,0 +1,440 @@
+/* `dir', `vdir' and `ls' directory listing programs for GNU.
+
+ Modified by Chet Ramey for Readline.
+
+ Copyright (C) 1985, 1988, 1990-1991, 1995-2010, 2012, 2017
+ Free Software Foundation, Inc.
+
+ 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/>. */
+
+/* Written by Richard Stallman and David MacKenzie. */
+
+/* Color support by Peter Anvin <Peter.Anvin@linux.org> and Dennis
+ Flaherty <dennisf@denix.elk.miles.com> based on original patches by
+ Greg Lee <lee@uhunix.uhcc.hawaii.edu>. */
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+// strdup() / strcpy()
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else /* !HAVE_STRING_H */
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+// abort()
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include "rldefs.h" // STREQ, savestring
+#include "readline.h"
+#include "rlprivate.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#include "colors.h"
+#include "parse-colors.h"
+
+#if defined (COLOR_SUPPORT)
+
+static bool get_funky_string (char **dest, const char **src, bool equals_end, size_t *output_count);
+
+struct bin_str _rl_color_indicator[] =
+ {
+ { LEN_STR_PAIR ("\033[") }, // lc: Left of color sequence
+ { LEN_STR_PAIR ("m") }, // rc: Right of color sequence
+ { 0, NULL }, // ec: End color (replaces lc+no+rc)
+ { LEN_STR_PAIR ("0") }, // rs: Reset to ordinary colors
+ { 0, NULL }, // no: Normal
+ { 0, NULL }, // fi: File: default
+ { LEN_STR_PAIR ("01;34") }, // di: Directory: bright blue
+ { LEN_STR_PAIR ("01;36") }, // ln: Symlink: bright cyan
+ { LEN_STR_PAIR ("33") }, // pi: Pipe: yellow/brown
+ { LEN_STR_PAIR ("01;35") }, // so: Socket: bright magenta
+ { LEN_STR_PAIR ("01;33") }, // bd: Block device: bright yellow
+ { LEN_STR_PAIR ("01;33") }, // cd: Char device: bright yellow
+ { 0, NULL }, // mi: Missing file: undefined
+ { 0, NULL }, // or: Orphaned symlink: undefined
+ { LEN_STR_PAIR ("01;32") }, // ex: Executable: bright green
+ { LEN_STR_PAIR ("01;35") }, // do: Door: bright magenta
+ { LEN_STR_PAIR ("37;41") }, // su: setuid: white on red
+ { LEN_STR_PAIR ("30;43") }, // sg: setgid: black on yellow
+ { LEN_STR_PAIR ("37;44") }, // st: sticky: black on blue
+ { LEN_STR_PAIR ("34;42") }, // ow: other-writable: blue on green
+ { LEN_STR_PAIR ("30;42") }, // tw: ow w/ sticky: black on green
+ { LEN_STR_PAIR ("30;41") }, // ca: black on red
+ { 0, NULL }, // mh: disabled by default
+ { LEN_STR_PAIR ("\033[K") }, // cl: clear to end of line
+ };
+
+/* Parse a string as part of the LS_COLORS variable; this may involve
+ decoding all kinds of escape characters. If equals_end is set an
+ unescaped equal sign ends the string, otherwise only a : or \0
+ does. Set *OUTPUT_COUNT to the number of bytes output. Return
+ true if successful.
+
+ The resulting string is *not* null-terminated, but may contain
+ embedded nulls.
+
+ Note that both dest and src are char **; on return they point to
+ the first free byte after the array and the character that ended
+ the input string, respectively. */
+
+static bool
+get_funky_string (char **dest, const char **src, bool equals_end, size_t *output_count) {
+ char num; /* For numerical codes */
+ size_t count; /* Something to count with */
+ enum {
+ ST_GND, ST_BACKSLASH, ST_OCTAL, ST_HEX, ST_CARET, ST_END, ST_ERROR
+ } state;
+ const char *p;
+ char *q;
+
+ p = *src; /* We don't want to double-indirect */
+ q = *dest; /* the whole darn time. */
+
+ count = 0; /* No characters counted in yet. */
+ num = 0;
+
+ state = ST_GND; /* Start in ground state. */
+ while (state < ST_END)
+ {
+ switch (state)
+ {
+ case ST_GND: /* Ground state (no escapes) */
+ switch (*p)
+ {
+ case ':':
+ case '\0':
+ state = ST_END; /* End of string */
+ break;
+ case '\\':
+ state = ST_BACKSLASH; /* Backslash scape sequence */
+ ++p;
+ break;
+ case '^':
+ state = ST_CARET; /* Caret escape */
+ ++p;
+ break;
+ case '=':
+ if (equals_end)
+ {
+ state = ST_END; /* End */
+ break;
+ }
+ /* else fall through */
+ default:
+ *(q++) = *(p++);
+ ++count;
+ break;
+ }
+ break;
+
+ case ST_BACKSLASH: /* Backslash escaped character */
+ switch (*p)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ state = ST_OCTAL; /* Octal sequence */
+ num = *p - '0';
+ break;
+ case 'x':
+ case 'X':
+ state = ST_HEX; /* Hex sequence */
+ num = 0;
+ break;
+ case 'a': /* Bell */
+ num = '\a';
+ break;
+ case 'b': /* Backspace */
+ num = '\b';
+ break;
+ case 'e': /* Escape */
+ num = 27;
+ break;
+ case 'f': /* Form feed */
+ num = '\f';
+ break;
+ case 'n': /* Newline */
+ num = '\n';
+ break;
+ case 'r': /* Carriage return */
+ num = '\r';
+ break;
+ case 't': /* Tab */
+ num = '\t';
+ break;
+ case 'v': /* Vtab */
+ num = '\v';
+ break;
+ case '?': /* Delete */
+ num = 127;
+ break;
+ case '_': /* Space */
+ num = ' ';
+ break;
+ case '\0': /* End of string */
+ state = ST_ERROR; /* Error! */
+ break;
+ default: /* Escaped character like \ ^ : = */
+ num = *p;
+ break;
+ }
+ if (state == ST_BACKSLASH)
+ {
+ *(q++) = num;
+ ++count;
+ state = ST_GND;
+ }
+ ++p;
+ break;
+
+ case ST_OCTAL: /* Octal sequence */
+ if (*p < '0' || *p > '7')
+ {
+ *(q++) = num;
+ ++count;
+ state = ST_GND;
+ }
+ else
+ num = (num << 3) + (*(p++) - '0');
+ break;
+
+ case ST_HEX: /* Hex sequence */
+ switch (*p)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ num = (num << 4) + (*(p++) - '0');
+ break;
+ case 'a':
+ case 'b':
+ case 'c':
+ case 'd':
+ case 'e':
+ case 'f':
+ num = (num << 4) + (*(p++) - 'a') + 10;
+ break;
+ case 'A':
+ case 'B':
+ case 'C':
+ case 'D':
+ case 'E':
+ case 'F':
+ num = (num << 4) + (*(p++) - 'A') + 10;
+ break;
+ default:
+ *(q++) = num;
+ ++count;
+ state = ST_GND;
+ break;
+ }
+ break;
+
+ case ST_CARET: /* Caret escape */
+ state = ST_GND; /* Should be the next state... */
+ if (*p >= '@' && *p <= '~')
+ {
+ *(q++) = *(p++) & 037;
+ ++count;
+ }
+ else if (*p == '?')
+ {
+ *(q++) = 127;
+ ++count;
+ }
+ else
+ state = ST_ERROR;
+ break;
+
+ default:
+ /* should we ? */
+ /* abort (); no, we should not */
+ state = ST_ERROR;
+ break;
+ }
+ }
+
+ *dest = q;
+ *src = p;
+ *output_count = count;
+
+ return state != ST_ERROR;
+}
+#endif /* COLOR_SUPPORT */
+
+void _rl_parse_colors(void)
+{
+#if defined (COLOR_SUPPORT)
+ const char *p; /* Pointer to character being parsed */
+ char *buf; /* color_buf buffer pointer */
+ int state; /* State of parser */
+ int ind_no; /* Indicator number */
+ char label[3]; /* Indicator label */
+ COLOR_EXT_TYPE *ext; /* Extension we are working on */
+
+ p = sh_get_env_value ("LS_COLORS");
+ if (p == 0 || *p == '\0')
+ {
+ _rl_color_ext_list = NULL;
+ return;
+ }
+
+ ext = NULL;
+ strcpy (label, "??");
+
+ /* This is an overly conservative estimate, but any possible
+ LS_COLORS string will *not* generate a color_buf longer than
+ itself, so it is a safe way of allocating a buffer in
+ advance. */
+ buf = color_buf = savestring (p);
+
+ state = 1;
+ while (state > 0)
+ {
+ switch (state)
+ {
+ case 1: /* First label character */
+ switch (*p)
+ {
+ case ':':
+ ++p;
+ break;
+
+ case '*':
+ /* Allocate new extension block and add to head of
+ linked list (this way a later definition will
+ override an earlier one, which can be useful for
+ having terminal-specific defs override global). */
+
+ ext = (COLOR_EXT_TYPE *)xmalloc (sizeof *ext);
+ ext->next = _rl_color_ext_list;
+ _rl_color_ext_list = ext;
+
+ ++p;
+ ext->ext.string = buf;
+
+ state = (get_funky_string (&buf, &p, true, &ext->ext.len)
+ ? 4 : -1);
+ break;
+
+ case '\0':
+ state = 0; /* Done! */
+ break;
+
+ default: /* Assume it is file type label */
+ label[0] = *(p++);
+ state = 2;
+ break;
+ }
+ break;
+
+ case 2: /* Second label character */
+ if (*p)
+ {
+ label[1] = *(p++);
+ state = 3;
+ }
+ else
+ state = -1; /* Error */
+ break;
+
+ case 3: /* Equal sign after indicator label */
+ state = -1; /* Assume failure... */
+ if (*(p++) == '=')/* It *should* be... */
+ {
+ for (ind_no = 0; indicator_name[ind_no] != NULL; ++ind_no)
+ {
+ if (STREQ (label, indicator_name[ind_no]))
+ {
+ _rl_color_indicator[ind_no].string = buf;
+ state = (get_funky_string (&buf, &p, false,
+ &_rl_color_indicator[ind_no].len)
+ ? 1 : -1);
+ break;
+ }
+ }
+ if (state == -1)
+ {
+ _rl_errmsg ("LS_COLORS: unrecognized prefix: %s", label);
+ /* recover from an unrecognized prefix */
+ while (p && *p && *p != ':')
+ p++;
+ if (p && *p == ':')
+ state = 1;
+ else if (p && *p == 0)
+ state = 0;
+ }
+ }
+ break;
+
+ case 4: /* Equal sign after *.ext */
+ if (*(p++) == '=')
+ {
+ ext->seq.string = buf;
+ state = (get_funky_string (&buf, &p, false, &ext->seq.len)
+ ? 1 : -1);
+ }
+ else
+ state = -1;
+ /* XXX - recover here as with an unrecognized prefix? */
+ if (state == -1 && ext->ext.string)
+ _rl_errmsg ("LS_COLORS: syntax error: %s", ext->ext.string);
+ break;
+ }
+ }
+
+ if (state < 0)
+ {
+ COLOR_EXT_TYPE *e;
+ COLOR_EXT_TYPE *e2;
+
+ _rl_errmsg ("unparsable value for LS_COLORS environment variable");
+ free (color_buf);
+ for (e = _rl_color_ext_list; e != NULL; /* empty */)
+ {
+ e2 = e;
+ e = e->next;
+ free (e2);
+ }
+ _rl_color_ext_list = NULL;
+ _rl_colored_stats = 0; /* can't have colored stats without colors */
+ }
+#else /* !COLOR_SUPPORT */
+ ;
+#endif /* !COLOR_SUPPORT */
+}
diff --git a/parse-colors.h b/parse-colors.h
new file mode 100644
index 0000000..aef86f7
--- /dev/null
+++ b/parse-colors.h
@@ -0,0 +1,46 @@
+/* `dir', `vdir' and `ls' directory listing programs for GNU.
+
+ Modified by Chet Ramey for Readline.
+
+ Copyright (C) 1985, 1988, 1990-1991, 1995-2010, 2012 Free Software Foundation,
+ Inc.
+
+ 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/>. */
+
+/* Written by Richard Stallman and David MacKenzie. */
+
+/* Color support by Peter Anvin <Peter.Anvin@linux.org> and Dennis
+ Flaherty <dennisf@denix.elk.miles.com> based on original patches by
+ Greg Lee <lee@uhunix.uhcc.hawaii.edu>. */
+
+#ifndef _PARSE_COLORS_H_
+#define _PARSE_COLORS_H_
+
+#include "readline.h"
+
+#define LEN_STR_PAIR(s) sizeof (s) - 1, s
+
+void _rl_parse_colors (void);
+
+static const char *const indicator_name[]=
+ {
+ "lc", "rc", "ec", "rs", "no", "fi", "di", "ln", "pi", "so",
+ "bd", "cd", "mi", "or", "ex", "do", "su", "sg", "st",
+ "ow", "tw", "ca", "mh", "cl", NULL
+ };
+
+/* Buffer for color sequences */
+static char *color_buf;
+
+#endif /* !_PARSE_COLORS_H_ */
diff --git a/patchlevel b/patchlevel
new file mode 100644
index 0000000..d8c9df7
--- /dev/null
+++ b/patchlevel
@@ -0,0 +1,3 @@
+# Do not edit -- exists only for use by patch
+
+0
diff --git a/posixdir.h b/posixdir.h
new file mode 100644
index 0000000..b737bd7
--- /dev/null
+++ b/posixdir.h
@@ -0,0 +1,71 @@
+/* posixdir.h -- Posix directory reading includes and defines. */
+
+/* Copyright (C) 1987,1991,2012,2019,2021 Free Software Foundation, Inc.
+
+ This file is part of GNU Bash, the Bourne Again SHell.
+
+ Bash 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.
+
+ Bash 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 Bash. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* This file should be included instead of <dirent.h> or <sys/dir.h>. */
+
+#if !defined (_POSIXDIR_H_)
+#define _POSIXDIR_H_
+
+#if defined (HAVE_DIRENT_H)
+# include <dirent.h>
+# if defined (HAVE_STRUCT_DIRENT_D_NAMLEN)
+# define D_NAMLEN(d) ((d)->d_namlen)
+# else
+# define D_NAMLEN(d) (strlen ((d)->d_name))
+# endif /* !HAVE_STRUCT_DIRENT_D_NAMLEN */
+#else
+# if defined (HAVE_SYS_NDIR_H)
+# include <sys/ndir.h>
+# endif
+# if defined (HAVE_SYS_DIR_H)
+# include <sys/dir.h>
+# endif
+# if defined (HAVE_NDIR_H)
+# include <ndir.h>
+# endif
+# if !defined (dirent)
+# define dirent direct
+# endif /* !dirent */
+# define D_NAMLEN(d) ((d)->d_namlen)
+#endif /* !HAVE_DIRENT_H */
+
+/* The bash code fairly consistently uses d_fileno; make sure it's available */
+#if defined (HAVE_STRUCT_DIRENT_D_INO) && !defined (HAVE_STRUCT_DIRENT_D_FILENO)
+# define d_fileno d_ino
+#endif
+
+/* Posix does not require that the d_ino field be present, and some
+ systems do not provide it. */
+#if !defined (HAVE_STRUCT_DIRENT_D_INO) || defined (BROKEN_DIRENT_D_INO)
+# define REAL_DIR_ENTRY(dp) 1
+#else
+# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
+#endif /* _POSIX_SOURCE */
+
+#if defined (HAVE_STRUCT_DIRENT_D_INO) && !defined (BROKEN_DIRENT_D_INO)
+# define D_INO_AVAILABLE
+#endif
+
+/* Signal the rest of the code that it can safely use dirent.d_fileno */
+#if defined (D_INO_AVAILABLE) || defined (HAVE_STRUCT_DIRENT_D_FILENO)
+# define D_FILENO_AVAILABLE 1
+#endif
+
+#endif /* !_POSIXDIR_H_ */
diff --git a/posixjmp.h b/posixjmp.h
new file mode 100644
index 0000000..9c7e99e
--- /dev/null
+++ b/posixjmp.h
@@ -0,0 +1,46 @@
+/* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */
+
+/* Copyright (C) 1987,1991-2015 Free Software Foundation, Inc.
+
+ This file is part of GNU Bash, the Bourne Again SHell.
+
+ Bash 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.
+
+ Bash 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 Bash. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _POSIXJMP_H_
+#define _POSIXJMP_H_
+
+#include <setjmp.h>
+
+/* This *must* be included *after* config.h */
+
+#if defined (HAVE_POSIX_SIGSETJMP)
+# define procenv_t sigjmp_buf
+
+# define setjmp_nosigs(x) sigsetjmp((x), 0)
+# define setjmp_sigs(x) sigsetjmp((x), 1)
+
+# define _rl_longjmp(x, n) siglongjmp((x), (n))
+# define sh_longjmp(x, n) siglongjmp((x), (n))
+#else
+# define procenv_t jmp_buf
+
+# define setjmp_nosigs setjmp
+# define setjmp_sigs setjmp
+
+# define _rl_longjmp(x, n) longjmp((x), (n))
+# define sh_longjmp(x, n) longjmp((x), (n))
+#endif
+
+#endif /* _POSIXJMP_H_ */
diff --git a/posixselect.h b/posixselect.h
new file mode 100644
index 0000000..da6a1ac
--- /dev/null
+++ b/posixselect.h
@@ -0,0 +1,47 @@
+/* posixselect.h -- wrapper for select(2) includes and definitions */
+
+/* Copyright (C) 2009 Free Software Foundation, Inc.
+
+ This file is part of GNU Bash, the Bourne Again SHell.
+
+ Bash 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.
+
+ Bash 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 Bash. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _POSIXSELECT_H_
+#define _POSIXSELECT_H_
+
+#if defined (FD_SET) && !defined (HAVE_SELECT)
+# define HAVE_SELECT 1
+#endif
+
+#if defined (HAVE_SELECT)
+# if !defined (HAVE_SYS_SELECT_H) || !defined (M_UNIX)
+# include <sys/time.h>
+# endif
+#endif /* HAVE_SELECT */
+#if defined (HAVE_SYS_SELECT_H)
+# include <sys/select.h>
+#endif
+
+#ifndef USEC_PER_SEC
+# define USEC_PER_SEC 1000000
+#endif
+
+#define USEC_TO_TIMEVAL(us, tv) \
+do { \
+ (tv).tv_sec = (us) / USEC_PER_SEC; \
+ (tv).tv_usec = (us) % USEC_PER_SEC; \
+} while (0)
+
+#endif /* _POSIXSELECT_H_ */
diff --git a/posixstat.h b/posixstat.h
new file mode 100644
index 0000000..b607786
--- /dev/null
+++ b/posixstat.h
@@ -0,0 +1,162 @@
+/* posixstat.h -- Posix stat(2) definitions for systems that
+ don't have them. */
+
+/* Copyright (C) 1987-2019 Free Software Foundation, Inc.
+
+ This file is part of GNU Bash, the Bourne Again SHell.
+
+ Bash 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.
+
+ Bash 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 Bash. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* This file should be included instead of <sys/stat.h>.
+ It relies on the local sys/stat.h to work though. */
+#if !defined (_POSIXSTAT_H_)
+#define _POSIXSTAT_H_
+
+#include <sys/stat.h>
+
+#if defined (STAT_MACROS_BROKEN)
+# undef S_ISBLK
+# undef S_ISCHR
+# undef S_ISDIR
+# undef S_ISFIFO
+# undef S_ISREG
+# undef S_ISLNK
+#endif /* STAT_MACROS_BROKEN */
+
+/* These are guaranteed to work only on isc386 */
+#if !defined (S_IFDIR) && !defined (S_ISDIR)
+# define S_IFDIR 0040000
+#endif /* !S_IFDIR && !S_ISDIR */
+#if !defined (S_IFMT)
+# define S_IFMT 0170000
+#endif /* !S_IFMT */
+
+/* Posix 1003.1 5.6.1.1 <sys/stat.h> file types */
+
+/* Some Posix-wannabe systems define _S_IF* macros instead of S_IF*, but
+ do not provide the S_IS* macros that Posix requires. */
+
+#if defined (_S_IFMT) && !defined (S_IFMT)
+#define S_IFMT _S_IFMT
+#endif
+#if defined (_S_IFIFO) && !defined (S_IFIFO)
+#define S_IFIFO _S_IFIFO
+#endif
+#if defined (_S_IFCHR) && !defined (S_IFCHR)
+#define S_IFCHR _S_IFCHR
+#endif
+#if defined (_S_IFDIR) && !defined (S_IFDIR)
+#define S_IFDIR _S_IFDIR
+#endif
+#if defined (_S_IFBLK) && !defined (S_IFBLK)
+#define S_IFBLK _S_IFBLK
+#endif
+#if defined (_S_IFREG) && !defined (S_IFREG)
+#define S_IFREG _S_IFREG
+#endif
+#if defined (_S_IFLNK) && !defined (S_IFLNK)
+#define S_IFLNK _S_IFLNK
+#endif
+#if defined (_S_IFSOCK) && !defined (S_IFSOCK)
+#define S_IFSOCK _S_IFSOCK
+#endif
+
+/* Test for each symbol individually and define the ones necessary (some
+ systems claiming Posix compatibility define some but not all). */
+
+#if defined (S_IFBLK) && !defined (S_ISBLK)
+#define S_ISBLK(m) (((m)&S_IFMT) == S_IFBLK) /* block device */
+#endif
+
+#if defined (S_IFCHR) && !defined (S_ISCHR)
+#define S_ISCHR(m) (((m)&S_IFMT) == S_IFCHR) /* character device */
+#endif
+
+#if defined (S_IFDIR) && !defined (S_ISDIR)
+#define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) /* directory */
+#endif
+
+#if defined (S_IFREG) && !defined (S_ISREG)
+#define S_ISREG(m) (((m)&S_IFMT) == S_IFREG) /* file */
+#endif
+
+#if defined (S_IFIFO) && !defined (S_ISFIFO)
+#define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO) /* fifo - named pipe */
+#endif
+
+#if defined (S_IFLNK) && !defined (S_ISLNK)
+#define S_ISLNK(m) (((m)&S_IFMT) == S_IFLNK) /* symbolic link */
+#endif
+
+#if defined (S_IFSOCK) && !defined (S_ISSOCK)
+#define S_ISSOCK(m) (((m)&S_IFMT) == S_IFSOCK) /* socket */
+#endif
+
+/*
+ * POSIX 1003.1 5.6.1.2 <sys/stat.h> File Modes
+ */
+
+#if !defined (S_IRWXU)
+# if !defined (S_IREAD)
+# define S_IREAD 00400
+# define S_IWRITE 00200
+# define S_IEXEC 00100
+# endif /* S_IREAD */
+
+# if !defined (S_IRUSR)
+# define S_IRUSR S_IREAD /* read, owner */
+# define S_IWUSR S_IWRITE /* write, owner */
+# define S_IXUSR S_IEXEC /* execute, owner */
+
+# define S_IRGRP (S_IREAD >> 3) /* read, group */
+# define S_IWGRP (S_IWRITE >> 3) /* write, group */
+# define S_IXGRP (S_IEXEC >> 3) /* execute, group */
+
+# define S_IROTH (S_IREAD >> 6) /* read, other */
+# define S_IWOTH (S_IWRITE >> 6) /* write, other */
+# define S_IXOTH (S_IEXEC >> 6) /* execute, other */
+# endif /* !S_IRUSR */
+
+# define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
+# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
+# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
+#else /* !S_IRWXU */
+ /* S_IRWXU is defined, but "group" and "other" bits might not be
+ (happens in certain versions of MinGW). */
+# if !defined (S_IRGRP)
+# define S_IRGRP (S_IREAD >> 3) /* read, group */
+# define S_IWGRP (S_IWRITE >> 3) /* write, group */
+# define S_IXGRP (S_IEXEC >> 3) /* execute, group */
+# endif /* !S_IRGRP */
+
+# if !defined (S_IROTH)
+# define S_IROTH (S_IREAD >> 6) /* read, other */
+# define S_IWOTH (S_IWRITE >> 6) /* write, other */
+# define S_IXOTH (S_IEXEC >> 6) /* execute, other */
+# endif /* !S_IROTH */
+# if !defined (S_IRWXG)
+# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
+# endif
+# if !defined (S_IRWXO)
+# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
+# endif
+#endif /* !S_IRWXU */
+
+/* These are non-standard, but are used in builtins.c$symbolic_umask() */
+#define S_IRUGO (S_IRUSR | S_IRGRP | S_IROTH)
+#define S_IWUGO (S_IWUSR | S_IWGRP | S_IWOTH)
+#define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
+
+#endif /* _POSIXSTAT_H_ */
diff --git a/posixtime.h b/posixtime.h
new file mode 100644
index 0000000..e70ebec
--- /dev/null
+++ b/posixtime.h
@@ -0,0 +1,84 @@
+/* posixtime.h -- wrapper for time.h, sys/times.h mess. */
+
+/* Copyright (C) 1999-2021 Free Software Foundation, Inc.
+
+ This file is part of GNU Bash, the Bourne Again SHell.
+
+ Bash 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.
+
+ Bash 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 Bash. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _POSIXTIME_H_
+#define _POSIXTIME_H_
+
+/* include this after config.h */
+/* Some systems require this, mostly for the definition of `struct timezone'.
+ For example, Dynix/ptx has that definition in <time.h> rather than
+ sys/time.h */
+#if defined (HAVE_SYS_TIME_H)
+# include <sys/time.h>
+#endif
+#include <time.h>
+
+#if !defined (HAVE_SYSCONF) || !defined (_SC_CLK_TCK)
+# if !defined (CLK_TCK)
+# if defined (HZ)
+# define CLK_TCK HZ
+# else
+# define CLK_TCK 60 /* 60HZ */
+# endif
+# endif /* !CLK_TCK */
+#endif /* !HAVE_SYSCONF && !_SC_CLK_TCK */
+
+#if !HAVE_TIMEVAL
+struct timeval
+{
+ time_t tv_sec;
+ long int tv_usec;
+};
+#endif
+
+#if !HAVE_GETTIMEOFDAY
+extern int gettimeofday PARAMS((struct timeval *, void *));
+#endif
+
+/* These exist on BSD systems, at least. */
+#if !defined (timerclear)
+# define timerclear(tvp) do { (tvp)->tv_sec = 0; (tvp)->tv_usec = 0; } while (0)
+#endif
+#if !defined (timerisset)
+# define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
+#endif
+#if !defined (timercmp)
+# define timercmp(a, b, CMP) \
+ (((a)->tv_sec == (b)->tv_sec) ? ((a)->tv_usec CMP (b)->tv_usec) \
+ : ((a)->tv_sec CMP (b)->tv_sec))
+#endif
+
+/* These are non-standard. */
+#if !defined (timerisunset)
+# define timerisunset(tvp) ((tvp)->tv_sec == 0 && (tvp)->tv_usec == 0)
+#endif
+#if !defined (timerset)
+# define timerset(tvp, s, u) do { tvp->tv_sec = s; tvp->tv_usec = u; } while (0)
+#endif
+
+#ifndef TIMEVAL_TO_TIMESPEC
+# define TIMEVAL_TO_TIMESPEC(tv, ts) \
+ do { \
+ (ts)->tv_sec = (tv)->tv_sec; \
+ (ts)->tv_nsec = (tv)->tv_usec * 1000; \
+ } while (0)
+#endif
+
+#endif /* _POSIXTIME_H_ */
diff --git a/readline.c b/readline.c
new file mode 100644
index 0000000..9d42a8d
--- /dev/null
+++ b/readline.c
@@ -0,0 +1,1575 @@
+/* readline.c -- a general facility for reading lines of input
+ with emacs style editing and completion. */
+
+/* Copyright (C) 1987-2022 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include "posixstat.h"
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+# include <sys/file.h>
+#endif /* HAVE_SYS_FILE_H */
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_LOCALE_H)
+# include <locale.h>
+#endif
+
+#include <stdio.h>
+#include "posixjmp.h"
+#include <errno.h>
+
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#if defined (__EMX__)
+# define INCL_DOSPROCESS
+# include <os2.h>
+#endif /* __EMX__ */
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#if defined (COLOR_SUPPORT)
+# include "parse-colors.h"
+#endif
+
+#ifndef RL_LIBRARY_VERSION
+# define RL_LIBRARY_VERSION "8.1"
+#endif
+
+#ifndef RL_READLINE_VERSION
+# define RL_READLINE_VERSION 0x0801
+#endif
+
+/* Forward declarations used in this file. */
+static char *readline_internal (void);
+static void readline_initialize_everything (void);
+
+static void run_startup_hooks (void);
+
+static void bind_arrow_keys_internal (Keymap);
+static void bind_arrow_keys (void);
+
+static void bind_bracketed_paste_prefix (void);
+
+static void readline_default_bindings (void);
+static void reset_default_bindings (void);
+
+static int _rl_subseq_result (int, Keymap, int, int);
+static int _rl_subseq_getchar (int);
+
+/* **************************************************************** */
+/* */
+/* Line editing input utility */
+/* */
+/* **************************************************************** */
+
+const char *rl_library_version = RL_LIBRARY_VERSION;
+
+int rl_readline_version = RL_READLINE_VERSION;
+
+/* True if this is `real' readline as opposed to some stub substitute. */
+int rl_gnu_readline_p = 1;
+
+/* A pointer to the keymap that is currently in use.
+ By default, it is the standard emacs keymap. */
+Keymap _rl_keymap = emacs_standard_keymap;
+
+/* The current style of editing. */
+int rl_editing_mode = emacs_mode;
+
+/* The current insert mode: input (the default) or overwrite */
+int rl_insert_mode = RL_IM_DEFAULT;
+
+/* Non-zero if we called this function from _rl_dispatch(). It's present
+ so functions can find out whether they were called from a key binding
+ or directly from an application. */
+int rl_dispatching;
+
+/* Non-zero if the previous command was a kill command. */
+int _rl_last_command_was_kill = 0;
+
+/* The current value of the numeric argument specified by the user. */
+int rl_numeric_arg = 1;
+
+/* Non-zero if an argument was typed. */
+int rl_explicit_arg = 0;
+
+/* Temporary value used while generating the argument. */
+int rl_arg_sign = 1;
+
+/* Non-zero means we have been called at least once before. */
+static int rl_initialized;
+
+#if 0
+/* If non-zero, this program is running in an EMACS buffer. */
+static int running_in_emacs;
+#endif
+
+/* Flags word encapsulating the current readline state. */
+unsigned long rl_readline_state = RL_STATE_NONE;
+
+/* The current offset in the current input line. */
+int rl_point;
+
+/* Mark in the current input line. */
+int rl_mark;
+
+/* Length of the current input line. */
+int rl_end;
+
+/* Make this non-zero to return the current input_line. */
+int rl_done;
+
+/* If non-zero when readline_internal returns, it means we found EOF */
+int rl_eof_found = 0;
+
+/* The last function executed by readline. */
+rl_command_func_t *rl_last_func = (rl_command_func_t *)NULL;
+
+/* Top level environment for readline_internal (). */
+procenv_t _rl_top_level;
+
+/* The streams we interact with. */
+FILE *_rl_in_stream, *_rl_out_stream;
+
+/* The names of the streams that we do input and output to. */
+FILE *rl_instream = (FILE *)NULL;
+FILE *rl_outstream = (FILE *)NULL;
+
+/* Non-zero means echo characters as they are read. Defaults to no echo;
+ set to 1 if there is a controlling terminal, we can get its attributes,
+ and the attributes include `echo'. Look at rltty.c:prepare_terminal_settings
+ for the code that sets it. */
+int _rl_echoing_p = 0;
+
+/* Current prompt. */
+char *rl_prompt = (char *)NULL;
+int rl_visible_prompt_length = 0;
+
+/* Set to non-zero by calling application if it has already printed rl_prompt
+ and does not want readline to do it the first time. */
+int rl_already_prompted = 0;
+
+/* The number of characters read in order to type this complete command. */
+int rl_key_sequence_length = 0;
+
+/* If non-zero, then this is the address of a function to call just
+ before readline_internal_setup () prints the first prompt. */
+rl_hook_func_t *rl_startup_hook = (rl_hook_func_t *)NULL;
+
+/* Any readline function can set this and have it run just before the user's
+ rl_startup_hook. */
+rl_hook_func_t *_rl_internal_startup_hook = (rl_hook_func_t *)NULL;
+
+/* If non-zero, this is the address of a function to call just before
+ readline_internal_setup () returns and readline_internal starts
+ reading input characters. */
+rl_hook_func_t *rl_pre_input_hook = (rl_hook_func_t *)NULL;
+
+/* What we use internally. You should always refer to RL_LINE_BUFFER. */
+static char *the_line;
+
+/* The character that can generate an EOF. Really read from
+ the terminal driver... just defaulted here. */
+int _rl_eof_char = CTRL ('D');
+
+/* Non-zero makes this the next keystroke to read. */
+int rl_pending_input = 0;
+
+/* Pointer to a useful terminal name. */
+const char *rl_terminal_name = (const char *)NULL;
+
+/* Non-zero means to always use horizontal scrolling in line display. */
+int _rl_horizontal_scroll_mode = 0;
+
+/* Non-zero means to display an asterisk at the starts of history lines
+ which have been modified. */
+int _rl_mark_modified_lines = 0;
+
+/* The style of `bell' notification preferred. This can be set to NO_BELL,
+ AUDIBLE_BELL, or VISIBLE_BELL. */
+int _rl_bell_preference = AUDIBLE_BELL;
+
+/* String inserted into the line by rl_insert_comment (). */
+char *_rl_comment_begin;
+
+/* Keymap holding the function currently being executed. */
+Keymap rl_executing_keymap;
+
+/* The function currently being executed. */
+rl_command_func_t *_rl_executing_func;
+
+/* Keymap we're currently using to dispatch. */
+Keymap _rl_dispatching_keymap;
+
+/* Non-zero means to erase entire line, including prompt, on empty input lines. */
+int rl_erase_empty_line = 0;
+
+/* Non-zero means to read only this many characters rather than up to a
+ character bound to accept-line. */
+int rl_num_chars_to_read = 0;
+
+/* Line buffer and maintenance. */
+char *rl_line_buffer = (char *)NULL;
+int rl_line_buffer_len = 0;
+
+/* Key sequence `contexts' */
+_rl_keyseq_cxt *_rl_kscxt = 0;
+
+int rl_executing_key;
+char *rl_executing_keyseq = 0;
+int _rl_executing_keyseq_size = 0;
+
+struct _rl_cmd _rl_pending_command;
+struct _rl_cmd *_rl_command_to_execute = (struct _rl_cmd *)NULL;
+
+/* Timeout (specified in milliseconds) when reading characters making up an
+ ambiguous multiple-key sequence */
+int _rl_keyseq_timeout = 500;
+
+#define RESIZE_KEYSEQ_BUFFER() \
+ do \
+ { \
+ if (rl_key_sequence_length + 2 >= _rl_executing_keyseq_size) \
+ { \
+ _rl_executing_keyseq_size += 16; \
+ rl_executing_keyseq = xrealloc (rl_executing_keyseq, _rl_executing_keyseq_size); \
+ } \
+ } \
+ while (0);
+
+/* Forward declarations used by the display, termcap, and history code. */
+
+/* **************************************************************** */
+/* */
+/* `Forward' declarations */
+/* */
+/* **************************************************************** */
+
+/* Non-zero means do not parse any lines other than comments and
+ parser directives. */
+unsigned char _rl_parsing_conditionalized_out = 0;
+
+/* Non-zero means to convert characters with the meta bit set to
+ escape-prefixed characters so we can indirect through
+ emacs_meta_keymap or vi_escape_keymap. */
+int _rl_convert_meta_chars_to_ascii = 1;
+
+/* Non-zero means to output characters with the meta bit set directly
+ rather than as a meta-prefixed escape sequence. */
+int _rl_output_meta_chars = 0;
+
+/* Non-zero means to look at the termios special characters and bind
+ them to equivalent readline functions at startup. */
+int _rl_bind_stty_chars = 1;
+
+/* Non-zero means to go through the history list at every newline (or
+ whenever rl_done is set and readline returns) and revert each line to
+ its initial state. */
+int _rl_revert_all_at_newline = 0;
+
+/* Non-zero means to honor the termios ECHOCTL bit and echo control
+ characters corresponding to keyboard-generated signals. */
+int _rl_echo_control_chars = 1;
+
+/* Non-zero means to prefix the displayed prompt with a character indicating
+ the editing mode: @ for emacs, : for vi-command, + for vi-insert. */
+int _rl_show_mode_in_prompt = 0;
+
+/* Non-zero means to attempt to put the terminal in `bracketed paste mode',
+ where it will prefix pasted text with an escape sequence and send
+ another to mark the end of the paste. */
+int _rl_enable_bracketed_paste = BRACKETED_PASTE_DEFAULT;
+int _rl_enable_active_region = BRACKETED_PASTE_DEFAULT;
+
+/* **************************************************************** */
+/* */
+/* Top Level Functions */
+/* */
+/* **************************************************************** */
+
+/* Non-zero means treat 0200 bit in terminal input as Meta bit. */
+int _rl_meta_flag = 0; /* Forward declaration */
+
+/* Set up the prompt and expand it. Called from readline() and
+ rl_callback_handler_install (). */
+int
+rl_set_prompt (const char *prompt)
+{
+ FREE (rl_prompt);
+ rl_prompt = prompt ? savestring (prompt) : (char *)NULL;
+ rl_display_prompt = rl_prompt ? rl_prompt : "";
+
+ rl_visible_prompt_length = rl_expand_prompt (rl_prompt);
+ return 0;
+}
+
+/* Read a line of input. Prompt with PROMPT. An empty PROMPT means
+ none. A return value of NULL means that EOF was encountered. */
+char *
+readline (const char *prompt)
+{
+ char *value;
+#if 0
+ int in_callback;
+#endif
+
+ /* If we are at EOF return a NULL string. */
+ if (rl_pending_input == EOF)
+ {
+ rl_clear_pending_input ();
+ return ((char *)NULL);
+ }
+
+#if 0
+ /* If readline() is called after installing a callback handler, temporarily
+ turn off the callback state to avoid ensuing messiness. Patch supplied
+ by the gdb folks. XXX -- disabled. This can be fooled and readline
+ left in a strange state by a poorly-timed longjmp. */
+ if (in_callback = RL_ISSTATE (RL_STATE_CALLBACK))
+ RL_UNSETSTATE (RL_STATE_CALLBACK);
+#endif
+
+ rl_set_prompt (prompt);
+
+ rl_initialize ();
+ if (rl_prep_term_function)
+ (*rl_prep_term_function) (_rl_meta_flag);
+
+#if defined (HANDLE_SIGNALS)
+ rl_set_signals ();
+#endif
+
+ value = readline_internal ();
+ if (rl_deprep_term_function)
+ (*rl_deprep_term_function) ();
+
+#if defined (HANDLE_SIGNALS)
+ rl_clear_signals ();
+#endif
+
+#if 0
+ if (in_callback)
+ RL_SETSTATE (RL_STATE_CALLBACK);
+#endif
+
+#if HAVE_DECL_AUDIT_USER_TTY && defined (HAVE_LIBAUDIT_H) && defined (ENABLE_TTY_AUDIT_SUPPORT)
+ if (value)
+ _rl_audit_tty (value);
+#endif
+
+ return (value);
+}
+
+static void
+run_startup_hooks (void)
+{
+ if (rl_startup_hook)
+ (*rl_startup_hook) ();
+
+ if (_rl_internal_startup_hook)
+ (*_rl_internal_startup_hook) ();
+}
+
+#if defined (READLINE_CALLBACKS)
+# define STATIC_CALLBACK
+#else
+# define STATIC_CALLBACK static
+#endif
+
+STATIC_CALLBACK void
+readline_internal_setup (void)
+{
+ char *nprompt;
+
+ _rl_in_stream = rl_instream;
+ _rl_out_stream = rl_outstream;
+
+ /* Enable the meta key only for the duration of readline(), if this
+ terminal has one and the terminal has been initialized */
+ if (_rl_enable_meta & RL_ISSTATE (RL_STATE_TERMPREPPED))
+ _rl_enable_meta_key ();
+
+ run_startup_hooks ();
+
+ rl_deactivate_mark ();
+
+#if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode)
+ rl_vi_insertion_mode (1, 'i'); /* don't want to reset last */
+ else
+#endif /* VI_MODE */
+ if (_rl_show_mode_in_prompt)
+ _rl_reset_prompt ();
+
+ /* If we're not echoing, we still want to at least print a prompt, because
+ rl_redisplay will not do it for us. If the calling application has a
+ custom redisplay function, though, let that function handle it. */
+ if (_rl_echoing_p == 0 && rl_redisplay_function == rl_redisplay)
+ {
+ if (rl_prompt && rl_already_prompted == 0)
+ {
+ nprompt = _rl_strip_prompt (rl_prompt);
+ fprintf (_rl_out_stream, "%s", nprompt);
+ fflush (_rl_out_stream);
+ xfree (nprompt);
+ }
+ }
+ else
+ {
+ if (rl_prompt && rl_already_prompted)
+ rl_on_new_line_with_prompt ();
+ else
+ rl_on_new_line ();
+ (*rl_redisplay_function) ();
+ }
+
+ if (rl_pre_input_hook)
+ (*rl_pre_input_hook) ();
+
+ RL_CHECK_SIGNALS ();
+}
+
+STATIC_CALLBACK char *
+readline_internal_teardown (int eof)
+{
+ char *temp;
+ HIST_ENTRY *entry;
+
+ RL_CHECK_SIGNALS ();
+
+ if (eof)
+ RL_SETSTATE (RL_STATE_EOF); /* XXX */
+
+ /* Restore the original of this history line, iff the line that we
+ are editing was originally in the history, AND the line has changed. */
+ entry = current_history ();
+
+ /* We don't want to do this if we executed functions that call
+ history_set_pos to set the history offset to the line containing the
+ non-incremental search string. */
+ if (entry && rl_undo_list)
+ {
+ temp = savestring (the_line);
+ rl_revert_line (1, 0);
+ entry = replace_history_entry (where_history (), the_line, (histdata_t)NULL);
+ _rl_free_history_entry (entry);
+
+ strcpy (the_line, temp);
+ xfree (temp);
+ }
+
+ if (_rl_revert_all_at_newline)
+ _rl_revert_all_lines ();
+
+ /* At any rate, it is highly likely that this line has an undo list. Get
+ rid of it now. */
+ if (rl_undo_list)
+ rl_free_undo_list ();
+
+ /* Disable the meta key, if this terminal has one and we were told to use it.
+ The check whether or not we sent the enable string is in
+ _rl_disable_meta_key(); the flag is set in _rl_enable_meta_key */
+ _rl_disable_meta_key ();
+
+ /* Restore normal cursor, if available. */
+ _rl_set_insert_mode (RL_IM_INSERT, 0);
+
+ return (eof ? (char *)NULL : savestring (the_line));
+}
+
+void
+_rl_internal_char_cleanup (void)
+{
+ if (_rl_keep_mark_active)
+ _rl_keep_mark_active = 0;
+ else if (rl_mark_active_p ())
+ rl_deactivate_mark ();
+
+#if defined (VI_MODE)
+ /* In vi mode, when you exit insert mode, the cursor moves back
+ over the previous character. We explicitly check for that here. */
+ if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap)
+ rl_vi_check ();
+#endif /* VI_MODE */
+
+ if (rl_num_chars_to_read && rl_end >= rl_num_chars_to_read)
+ {
+ (*rl_redisplay_function) ();
+ _rl_want_redisplay = 0;
+ rl_newline (1, '\n');
+ }
+
+ if (rl_done == 0)
+ {
+ (*rl_redisplay_function) ();
+ _rl_want_redisplay = 0;
+ }
+
+ /* If the application writer has told us to erase the entire line if
+ the only character typed was something bound to rl_newline, do so. */
+ if (rl_erase_empty_line && rl_done && rl_last_func == rl_newline &&
+ rl_point == 0 && rl_end == 0)
+ _rl_erase_entire_line ();
+}
+
+STATIC_CALLBACK int
+#if defined (READLINE_CALLBACKS)
+readline_internal_char (void)
+#else
+readline_internal_charloop (void)
+#endif
+{
+ static int lastc, eof_found;
+ int c, code, lk, r;
+
+ lastc = EOF;
+
+#if !defined (READLINE_CALLBACKS)
+ eof_found = 0;
+ while (rl_done == 0)
+ {
+#endif
+ lk = _rl_last_command_was_kill;
+
+#if defined (HAVE_POSIX_SIGSETJMP)
+ code = sigsetjmp (_rl_top_level, 0);
+#else
+ code = setjmp (_rl_top_level);
+#endif
+
+ if (code)
+ {
+ (*rl_redisplay_function) ();
+ _rl_want_redisplay = 0;
+
+ /* If we longjmped because of a timeout, handle it here. */
+ if (RL_ISSTATE (RL_STATE_TIMEOUT))
+ {
+ RL_SETSTATE (RL_STATE_DONE);
+ rl_done = 1;
+ return 1;
+ }
+
+ /* If we get here, we're not being called from something dispatched
+ from _rl_callback_read_char(), which sets up its own value of
+ _rl_top_level (saving and restoring the old, of course), so
+ we can just return here. */
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ return (0);
+ }
+
+ if (rl_pending_input == 0)
+ {
+ /* Then initialize the argument and number of keys read. */
+ _rl_reset_argument ();
+ rl_executing_keyseq[rl_key_sequence_length = 0] = '\0';
+ }
+
+ RL_SETSTATE(RL_STATE_READCMD);
+ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_READCMD);
+
+ /* look at input.c:rl_getc() for the circumstances under which this will
+ be returned; punt immediately on read error without converting it to
+ a newline; assume that rl_read_key has already called the signal
+ handler. */
+ if (c == READERR)
+ {
+#if defined (READLINE_CALLBACKS)
+ RL_SETSTATE(RL_STATE_DONE);
+ return (rl_done = 1);
+#else
+ RL_SETSTATE(RL_STATE_EOF);
+ eof_found = 1;
+ break;
+#endif
+ }
+
+ /* EOF typed to a non-blank line is ^D the first time, EOF the second
+ time in a row. This won't return any partial line read from the tty.
+ If we want to change this, to force any existing line to be returned
+ when read(2) reads EOF, for example, this is the place to change. */
+ if (c == EOF && rl_end)
+ {
+ if (RL_SIG_RECEIVED ())
+ {
+ RL_CHECK_SIGNALS ();
+ if (rl_signal_event_hook)
+ (*rl_signal_event_hook) (); /* XXX */
+ }
+
+ /* XXX - reading two consecutive EOFs returns EOF */
+ if (RL_ISSTATE (RL_STATE_TERMPREPPED))
+ {
+ if (lastc == _rl_eof_char || lastc == EOF)
+ rl_end = 0;
+ else
+ c = _rl_eof_char;
+ }
+ else
+ c = NEWLINE;
+ }
+
+ /* The character _rl_eof_char typed to blank line, and not as the
+ previous character is interpreted as EOF. This doesn't work when
+ READLINE_CALLBACKS is defined, so hitting a series of ^Ds will
+ erase all the chars on the line and then return EOF. */
+ if (((c == _rl_eof_char && lastc != c) || c == EOF) && rl_end == 0)
+ {
+#if defined (READLINE_CALLBACKS)
+ RL_SETSTATE(RL_STATE_DONE);
+ return (rl_done = 1);
+#else
+ RL_SETSTATE(RL_STATE_EOF);
+ eof_found = 1;
+ break;
+#endif
+ }
+
+ lastc = c;
+ r = _rl_dispatch ((unsigned char)c, _rl_keymap);
+ RL_CHECK_SIGNALS ();
+
+ if (_rl_command_to_execute)
+ {
+ (*rl_redisplay_function) ();
+
+ rl_executing_keymap = _rl_command_to_execute->map;
+ rl_executing_key = _rl_command_to_execute->key;
+
+ _rl_executing_func = _rl_command_to_execute->func;
+
+ rl_dispatching = 1;
+ RL_SETSTATE(RL_STATE_DISPATCHING);
+ r = (*(_rl_command_to_execute->func)) (_rl_command_to_execute->count, _rl_command_to_execute->key);
+ _rl_command_to_execute = 0;
+ RL_UNSETSTATE(RL_STATE_DISPATCHING);
+ rl_dispatching = 0;
+
+ RL_CHECK_SIGNALS ();
+ }
+
+ /* If there was no change in _rl_last_command_was_kill, then no kill
+ has taken place. Note that if input is pending we are reading
+ a prefix command, so nothing has changed yet. */
+ if (rl_pending_input == 0 && lk == _rl_last_command_was_kill)
+ _rl_last_command_was_kill = 0;
+
+ _rl_internal_char_cleanup ();
+
+#if defined (READLINE_CALLBACKS)
+ return 0;
+#else
+ }
+
+ return (eof_found);
+#endif
+}
+
+#if defined (READLINE_CALLBACKS)
+static int
+readline_internal_charloop (void)
+{
+ int eof = 1;
+
+ while (rl_done == 0)
+ eof = readline_internal_char ();
+ return (eof);
+}
+#endif /* READLINE_CALLBACKS */
+
+/* Read a line of input from the global rl_instream, doing output on
+ the global rl_outstream.
+ If rl_prompt is non-null, then that is our prompt. */
+static char *
+readline_internal (void)
+{
+ readline_internal_setup ();
+ rl_eof_found = readline_internal_charloop ();
+ return (readline_internal_teardown (rl_eof_found));
+}
+
+void
+_rl_init_line_state (void)
+{
+ rl_point = rl_end = rl_mark = 0;
+ the_line = rl_line_buffer;
+ the_line[0] = 0;
+}
+
+void
+_rl_set_the_line (void)
+{
+ the_line = rl_line_buffer;
+}
+
+#if defined (READLINE_CALLBACKS)
+_rl_keyseq_cxt *
+_rl_keyseq_cxt_alloc (void)
+{
+ _rl_keyseq_cxt *cxt;
+
+ cxt = (_rl_keyseq_cxt *)xmalloc (sizeof (_rl_keyseq_cxt));
+
+ cxt->flags = cxt->subseq_arg = cxt->subseq_retval = 0;
+
+ cxt->okey = 0;
+ cxt->ocxt = _rl_kscxt;
+ cxt->childval = 42; /* sentinel value */
+
+ return cxt;
+}
+
+void
+_rl_keyseq_cxt_dispose (_rl_keyseq_cxt *cxt)
+{
+ xfree (cxt);
+}
+
+void
+_rl_keyseq_chain_dispose (void)
+{
+ _rl_keyseq_cxt *cxt;
+
+ while (_rl_kscxt)
+ {
+ cxt = _rl_kscxt;
+ _rl_kscxt = _rl_kscxt->ocxt;
+ _rl_keyseq_cxt_dispose (cxt);
+ }
+}
+#endif
+
+static int
+_rl_subseq_getchar (int key)
+{
+ int k;
+
+ if (key == ESC)
+ RL_SETSTATE(RL_STATE_METANEXT);
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ k = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+ if (key == ESC)
+ RL_UNSETSTATE(RL_STATE_METANEXT);
+
+ return k;
+}
+
+#if defined (READLINE_CALLBACKS)
+int
+_rl_dispatch_callback (_rl_keyseq_cxt *cxt)
+{
+ int nkey, r;
+
+ /* For now */
+ /* The first time this context is used, we want to read input and dispatch
+ on it. When traversing the chain of contexts back `up', we want to use
+ the value from the next context down. We're simulating recursion using
+ a chain of contexts. */
+ if ((cxt->flags & KSEQ_DISPATCHED) == 0)
+ {
+ nkey = _rl_subseq_getchar (cxt->okey);
+ if (nkey < 0)
+ {
+ _rl_abort_internal ();
+ return -1;
+ }
+ r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg);
+ cxt->flags |= KSEQ_DISPATCHED;
+ }
+ else
+ r = cxt->childval;
+
+ /* For now */
+ if (r != -3) /* don't do this if we indicate there will be other matches */
+ r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ));
+
+ RL_CHECK_SIGNALS ();
+ /* We only treat values < 0 specially to simulate recursion. */
+ if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0)) /* success! or failure! */
+ {
+ _rl_keyseq_chain_dispose ();
+ RL_UNSETSTATE (RL_STATE_MULTIKEY);
+ return r;
+ }
+
+ if (r != -3) /* magic value that says we added to the chain */
+ _rl_kscxt = cxt->ocxt;
+ if (_rl_kscxt)
+ _rl_kscxt->childval = r;
+ if (r != -3)
+ _rl_keyseq_cxt_dispose (cxt);
+
+ return r;
+}
+#endif /* READLINE_CALLBACKS */
+
+/* Do the command associated with KEY in MAP.
+ If the associated command is really a keymap, then read
+ another key, and dispatch into that map. */
+int
+_rl_dispatch (register int key, Keymap map)
+{
+ _rl_dispatching_keymap = map;
+ return _rl_dispatch_subseq (key, map, 0);
+}
+
+int
+_rl_dispatch_subseq (register int key, Keymap map, int got_subseq)
+{
+ int r, newkey;
+ char *macro;
+ rl_command_func_t *func;
+#if defined (READLINE_CALLBACKS)
+ _rl_keyseq_cxt *cxt;
+#endif
+
+ if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
+ {
+ if (map[ESC].type == ISKMAP)
+ {
+ if (RL_ISSTATE (RL_STATE_MACRODEF))
+ _rl_add_macro_char (ESC);
+ RESIZE_KEYSEQ_BUFFER ();
+ rl_executing_keyseq[rl_key_sequence_length++] = ESC;
+ map = FUNCTION_TO_KEYMAP (map, ESC);
+ key = UNMETA (key);
+ return (_rl_dispatch (key, map));
+ }
+ else
+ rl_ding ();
+ return 0;
+ }
+
+ if (RL_ISSTATE (RL_STATE_MACRODEF))
+ _rl_add_macro_char (key);
+
+ r = 0;
+ switch (map[key].type)
+ {
+ case ISFUNC:
+ func = map[key].function;
+ if (func)
+ {
+ /* Special case rl_do_lowercase_version (). */
+ if (func == rl_do_lowercase_version)
+ /* Should we do anything special if key == ANYOTHERKEY? */
+ return (_rl_dispatch (_rl_to_lower ((unsigned char)key), map));
+
+ rl_executing_keymap = map;
+ rl_executing_key = key;
+
+ _rl_executing_func = func;
+
+ RESIZE_KEYSEQ_BUFFER();
+ rl_executing_keyseq[rl_key_sequence_length++] = key;
+ rl_executing_keyseq[rl_key_sequence_length] = '\0';
+
+ rl_dispatching = 1;
+ RL_SETSTATE(RL_STATE_DISPATCHING);
+ r = (*func) (rl_numeric_arg * rl_arg_sign, key);
+ RL_UNSETSTATE(RL_STATE_DISPATCHING);
+ rl_dispatching = 0;
+
+ /* If we have input pending, then the last command was a prefix
+ command. Don't change the state of rl_last_func. Otherwise,
+ remember the last command executed in this variable. */
+#if defined (VI_MODE)
+ if (rl_pending_input == 0 && map[key].function != rl_digit_argument && map[key].function != rl_vi_arg_digit)
+#else
+ if (rl_pending_input == 0 && map[key].function != rl_digit_argument)
+#endif
+ rl_last_func = map[key].function;
+
+ RL_CHECK_SIGNALS ();
+ }
+ else if (map[ANYOTHERKEY].function)
+ {
+ /* OK, there's no function bound in this map, but there is a
+ shadow function that was overridden when the current keymap
+ was created. Return -2 to note that. */
+ if (RL_ISSTATE (RL_STATE_MACROINPUT))
+ _rl_prev_macro_key ();
+ else
+ _rl_unget_char (key);
+ if (rl_key_sequence_length > 0)
+ rl_executing_keyseq[--rl_key_sequence_length] = '\0';
+ return -2;
+ }
+ else if (got_subseq)
+ {
+ /* Return -1 to note that we're in a subsequence, but we don't
+ have a matching key, nor was one overridden. This means
+ we need to back up the recursion chain and find the last
+ subsequence that is bound to a function. */
+ if (RL_ISSTATE (RL_STATE_MACROINPUT))
+ _rl_prev_macro_key ();
+ else
+ _rl_unget_char (key);
+ if (rl_key_sequence_length > 0)
+ rl_executing_keyseq[--rl_key_sequence_length] = '\0';
+ return -1;
+ }
+ else
+ {
+#if defined (READLINE_CALLBACKS)
+ RL_UNSETSTATE (RL_STATE_MULTIKEY);
+ _rl_keyseq_chain_dispose ();
+#endif
+ _rl_abort_internal ();
+ return -1;
+ }
+ break;
+
+ case ISKMAP:
+ if (map[key].function != 0)
+ {
+#if defined (VI_MODE)
+ /* The only way this test will be true is if a subsequence has been
+ bound starting with ESC, generally the arrow keys. What we do is
+ check whether there's input in the queue, which there generally
+ will be if an arrow key has been pressed, and, if there's not,
+ just dispatch to (what we assume is) rl_vi_movement_mode right
+ away. This is essentially an input test with a zero timeout (by
+ default) or a timeout determined by the value of `keyseq-timeout' */
+ /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued
+ takes microseconds, so multiply by 1000 */
+ if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap &&
+ (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) &&
+ _rl_pushed_input_available () == 0 &&
+ _rl_input_queued ((_rl_keyseq_timeout > 0) ? _rl_keyseq_timeout*1000 : 0) == 0)
+ return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key)));
+ /* This is a very specific test. It can possibly be generalized in
+ the future, but for now it handles a specific case of ESC being
+ the last character in a keyboard macro. */
+ if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap &&
+ (RL_ISSTATE (RL_STATE_INPUTPENDING) == 0) &&
+ (RL_ISSTATE (RL_STATE_MACROINPUT) && _rl_peek_macro_key () == 0) &&
+ _rl_pushed_input_available () == 0 &&
+ _rl_input_queued ((_rl_keyseq_timeout > 0) ? _rl_keyseq_timeout*1000 : 0) == 0)
+ return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key)));
+#endif
+
+ RESIZE_KEYSEQ_BUFFER ();
+ rl_executing_keyseq[rl_key_sequence_length++] = key;
+ _rl_dispatching_keymap = FUNCTION_TO_KEYMAP (map, key);
+
+ /* Allocate new context here. Use linked contexts (linked through
+ cxt->ocxt) to simulate recursion */
+#if defined (READLINE_CALLBACKS)
+# if defined (VI_MODE)
+ /* If we're redoing a vi mode command and we know there is a shadowed
+ function corresponding to this key, just call it -- all the redoable
+ vi mode commands already have all the input they need, and rl_vi_redo
+ assumes that one call to rl_dispatch is sufficient to complete the
+ command. */
+ if (_rl_vi_redoing && RL_ISSTATE (RL_STATE_CALLBACK) &&
+ map[ANYOTHERKEY].function != 0)
+ return (_rl_subseq_result (-2, map, key, got_subseq));
+# endif
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ /* Return 0 only the first time, to indicate success to
+ _rl_callback_read_char. The rest of the time, we're called
+ from _rl_dispatch_callback, so we return -3 to indicate
+ special handling is necessary. */
+ r = RL_ISSTATE (RL_STATE_MULTIKEY) ? -3 : 0;
+ cxt = _rl_keyseq_cxt_alloc ();
+
+ if (got_subseq)
+ cxt->flags |= KSEQ_SUBSEQ;
+ cxt->okey = key;
+ cxt->oldmap = map;
+ cxt->dmap = _rl_dispatching_keymap;
+ cxt->subseq_arg = got_subseq || cxt->dmap[ANYOTHERKEY].function;
+
+ RL_SETSTATE (RL_STATE_MULTIKEY);
+ _rl_kscxt = cxt;
+
+ return r; /* don't indicate immediate success */
+ }
+#endif
+
+ /* Tentative inter-character timeout for potential multi-key
+ sequences? If no input within timeout, abort sequence and
+ act as if we got non-matching input. */
+ /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued
+ takes microseconds, so multiply by 1000 */
+ if (_rl_keyseq_timeout > 0 &&
+ (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) &&
+ _rl_pushed_input_available () == 0 &&
+ _rl_dispatching_keymap[ANYOTHERKEY].function &&
+ _rl_input_queued (_rl_keyseq_timeout*1000) == 0)
+ {
+ if (rl_key_sequence_length > 0)
+ rl_executing_keyseq[--rl_key_sequence_length] = '\0';
+ return (_rl_subseq_result (-2, map, key, got_subseq));
+ }
+
+ newkey = _rl_subseq_getchar (key);
+ if (newkey < 0)
+ {
+ _rl_abort_internal ();
+ return -1;
+ }
+
+ r = _rl_dispatch_subseq (newkey, _rl_dispatching_keymap, got_subseq || map[ANYOTHERKEY].function);
+ return _rl_subseq_result (r, map, key, got_subseq);
+ }
+ else
+ {
+ _rl_abort_internal (); /* XXX */
+ return -1;
+ }
+ break;
+
+ case ISMACR:
+ if (map[key].function != 0)
+ {
+ rl_executing_keyseq[rl_key_sequence_length] = '\0';
+ macro = savestring ((char *)map[key].function);
+ _rl_with_macro_input (macro);
+ return 0;
+ }
+ break;
+ }
+
+#if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
+ key != ANYOTHERKEY &&
+ _rl_dispatching_keymap == vi_movement_keymap &&
+ _rl_vi_textmod_command (key))
+ _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
+#endif
+
+ return (r);
+}
+
+static int
+_rl_subseq_result (int r, Keymap map, int key, int got_subseq)
+{
+ Keymap m;
+ int type, nt;
+ rl_command_func_t *func, *nf;
+
+ if (r == -2)
+ /* We didn't match anything, and the keymap we're indexed into
+ shadowed a function previously bound to that prefix. Call
+ the function. The recursive call to _rl_dispatch_subseq has
+ already taken care of pushing any necessary input back onto
+ the input queue with _rl_unget_char. */
+ {
+ m = _rl_dispatching_keymap;
+ type = m[ANYOTHERKEY].type;
+ func = m[ANYOTHERKEY].function;
+ if (type == ISFUNC && func == rl_do_lowercase_version)
+ r = _rl_dispatch (_rl_to_lower ((unsigned char)key), map);
+ else if (type == ISFUNC)
+ {
+ /* If we shadowed a function, whatever it is, we somehow need a
+ keymap with map[key].func == shadowed-function.
+ Let's use this one. Then we can dispatch using the original
+ key, since there are commands (e.g., in vi mode) for which it
+ matters. */
+ nt = m[key].type;
+ nf = m[key].function;
+
+ m[key].type = type;
+ m[key].function = func;
+ /* Don't change _rl_dispatching_keymap, set it here */
+ _rl_dispatching_keymap = map; /* previous map */
+ r = _rl_dispatch_subseq (key, m, 0);
+ m[key].type = nt;
+ m[key].function = nf;
+ }
+ else
+ /* We probably shadowed a keymap, so keep going. */
+ r = _rl_dispatch (ANYOTHERKEY, m);
+ }
+ else if (r < 0 && map[ANYOTHERKEY].function)
+ {
+ /* We didn't match (r is probably -1), so return something to
+ tell the caller that it should try ANYOTHERKEY for an
+ overridden function. */
+ if (RL_ISSTATE (RL_STATE_MACROINPUT))
+ _rl_prev_macro_key ();
+ else
+ _rl_unget_char (key);
+ if (rl_key_sequence_length > 0)
+ rl_executing_keyseq[--rl_key_sequence_length] = '\0';
+ _rl_dispatching_keymap = map;
+ return -2;
+ }
+ else if (r < 0 && got_subseq) /* XXX */
+ {
+ /* OK, back up the chain. */
+ if (RL_ISSTATE (RL_STATE_MACROINPUT))
+ _rl_prev_macro_key ();
+ else
+ _rl_unget_char (key);
+ if (rl_key_sequence_length > 0)
+ rl_executing_keyseq[--rl_key_sequence_length] = '\0';
+ _rl_dispatching_keymap = map;
+ return -1;
+ }
+
+ return r;
+}
+
+/* **************************************************************** */
+/* */
+/* Initializations */
+/* */
+/* **************************************************************** */
+
+/* Initialize readline (and terminal if not already). */
+int
+rl_initialize (void)
+{
+ /* Initialize the timeout first to get the precise start time. */
+ _rl_timeout_init ();
+
+ /* If we have never been called before, initialize the
+ terminal and data structures. */
+ if (rl_initialized == 0)
+ {
+ RL_SETSTATE(RL_STATE_INITIALIZING);
+ readline_initialize_everything ();
+ RL_UNSETSTATE(RL_STATE_INITIALIZING);
+ rl_initialized++;
+ RL_SETSTATE(RL_STATE_INITIALIZED);
+ }
+ else
+ _rl_reset_locale (); /* check current locale and set locale variables */
+
+ /* Initialize the current line information. */
+ _rl_init_line_state ();
+
+ /* We aren't done yet. We haven't even gotten started yet! */
+ rl_done = 0;
+ RL_UNSETSTATE(RL_STATE_DONE|RL_STATE_TIMEOUT|RL_STATE_EOF);
+
+ /* Tell the history routines what is going on. */
+ _rl_start_using_history ();
+
+ /* Make the display buffer match the state of the line. */
+ rl_reset_line_state ();
+
+ /* No such function typed yet. */
+ rl_last_func = (rl_command_func_t *)NULL;
+
+ /* Parsing of key-bindings begins in an enabled state. */
+ _rl_parsing_conditionalized_out = 0;
+
+#if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode)
+ _rl_vi_initialize_line ();
+#endif
+
+ /* Each line starts in insert mode (the default). */
+ _rl_set_insert_mode (RL_IM_DEFAULT, 1);
+
+ return 0;
+}
+
+#if 0
+#if defined (__EMX__)
+static void
+_emx_build_environ (void)
+{
+ TIB *tibp;
+ PIB *pibp;
+ char *t, **tp;
+ int c;
+
+ DosGetInfoBlocks (&tibp, &pibp);
+ t = pibp->pib_pchenv;
+ for (c = 1; *t; c++)
+ t += strlen (t) + 1;
+ tp = environ = (char **)xmalloc ((c + 1) * sizeof (char *));
+ t = pibp->pib_pchenv;
+ while (*t)
+ {
+ *tp++ = t;
+ t += strlen (t) + 1;
+ }
+ *tp = 0;
+}
+#endif /* __EMX__ */
+#endif
+
+/* Initialize the entire state of the world. */
+static void
+readline_initialize_everything (void)
+{
+#if 0
+#if defined (__EMX__)
+ if (environ == 0)
+ _emx_build_environ ();
+#endif
+#endif
+
+#if 0
+ /* Find out if we are running in Emacs -- UNUSED. */
+ running_in_emacs = sh_get_env_value ("EMACS") != (char *)0;
+#endif
+
+ /* Set up input and output if they are not already set up. */
+ if (!rl_instream)
+ rl_instream = stdin;
+
+ if (!rl_outstream)
+ rl_outstream = stdout;
+
+ /* Bind _rl_in_stream and _rl_out_stream immediately. These values
+ may change, but they may also be used before readline_internal ()
+ is called. */
+ _rl_in_stream = rl_instream;
+ _rl_out_stream = rl_outstream;
+
+ /* Allocate data structures. */
+ if (rl_line_buffer == 0)
+ rl_line_buffer = (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE);
+
+ /* Initialize the terminal interface. */
+ if (rl_terminal_name == 0)
+ rl_terminal_name = sh_get_env_value ("TERM");
+ _rl_init_terminal_io (rl_terminal_name);
+
+ /* Bind tty characters to readline functions. */
+ readline_default_bindings ();
+
+ /* Initialize the function names. */
+ rl_initialize_funmap ();
+
+ /* Decide whether we should automatically go into eight-bit mode. */
+ _rl_init_eightbit ();
+
+ /* Read in the init file. */
+ rl_read_init_file ((char *)NULL);
+
+ /* XXX */
+ if (_rl_horizontal_scroll_mode && _rl_term_autowrap)
+ {
+ _rl_screenwidth--;
+ _rl_screenchars -= _rl_screenheight;
+ }
+
+ /* Override the effect of any `set keymap' assignments in the
+ inputrc file. */
+ rl_set_keymap_from_edit_mode ();
+
+ /* Try to bind a common arrow key prefix, if not already bound. */
+ bind_arrow_keys ();
+
+ /* Bind the bracketed paste prefix assuming that the user will enable
+ it on terminals that support it. */
+ bind_bracketed_paste_prefix ();
+
+ /* If the completion parser's default word break characters haven't
+ been set yet, then do so now. */
+ if (rl_completer_word_break_characters == 0)
+ rl_completer_word_break_characters = rl_basic_word_break_characters;
+
+#if defined (COLOR_SUPPORT)
+ if (_rl_colored_stats || _rl_colored_completion_prefix)
+ _rl_parse_colors ();
+#endif
+
+ rl_executing_keyseq = malloc (_rl_executing_keyseq_size = 16);
+ if (rl_executing_keyseq)
+ rl_executing_keyseq[rl_key_sequence_length = 0] = '\0';
+}
+
+/* If this system allows us to look at the values of the regular
+ input editing characters, then bind them to their readline
+ equivalents, iff the characters are not bound to keymaps. */
+static void
+readline_default_bindings (void)
+{
+ if (_rl_bind_stty_chars)
+ rl_tty_set_default_bindings (_rl_keymap);
+}
+
+/* Reset the default bindings for the terminal special characters we're
+ interested in back to rl_insert and read the new ones. */
+static void
+reset_default_bindings (void)
+{
+ if (_rl_bind_stty_chars)
+ {
+ rl_tty_unset_default_bindings (_rl_keymap);
+ rl_tty_set_default_bindings (_rl_keymap);
+ }
+}
+
+/* Bind some common arrow key sequences in MAP. */
+static void
+bind_arrow_keys_internal (Keymap map)
+{
+ Keymap xkeymap;
+
+ xkeymap = _rl_keymap;
+ _rl_keymap = map;
+
+#if defined (__MSDOS__)
+ rl_bind_keyseq_if_unbound ("\033[0A", rl_get_previous_history);
+ rl_bind_keyseq_if_unbound ("\033[0B", rl_backward_char);
+ rl_bind_keyseq_if_unbound ("\033[0C", rl_forward_char);
+ rl_bind_keyseq_if_unbound ("\033[0D", rl_get_next_history);
+#endif
+
+ rl_bind_keyseq_if_unbound ("\033[A", rl_get_previous_history);
+ rl_bind_keyseq_if_unbound ("\033[B", rl_get_next_history);
+ rl_bind_keyseq_if_unbound ("\033[C", rl_forward_char);
+ rl_bind_keyseq_if_unbound ("\033[D", rl_backward_char);
+ rl_bind_keyseq_if_unbound ("\033[H", rl_beg_of_line);
+ rl_bind_keyseq_if_unbound ("\033[F", rl_end_of_line);
+
+ rl_bind_keyseq_if_unbound ("\033OA", rl_get_previous_history);
+ rl_bind_keyseq_if_unbound ("\033OB", rl_get_next_history);
+ rl_bind_keyseq_if_unbound ("\033OC", rl_forward_char);
+ rl_bind_keyseq_if_unbound ("\033OD", rl_backward_char);
+ rl_bind_keyseq_if_unbound ("\033OH", rl_beg_of_line);
+ rl_bind_keyseq_if_unbound ("\033OF", rl_end_of_line);
+
+ /* Key bindings for control-arrow keys */
+ rl_bind_keyseq_if_unbound ("\033[1;5C", rl_forward_word);
+ rl_bind_keyseq_if_unbound ("\033[1;5D", rl_backward_word);
+ rl_bind_keyseq_if_unbound ("\033[3;5~", rl_kill_word);
+
+ /* Key bindings for alt-arrow keys */
+ rl_bind_keyseq_if_unbound ("\033[1;3C", rl_forward_word);
+ rl_bind_keyseq_if_unbound ("\033[1;3D", rl_backward_word);
+
+#if defined (__MINGW32__)
+ rl_bind_keyseq_if_unbound ("\340H", rl_get_previous_history);
+ rl_bind_keyseq_if_unbound ("\340P", rl_get_next_history);
+ rl_bind_keyseq_if_unbound ("\340M", rl_forward_char);
+ rl_bind_keyseq_if_unbound ("\340K", rl_backward_char);
+ rl_bind_keyseq_if_unbound ("\340G", rl_beg_of_line);
+ rl_bind_keyseq_if_unbound ("\340O", rl_end_of_line);
+ rl_bind_keyseq_if_unbound ("\340S", rl_delete);
+ rl_bind_keyseq_if_unbound ("\340R", rl_overwrite_mode);
+
+ /* These may or may not work because of the embedded NUL. */
+ rl_bind_keyseq_if_unbound ("\\000H", rl_get_previous_history);
+ rl_bind_keyseq_if_unbound ("\\000P", rl_get_next_history);
+ rl_bind_keyseq_if_unbound ("\\000M", rl_forward_char);
+ rl_bind_keyseq_if_unbound ("\\000K", rl_backward_char);
+ rl_bind_keyseq_if_unbound ("\\000G", rl_beg_of_line);
+ rl_bind_keyseq_if_unbound ("\\000O", rl_end_of_line);
+ rl_bind_keyseq_if_unbound ("\\000S", rl_delete);
+ rl_bind_keyseq_if_unbound ("\\000R", rl_overwrite_mode);
+#endif
+
+ _rl_keymap = xkeymap;
+}
+
+/* Try and bind the common arrow key prefixes after giving termcap and
+ the inputrc file a chance to bind them and create `real' keymaps
+ for the arrow key prefix. */
+static void
+bind_arrow_keys (void)
+{
+ bind_arrow_keys_internal (emacs_standard_keymap);
+
+#if defined (VI_MODE)
+ bind_arrow_keys_internal (vi_movement_keymap);
+ /* Unbind vi_movement_keymap[ESC] to allow users to repeatedly hit ESC
+ in vi command mode while still allowing the arrow keys to work. */
+ if (vi_movement_keymap[ESC].type == ISKMAP)
+ rl_bind_keyseq_in_map ("\033", (rl_command_func_t *)NULL, vi_movement_keymap);
+ bind_arrow_keys_internal (vi_insertion_keymap);
+#endif
+}
+
+static void
+bind_bracketed_paste_prefix (void)
+{
+ Keymap xkeymap;
+
+ xkeymap = _rl_keymap;
+
+ _rl_keymap = emacs_standard_keymap;
+ rl_bind_keyseq_if_unbound (BRACK_PASTE_PREF, rl_bracketed_paste_begin);
+
+#if defined (VI_MODE)
+ _rl_keymap = vi_insertion_keymap;
+ rl_bind_keyseq_if_unbound (BRACK_PASTE_PREF, rl_bracketed_paste_begin);
+ /* XXX - is there a reason to do this in the vi command keymap? */
+#endif
+
+ _rl_keymap = xkeymap;
+}
+
+/* **************************************************************** */
+/* */
+/* Saving and Restoring Readline's state */
+/* */
+/* **************************************************************** */
+
+int
+rl_save_state (struct readline_state *sp)
+{
+ if (sp == 0)
+ return -1;
+
+ sp->point = rl_point;
+ sp->end = rl_end;
+ sp->mark = rl_mark;
+ sp->buffer = rl_line_buffer;
+ sp->buflen = rl_line_buffer_len;
+ sp->ul = rl_undo_list;
+ sp->prompt = rl_prompt;
+
+ sp->rlstate = rl_readline_state;
+ sp->done = rl_done;
+ sp->kmap = _rl_keymap;
+
+ sp->lastfunc = rl_last_func;
+ sp->insmode = rl_insert_mode;
+ sp->edmode = rl_editing_mode;
+ sp->kseq = rl_executing_keyseq;
+ sp->kseqlen = rl_key_sequence_length;
+ sp->inf = rl_instream;
+ sp->outf = rl_outstream;
+ sp->pendingin = rl_pending_input;
+ sp->macro = rl_executing_macro;
+
+ sp->catchsigs = rl_catch_signals;
+ sp->catchsigwinch = rl_catch_sigwinch;
+
+ sp->entryfunc = rl_completion_entry_function;
+ sp->menuentryfunc = rl_menu_completion_entry_function;
+ sp->ignorefunc = rl_ignore_some_completions_function;
+ sp->attemptfunc = rl_attempted_completion_function;
+ sp->wordbreakchars = rl_completer_word_break_characters;
+
+ return (0);
+}
+
+int
+rl_restore_state (struct readline_state *sp)
+{
+ if (sp == 0)
+ return -1;
+
+ rl_point = sp->point;
+ rl_end = sp->end;
+ rl_mark = sp->mark;
+ the_line = rl_line_buffer = sp->buffer;
+ rl_line_buffer_len = sp->buflen;
+ rl_undo_list = sp->ul;
+ rl_prompt = sp->prompt;
+
+ rl_readline_state = sp->rlstate;
+ rl_done = sp->done;
+ _rl_keymap = sp->kmap;
+
+ rl_last_func = sp->lastfunc;
+ rl_insert_mode = sp->insmode;
+ rl_editing_mode = sp->edmode;
+ rl_executing_keyseq = sp->kseq;
+ rl_key_sequence_length = sp->kseqlen;
+ rl_instream = sp->inf;
+ rl_outstream = sp->outf;
+ rl_pending_input = sp->pendingin;
+ rl_executing_macro = sp->macro;
+
+ rl_catch_signals = sp->catchsigs;
+ rl_catch_sigwinch = sp->catchsigwinch;
+
+ rl_completion_entry_function = sp->entryfunc;
+ rl_menu_completion_entry_function = sp->menuentryfunc;
+ rl_ignore_some_completions_function = sp->ignorefunc;
+ rl_attempted_completion_function = sp->attemptfunc;
+ rl_completer_word_break_characters = sp->wordbreakchars;
+
+ rl_deactivate_mark ();
+
+ return (0);
+}
+
+/* Functions to manage the string that is the current key sequence. */
+
+void
+_rl_init_executing_keyseq (void)
+{
+ rl_executing_keyseq[rl_key_sequence_length = 0] = '\0';
+}
+
+void
+_rl_term_executing_keyseq (void)
+{
+ rl_executing_keyseq[rl_key_sequence_length] = '\0';
+}
+
+void
+_rl_end_executing_keyseq (void)
+{
+ if (rl_key_sequence_length > 0)
+ rl_executing_keyseq[--rl_key_sequence_length] = '\0';
+}
+
+void
+_rl_add_executing_keyseq (int key)
+{
+ RESIZE_KEYSEQ_BUFFER ();
+ rl_executing_keyseq[rl_key_sequence_length++] = key;
+}
+
+/* `delete' the last character added to the executing key sequence. Use this
+ before calling rl_execute_next to avoid keys being added twice. */
+void
+_rl_del_executing_keyseq (void)
+{
+ if (rl_key_sequence_length > 0)
+ rl_key_sequence_length--;
+}
diff --git a/readline.h b/readline.h
new file mode 100644
index 0000000..cac269f
--- /dev/null
+++ b/readline.h
@@ -0,0 +1,986 @@
+/* Readline.h -- the names of functions callable from within readline. */
+
+/* Copyright (C) 1987-2022 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_READLINE_H_)
+#define _READLINE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined (READLINE_LIBRARY)
+# include "rlstdc.h"
+# include "rltypedefs.h"
+# include "keymaps.h"
+# include "tilde.h"
+#else
+# include <readline/rlstdc.h>
+# include <readline/rltypedefs.h>
+# include <readline/keymaps.h>
+# include <readline/tilde.h>
+#endif
+
+/* Hex-encoded Readline version number. */
+#define RL_READLINE_VERSION 0x0802 /* Readline 8.2 */
+#define RL_VERSION_MAJOR 8
+#define RL_VERSION_MINOR 2
+
+/* Readline data structures. */
+
+/* Maintaining the state of undo. We remember individual deletes and inserts
+ on a chain of things to do. */
+
+/* The actions that undo knows how to undo. Notice that UNDO_DELETE means
+ to insert some text, and UNDO_INSERT means to delete some text. I.e.,
+ the code tells undo what to undo, not how to undo it. */
+enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END };
+
+/* What an element of THE_UNDO_LIST looks like. */
+typedef struct undo_list {
+ struct undo_list *next;
+ int start, end; /* Where the change took place. */
+ char *text; /* The text to insert, if undoing a delete. */
+ enum undo_code what; /* Delete, Insert, Begin, End. */
+} UNDO_LIST;
+
+/* The current undo list for RL_LINE_BUFFER. */
+extern UNDO_LIST *rl_undo_list;
+
+/* The data structure for mapping textual names to code addresses. */
+typedef struct _funmap {
+ const char *name;
+ rl_command_func_t *function;
+} FUNMAP;
+
+extern FUNMAP **funmap;
+
+/* **************************************************************** */
+/* */
+/* Functions available to bind to key sequences */
+/* */
+/* **************************************************************** */
+
+/* Bindable commands for numeric arguments. */
+extern int rl_digit_argument (int, int);
+extern int rl_universal_argument (int, int);
+
+/* Bindable commands for moving the cursor. */
+extern int rl_forward_byte (int, int);
+extern int rl_forward_char (int, int);
+extern int rl_forward (int, int);
+extern int rl_backward_byte (int, int);
+extern int rl_backward_char (int, int);
+extern int rl_backward (int, int);
+extern int rl_beg_of_line (int, int);
+extern int rl_end_of_line (int, int);
+extern int rl_forward_word (int, int);
+extern int rl_backward_word (int, int);
+extern int rl_refresh_line (int, int);
+extern int rl_clear_screen (int, int);
+extern int rl_clear_display (int, int);
+extern int rl_skip_csi_sequence (int, int);
+extern int rl_arrow_keys (int, int);
+
+extern int rl_previous_screen_line (int, int);
+extern int rl_next_screen_line (int, int);
+
+/* Bindable commands for inserting and deleting text. */
+extern int rl_insert (int, int);
+extern int rl_quoted_insert (int, int);
+extern int rl_tab_insert (int, int);
+extern int rl_newline (int, int);
+extern int rl_do_lowercase_version (int, int);
+extern int rl_rubout (int, int);
+extern int rl_delete (int, int);
+extern int rl_rubout_or_delete (int, int);
+extern int rl_delete_horizontal_space (int, int);
+extern int rl_delete_or_show_completions (int, int);
+extern int rl_insert_comment (int, int);
+
+/* Bindable commands for changing case. */
+extern int rl_upcase_word (int, int);
+extern int rl_downcase_word (int, int);
+extern int rl_capitalize_word (int, int);
+
+/* Bindable commands for transposing characters and words. */
+extern int rl_transpose_words (int, int);
+extern int rl_transpose_chars (int, int);
+
+/* Bindable commands for searching within a line. */
+extern int rl_char_search (int, int);
+extern int rl_backward_char_search (int, int);
+
+/* Bindable commands for readline's interface to the command history. */
+extern int rl_beginning_of_history (int, int);
+extern int rl_end_of_history (int, int);
+extern int rl_get_next_history (int, int);
+extern int rl_get_previous_history (int, int);
+extern int rl_operate_and_get_next (int, int);
+extern int rl_fetch_history (int, int);
+
+/* Bindable commands for managing the mark and region. */
+extern int rl_set_mark (int, int);
+extern int rl_exchange_point_and_mark (int, int);
+
+/* Bindable commands to set the editing mode (emacs or vi). */
+extern int rl_vi_editing_mode (int, int);
+extern int rl_emacs_editing_mode (int, int);
+
+/* Bindable commands to change the insert mode (insert or overwrite) */
+extern int rl_overwrite_mode (int, int);
+
+/* Bindable commands for managing key bindings. */
+extern int rl_re_read_init_file (int, int);
+extern int rl_dump_functions (int, int);
+extern int rl_dump_macros (int, int);
+extern int rl_dump_variables (int, int);
+
+/* Bindable commands for word completion. */
+extern int rl_complete (int, int);
+extern int rl_possible_completions (int, int);
+extern int rl_insert_completions (int, int);
+extern int rl_old_menu_complete (int, int);
+extern int rl_menu_complete (int, int);
+extern int rl_backward_menu_complete (int, int);
+
+/* Bindable commands for killing and yanking text, and managing the kill ring. */
+extern int rl_kill_word (int, int);
+extern int rl_backward_kill_word (int, int);
+extern int rl_kill_line (int, int);
+extern int rl_backward_kill_line (int, int);
+extern int rl_kill_full_line (int, int);
+extern int rl_unix_word_rubout (int, int);
+extern int rl_unix_filename_rubout (int, int);
+extern int rl_unix_line_discard (int, int);
+extern int rl_copy_region_to_kill (int, int);
+extern int rl_kill_region (int, int);
+extern int rl_copy_forward_word (int, int);
+extern int rl_copy_backward_word (int, int);
+extern int rl_yank (int, int);
+extern int rl_yank_pop (int, int);
+extern int rl_yank_nth_arg (int, int);
+extern int rl_yank_last_arg (int, int);
+extern int rl_bracketed_paste_begin (int, int);
+/* Not available unless _WIN32 is defined. */
+#if defined (_WIN32)
+extern int rl_paste_from_clipboard (int, int);
+#endif
+
+/* Bindable commands for incremental searching. */
+extern int rl_reverse_search_history (int, int);
+extern int rl_forward_search_history (int, int);
+
+/* Bindable keyboard macro commands. */
+extern int rl_start_kbd_macro (int, int);
+extern int rl_end_kbd_macro (int, int);
+extern int rl_call_last_kbd_macro (int, int);
+extern int rl_print_last_kbd_macro (int, int);
+
+/* Bindable undo commands. */
+extern int rl_revert_line (int, int);
+extern int rl_undo_command (int, int);
+
+/* Bindable tilde expansion commands. */
+extern int rl_tilde_expand (int, int);
+
+/* Bindable terminal control commands. */
+extern int rl_restart_output (int, int);
+extern int rl_stop_output (int, int);
+
+/* Miscellaneous bindable commands. */
+extern int rl_abort (int, int);
+extern int rl_tty_status (int, int);
+
+/* Bindable commands for incremental and non-incremental history searching. */
+extern int rl_history_search_forward (int, int);
+extern int rl_history_search_backward (int, int);
+extern int rl_history_substr_search_forward (int, int);
+extern int rl_history_substr_search_backward (int, int);
+extern int rl_noninc_forward_search (int, int);
+extern int rl_noninc_reverse_search (int, int);
+extern int rl_noninc_forward_search_again (int, int);
+extern int rl_noninc_reverse_search_again (int, int);
+
+/* Bindable command used when inserting a matching close character. */
+extern int rl_insert_close (int, int);
+
+/* Not available unless READLINE_CALLBACKS is defined. */
+extern void rl_callback_handler_install (const char *, rl_vcpfunc_t *);
+extern void rl_callback_read_char (void);
+extern void rl_callback_handler_remove (void);
+extern void rl_callback_sigcleanup (void);
+
+/* Things for vi mode. Not available unless readline is compiled -DVI_MODE. */
+/* VI-mode bindable commands. */
+extern int rl_vi_redo (int, int);
+extern int rl_vi_undo (int, int);
+extern int rl_vi_yank_arg (int, int);
+extern int rl_vi_fetch_history (int, int);
+extern int rl_vi_search_again (int, int);
+extern int rl_vi_search (int, int);
+extern int rl_vi_complete (int, int);
+extern int rl_vi_tilde_expand (int, int);
+extern int rl_vi_prev_word (int, int);
+extern int rl_vi_next_word (int, int);
+extern int rl_vi_end_word (int, int);
+extern int rl_vi_insert_beg (int, int);
+extern int rl_vi_append_mode (int, int);
+extern int rl_vi_append_eol (int, int);
+extern int rl_vi_eof_maybe (int, int);
+extern int rl_vi_insertion_mode (int, int);
+extern int rl_vi_insert_mode (int, int);
+extern int rl_vi_movement_mode (int, int);
+extern int rl_vi_arg_digit (int, int);
+extern int rl_vi_change_case (int, int);
+extern int rl_vi_put (int, int);
+extern int rl_vi_column (int, int);
+extern int rl_vi_delete_to (int, int);
+extern int rl_vi_change_to (int, int);
+extern int rl_vi_yank_to (int, int);
+extern int rl_vi_yank_pop (int, int);
+extern int rl_vi_rubout (int, int);
+extern int rl_vi_delete (int, int);
+extern int rl_vi_back_to_indent (int, int);
+extern int rl_vi_unix_word_rubout (int, int);
+extern int rl_vi_first_print (int, int);
+extern int rl_vi_char_search (int, int);
+extern int rl_vi_match (int, int);
+extern int rl_vi_change_char (int, int);
+extern int rl_vi_subst (int, int);
+extern int rl_vi_overstrike (int, int);
+extern int rl_vi_overstrike_delete (int, int);
+extern int rl_vi_replace (int, int);
+extern int rl_vi_set_mark (int, int);
+extern int rl_vi_goto_mark (int, int);
+
+/* VI-mode utility functions. */
+extern int rl_vi_check (void);
+extern int rl_vi_domove (int, int *);
+extern int rl_vi_bracktype (int);
+
+extern void rl_vi_start_inserting (int, int, int);
+
+/* VI-mode pseudo-bindable commands, used as utility functions. */
+extern int rl_vi_fWord (int, int);
+extern int rl_vi_bWord (int, int);
+extern int rl_vi_eWord (int, int);
+extern int rl_vi_fword (int, int);
+extern int rl_vi_bword (int, int);
+extern int rl_vi_eword (int, int);
+
+/* **************************************************************** */
+/* */
+/* Well Published Functions */
+/* */
+/* **************************************************************** */
+
+/* Readline functions. */
+/* Read a line of input. Prompt with PROMPT. A NULL PROMPT means none. */
+extern char *readline (const char *);
+
+extern int rl_set_prompt (const char *);
+extern int rl_expand_prompt (char *);
+
+extern int rl_initialize (void);
+
+/* Undocumented; unused by readline */
+extern int rl_discard_argument (void);
+
+/* Utility functions to bind keys to readline commands. */
+extern int rl_add_defun (const char *, rl_command_func_t *, int);
+extern int rl_bind_key (int, rl_command_func_t *);
+extern int rl_bind_key_in_map (int, rl_command_func_t *, Keymap);
+extern int rl_unbind_key (int);
+extern int rl_unbind_key_in_map (int, Keymap);
+extern int rl_bind_key_if_unbound (int, rl_command_func_t *);
+extern int rl_bind_key_if_unbound_in_map (int, rl_command_func_t *, Keymap);
+extern int rl_unbind_function_in_map (rl_command_func_t *, Keymap);
+extern int rl_unbind_command_in_map (const char *, Keymap);
+extern int rl_bind_keyseq (const char *, rl_command_func_t *);
+extern int rl_bind_keyseq_in_map (const char *, rl_command_func_t *, Keymap);
+extern int rl_bind_keyseq_if_unbound (const char *, rl_command_func_t *);
+extern int rl_bind_keyseq_if_unbound_in_map (const char *, rl_command_func_t *, Keymap);
+extern int rl_generic_bind (int, const char *, char *, Keymap);
+
+extern char *rl_variable_value (const char *);
+extern int rl_variable_bind (const char *, const char *);
+
+/* Backwards compatibility, use rl_bind_keyseq_in_map instead. */
+extern int rl_set_key (const char *, rl_command_func_t *, Keymap);
+
+/* Backwards compatibility, use rl_generic_bind instead. */
+extern int rl_macro_bind (const char *, const char *, Keymap);
+
+/* Undocumented in the texinfo manual; not really useful to programs. */
+extern int rl_translate_keyseq (const char *, char *, int *);
+extern char *rl_untranslate_keyseq (int);
+
+extern rl_command_func_t *rl_named_function (const char *);
+extern rl_command_func_t *rl_function_of_keyseq (const char *, Keymap, int *);
+extern rl_command_func_t *rl_function_of_keyseq_len (const char *, size_t, Keymap, int *);
+extern int rl_trim_arg_from_keyseq (const char *, size_t, Keymap);
+
+extern void rl_list_funmap_names (void);
+extern char **rl_invoking_keyseqs_in_map (rl_command_func_t *, Keymap);
+extern char **rl_invoking_keyseqs (rl_command_func_t *);
+
+extern void rl_function_dumper (int);
+extern void rl_macro_dumper (int);
+extern void rl_variable_dumper (int);
+
+extern int rl_read_init_file (const char *);
+extern int rl_parse_and_bind (char *);
+
+/* Functions for manipulating keymaps. */
+extern Keymap rl_make_bare_keymap (void);
+extern int rl_empty_keymap (Keymap);
+extern Keymap rl_copy_keymap (Keymap);
+extern Keymap rl_make_keymap (void);
+extern void rl_discard_keymap (Keymap);
+extern void rl_free_keymap (Keymap);
+
+extern Keymap rl_get_keymap_by_name (const char *);
+extern char *rl_get_keymap_name (Keymap);
+extern void rl_set_keymap (Keymap);
+extern Keymap rl_get_keymap (void);
+
+extern int rl_set_keymap_name (const char *, Keymap);
+
+/* Undocumented; used internally only. */
+extern void rl_set_keymap_from_edit_mode (void);
+extern char *rl_get_keymap_name_from_edit_mode (void);
+
+/* Functions for manipulating the funmap, which maps command names to functions. */
+extern int rl_add_funmap_entry (const char *, rl_command_func_t *);
+extern const char **rl_funmap_names (void);
+/* Undocumented, only used internally -- there is only one funmap, and this
+ function may be called only once. */
+extern void rl_initialize_funmap (void);
+
+/* Utility functions for managing keyboard macros. */
+extern void rl_push_macro_input (char *);
+
+/* Functions for undoing, from undo.c */
+extern void rl_add_undo (enum undo_code, int, int, char *);
+extern void rl_free_undo_list (void);
+extern int rl_do_undo (void);
+extern int rl_begin_undo_group (void);
+extern int rl_end_undo_group (void);
+extern int rl_modifying (int, int);
+
+/* Functions for redisplay. */
+extern void rl_redisplay (void);
+extern int rl_on_new_line (void);
+extern int rl_on_new_line_with_prompt (void);
+extern int rl_forced_update_display (void);
+extern int rl_clear_visible_line (void);
+extern int rl_clear_message (void);
+extern int rl_reset_line_state (void);
+extern int rl_crlf (void);
+
+/* Functions to manage the mark and region, especially the notion of an
+ active mark and an active region. */
+extern void rl_keep_mark_active (void);
+
+extern void rl_activate_mark (void);
+extern void rl_deactivate_mark (void);
+extern int rl_mark_active_p (void);
+
+#if defined (USE_VARARGS) && defined (PREFER_STDARG)
+extern int rl_message (const char *, ...) __attribute__((__format__ (printf, 1, 2)));
+#else
+extern int rl_message ();
+#endif
+
+extern int rl_show_char (int);
+
+/* Undocumented in texinfo manual. */
+extern int rl_character_len (int, int);
+extern void rl_redraw_prompt_last_line (void);
+
+/* Save and restore internal prompt redisplay information. */
+extern void rl_save_prompt (void);
+extern void rl_restore_prompt (void);
+
+/* Modifying text. */
+extern void rl_replace_line (const char *, int);
+extern int rl_insert_text (const char *);
+extern int rl_delete_text (int, int);
+extern int rl_kill_text (int, int);
+extern char *rl_copy_text (int, int);
+
+/* Terminal and tty mode management. */
+extern void rl_prep_terminal (int);
+extern void rl_deprep_terminal (void);
+extern void rl_tty_set_default_bindings (Keymap);
+extern void rl_tty_unset_default_bindings (Keymap);
+
+extern int rl_tty_set_echoing (int);
+extern int rl_reset_terminal (const char *);
+extern void rl_resize_terminal (void);
+extern void rl_set_screen_size (int, int);
+extern void rl_get_screen_size (int *, int *);
+extern void rl_reset_screen_size (void);
+
+extern char *rl_get_termcap (const char *);
+
+/* Functions for character input. */
+extern int rl_stuff_char (int);
+extern int rl_execute_next (int);
+extern int rl_clear_pending_input (void);
+extern int rl_read_key (void);
+extern int rl_getc (FILE *);
+extern int rl_set_keyboard_input_timeout (int);
+
+/* Functions to set and reset timeouts. */
+extern int rl_set_timeout (unsigned int, unsigned int);
+extern int rl_timeout_remaining (unsigned int *, unsigned int *);
+
+#undef rl_clear_timeout
+#define rl_clear_timeout() rl_set_timeout (0, 0)
+
+/* `Public' utility functions . */
+extern void rl_extend_line_buffer (int);
+extern int rl_ding (void);
+extern int rl_alphabetic (int);
+extern void rl_free (void *);
+
+/* Readline signal handling, from signals.c */
+extern int rl_set_signals (void);
+extern int rl_clear_signals (void);
+extern void rl_cleanup_after_signal (void);
+extern void rl_reset_after_signal (void);
+extern void rl_free_line_state (void);
+
+extern int rl_pending_signal (void);
+extern void rl_check_signals (void);
+
+extern void rl_echo_signal_char (int);
+
+extern int rl_set_paren_blink_timeout (int);
+
+/* History management functions. */
+
+extern void rl_clear_history (void);
+
+/* Undocumented. */
+extern int rl_maybe_save_line (void);
+extern int rl_maybe_unsave_line (void);
+extern int rl_maybe_replace_line (void);
+
+/* Completion functions. */
+extern int rl_complete_internal (int);
+extern void rl_display_match_list (char **, int, int);
+
+extern char **rl_completion_matches (const char *, rl_compentry_func_t *);
+extern char *rl_username_completion_function (const char *, int);
+extern char *rl_filename_completion_function (const char *, int);
+
+extern int rl_completion_mode (rl_command_func_t *);
+
+#if 0
+/* Backwards compatibility (compat.c). These will go away sometime. */
+extern void free_undo_list (void);
+extern int maybe_save_line (void);
+extern int maybe_unsave_line (void);
+extern int maybe_replace_line (void);
+
+extern int ding (void);
+extern int alphabetic (int);
+extern int crlf (void);
+
+extern char **completion_matches (char *, rl_compentry_func_t *);
+extern char *username_completion_function (const char *, int);
+extern char *filename_completion_function (const char *, int);
+#endif
+
+/* **************************************************************** */
+/* */
+/* Well Published Variables */
+/* */
+/* **************************************************************** */
+
+/* The version of this incarnation of the readline library. */
+extern const char *rl_library_version; /* e.g., "4.2" */
+extern int rl_readline_version; /* e.g., 0x0402 */
+
+/* True if this is real GNU readline. */
+extern int rl_gnu_readline_p;
+
+/* Flags word encapsulating the current readline state. */
+extern unsigned long rl_readline_state;
+
+/* Says which editing mode readline is currently using. 1 means emacs mode;
+ 0 means vi mode. */
+extern int rl_editing_mode;
+
+/* Insert or overwrite mode for emacs mode. 1 means insert mode; 0 means
+ overwrite mode. Reset to insert mode on each input line. */
+extern int rl_insert_mode;
+
+/* The name of the calling program. You should initialize this to
+ whatever was in argv[0]. It is used when parsing conditionals. */
+extern const char *rl_readline_name;
+
+/* The prompt readline uses. This is set from the argument to
+ readline (), and should not be assigned to directly. */
+extern char *rl_prompt;
+
+/* The prompt string that is actually displayed by rl_redisplay. Public so
+ applications can more easily supply their own redisplay functions. */
+extern char *rl_display_prompt;
+
+/* The line buffer that is in use. */
+extern char *rl_line_buffer;
+
+/* The location of point, and end. */
+extern int rl_point;
+extern int rl_end;
+
+/* The mark, or saved cursor position. */
+extern int rl_mark;
+
+/* Flag to indicate that readline has finished with the current input
+ line and should return it. */
+extern int rl_done;
+
+/* Flag to indicate that readline has read an EOF character or read has
+ returned 0 or error, and is returning a NULL line as a result. */
+extern int rl_eof_found;
+
+/* If set to a character value, that will be the next keystroke read. */
+extern int rl_pending_input;
+
+/* Non-zero if we called this function from _rl_dispatch(). It's present
+ so functions can find out whether they were called from a key binding
+ or directly from an application. */
+extern int rl_dispatching;
+
+/* Non-zero if the user typed a numeric argument before executing the
+ current function. */
+extern int rl_explicit_arg;
+
+/* The current value of the numeric argument specified by the user. */
+extern int rl_numeric_arg;
+
+/* The address of the last command function Readline executed. */
+extern rl_command_func_t *rl_last_func;
+
+/* The name of the terminal to use. */
+extern const char *rl_terminal_name;
+
+/* The input and output streams. */
+extern FILE *rl_instream;
+extern FILE *rl_outstream;
+
+/* If non-zero, Readline gives values of LINES and COLUMNS from the environment
+ greater precedence than values fetched from the kernel when computing the
+ screen dimensions. */
+extern int rl_prefer_env_winsize;
+
+/* If non-zero, then this is the address of a function to call just
+ before readline_internal () prints the first prompt. */
+extern rl_hook_func_t *rl_startup_hook;
+
+/* If non-zero, this is the address of a function to call just before
+ readline_internal_setup () returns and readline_internal starts
+ reading input characters. */
+extern rl_hook_func_t *rl_pre_input_hook;
+
+/* The address of a function to call periodically while Readline is
+ awaiting character input, or NULL, for no event handling. */
+extern rl_hook_func_t *rl_event_hook;
+
+/* The address of a function to call if a read is interrupted by a signal. */
+extern rl_hook_func_t *rl_signal_event_hook;
+
+extern rl_hook_func_t *rl_timeout_event_hook;
+
+/* The address of a function to call if Readline needs to know whether or not
+ there is data available from the current input source. */
+extern rl_hook_func_t *rl_input_available_hook;
+
+/* The address of the function to call to fetch a character from the current
+ Readline input stream */
+extern rl_getc_func_t *rl_getc_function;
+
+extern rl_voidfunc_t *rl_redisplay_function;
+
+extern rl_vintfunc_t *rl_prep_term_function;
+extern rl_voidfunc_t *rl_deprep_term_function;
+
+/* Dispatch variables. */
+extern Keymap rl_executing_keymap;
+extern Keymap rl_binding_keymap;
+
+extern int rl_executing_key;
+extern char *rl_executing_keyseq;
+extern int rl_key_sequence_length;
+
+/* Display variables. */
+/* If non-zero, readline will erase the entire line, including any prompt,
+ if the only thing typed on an otherwise-blank line is something bound to
+ rl_newline. */
+extern int rl_erase_empty_line;
+
+/* If non-zero, the application has already printed the prompt (rl_prompt)
+ before calling readline, so readline should not output it the first time
+ redisplay is done. */
+extern int rl_already_prompted;
+
+/* A non-zero value means to read only this many characters rather than
+ up to a character bound to accept-line. */
+extern int rl_num_chars_to_read;
+
+/* The text of a currently-executing keyboard macro. */
+extern char *rl_executing_macro;
+
+/* Variables to control readline signal handling. */
+/* If non-zero, readline will install its own signal handlers for
+ SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */
+extern int rl_catch_signals;
+
+/* If non-zero, readline will install a signal handler for SIGWINCH
+ that also attempts to call any calling application's SIGWINCH signal
+ handler. Note that the terminal is not cleaned up before the
+ application's signal handler is called; use rl_cleanup_after_signal()
+ to do that. */
+extern int rl_catch_sigwinch;
+
+/* If non-zero, the readline SIGWINCH handler will modify LINES and
+ COLUMNS in the environment. */
+extern int rl_change_environment;
+
+/* Completion variables. */
+/* Pointer to the generator function for completion_matches ().
+ NULL means to use rl_filename_completion_function (), the default
+ filename completer. */
+extern rl_compentry_func_t *rl_completion_entry_function;
+
+/* Optional generator for menu completion. Default is
+ rl_completion_entry_function (rl_filename_completion_function). */
+extern rl_compentry_func_t *rl_menu_completion_entry_function;
+
+/* If rl_ignore_some_completions_function is non-NULL it is the address
+ of a function to call after all of the possible matches have been
+ generated, but before the actual completion is done to the input line.
+ The function is called with one argument; a NULL terminated array
+ of (char *). If your function removes any of the elements, they
+ must be free()'ed. */
+extern rl_compignore_func_t *rl_ignore_some_completions_function;
+
+/* Pointer to alternative function to create matches.
+ Function is called with TEXT, START, and END.
+ START and END are indices in RL_LINE_BUFFER saying what the boundaries
+ of TEXT are.
+ If this function exists and returns NULL then call the value of
+ rl_completion_entry_function to try to match, otherwise use the
+ array of strings returned. */
+extern rl_completion_func_t *rl_attempted_completion_function;
+
+/* The basic list of characters that signal a break between words for the
+ completer routine. The initial contents of this variable is what
+ breaks words in the shell, i.e. "n\"\\'`@$>". */
+extern const char *rl_basic_word_break_characters;
+
+/* The list of characters that signal a break between words for
+ rl_complete_internal. The default list is the contents of
+ rl_basic_word_break_characters. */
+extern const char *rl_completer_word_break_characters;
+
+/* Hook function to allow an application to set the completion word
+ break characters before readline breaks up the line. Allows
+ position-dependent word break characters. */
+extern rl_cpvfunc_t *rl_completion_word_break_hook;
+
+/* List of characters which can be used to quote a substring of the line.
+ Completion occurs on the entire substring, and within the substring
+ rl_completer_word_break_characters are treated as any other character,
+ unless they also appear within this list. */
+extern const char *rl_completer_quote_characters;
+
+/* List of quote characters which cause a word break. */
+extern const char *rl_basic_quote_characters;
+
+/* List of characters that need to be quoted in filenames by the completer. */
+extern const char *rl_filename_quote_characters;
+
+/* List of characters that are word break characters, but should be left
+ in TEXT when it is passed to the completion function. The shell uses
+ this to help determine what kind of completing to do. */
+extern const char *rl_special_prefixes;
+
+/* If non-zero, then this is the address of a function to call when
+ completing on a directory name. The function is called with
+ the address of a string (the current directory name) as an arg. It
+ changes what is displayed when the possible completions are printed
+ or inserted. The directory completion hook should perform
+ any necessary dequoting. This function should return 1 if it modifies
+ the directory name pointer passed as an argument. If the directory
+ completion hook returns 0, it should not modify the directory name
+ pointer passed as an argument. */
+extern rl_icppfunc_t *rl_directory_completion_hook;
+
+/* If non-zero, this is the address of a function to call when completing
+ a directory name. This function takes the address of the directory name
+ to be modified as an argument. Unlike rl_directory_completion_hook, it
+ only modifies the directory name used in opendir(2), not what is displayed
+ when the possible completions are printed or inserted. If set, it takes
+ precedence over rl_directory_completion_hook. The directory rewrite
+ hook should perform any necessary dequoting. This function has the same
+ return value properties as the directory_completion_hook.
+
+ I'm not happy with how this works yet, so it's undocumented. I'm trying
+ it in bash to see how well it goes. */
+extern rl_icppfunc_t *rl_directory_rewrite_hook;
+
+/* If non-zero, this is the address of a function for the completer to call
+ before deciding which character to append to a completed name. It should
+ modify the directory name passed as an argument if appropriate, and return
+ non-zero if it modifies the name. This should not worry about dequoting
+ the filename; that has already happened by the time it gets here. */
+extern rl_icppfunc_t *rl_filename_stat_hook;
+
+/* If non-zero, this is the address of a function to call when reading
+ directory entries from the filesystem for completion and comparing
+ them to the partial word to be completed. The function should
+ either return its first argument (if no conversion takes place) or
+ newly-allocated memory. This can, for instance, convert filenames
+ between character sets for comparison against what's typed at the
+ keyboard. The returned value is what is added to the list of
+ matches. The second argument is the length of the filename to be
+ converted. */
+extern rl_dequote_func_t *rl_filename_rewrite_hook;
+
+/* Backwards compatibility with previous versions of readline. */
+#define rl_symbolic_link_hook rl_directory_completion_hook
+
+/* If non-zero, then this is the address of a function to call when
+ completing a word would normally display the list of possible matches.
+ This function is called instead of actually doing the display.
+ It takes three arguments: (char **matches, int num_matches, int max_length)
+ where MATCHES is the array of strings that matched, NUM_MATCHES is the
+ number of strings in that array, and MAX_LENGTH is the length of the
+ longest string in that array. */
+extern rl_compdisp_func_t *rl_completion_display_matches_hook;
+
+/* Non-zero means that the results of the matches are to be treated
+ as filenames. This is ALWAYS zero on entry, and can only be changed
+ within a completion entry finder function. */
+extern int rl_filename_completion_desired;
+
+/* Non-zero means that the results of the matches are to be quoted using
+ double quotes (or an application-specific quoting mechanism) if the
+ filename contains any characters in rl_word_break_chars. This is
+ ALWAYS non-zero on entry, and can only be changed within a completion
+ entry finder function. */
+extern int rl_filename_quoting_desired;
+
+/* Set to a function to quote a filename in an application-specific fashion.
+ Called with the text to quote, the type of match found (single or multiple)
+ and a pointer to the quoting character to be used, which the function can
+ reset if desired. */
+extern rl_quote_func_t *rl_filename_quoting_function;
+
+/* Function to call to remove quoting characters from a filename. Called
+ before completion is attempted, so the embedded quotes do not interfere
+ with matching names in the file system. */
+extern rl_dequote_func_t *rl_filename_dequoting_function;
+
+/* Function to call to decide whether or not a word break character is
+ quoted. If a character is quoted, it does not break words for the
+ completer. */
+extern rl_linebuf_func_t *rl_char_is_quoted_p;
+
+/* Non-zero means to suppress normal filename completion after the
+ user-specified completion function has been called. */
+extern int rl_attempted_completion_over;
+
+/* Set to a character describing the type of completion being attempted by
+ rl_complete_internal; available for use by application completion
+ functions. */
+extern int rl_completion_type;
+
+/* Set to the last key used to invoke one of the completion functions */
+extern int rl_completion_invoking_key;
+
+/* Up to this many items will be displayed in response to a
+ possible-completions call. After that, we ask the user if she
+ is sure she wants to see them all. The default value is 100. */
+extern int rl_completion_query_items;
+
+/* Character appended to completed words when at the end of the line. The
+ default is a space. Nothing is added if this is '\0'. */
+extern int rl_completion_append_character;
+
+/* If set to non-zero by an application completion function,
+ rl_completion_append_character will not be appended. */
+extern int rl_completion_suppress_append;
+
+/* Set to any quote character readline thinks it finds before any application
+ completion function is called. */
+extern int rl_completion_quote_character;
+
+/* Set to a non-zero value if readline found quoting anywhere in the word to
+ be completed; set before any application completion function is called. */
+extern int rl_completion_found_quote;
+
+/* If non-zero, the completion functions don't append any closing quote.
+ This is set to 0 by rl_complete_internal and may be changed by an
+ application-specific completion function. */
+extern int rl_completion_suppress_quote;
+
+/* If non-zero, readline will sort the completion matches. On by default. */
+extern int rl_sort_completion_matches;
+
+/* If non-zero, a slash will be appended to completed filenames that are
+ symbolic links to directory names, subject to the value of the
+ mark-directories variable (which is user-settable). This exists so
+ that application completion functions can override the user's preference
+ (set via the mark-symlinked-directories variable) if appropriate.
+ It's set to the value of _rl_complete_mark_symlink_dirs in
+ rl_complete_internal before any application-specific completion
+ function is called, so without that function doing anything, the user's
+ preferences are honored. */
+extern int rl_completion_mark_symlink_dirs;
+
+/* If non-zero, then disallow duplicates in the matches. */
+extern int rl_ignore_completion_duplicates;
+
+/* If this is non-zero, completion is (temporarily) inhibited, and the
+ completion character will be inserted as any other. */
+extern int rl_inhibit_completion;
+
+/* Applications can set this to non-zero to have readline's signal handlers
+ installed during the entire duration of reading a complete line, as in
+ readline-6.2. This should be used with care, because it can result in
+ readline receiving signals and not handling them until it's called again
+ via rl_callback_read_char, thereby stealing them from the application.
+ By default, signal handlers are only active while readline is active. */
+extern int rl_persistent_signal_handlers;
+
+/* Input error; can be returned by (*rl_getc_function) if readline is reading
+ a top-level command (RL_ISSTATE (RL_STATE_READCMD)). */
+#define READERR (-2)
+
+/* Definitions available for use by readline clients. */
+#define RL_PROMPT_START_IGNORE '\001'
+#define RL_PROMPT_END_IGNORE '\002'
+
+/* Possible values for do_replace argument to rl_filename_quoting_function,
+ called by rl_complete_internal. */
+#define NO_MATCH 0
+#define SINGLE_MATCH 1
+#define MULT_MATCH 2
+
+/* Possible state values for rl_readline_state */
+#define RL_STATE_NONE 0x000000 /* no state; before first call */
+
+#define RL_STATE_INITIALIZING 0x0000001 /* initializing */
+#define RL_STATE_INITIALIZED 0x0000002 /* initialization done */
+#define RL_STATE_TERMPREPPED 0x0000004 /* terminal is prepped */
+#define RL_STATE_READCMD 0x0000008 /* reading a command key */
+#define RL_STATE_METANEXT 0x0000010 /* reading input after ESC */
+#define RL_STATE_DISPATCHING 0x0000020 /* dispatching to a command */
+#define RL_STATE_MOREINPUT 0x0000040 /* reading more input in a command function */
+#define RL_STATE_ISEARCH 0x0000080 /* doing incremental search */
+#define RL_STATE_NSEARCH 0x0000100 /* doing non-inc search */
+#define RL_STATE_SEARCH 0x0000200 /* doing a history search */
+#define RL_STATE_NUMERICARG 0x0000400 /* reading numeric argument */
+#define RL_STATE_MACROINPUT 0x0000800 /* getting input from a macro */
+#define RL_STATE_MACRODEF 0x0001000 /* defining keyboard macro */
+#define RL_STATE_OVERWRITE 0x0002000 /* overwrite mode */
+#define RL_STATE_COMPLETING 0x0004000 /* doing completion */
+#define RL_STATE_SIGHANDLER 0x0008000 /* in readline sighandler */
+#define RL_STATE_UNDOING 0x0010000 /* doing an undo */
+#define RL_STATE_INPUTPENDING 0x0020000 /* rl_execute_next called */
+#define RL_STATE_TTYCSAVED 0x0040000 /* tty special chars saved */
+#define RL_STATE_CALLBACK 0x0080000 /* using the callback interface */
+#define RL_STATE_VIMOTION 0x0100000 /* reading vi motion arg */
+#define RL_STATE_MULTIKEY 0x0200000 /* reading multiple-key command */
+#define RL_STATE_VICMDONCE 0x0400000 /* entered vi command mode at least once */
+#define RL_STATE_CHARSEARCH 0x0800000 /* vi mode char search */
+#define RL_STATE_REDISPLAYING 0x1000000 /* updating terminal display */
+
+#define RL_STATE_DONE 0x2000000 /* done; accepted line */
+#define RL_STATE_TIMEOUT 0x4000000 /* done; timed out */
+#define RL_STATE_EOF 0x8000000 /* done; got eof on read */
+
+#define RL_SETSTATE(x) (rl_readline_state |= (x))
+#define RL_UNSETSTATE(x) (rl_readline_state &= ~(x))
+#define RL_ISSTATE(x) (rl_readline_state & (x))
+
+struct readline_state {
+ /* line state */
+ int point;
+ int end;
+ int mark;
+ int buflen;
+ char *buffer;
+ UNDO_LIST *ul;
+ char *prompt;
+
+ /* global state */
+ int rlstate;
+ int done;
+ Keymap kmap;
+
+ /* input state */
+ rl_command_func_t *lastfunc;
+ int insmode;
+ int edmode;
+ char *kseq;
+ int kseqlen;
+
+ int pendingin;
+ FILE *inf;
+ FILE *outf;
+ char *macro;
+
+ /* signal state */
+ int catchsigs;
+ int catchsigwinch;
+
+ /* search state */
+
+ /* completion state */
+ rl_compentry_func_t *entryfunc;
+ rl_compentry_func_t *menuentryfunc;
+ rl_compignore_func_t *ignorefunc;
+ rl_completion_func_t *attemptfunc;
+ const char *wordbreakchars;
+
+ /* options state */
+
+ /* hook state */
+
+ /* reserved for future expansion, so the struct size doesn't change */
+ char reserved[64];
+};
+
+extern int rl_save_state (struct readline_state *);
+extern int rl_restore_state (struct readline_state *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _READLINE_H_ */
diff --git a/readline.pc.in b/readline.pc.in
new file mode 100644
index 0000000..ff79d71
--- /dev/null
+++ b/readline.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: Readline
+Description: Gnu Readline library for command line editing
+URL: http://tiswww.cwru.edu/php/chet/readline/rltop.html
+Version: @LIBVERSION@
+Requires.private: @TERMCAP_PKG_CONFIG_LIB@
+Libs: -L${libdir} -lreadline
+Cflags: -I${includedir}
diff --git a/rlconf.h b/rlconf.h
new file mode 100644
index 0000000..b6d6a2f
--- /dev/null
+++ b/rlconf.h
@@ -0,0 +1,79 @@
+/* rlconf.h -- readline configuration definitions */
+
+/* Copyright (C) 1992-2015 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_RLCONF_H_)
+#define _RLCONF_H_
+
+/* Define this if you want the vi-mode editing available. */
+#define VI_MODE
+
+/* Define this to get an indication of file type when listing completions. */
+#define VISIBLE_STATS
+
+/* Define this to get support for colors when listing completions and in
+ other places. */
+#define COLOR_SUPPORT
+
+/* This definition is needed by readline.c, rltty.c, and signals.c. */
+/* If on, then readline handles signals in a way that doesn't suck. */
+#define HANDLE_SIGNALS
+
+/* Ugly but working hack for binding prefix meta. */
+#define PREFIX_META_HACK
+
+/* The next-to-last-ditch effort file name for a user-specific init file. */
+#define DEFAULT_INPUTRC "~/.inputrc"
+
+/* The ultimate last-ditch filename for an init file -- system-wide. */
+#define SYS_INPUTRC "/etc/inputrc"
+
+/* If defined, expand tabs to spaces. */
+#define DISPLAY_TABS
+
+/* If defined, use the terminal escape sequence to move the cursor forward
+ over a character when updating the line rather than rewriting it. */
+/* #define HACK_TERMCAP_MOTION */
+
+/* The string inserted by the `insert comment' command. */
+#define RL_COMMENT_BEGIN_DEFAULT "#"
+
+/* Define this if you want code that allows readline to be used in an
+ X `callback' style. */
+#define READLINE_CALLBACKS
+
+/* Define this if you want the cursor to indicate insert or overwrite mode. */
+/* #define CURSOR_MODE */
+
+/* Define this if you want to enable code that talks to the Linux kernel
+ tty auditing system. */
+/* #define ENABLE_TTY_AUDIT_SUPPORT */
+
+/* Defaults for the various editing mode indicators, inserted at the beginning
+ of the last (maybe only) line of the prompt if show-mode-in-prompt is on */
+#define RL_EMACS_MODESTR_DEFAULT "@"
+#define RL_EMACS_MODESTR_DEFLEN 1
+
+#define RL_VI_INS_MODESTR_DEFAULT "(ins)"
+#define RL_VI_INS_MODESTR_DEFLEN 5
+#define RL_VI_CMD_MODESTR_DEFAULT "(cmd)"
+#define RL_VI_CMD_MODESTR_DEFLEN 5
+
+#endif /* _RLCONF_H_ */
diff --git a/rldefs.h b/rldefs.h
new file mode 100644
index 0000000..98577a6
--- /dev/null
+++ b/rldefs.h
@@ -0,0 +1,166 @@
+/* rldefs.h -- an attempt to isolate some of the system-specific defines
+ for readline. This should be included after any files that define
+ system-specific constants like _POSIX_VERSION or USG. */
+
+/* Copyright (C) 1987-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_RLDEFS_H_)
+#define _RLDEFS_H_
+
+#if defined (HAVE_CONFIG_H)
+# include "config.h"
+#endif
+
+#include "rlstdc.h"
+
+#if defined (STRCOLL_BROKEN)
+# undef HAVE_STRCOLL
+#endif
+
+#if defined (_POSIX_VERSION) && !defined (TERMIOS_MISSING)
+# define TERMIOS_TTY_DRIVER
+#else
+# if defined (HAVE_TERMIO_H)
+# define TERMIO_TTY_DRIVER
+# else
+# if !defined (__MINGW32__)
+# define NEW_TTY_DRIVER
+# else
+# define NO_TTY_DRIVER
+# endif
+# endif
+#endif
+
+/* Posix macro to check file in statbuf for directory-ness.
+ This requires that <sys/stat.h> be included before this test. */
+#if defined (S_IFDIR) && !defined (S_ISDIR)
+# define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR)
+#endif
+
+/* Decide which flavor of the header file describing the C library
+ string functions to include and include it. */
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else /* !HAVE_STRING_H */
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strchr (), *strrchr ();
+#endif /* !strchr && !__STDC__ */
+
+#if defined (PREFER_STDARG)
+# include <stdarg.h>
+#else
+# if defined (PREFER_VARARGS)
+# include <varargs.h>
+# endif
+#endif
+
+#if defined (HAVE_STRCASECMP)
+#define _rl_stricmp strcasecmp
+#define _rl_strnicmp strncasecmp
+#else
+extern int _rl_stricmp (const char *, const char *);
+extern int _rl_strnicmp (const char *, const char *, int);
+#endif
+
+#if defined (HAVE_STRPBRK) && !defined (HAVE_MULTIBYTE)
+# define _rl_strpbrk(a,b) strpbrk((a),(b))
+#else
+extern char *_rl_strpbrk (const char *, const char *);
+#endif
+
+#if !defined (emacs_mode)
+# define no_mode -1
+# define vi_mode 0
+# define emacs_mode 1
+#endif
+
+#if !defined (RL_IM_INSERT)
+# define RL_IM_INSERT 1
+# define RL_IM_OVERWRITE 0
+#
+# define RL_IM_DEFAULT RL_IM_INSERT
+#endif
+
+/* If you cast map[key].function to type (Keymap) on a Cray,
+ the compiler takes the value of map[key].function and
+ divides it by 4 to convert between pointer types (pointers
+ to functions and pointers to structs are different sizes).
+ This is not what is wanted. */
+#if defined (CRAY)
+# define FUNCTION_TO_KEYMAP(map, key) (Keymap)((int)map[key].function)
+# define KEYMAP_TO_FUNCTION(data) (rl_command_func_t *)((int)(data))
+#else
+# define FUNCTION_TO_KEYMAP(map, key) (Keymap)(map[key].function)
+# define KEYMAP_TO_FUNCTION(data) (rl_command_func_t *)(data)
+#endif
+
+#ifndef savestring
+#define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x))
+#endif
+
+/* Possible values for _rl_bell_preference. */
+#define NO_BELL 0
+#define AUDIBLE_BELL 1
+#define VISIBLE_BELL 2
+
+/* Definitions used when searching the line for characters. */
+/* NOTE: it is necessary that opposite directions are inverses */
+#define FTO 1 /* forward to */
+#define BTO -1 /* backward to */
+#define FFIND 2 /* forward find */
+#define BFIND -2 /* backward find */
+
+/* Possible values for the found_quote flags word used by the completion
+ functions. It says what kind of (shell-like) quoting we found anywhere
+ in the line. */
+#define RL_QF_SINGLE_QUOTE 0x01
+#define RL_QF_DOUBLE_QUOTE 0x02
+#define RL_QF_BACKSLASH 0x04
+#define RL_QF_OTHER_QUOTE 0x08
+
+/* Default readline line buffer length. */
+#define DEFAULT_BUFFER_SIZE 256
+
+#if !defined (STREQ)
+#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0))
+#define STREQN(a, b, n) (((n) == 0) ? (1) \
+ : ((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0))
+#endif
+
+#if !defined (RL_STRLEN)
+# define RL_STRLEN(s) (((s) && (s)[0]) ? ((s)[1] ? ((s)[2] ? strlen(s) : 2) : 1) : 0)
+#endif
+
+#if !defined (FREE)
+# define FREE(x) if (x) free (x)
+#endif
+
+#if !defined (SWAP)
+# define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
+#endif
+
+/* CONFIGURATION SECTION */
+#include "rlconf.h"
+
+#endif /* !_RLDEFS_H_ */
diff --git a/rlmbutil.h b/rlmbutil.h
new file mode 100644
index 0000000..d906057
--- /dev/null
+++ b/rlmbutil.h
@@ -0,0 +1,225 @@
+/* rlmbutil.h -- utility functions for multibyte characters. */
+
+/* Copyright (C) 2001-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_RL_MBUTIL_H_)
+#define _RL_MBUTIL_H_
+
+#include "rlstdc.h"
+
+/************************************************/
+/* check multibyte capability for I18N code */
+/************************************************/
+
+/* For platforms which support the ISO C amendment 1 functionality we
+ support user defined character classes. */
+ /* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */
+#if defined (HAVE_WCTYPE_H) && defined (HAVE_WCHAR_H) && defined (HAVE_LOCALE_H)
+# include <wchar.h>
+# include <wctype.h>
+# if defined (HAVE_ISWCTYPE) && \
+ defined (HAVE_ISWLOWER) && \
+ defined (HAVE_ISWUPPER) && \
+ defined (HAVE_MBSRTOWCS) && \
+ defined (HAVE_MBRTOWC) && \
+ defined (HAVE_MBRLEN) && \
+ defined (HAVE_TOWLOWER) && \
+ defined (HAVE_TOWUPPER) && \
+ defined (HAVE_WCHAR_T) && \
+ defined (HAVE_WCWIDTH)
+ /* system is supposed to support XPG5 */
+# define HANDLE_MULTIBYTE 1
+# endif
+#endif
+
+/* If we don't want multibyte chars even on a system that supports them, let
+ the configuring user turn multibyte support off. */
+#if defined (NO_MULTIBYTE_SUPPORT)
+# undef HANDLE_MULTIBYTE
+#endif
+
+/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t. */
+#if HANDLE_MULTIBYTE && !defined (HAVE_MBSTATE_T)
+# define wcsrtombs(dest, src, len, ps) (wcsrtombs) (dest, src, len, 0)
+# define mbsrtowcs(dest, src, len, ps) (mbsrtowcs) (dest, src, len, 0)
+# define wcrtomb(s, wc, ps) (wcrtomb) (s, wc, 0)
+# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
+# define mbrlen(s, n, ps) (mbrlen) (s, n, 0)
+# define mbstate_t int
+#endif
+
+/* Make sure MB_LEN_MAX is at least 16 on systems that claim to be able to
+ handle multibyte chars (some systems define MB_LEN_MAX as 1) */
+#ifdef HANDLE_MULTIBYTE
+# include <limits.h>
+# if defined(MB_LEN_MAX) && (MB_LEN_MAX < 16)
+# undef MB_LEN_MAX
+# endif
+# if !defined (MB_LEN_MAX)
+# define MB_LEN_MAX 16
+# endif
+#endif
+
+/************************************************/
+/* end of multibyte capability checks for I18N */
+/************************************************/
+
+/*
+ * wchar_t doesn't work for 32-bit values on Windows using MSVC
+ */
+#ifdef WCHAR_T_BROKEN
+# define WCHAR_T char32_t
+# define MBRTOWC mbrtoc32
+# define WCRTOMB c32rtomb
+#else /* normal systems */
+# define WCHAR_T wchar_t
+# define MBRTOWC mbrtowc
+# define WCRTOMB wcrtomb
+#endif
+
+/*
+ * Flags for _rl_find_prev_mbchar and _rl_find_next_mbchar:
+ *
+ * MB_FIND_ANY find any multibyte character
+ * MB_FIND_NONZERO find a non-zero-width multibyte character
+ */
+
+#define MB_FIND_ANY 0x00
+#define MB_FIND_NONZERO 0x01
+
+extern int _rl_find_prev_mbchar (char *, int, int);
+extern int _rl_find_next_mbchar (char *, int, int, int);
+
+#ifdef HANDLE_MULTIBYTE
+
+extern int _rl_compare_chars (char *, int, mbstate_t *, char *, int, mbstate_t *);
+extern int _rl_get_char_len (char *, mbstate_t *);
+extern int _rl_adjust_point (char *, int, mbstate_t *);
+
+extern int _rl_read_mbchar (char *, int);
+extern int _rl_read_mbstring (int, char *, int);
+
+extern int _rl_is_mbchar_matched (char *, int, int, char *, int);
+
+extern WCHAR_T _rl_char_value (char *, int);
+extern int _rl_walphabetic (WCHAR_T);
+
+#define _rl_to_wupper(wc) (iswlower (wc) ? towupper (wc) : (wc))
+#define _rl_to_wlower(wc) (iswupper (wc) ? towlower (wc) : (wc))
+
+#define MB_NEXTCHAR(b,s,c,f) \
+ ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) \
+ ? _rl_find_next_mbchar ((b), (s), (c), (f)) \
+ : ((s) + (c)))
+#define MB_PREVCHAR(b,s,f) \
+ ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) \
+ ? _rl_find_prev_mbchar ((b), (s), (f)) \
+ : ((s) - 1))
+
+#define MB_INVALIDCH(x) ((x) == (size_t)-1 || (x) == (size_t)-2)
+#define MB_NULLWCH(x) ((x) == 0)
+
+/* Try and shortcut the printable ascii characters to cut down the number of
+ calls to a libc wcwidth() */
+static inline int
+_rl_wcwidth (WCHAR_T wc)
+{
+ switch (wc)
+ {
+ case ' ': case '!': case '"': case '#': case '%':
+ case '&': case '\'': case '(': case ')': case '*':
+ case '+': case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>':
+ case '?':
+ case 'A': case 'B': case 'C': case 'D': case 'E':
+ case 'F': case 'G': case 'H': case 'I': case 'J':
+ case 'K': case 'L': case 'M': case 'N': case 'O':
+ case 'P': case 'Q': case 'R': case 'S': case 'T':
+ case 'U': case 'V': case 'W': case 'X': case 'Y':
+ case 'Z':
+ case '[': case '\\': case ']': case '^': case '_':
+ case 'a': case 'b': case 'c': case 'd': case 'e':
+ case 'f': case 'g': case 'h': case 'i': case 'j':
+ case 'k': case 'l': case 'm': case 'n': case 'o':
+ case 'p': case 'q': case 'r': case 's': case 't':
+ case 'u': case 'v': case 'w': case 'x': case 'y':
+ case 'z': case '{': case '|': case '}': case '~':
+ return 1;
+ default:
+ return wcwidth (wc);
+ }
+}
+
+/* Unicode combining characters range from U+0300 to U+036F */
+#define UNICODE_COMBINING_CHAR(x) ((x) >= 768 && (x) <= 879)
+
+#if defined (WCWIDTH_BROKEN)
+# define WCWIDTH(wc) ((_rl_utf8locale && UNICODE_COMBINING_CHAR(wc)) ? 0 : _rl_wcwidth(wc))
+#else
+# define WCWIDTH(wc) _rl_wcwidth(wc)
+#endif
+
+#if defined (WCWIDTH_BROKEN)
+# define IS_COMBINING_CHAR(x) (WCWIDTH(x) == 0 && iswcntrl(x) == 0)
+#else
+# define IS_COMBINING_CHAR(x) (WCWIDTH(x) == 0)
+#endif
+
+#define UTF8_SINGLEBYTE(c) (((c) & 0x80) == 0)
+#define UTF8_MBFIRSTCHAR(c) (((c) & 0xc0) == 0xc0)
+#define UTF8_MBCHAR(c) (((c) & 0xc0) == 0x80)
+
+#else /* !HANDLE_MULTIBYTE */
+
+#undef MB_LEN_MAX
+#undef MB_CUR_MAX
+
+#define MB_LEN_MAX 1
+#define MB_CUR_MAX 1
+
+#define _rl_find_prev_mbchar(b, i, f) (((i) == 0) ? (i) : ((i) - 1))
+#define _rl_find_next_mbchar(b, i1, i2, f) ((i1) + (i2))
+
+#define _rl_char_value(buf,ind) ((buf)[(ind)])
+
+#define _rl_walphabetic(c) (rl_alphabetic (c))
+
+#define _rl_to_wupper(c) (_rl_to_upper (c))
+#define _rl_to_wlower(c) (_rl_to_lower (c))
+
+#define MB_NEXTCHAR(b,s,c,f) ((s) + (c))
+#define MB_PREVCHAR(b,s,f) ((s) - 1)
+
+#define MB_INVALIDCH(x) (0)
+#define MB_NULLWCH(x) (0)
+
+#define UTF8_SINGLEBYTE(c) (1)
+
+#if !defined (HAVE_WCHAR_T) && !defined (wchar_t)
+# define wchar_t int
+#endif
+
+#endif /* !HANDLE_MULTIBYTE */
+
+extern int rl_byte_oriented;
+
+#endif /* _RL_MBUTIL_H_ */
diff --git a/rlprivate.h b/rlprivate.h
new file mode 100644
index 0000000..d87d07a
--- /dev/null
+++ b/rlprivate.h
@@ -0,0 +1,633 @@
+/* rlprivate.h -- functions and variables global to the readline library,
+ but not intended for use by applications. */
+
+/* Copyright (C) 1999-2022 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_RL_PRIVATE_H_)
+#define _RL_PRIVATE_H_
+
+#include "rlconf.h" /* for VISIBLE_STATS */
+#include "rlstdc.h"
+#include "posixjmp.h" /* defines procenv_t */
+#include "rlmbutil.h" /* for HANDLE_MULTIBYTE */
+
+/*************************************************************************
+ * *
+ * Convenience definitions *
+ * *
+ *************************************************************************/
+
+#define EMACS_MODE() (rl_editing_mode == emacs_mode)
+#define VI_COMMAND_MODE() (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap)
+#define VI_INSERT_MODE() (rl_editing_mode == vi_mode && _rl_keymap == vi_insertion_keymap)
+
+#define RL_CHECK_SIGNALS() \
+ do { \
+ if (_rl_caught_signal) _rl_signal_handler (_rl_caught_signal); \
+ } while (0)
+
+#define RL_SIG_RECEIVED() (_rl_caught_signal != 0)
+#define RL_SIGINT_RECEIVED() (_rl_caught_signal == SIGINT)
+#define RL_SIGWINCH_RECEIVED() (_rl_caught_signal == SIGWINCH)
+
+#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay)
+#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)
+
+/*************************************************************************
+ * *
+ * Global structs undocumented in texinfo manual and not in readline.h *
+ * *
+ *************************************************************************/
+/* search types */
+#define RL_SEARCH_ISEARCH 0x01 /* incremental search */
+#define RL_SEARCH_NSEARCH 0x02 /* non-incremental search */
+#define RL_SEARCH_CSEARCH 0x04 /* intra-line char search */
+
+/* search flags */
+#define SF_REVERSE 0x01
+#define SF_FOUND 0x02
+#define SF_FAILED 0x04
+#define SF_CHGKMAP 0x08
+#define SF_PATTERN 0x10
+#define SF_NOCASE 0x20 /* unused so far */
+
+typedef struct __rl_search_context
+{
+ int type;
+ int sflags;
+
+ char *search_string;
+ int search_string_index;
+ int search_string_size;
+
+ char **lines;
+ char *allocated_line;
+ int hlen;
+ int hindex;
+
+ int save_point;
+ int save_mark;
+ int save_line;
+ int last_found_line;
+ char *prev_line_found;
+
+ UNDO_LIST *save_undo_list;
+
+ Keymap keymap; /* used when dispatching commands in search string */
+ Keymap okeymap; /* original keymap */
+
+ int history_pos;
+ int direction;
+
+ int prevc;
+ int lastc;
+#if defined (HANDLE_MULTIBYTE)
+ char mb[MB_LEN_MAX];
+ char pmb[MB_LEN_MAX];
+#endif
+
+ char *sline;
+ int sline_len;
+ int sline_index;
+
+ char *search_terminators;
+} _rl_search_cxt;
+
+struct _rl_cmd {
+ Keymap map;
+ int count;
+ int key;
+ rl_command_func_t *func;
+};
+extern struct _rl_cmd _rl_pending_command;
+extern struct _rl_cmd *_rl_command_to_execute;
+
+/* Callback data for reading numeric arguments */
+#define NUM_SAWMINUS 0x01
+#define NUM_SAWDIGITS 0x02
+#define NUM_READONE 0x04
+
+typedef int _rl_arg_cxt;
+
+/* A context for reading key sequences longer than a single character when
+ using the callback interface. */
+#define KSEQ_DISPATCHED 0x01
+#define KSEQ_SUBSEQ 0x02
+#define KSEQ_RECURSIVE 0x04
+
+typedef struct __rl_keyseq_context
+{
+ int flags;
+ int subseq_arg;
+ int subseq_retval; /* XXX */
+ int okey;
+
+ Keymap dmap;
+ Keymap oldmap;
+
+ struct __rl_keyseq_context *ocxt;
+ int childval;
+} _rl_keyseq_cxt;
+
+/* vi-mode commands that use result of motion command to define boundaries */
+#define VIM_DELETE 0x01
+#define VIM_CHANGE 0x02
+#define VIM_YANK 0x04
+
+/* various states for vi-mode commands that use motion commands. reflects
+ RL_READLINE_STATE */
+#define VMSTATE_READ 0x01
+#define VMSTATE_NUMARG 0x02
+
+typedef struct __rl_vimotion_context
+{
+ int op;
+ int state;
+ int flags; /* reserved */
+ _rl_arg_cxt ncxt;
+ int numeric_arg;
+ int start, end; /* rl_point, rl_end */
+ int key, motion; /* initial key, motion command */
+} _rl_vimotion_cxt;
+
+/* fill in more as needed */
+/* `Generic' callback data and functions */
+typedef struct __rl_callback_generic_arg
+{
+ int count;
+ int i1, i2;
+ /* add here as needed */
+} _rl_callback_generic_arg;
+
+typedef int _rl_callback_func_t (_rl_callback_generic_arg *);
+
+typedef void _rl_sigcleanup_func_t (int, void *);
+
+/*************************************************************************
+ * *
+ * Global functions undocumented in texinfo manual and not in readline.h *
+ * *
+ *************************************************************************/
+
+/*************************************************************************
+ * *
+ * Global variables undocumented in texinfo manual and not in readline.h *
+ * *
+ *************************************************************************/
+
+/* complete.c */
+extern int rl_complete_with_tilde_expansion;
+#if defined (VISIBLE_STATS)
+extern int rl_visible_stats;
+#endif /* VISIBLE_STATS */
+#if defined (COLOR_SUPPORT)
+extern int _rl_colored_stats;
+extern int _rl_colored_completion_prefix;
+#endif
+
+/* readline.c */
+extern int rl_line_buffer_len;
+extern int rl_arg_sign;
+extern int rl_visible_prompt_length;
+extern int rl_byte_oriented;
+
+/* display.c */
+extern int rl_display_fixed;
+
+/* parens.c */
+extern int rl_blink_matching_paren;
+
+/*************************************************************************
+ * *
+ * Global functions and variables unused and undocumented *
+ * *
+ *************************************************************************/
+
+/* kill.c */
+extern int rl_set_retained_kills (int);
+
+/* terminal.c */
+extern void _rl_set_screen_size (int, int);
+
+/* undo.c */
+extern int _rl_fix_last_undo_of_type (int, int, int);
+
+/* util.c */
+extern char *_rl_savestring (const char *);
+
+/*************************************************************************
+ * *
+ * Functions and variables private to the readline library *
+ * *
+ *************************************************************************/
+
+/* NOTE: Functions and variables prefixed with `_rl_' are
+ pseudo-global: they are global so they can be shared
+ between files in the readline library, but are not intended
+ to be visible to readline callers. */
+
+/*************************************************************************
+ * Undocumented private functions *
+ *************************************************************************/
+
+#if defined(READLINE_CALLBACKS)
+
+/* readline.c */
+extern void readline_internal_setup (void);
+extern char *readline_internal_teardown (int);
+extern int readline_internal_char (void);
+
+extern _rl_keyseq_cxt *_rl_keyseq_cxt_alloc (void);
+extern void _rl_keyseq_cxt_dispose (_rl_keyseq_cxt *);
+extern void _rl_keyseq_chain_dispose (void);
+
+extern int _rl_dispatch_callback (_rl_keyseq_cxt *);
+
+/* callback.c */
+extern _rl_callback_generic_arg *_rl_callback_data_alloc (int);
+extern void _rl_callback_data_dispose (_rl_callback_generic_arg *);
+
+#endif /* READLINE_CALLBACKS */
+
+/* bind.c */
+extern char *_rl_untranslate_macro_value (char *, int);
+
+/* complete.c */
+extern void _rl_reset_completion_state (void);
+extern char _rl_find_completion_word (int *, int *);
+extern void _rl_free_match_list (char **);
+
+/* display.c */
+extern char *_rl_strip_prompt (char *);
+extern void _rl_reset_prompt (void);
+extern void _rl_move_vert (int);
+extern void _rl_save_prompt (void);
+extern void _rl_restore_prompt (void);
+extern char *_rl_make_prompt_for_search (int);
+extern void _rl_erase_at_end_of_line (int);
+extern void _rl_clear_to_eol (int);
+extern void _rl_clear_screen (int);
+extern void _rl_update_final (void);
+extern void _rl_optimize_redisplay (void);
+extern void _rl_redisplay_after_sigwinch (void);
+extern void _rl_clean_up_for_exit (void);
+extern void _rl_erase_entire_line (void);
+extern int _rl_current_display_line (void);
+extern void _rl_refresh_line (void);
+
+/* input.c */
+extern int _rl_any_typein (void);
+extern int _rl_input_available (void);
+extern int _rl_nchars_available (void);
+extern int _rl_input_queued (int);
+extern void _rl_insert_typein (int);
+extern int _rl_unget_char (int);
+extern int _rl_pushed_input_available (void);
+
+extern int _rl_timeout_init (void);
+extern int _rl_timeout_handle_sigalrm (void);
+#if defined (_POSIXSELECT_H_)
+/* use as a sentinel for fd_set, struct timeval, and sigset_t definitions */
+extern int _rl_timeout_select (int, fd_set *, fd_set *, fd_set *, const struct timeval *, const sigset_t *);
+#endif
+
+/* isearch.c */
+extern _rl_search_cxt *_rl_scxt_alloc (int, int);
+extern void _rl_scxt_dispose (_rl_search_cxt *, int);
+
+extern int _rl_isearch_dispatch (_rl_search_cxt *, int);
+extern int _rl_isearch_callback (_rl_search_cxt *);
+extern int _rl_isearch_cleanup (_rl_search_cxt *, int);
+
+extern int _rl_search_getchar (_rl_search_cxt *);
+
+/* kill.c */
+#ifndef BRACKETED_PASTE_DEFAULT
+# define BRACKETED_PASTE_DEFAULT 1 /* XXX - for now */
+#endif
+
+#define BRACK_PASTE_PREF "\033[200~"
+#define BRACK_PASTE_SUFF "\033[201~"
+
+#define BRACK_PASTE_LAST '~'
+#define BRACK_PASTE_SLEN 6
+
+#define BRACK_PASTE_INIT "\033[?2004h"
+#define BRACK_PASTE_FINI "\033[?2004l\r"
+
+extern int _rl_read_bracketed_paste_prefix (int);
+extern char *_rl_bracketed_text (size_t *);
+extern int _rl_bracketed_read_key (void);
+extern int _rl_bracketed_read_mbstring (char *, int);
+
+/* macro.c */
+extern void _rl_with_macro_input (char *);
+extern int _rl_peek_macro_key (void);
+extern int _rl_next_macro_key (void);
+extern int _rl_prev_macro_key (void);
+extern void _rl_push_executing_macro (void);
+extern void _rl_pop_executing_macro (void);
+extern void _rl_add_macro_char (int);
+extern void _rl_kill_kbd_macro (void);
+
+/* misc.c */
+extern int _rl_arg_overflow (void);
+extern void _rl_arg_init (void);
+extern int _rl_arg_getchar (void);
+extern int _rl_arg_callback (_rl_arg_cxt);
+extern void _rl_reset_argument (void);
+
+extern void _rl_start_using_history (void);
+extern int _rl_free_saved_history_line (void);
+extern void _rl_set_insert_mode (int, int);
+
+extern void _rl_revert_previous_lines (void);
+extern void _rl_revert_all_lines (void);
+
+/* nls.c */
+extern char *_rl_init_locale (void);
+extern int _rl_init_eightbit (void);
+extern void _rl_reset_locale (void);
+
+/* parens.c */
+extern void _rl_enable_paren_matching (int);
+
+/* readline.c */
+extern void _rl_init_line_state (void);
+extern void _rl_set_the_line (void);
+extern int _rl_dispatch (int, Keymap);
+extern int _rl_dispatch_subseq (int, Keymap, int);
+extern void _rl_internal_char_cleanup (void);
+
+extern void _rl_init_executing_keyseq (void);
+extern void _rl_term_executing_keyseq (void);
+extern void _rl_end_executing_keyseq (void);
+extern void _rl_add_executing_keyseq (int);
+extern void _rl_del_executing_keyseq (void);
+
+extern rl_command_func_t *_rl_executing_func;
+
+/* rltty.c */
+extern int _rl_disable_tty_signals (void);
+extern int _rl_restore_tty_signals (void);
+
+/* search.c */
+extern int _rl_nsearch_callback (_rl_search_cxt *);
+extern int _rl_nsearch_cleanup (_rl_search_cxt *, int);
+
+/* signals.c */
+extern void _rl_signal_handler (int);
+
+extern void _rl_block_sigint (void);
+extern void _rl_release_sigint (void);
+extern void _rl_block_sigwinch (void);
+extern void _rl_release_sigwinch (void);
+
+/* terminal.c */
+extern void _rl_get_screen_size (int, int);
+extern void _rl_sigwinch_resize_terminal (void);
+extern int _rl_init_terminal_io (const char *);
+#ifdef _MINIX
+extern void _rl_output_character_function (int);
+#else
+extern int _rl_output_character_function (int);
+#endif
+extern void _rl_cr (void);
+extern void _rl_output_some_chars (const char *, int);
+extern int _rl_backspace (int);
+extern void _rl_enable_meta_key (void);
+extern void _rl_disable_meta_key (void);
+extern void _rl_control_keypad (int);
+extern void _rl_set_cursor (int, int);
+extern void _rl_standout_on (void);
+extern void _rl_standout_off (void);
+extern int _rl_reset_region_color (int, const char *);
+extern void _rl_region_color_on (void);
+extern void _rl_region_color_off (void);
+
+/* text.c */
+extern void _rl_fix_point (int);
+extern void _rl_fix_mark (void);
+extern int _rl_replace_text (const char *, int, int);
+extern int _rl_forward_char_internal (int);
+extern int _rl_backward_char_internal (int);
+extern int _rl_insert_char (int, int);
+extern int _rl_overwrite_char (int, int);
+extern int _rl_overwrite_rubout (int, int);
+extern int _rl_rubout_char (int, int);
+#if defined (HANDLE_MULTIBYTE)
+extern int _rl_char_search_internal (int, int, char *, int);
+#else
+extern int _rl_char_search_internal (int, int, int);
+#endif
+extern int _rl_set_mark_at_pos (int);
+
+/* undo.c */
+extern UNDO_LIST *_rl_copy_undo_entry (UNDO_LIST *);
+extern UNDO_LIST *_rl_copy_undo_list (UNDO_LIST *);
+extern void _rl_free_undo_list (UNDO_LIST *);
+
+/* util.c */
+#if defined (USE_VARARGS) && defined (PREFER_STDARG)
+extern void _rl_ttymsg (const char *, ...) __attribute__((__format__ (printf, 1, 2)));
+extern void _rl_errmsg (const char *, ...) __attribute__((__format__ (printf, 1, 2)));
+extern void _rl_trace (const char *, ...) __attribute__((__format__ (printf, 1, 2)));
+#else
+extern void _rl_ttymsg ();
+extern void _rl_errmsg ();
+extern void _rl_trace ();
+#endif
+extern void _rl_audit_tty (char *);
+
+extern int _rl_tropen (void);
+
+extern int _rl_abort_internal (void);
+extern int _rl_null_function (int, int);
+extern char *_rl_strindex (const char *, const char *);
+extern int _rl_qsort_string_compare (char **, char **);
+extern int (_rl_uppercase_p) (int);
+extern int (_rl_lowercase_p) (int);
+extern int (_rl_pure_alphabetic) (int);
+extern int (_rl_digit_p) (int);
+extern int (_rl_to_lower) (int);
+extern int (_rl_to_upper) (int);
+extern int (_rl_digit_value) (int);
+
+/* vi_mode.c */
+extern void _rl_vi_initialize_line (void);
+extern void _rl_vi_reset_last (void);
+extern void _rl_vi_set_last (int, int, int);
+extern int _rl_vi_textmod_command (int);
+extern int _rl_vi_motion_command (int);
+extern void _rl_vi_done_inserting (void);
+extern int _rl_vi_domove_callback (_rl_vimotion_cxt *);
+extern int _rl_vi_domove_motion_cleanup (int, _rl_vimotion_cxt *);
+
+/* Use HS_HISTORY_VERSION as the sentinel to see if we've included history.h
+ and so can use HIST_ENTRY */
+#if defined (HS_HISTORY_VERSION)
+extern void _rl_free_history_entry (HIST_ENTRY *);
+#endif
+
+/*************************************************************************
+ * Undocumented private variables *
+ *************************************************************************/
+
+/* bind.c */
+extern const char * const _rl_possible_control_prefixes[];
+extern const char * const _rl_possible_meta_prefixes[];
+
+/* callback.c */
+extern _rl_callback_func_t *_rl_callback_func;
+extern _rl_callback_generic_arg *_rl_callback_data;
+
+/* complete.c */
+extern int _rl_complete_show_all;
+extern int _rl_complete_show_unmodified;
+extern int _rl_complete_mark_directories;
+extern int _rl_complete_mark_symlink_dirs;
+extern int _rl_completion_prefix_display_length;
+extern int _rl_completion_columns;
+extern int _rl_print_completions_horizontally;
+extern int _rl_completion_case_fold;
+extern int _rl_completion_case_map;
+extern int _rl_match_hidden_files;
+extern int _rl_page_completions;
+extern int _rl_skip_completed_text;
+extern int _rl_menu_complete_prefix_first;
+
+/* display.c */
+extern int _rl_vis_botlin;
+extern int _rl_last_c_pos;
+extern int _rl_suppress_redisplay;
+extern int _rl_want_redisplay;
+
+extern char *_rl_emacs_mode_str;
+extern int _rl_emacs_modestr_len;
+extern char *_rl_vi_ins_mode_str;
+extern int _rl_vi_ins_modestr_len;
+extern char *_rl_vi_cmd_mode_str;
+extern int _rl_vi_cmd_modestr_len;
+
+/* isearch.c */
+extern char *_rl_isearch_terminators;
+
+extern _rl_search_cxt *_rl_iscxt;
+
+/* macro.c */
+extern char *_rl_executing_macro;
+
+/* misc.c */
+extern int _rl_history_preserve_point;
+extern int _rl_history_saved_point;
+
+extern _rl_arg_cxt _rl_argcxt;
+
+/* nls.c */
+extern int _rl_utf8locale;
+
+/* readline.c */
+extern int _rl_echoing_p;
+extern int _rl_horizontal_scroll_mode;
+extern int _rl_mark_modified_lines;
+extern int _rl_bell_preference;
+extern int _rl_meta_flag;
+extern int _rl_convert_meta_chars_to_ascii;
+extern int _rl_output_meta_chars;
+extern int _rl_bind_stty_chars;
+extern int _rl_revert_all_at_newline;
+extern int _rl_echo_control_chars;
+extern int _rl_show_mode_in_prompt;
+extern int _rl_enable_bracketed_paste;
+extern int _rl_enable_active_region;
+extern char *_rl_active_region_start_color;
+extern char *_rl_active_region_end_color;
+extern char *_rl_comment_begin;
+extern unsigned char _rl_parsing_conditionalized_out;
+extern Keymap _rl_keymap;
+extern FILE *_rl_in_stream;
+extern FILE *_rl_out_stream;
+extern int _rl_last_command_was_kill;
+extern int _rl_eof_char;
+extern procenv_t _rl_top_level;
+extern _rl_keyseq_cxt *_rl_kscxt;
+extern int _rl_keyseq_timeout;
+
+extern int _rl_executing_keyseq_size;
+
+extern rl_hook_func_t *_rl_internal_startup_hook;
+
+/* search.c */
+extern _rl_search_cxt *_rl_nscxt;
+extern int _rl_history_search_pos;
+
+/* signals.c */
+extern int volatile _rl_caught_signal;
+
+extern _rl_sigcleanup_func_t *_rl_sigcleanup;
+extern void *_rl_sigcleanarg;
+
+extern int _rl_echoctl;
+
+extern int _rl_intr_char;
+extern int _rl_quit_char;
+extern int _rl_susp_char;
+
+/* terminal.c */
+extern int _rl_enable_keypad;
+extern int _rl_enable_meta;
+extern char *_rl_term_clreol;
+extern char *_rl_term_clrpag;
+extern char *_rl_term_clrscroll;
+extern char *_rl_term_im;
+extern char *_rl_term_ic;
+extern char *_rl_term_ei;
+extern char *_rl_term_DC;
+extern char *_rl_term_up;
+extern char *_rl_term_dc;
+extern char *_rl_term_cr;
+extern char *_rl_term_IC;
+extern char *_rl_term_forward_char;
+extern int _rl_screenheight;
+extern int _rl_screenwidth;
+extern int _rl_screenchars;
+extern int _rl_terminal_can_insert;
+extern int _rl_term_autowrap;
+
+/* text.c */
+extern int _rl_optimize_typeahead;
+extern int _rl_keep_mark_active;
+
+/* undo.c */
+extern int _rl_doing_an_undo;
+extern int _rl_undo_group_level;
+
+/* vi_mode.c */
+extern int _rl_vi_last_command;
+extern int _rl_vi_redoing;
+extern _rl_vimotion_cxt *_rl_vimvcxt;
+
+/* Use HS_HISTORY_VERSION as the sentinel to see if we've included history.h
+ and so can use HIST_ENTRY */
+#if defined (HS_HISTORY_VERSION)
+extern HIST_ENTRY *_rl_saved_line_for_history;
+#endif
+
+#endif /* _RL_PRIVATE_H_ */
diff --git a/rlshell.h b/rlshell.h
new file mode 100644
index 0000000..6055b14
--- /dev/null
+++ b/rlshell.h
@@ -0,0 +1,33 @@
+/* rlshell.h -- utility functions normally provided by bash. */
+
+/* Copyright (C) 1999-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_RL_SHELL_H_)
+#define _RL_SHELL_H_
+
+#include "rlstdc.h"
+
+extern char *sh_single_quote (char *);
+extern void sh_set_lines_and_columns (int, int);
+extern char *sh_get_env_value (const char *);
+extern char *sh_get_home_dir (void);
+extern int sh_unset_nodelay_mode (int);
+
+#endif /* _RL_SHELL_H_ */
diff --git a/rlstdc.h b/rlstdc.h
new file mode 100644
index 0000000..2aaa30b
--- /dev/null
+++ b/rlstdc.h
@@ -0,0 +1,57 @@
+/* stdc.h -- macros to make source compile on both ANSI C and K&R C compilers. */
+
+/* Copyright (C) 1993-2009 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_RL_STDC_H_)
+#define _RL_STDC_H_
+
+/* Adapted from BSD /usr/include/sys/cdefs.h. */
+
+/* A function can be defined using prototypes and compile on both ANSI C
+ and traditional C compilers with something like this:
+ extern char *func PARAMS((char *, char *, int)); */
+
+#if !defined (PARAMS)
+# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus)
+# define PARAMS(protos) protos
+# else
+# define PARAMS(protos) ()
+# endif
+#endif
+
+#ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
+# define __attribute__(x)
+# endif
+#endif
+
+/* Moved from config.h.in because readline.h:rl_message depends on these
+ defines. */
+#if defined (__STDC__) && defined (HAVE_STDARG_H)
+# define PREFER_STDARG
+# define USE_VARARGS
+#else
+# if defined (HAVE_VARARGS_H)
+# define PREFER_VARARGS
+# define USE_VARARGS
+# endif
+#endif
+
+#endif /* !_RL_STDC_H_ */
diff --git a/rltty.c b/rltty.c
new file mode 100644
index 0000000..882a3d4
--- /dev/null
+++ b/rltty.c
@@ -0,0 +1,995 @@
+/* rltty.c -- functions to prepare and restore the terminal for readline's
+ use. */
+
+/* Copyright (C) 1992-2022 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <signal.h>
+#include <errno.h>
+#include <stdio.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#include "rldefs.h"
+
+#include "rltty.h"
+#if defined (HAVE_SYS_IOCTL_H)
+# include <sys/ioctl.h> /* include for declaration of ioctl */
+#endif
+
+#include "readline.h"
+#include "rlprivate.h"
+
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+rl_vintfunc_t *rl_prep_term_function = rl_prep_terminal;
+rl_voidfunc_t *rl_deprep_term_function = rl_deprep_terminal;
+
+static void set_winsize (int);
+
+/* **************************************************************** */
+/* */
+/* Saving and Restoring the TTY */
+/* */
+/* **************************************************************** */
+
+/* Non-zero means that the terminal is in a prepped state. There are several
+ flags that are OR'd in to denote whether or not we have sent various
+ init strings to the terminal. */
+#define TPX_PREPPED 0x01
+#define TPX_BRACKPASTE 0x02
+#define TPX_METAKEY 0x04
+
+static int terminal_prepped;
+
+static _RL_TTY_CHARS _rl_tty_chars, _rl_last_tty_chars;
+
+/* If non-zero, means that this process has called tcflow(fd, TCOOFF)
+ and output is suspended. */
+#if defined (__ksr1__)
+static int ksrflow;
+#endif
+
+/* Dummy call to force a backgrounded readline to stop before it tries
+ to get the tty settings. */
+static void
+set_winsize (tty)
+ int tty;
+{
+#if defined (TIOCGWINSZ)
+ struct winsize w;
+
+ if (ioctl (tty, TIOCGWINSZ, &w) == 0)
+ (void) ioctl (tty, TIOCSWINSZ, &w);
+#endif /* TIOCGWINSZ */
+}
+
+#if defined (NO_TTY_DRIVER)
+/* Nothing */
+#elif defined (NEW_TTY_DRIVER)
+
+/* Values for the `flags' field of a struct bsdtty. This tells which
+ elements of the struct bsdtty have been fetched from the system and
+ are valid. */
+#define SGTTY_SET 0x01
+#define LFLAG_SET 0x02
+#define TCHARS_SET 0x04
+#define LTCHARS_SET 0x08
+
+struct bsdtty {
+ struct sgttyb sgttyb; /* Basic BSD tty driver information. */
+ int lflag; /* Local mode flags, like LPASS8. */
+#if defined (TIOCGETC)
+ struct tchars tchars; /* Terminal special characters, including ^S and ^Q. */
+#endif
+#if defined (TIOCGLTC)
+ struct ltchars ltchars; /* 4.2 BSD editing characters */
+#endif
+ int flags; /* Bitmap saying which parts of the struct are valid. */
+};
+
+#define TIOTYPE struct bsdtty
+
+static TIOTYPE otio;
+
+static void save_tty_chars (TIOTYPE *);
+static int _get_tty_settings (int, TIOTYPE *);
+static int get_tty_settings (int, TIOTYPE *);
+static int _set_tty_settings (int, TIOTYPE *);
+static int set_tty_settings (int, TIOTYPE *);
+
+static void prepare_terminal_settings (int, TIOTYPE, TIOTYPE *);
+
+static void set_special_char (Keymap, TIOTYPE *, int, rl_command_func_t *);
+
+static void
+save_tty_chars (TIOTYPE *tiop)
+{
+ _rl_last_tty_chars = _rl_tty_chars;
+
+ if (tiop->flags & SGTTY_SET)
+ {
+ _rl_tty_chars.t_erase = tiop->sgttyb.sg_erase;
+ _rl_tty_chars.t_kill = tiop->sgttyb.sg_kill;
+ }
+
+ if (tiop->flags & TCHARS_SET)
+ {
+ _rl_intr_char = _rl_tty_chars.t_intr = tiop->tchars.t_intrc;
+ _rl_quit_char = _rl_tty_chars.t_quit = tiop->tchars.t_quitc;
+
+ _rl_tty_chars.t_start = tiop->tchars.t_startc;
+ _rl_tty_chars.t_stop = tiop->tchars.t_stopc;
+ _rl_tty_chars.t_eof = tiop->tchars.t_eofc;
+ _rl_tty_chars.t_eol = '\n';
+ _rl_tty_chars.t_eol2 = tiop->tchars.t_brkc;
+ }
+
+ if (tiop->flags & LTCHARS_SET)
+ {
+ _rl_susp_char = _rl_tty_chars.t_susp = tiop->ltchars.t_suspc;
+
+ _rl_tty_chars.t_dsusp = tiop->ltchars.t_dsuspc;
+ _rl_tty_chars.t_reprint = tiop->ltchars.t_rprntc;
+ _rl_tty_chars.t_flush = tiop->ltchars.t_flushc;
+ _rl_tty_chars.t_werase = tiop->ltchars.t_werasc;
+ _rl_tty_chars.t_lnext = tiop->ltchars.t_lnextc;
+ }
+
+ _rl_tty_chars.t_status = -1;
+}
+
+static int
+get_tty_settings (int tty, TIOTYPE *tiop)
+{
+ set_winsize (tty);
+
+ tiop->flags = tiop->lflag = 0;
+
+ errno = 0;
+ if (ioctl (tty, TIOCGETP, &(tiop->sgttyb)) < 0)
+ return -1;
+ tiop->flags |= SGTTY_SET;
+
+#if defined (TIOCLGET)
+ if (ioctl (tty, TIOCLGET, &(tiop->lflag)) == 0)
+ tiop->flags |= LFLAG_SET;
+#endif
+
+#if defined (TIOCGETC)
+ if (ioctl (tty, TIOCGETC, &(tiop->tchars)) == 0)
+ tiop->flags |= TCHARS_SET;
+#endif
+
+#if defined (TIOCGLTC)
+ if (ioctl (tty, TIOCGLTC, &(tiop->ltchars)) == 0)
+ tiop->flags |= LTCHARS_SET;
+#endif
+
+ return 0;
+}
+
+static int
+set_tty_settings (int tty, TIOTYPE *tiop)
+{
+ if (tiop->flags & SGTTY_SET)
+ {
+ ioctl (tty, TIOCSETN, &(tiop->sgttyb));
+ tiop->flags &= ~SGTTY_SET;
+ }
+ _rl_echoing_p = 1;
+
+#if defined (TIOCLSET)
+ if (tiop->flags & LFLAG_SET)
+ {
+ ioctl (tty, TIOCLSET, &(tiop->lflag));
+ tiop->flags &= ~LFLAG_SET;
+ }
+#endif
+
+#if defined (TIOCSETC)
+ if (tiop->flags & TCHARS_SET)
+ {
+ ioctl (tty, TIOCSETC, &(tiop->tchars));
+ tiop->flags &= ~TCHARS_SET;
+ }
+#endif
+
+#if defined (TIOCSLTC)
+ if (tiop->flags & LTCHARS_SET)
+ {
+ ioctl (tty, TIOCSLTC, &(tiop->ltchars));
+ tiop->flags &= ~LTCHARS_SET;
+ }
+#endif
+
+ return 0;
+}
+
+static void
+prepare_terminal_settings (int meta_flag, TIOTYPE oldtio, TIOTYPE *tiop)
+{
+ _rl_echoing_p = (oldtio.sgttyb.sg_flags & ECHO);
+ _rl_echoctl = (oldtio.sgttyb.sg_flags & ECHOCTL);
+
+ /* Copy the original settings to the structure we're going to use for
+ our settings. */
+ tiop->sgttyb = oldtio.sgttyb;
+ tiop->lflag = oldtio.lflag;
+#if defined (TIOCGETC)
+ tiop->tchars = oldtio.tchars;
+#endif
+#if defined (TIOCGLTC)
+ tiop->ltchars = oldtio.ltchars;
+#endif
+ tiop->flags = oldtio.flags;
+
+ /* First, the basic settings to put us into character-at-a-time, no-echo
+ input mode. */
+ tiop->sgttyb.sg_flags &= ~(ECHO | CRMOD);
+ tiop->sgttyb.sg_flags |= CBREAK;
+
+ /* If this terminal doesn't care how the 8th bit is used, then we can
+ use it for the meta-key. If only one of even or odd parity is
+ specified, then the terminal is using parity, and we cannot. */
+#if !defined (ANYP)
+# define ANYP (EVENP | ODDP)
+#endif
+ if (((oldtio.sgttyb.sg_flags & ANYP) == ANYP) ||
+ ((oldtio.sgttyb.sg_flags & ANYP) == 0))
+ {
+ tiop->sgttyb.sg_flags |= ANYP;
+
+ /* Hack on local mode flags if we can. */
+#if defined (TIOCLGET)
+# if defined (LPASS8)
+ tiop->lflag |= LPASS8;
+# endif /* LPASS8 */
+#endif /* TIOCLGET */
+ }
+
+#if defined (TIOCGETC)
+# if defined (USE_XON_XOFF)
+ /* Get rid of terminal output start and stop characters. */
+ tiop->tchars.t_stopc = -1; /* C-s */
+ tiop->tchars.t_startc = -1; /* C-q */
+
+ /* If there is an XON character, bind it to restart the output. */
+ if (oldtio.tchars.t_startc != -1)
+ rl_bind_key (oldtio.tchars.t_startc, rl_restart_output);
+# endif /* USE_XON_XOFF */
+
+ /* If there is an EOF char, bind _rl_eof_char to it. */
+ if (oldtio.tchars.t_eofc != -1)
+ _rl_eof_char = oldtio.tchars.t_eofc;
+
+# if defined (NO_KILL_INTR)
+ /* Get rid of terminal-generated SIGQUIT and SIGINT. */
+ tiop->tchars.t_quitc = -1; /* C-\ */
+ tiop->tchars.t_intrc = -1; /* C-c */
+# endif /* NO_KILL_INTR */
+#endif /* TIOCGETC */
+
+#if defined (TIOCGLTC)
+ /* Make the interrupt keys go away. Just enough to make people happy. */
+ tiop->ltchars.t_dsuspc = -1; /* C-y */
+ tiop->ltchars.t_lnextc = -1; /* C-v */
+#endif /* TIOCGLTC */
+}
+
+#else /* !defined (NEW_TTY_DRIVER) */
+
+#if !defined (VMIN)
+# define VMIN VEOF
+#endif
+
+#if !defined (VTIME)
+# define VTIME VEOL
+#endif
+
+#if defined (TERMIOS_TTY_DRIVER)
+# define TIOTYPE struct termios
+# define DRAIN_OUTPUT(fd) tcdrain (fd)
+# define GETATTR(tty, tiop) (tcgetattr (tty, tiop))
+# ifdef M_UNIX
+# define SETATTR(tty, tiop) (tcsetattr (tty, TCSANOW, tiop))
+# else
+# define SETATTR(tty, tiop) (tcsetattr (tty, TCSADRAIN, tiop))
+# endif /* !M_UNIX */
+#else
+# define TIOTYPE struct termio
+# define DRAIN_OUTPUT(fd)
+# define GETATTR(tty, tiop) (ioctl (tty, TCGETA, tiop))
+# define SETATTR(tty, tiop) (ioctl (tty, TCSETAW, tiop))
+#endif /* !TERMIOS_TTY_DRIVER */
+
+static TIOTYPE otio;
+
+static void save_tty_chars (TIOTYPE *);
+static int _get_tty_settings (int, TIOTYPE *);
+static int get_tty_settings (int, TIOTYPE *);
+static int _set_tty_settings (int, TIOTYPE *);
+static int set_tty_settings (int, TIOTYPE *);
+
+static void prepare_terminal_settings (int, TIOTYPE, TIOTYPE *);
+
+static void set_special_char (Keymap, TIOTYPE *, int, rl_command_func_t *);
+static void _rl_bind_tty_special_chars (Keymap, TIOTYPE);
+
+#if defined (FLUSHO)
+# define OUTPUT_BEING_FLUSHED(tp) (tp->c_lflag & FLUSHO)
+#else
+# define OUTPUT_BEING_FLUSHED(tp) 0
+#endif
+
+static void
+save_tty_chars (TIOTYPE *tiop)
+{
+ _rl_last_tty_chars = _rl_tty_chars;
+
+ _rl_tty_chars.t_eof = tiop->c_cc[VEOF];
+ _rl_tty_chars.t_eol = tiop->c_cc[VEOL];
+#ifdef VEOL2
+ _rl_tty_chars.t_eol2 = tiop->c_cc[VEOL2];
+#endif
+ _rl_tty_chars.t_erase = tiop->c_cc[VERASE];
+#ifdef VWERASE
+ _rl_tty_chars.t_werase = tiop->c_cc[VWERASE];
+#endif
+ _rl_tty_chars.t_kill = tiop->c_cc[VKILL];
+#ifdef VREPRINT
+ _rl_tty_chars.t_reprint = tiop->c_cc[VREPRINT];
+#endif
+ _rl_intr_char = _rl_tty_chars.t_intr = tiop->c_cc[VINTR];
+ _rl_quit_char = _rl_tty_chars.t_quit = tiop->c_cc[VQUIT];
+#ifdef VSUSP
+ _rl_susp_char = _rl_tty_chars.t_susp = tiop->c_cc[VSUSP];
+#endif
+#ifdef VDSUSP
+ _rl_tty_chars.t_dsusp = tiop->c_cc[VDSUSP];
+#endif
+#ifdef VSTART
+ _rl_tty_chars.t_start = tiop->c_cc[VSTART];
+#endif
+#ifdef VSTOP
+ _rl_tty_chars.t_stop = tiop->c_cc[VSTOP];
+#endif
+#ifdef VLNEXT
+ _rl_tty_chars.t_lnext = tiop->c_cc[VLNEXT];
+#endif
+#ifdef VDISCARD
+ _rl_tty_chars.t_flush = tiop->c_cc[VDISCARD];
+#endif
+#ifdef VSTATUS
+ _rl_tty_chars.t_status = tiop->c_cc[VSTATUS];
+#endif
+}
+
+#if defined (_AIX) || defined (_AIX41)
+/* Currently this is only used on AIX */
+static void
+rltty_warning (char *msg)
+{
+ _rl_errmsg ("warning: %s", msg);
+}
+#endif
+
+#if defined (_AIX)
+void
+setopost (TIOTYPE *tp)
+{
+ if ((tp->c_oflag & OPOST) == 0)
+ {
+ _rl_errmsg ("warning: turning on OPOST for terminal\r");
+ tp->c_oflag |= OPOST|ONLCR;
+ }
+}
+#endif
+
+static int
+_get_tty_settings (int tty, TIOTYPE *tiop)
+{
+ int ioctl_ret;
+
+ while (1)
+ {
+ ioctl_ret = GETATTR (tty, tiop);
+ if (ioctl_ret < 0)
+ {
+ if (errno != EINTR)
+ return -1;
+ else
+ continue;
+ }
+ if (OUTPUT_BEING_FLUSHED (tiop))
+ {
+#if defined (FLUSHO)
+ _rl_errmsg ("warning: turning off output flushing");
+ tiop->c_lflag &= ~FLUSHO;
+ break;
+#else
+ continue;
+#endif
+ }
+ break;
+ }
+
+ return 0;
+}
+
+static int
+get_tty_settings (int tty, TIOTYPE *tiop)
+{
+ set_winsize (tty);
+
+ errno = 0;
+ if (_get_tty_settings (tty, tiop) < 0)
+ return -1;
+
+#if defined (_AIX)
+ setopost(tiop);
+#endif
+
+ return 0;
+}
+
+static int
+_set_tty_settings (int tty, TIOTYPE *tiop)
+{
+ while (SETATTR (tty, tiop) < 0)
+ {
+ if (errno != EINTR)
+ return -1;
+ errno = 0;
+ }
+ return 0;
+}
+
+static int
+set_tty_settings (int tty, TIOTYPE *tiop)
+{
+ if (_set_tty_settings (tty, tiop) < 0)
+ return -1;
+
+#if 0
+
+#if defined (TERMIOS_TTY_DRIVER)
+# if defined (__ksr1__)
+ if (ksrflow)
+ {
+ ksrflow = 0;
+ tcflow (tty, TCOON);
+ }
+# else /* !ksr1 */
+ tcflow (tty, TCOON); /* Simulate a ^Q. */
+# endif /* !ksr1 */
+#else
+ ioctl (tty, TCXONC, 1); /* Simulate a ^Q. */
+#endif /* !TERMIOS_TTY_DRIVER */
+
+#endif /* 0 */
+
+ return 0;
+}
+
+static void
+prepare_terminal_settings (int meta_flag, TIOTYPE oldtio, TIOTYPE *tiop)
+{
+ int sc;
+ Keymap kmap;
+
+ _rl_echoing_p = (oldtio.c_lflag & ECHO);
+#if defined (ECHOCTL)
+ _rl_echoctl = (oldtio.c_lflag & ECHOCTL);
+#endif
+
+ tiop->c_lflag &= ~(ICANON | ECHO);
+
+ if ((unsigned char) oldtio.c_cc[VEOF] != (unsigned char) _POSIX_VDISABLE)
+ _rl_eof_char = oldtio.c_cc[VEOF];
+
+#if defined (USE_XON_XOFF)
+#if defined (IXANY)
+ tiop->c_iflag &= ~(IXON | IXANY);
+#else
+ /* `strict' Posix systems do not define IXANY. */
+ tiop->c_iflag &= ~IXON;
+#endif /* IXANY */
+#endif /* USE_XON_XOFF */
+
+ /* Only turn this off if we are using all 8 bits. */
+ if (((tiop->c_cflag & CSIZE) == CS8) || meta_flag)
+ tiop->c_iflag &= ~(ISTRIP | INPCK);
+
+ /* Make sure we differentiate between CR and NL on input. */
+ tiop->c_iflag &= ~(ICRNL | INLCR);
+
+#if !defined (HANDLE_SIGNALS)
+ tiop->c_lflag &= ~ISIG;
+#else
+ tiop->c_lflag |= ISIG;
+#endif
+
+ tiop->c_cc[VMIN] = 1;
+ tiop->c_cc[VTIME] = 0;
+
+#if defined (FLUSHO)
+ if (OUTPUT_BEING_FLUSHED (tiop))
+ {
+ tiop->c_lflag &= ~FLUSHO;
+ oldtio.c_lflag &= ~FLUSHO;
+ }
+#endif
+
+ /* Turn off characters that we need on Posix systems with job control,
+ just to be sure. This includes ^Y and ^V. This should not really
+ be necessary. */
+#if defined (TERMIOS_TTY_DRIVER) && defined (_POSIX_VDISABLE)
+
+#if defined (VLNEXT)
+ tiop->c_cc[VLNEXT] = _POSIX_VDISABLE;
+#endif
+
+#if defined (VDSUSP)
+ tiop->c_cc[VDSUSP] = _POSIX_VDISABLE;
+#endif
+
+ /* Conditionally disable some other tty special characters if there is a
+ key binding for them in the current keymap. Readline ordinarily doesn't
+ bind these characters, but an application or user might. */
+#if defined (VI_MODE)
+ kmap = (rl_editing_mode == vi_mode) ? vi_insertion_keymap : _rl_keymap;
+#else
+ kmap = _rl_keymap;
+#endif
+#if defined (VDISCARD)
+ sc = tiop->c_cc[VDISCARD];
+ if (sc != _POSIX_VDISABLE && kmap[(unsigned char)sc].type == ISFUNC)
+ tiop->c_cc[VDISCARD] = _POSIX_VDISABLE;
+#endif /* VDISCARD */
+
+#endif /* TERMIOS_TTY_DRIVER && _POSIX_VDISABLE */
+}
+#endif /* !NEW_TTY_DRIVER */
+
+/* Put the terminal in CBREAK mode so that we can detect key presses. */
+#if defined (NO_TTY_DRIVER)
+void
+rl_prep_terminal (int meta_flag)
+{
+ _rl_echoing_p = 1;
+}
+
+void
+rl_deprep_terminal (void)
+{
+}
+
+#else /* ! NO_TTY_DRIVER */
+void
+rl_prep_terminal (int meta_flag)
+{
+ int tty, nprep;
+ TIOTYPE tio;
+
+ if (terminal_prepped)
+ return;
+
+ /* Try to keep this function from being INTerrupted. */
+ _rl_block_sigint ();
+
+ tty = rl_instream ? fileno (rl_instream) : fileno (stdin);
+
+ if (get_tty_settings (tty, &tio) < 0)
+ {
+#if defined (ENOTSUP)
+ /* MacOS X and Linux, at least, lie about the value of errno if
+ tcgetattr fails. */
+ if (errno == ENOTTY || errno == EINVAL || errno == ENOTSUP)
+#else
+ if (errno == ENOTTY || errno == EINVAL)
+#endif
+ _rl_echoing_p = 1; /* XXX */
+
+ _rl_release_sigint ();
+ return;
+ }
+
+ otio = tio;
+
+ if (_rl_bind_stty_chars)
+ {
+#if defined (VI_MODE)
+ /* If editing in vi mode, make sure we restore the bindings in the
+ insertion keymap no matter what keymap we ended up in. */
+ if (rl_editing_mode == vi_mode)
+ rl_tty_unset_default_bindings (vi_insertion_keymap);
+ else
+#endif
+ rl_tty_unset_default_bindings (_rl_keymap);
+ }
+ save_tty_chars (&otio);
+ RL_SETSTATE(RL_STATE_TTYCSAVED);
+ if (_rl_bind_stty_chars)
+ {
+#if defined (VI_MODE)
+ /* If editing in vi mode, make sure we set the bindings in the
+ insertion keymap no matter what keymap we ended up in. */
+ if (rl_editing_mode == vi_mode)
+ _rl_bind_tty_special_chars (vi_insertion_keymap, tio);
+ else
+#endif
+ _rl_bind_tty_special_chars (_rl_keymap, tio);
+ }
+
+ prepare_terminal_settings (meta_flag, otio, &tio);
+
+ if (set_tty_settings (tty, &tio) < 0)
+ {
+ _rl_release_sigint ();
+ return;
+ }
+
+ if (_rl_enable_keypad)
+ _rl_control_keypad (1);
+
+ nprep = TPX_PREPPED;
+
+ if (_rl_enable_bracketed_paste)
+ {
+ fprintf (rl_outstream, BRACK_PASTE_INIT);
+ nprep |= TPX_BRACKPASTE;
+ }
+
+ fflush (rl_outstream);
+ terminal_prepped = nprep;
+ RL_SETSTATE(RL_STATE_TERMPREPPED);
+
+ _rl_release_sigint ();
+}
+
+/* Restore the terminal's normal settings and modes. */
+void
+rl_deprep_terminal (void)
+{
+ int tty;
+
+ if (terminal_prepped == 0)
+ return;
+
+ /* Try to keep this function from being interrupted. */
+ _rl_block_sigint ();
+
+ tty = rl_instream ? fileno (rl_instream) : fileno (stdin);
+
+ if (terminal_prepped & TPX_BRACKPASTE)
+ {
+ fprintf (rl_outstream, BRACK_PASTE_FINI);
+ /* Since the last character in BRACK_PASTE_FINI is \r */
+ _rl_last_c_pos = 0;
+ if (rl_eof_found && (RL_ISSTATE (RL_STATE_TIMEOUT) == 0))
+ fprintf (rl_outstream, "\n");
+ else if (_rl_echoing_p == 0)
+ fprintf (rl_outstream, "\n");
+ }
+
+ if (_rl_enable_keypad)
+ _rl_control_keypad (0);
+
+ fflush (rl_outstream);
+
+ if (set_tty_settings (tty, &otio) < 0)
+ {
+ _rl_release_sigint ();
+ return;
+ }
+
+ terminal_prepped = 0;
+ RL_UNSETSTATE(RL_STATE_TERMPREPPED);
+
+ _rl_release_sigint ();
+}
+#endif /* !NO_TTY_DRIVER */
+
+/* Set readline's idea of whether or not it is echoing output to the terminal,
+ returning the old value. */
+int
+rl_tty_set_echoing (int u)
+{
+ int o;
+
+ o = _rl_echoing_p;
+ _rl_echoing_p = u;
+ return o;
+}
+
+/* **************************************************************** */
+/* */
+/* Bogus Flow Control */
+/* */
+/* **************************************************************** */
+
+int
+rl_restart_output (int count, int key)
+{
+#if defined (__MINGW32__)
+ return 0;
+#else /* !__MING32__ */
+
+ int fildes = fileno (rl_outstream);
+#if defined (TIOCSTART)
+#if defined (apollo)
+ ioctl (&fildes, TIOCSTART, 0);
+#else
+ ioctl (fildes, TIOCSTART, 0);
+#endif /* apollo */
+
+#else /* !TIOCSTART */
+# if defined (TERMIOS_TTY_DRIVER)
+# if defined (__ksr1__)
+ if (ksrflow)
+ {
+ ksrflow = 0;
+ tcflow (fildes, TCOON);
+ }
+# else /* !ksr1 */
+ tcflow (fildes, TCOON); /* Simulate a ^Q. */
+# endif /* !ksr1 */
+# else /* !TERMIOS_TTY_DRIVER */
+# if defined (TCXONC)
+ ioctl (fildes, TCXONC, TCOON);
+# endif /* TCXONC */
+# endif /* !TERMIOS_TTY_DRIVER */
+#endif /* !TIOCSTART */
+
+ return 0;
+#endif /* !__MINGW32__ */
+}
+
+int
+rl_stop_output (int count, int key)
+{
+#if defined (__MINGW32__)
+ return 0;
+#else
+
+ int fildes = fileno (rl_instream);
+
+#if defined (TIOCSTOP)
+# if defined (apollo)
+ ioctl (&fildes, TIOCSTOP, 0);
+# else
+ ioctl (fildes, TIOCSTOP, 0);
+# endif /* apollo */
+#else /* !TIOCSTOP */
+# if defined (TERMIOS_TTY_DRIVER)
+# if defined (__ksr1__)
+ ksrflow = 1;
+# endif /* ksr1 */
+ tcflow (fildes, TCOOFF);
+# else
+# if defined (TCXONC)
+ ioctl (fildes, TCXONC, TCOON);
+# endif /* TCXONC */
+# endif /* !TERMIOS_TTY_DRIVER */
+#endif /* !TIOCSTOP */
+
+ return 0;
+#endif /* !__MINGW32__ */
+}
+
+/* **************************************************************** */
+/* */
+/* Default Key Bindings */
+/* */
+/* **************************************************************** */
+
+#if !defined (NO_TTY_DRIVER)
+#define SET_SPECIAL(sc, func) set_special_char(kmap, &ttybuff, sc, func)
+#endif
+
+#if defined (NO_TTY_DRIVER)
+
+#define SET_SPECIAL(sc, func)
+#define RESET_SPECIAL(c)
+
+#elif defined (NEW_TTY_DRIVER)
+static void
+set_special_char (Keymap kmap, TIOTYPE *tiop, int sc, rl_command_func_t *func)
+{
+ if (sc != -1 && kmap[(unsigned char)sc].type == ISFUNC)
+ kmap[(unsigned char)sc].function = func;
+}
+
+#define RESET_SPECIAL(c) \
+ if (c != -1 && kmap[(unsigned char)c].type == ISFUNC) \
+ kmap[(unsigned char)c].function = rl_insert;
+
+static void
+_rl_bind_tty_special_chars (Keymap kmap, TIOTYPE ttybuff)
+{
+ if (ttybuff.flags & SGTTY_SET)
+ {
+ SET_SPECIAL (ttybuff.sgttyb.sg_erase, rl_rubout);
+ SET_SPECIAL (ttybuff.sgttyb.sg_kill, rl_unix_line_discard);
+ }
+
+# if defined (TIOCGLTC)
+ if (ttybuff.flags & LTCHARS_SET)
+ {
+ SET_SPECIAL (ttybuff.ltchars.t_werasc, rl_unix_word_rubout);
+ SET_SPECIAL (ttybuff.ltchars.t_lnextc, rl_quoted_insert);
+ }
+# endif /* TIOCGLTC */
+}
+
+#else /* !NEW_TTY_DRIVER */
+static void
+set_special_char (Keymap kmap, TIOTYPE *tiop, int sc, rl_command_func_t *func)
+{
+ unsigned char uc;
+
+ uc = tiop->c_cc[sc];
+ if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC)
+ kmap[uc].function = func;
+}
+
+/* used later */
+#define RESET_SPECIAL(uc) \
+ if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) \
+ kmap[uc].function = rl_insert;
+
+static void
+_rl_bind_tty_special_chars (Keymap kmap, TIOTYPE ttybuff)
+{
+ SET_SPECIAL (VERASE, rl_rubout);
+ SET_SPECIAL (VKILL, rl_unix_line_discard);
+
+# if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
+ SET_SPECIAL (VLNEXT, rl_quoted_insert);
+# endif /* VLNEXT && TERMIOS_TTY_DRIVER */
+
+# if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
+# if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode)
+ SET_SPECIAL (VWERASE, rl_vi_unix_word_rubout);
+ else
+# endif
+ SET_SPECIAL (VWERASE, rl_unix_word_rubout);
+# endif /* VWERASE && TERMIOS_TTY_DRIVER */
+}
+
+#endif /* !NEW_TTY_DRIVER */
+
+/* Set the system's default editing characters to their readline equivalents
+ in KMAP. Should be static, now that we have rl_tty_set_default_bindings. */
+void
+rltty_set_default_bindings (Keymap kmap)
+{
+#if !defined (NO_TTY_DRIVER)
+ TIOTYPE ttybuff;
+ int tty;
+
+ tty = fileno (rl_instream);
+
+ if (get_tty_settings (tty, &ttybuff) == 0)
+ _rl_bind_tty_special_chars (kmap, ttybuff);
+#endif
+}
+
+/* New public way to set the system default editing chars to their readline
+ equivalents. */
+void
+rl_tty_set_default_bindings (Keymap kmap)
+{
+ rltty_set_default_bindings (kmap);
+}
+
+/* Rebind all of the tty special chars that readline worries about back
+ to self-insert. Call this before saving the current terminal special
+ chars with save_tty_chars(). This only works on POSIX termios or termio
+ systems. */
+void
+rl_tty_unset_default_bindings (Keymap kmap)
+{
+ /* Don't bother before we've saved the tty special chars at least once. */
+ if (RL_ISSTATE(RL_STATE_TTYCSAVED) == 0)
+ return;
+
+ RESET_SPECIAL (_rl_tty_chars.t_erase);
+ RESET_SPECIAL (_rl_tty_chars.t_kill);
+
+# if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
+ RESET_SPECIAL (_rl_tty_chars.t_lnext);
+# endif /* VLNEXT && TERMIOS_TTY_DRIVER */
+
+# if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
+ RESET_SPECIAL (_rl_tty_chars.t_werase);
+# endif /* VWERASE && TERMIOS_TTY_DRIVER */
+}
+
+#if defined (HANDLE_SIGNALS)
+
+#if defined (NEW_TTY_DRIVER) || defined (NO_TTY_DRIVER)
+int
+_rl_disable_tty_signals (void)
+{
+ return 0;
+}
+
+int
+_rl_restore_tty_signals (void)
+{
+ return 0;
+}
+#else
+
+static TIOTYPE sigstty, nosigstty;
+static int tty_sigs_disabled = 0;
+
+int
+_rl_disable_tty_signals (void)
+{
+ if (tty_sigs_disabled)
+ return 0;
+
+ if (_get_tty_settings (fileno (rl_instream), &sigstty) < 0)
+ return -1;
+
+ nosigstty = sigstty;
+
+ nosigstty.c_lflag &= ~ISIG;
+ nosigstty.c_iflag &= ~IXON;
+
+ if (_set_tty_settings (fileno (rl_instream), &nosigstty) < 0)
+ return (_set_tty_settings (fileno (rl_instream), &sigstty));
+
+ tty_sigs_disabled = 1;
+ return 0;
+}
+
+int
+_rl_restore_tty_signals (void)
+{
+ int r;
+
+ if (tty_sigs_disabled == 0)
+ return 0;
+
+ r = _set_tty_settings (fileno (rl_instream), &sigstty);
+
+ if (r == 0)
+ tty_sigs_disabled = 0;
+
+ return r;
+}
+#endif /* !NEW_TTY_DRIVER */
+
+#endif /* HANDLE_SIGNALS */
diff --git a/rltty.h b/rltty.h
new file mode 100644
index 0000000..5bcc946
--- /dev/null
+++ b/rltty.h
@@ -0,0 +1,80 @@
+/* rltty.h - tty driver-related definitions used by some library files. */
+
+/* Copyright (C) 1995-2009 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_RLTTY_H_)
+#define _RLTTY_H_
+
+/* Posix systems use termios and the Posix signal functions. */
+#if defined (TERMIOS_TTY_DRIVER)
+# include <termios.h>
+#endif /* TERMIOS_TTY_DRIVER */
+
+/* System V machines use termio. */
+#if defined (TERMIO_TTY_DRIVER)
+# include <termio.h>
+# if !defined (TCOON)
+# define TCOON 1
+# endif
+#endif /* TERMIO_TTY_DRIVER */
+
+/* Other (BSD) machines use sgtty. */
+#if defined (NEW_TTY_DRIVER)
+# include <sgtty.h>
+#endif
+
+#include "rlwinsize.h"
+
+/* Define _POSIX_VDISABLE if we are not using the `new' tty driver and
+ it is not already defined. It is used both to determine if a
+ special character is disabled and to disable certain special
+ characters. Posix systems should set to 0, USG systems to -1. */
+#if !defined (NEW_TTY_DRIVER) && !defined (_POSIX_VDISABLE)
+# if defined (_SVR4_VDISABLE)
+# define _POSIX_VDISABLE _SVR4_VDISABLE
+# else
+# if defined (_POSIX_VERSION)
+# define _POSIX_VDISABLE 0
+# else /* !_POSIX_VERSION */
+# define _POSIX_VDISABLE -1
+# endif /* !_POSIX_VERSION */
+# endif /* !_SVR4_DISABLE */
+#endif /* !NEW_TTY_DRIVER && !_POSIX_VDISABLE */
+
+typedef struct _rl_tty_chars {
+ unsigned char t_eof;
+ unsigned char t_eol;
+ unsigned char t_eol2;
+ unsigned char t_erase;
+ unsigned char t_werase;
+ unsigned char t_kill;
+ unsigned char t_reprint;
+ unsigned char t_intr;
+ unsigned char t_quit;
+ unsigned char t_susp;
+ unsigned char t_dsusp;
+ unsigned char t_start;
+ unsigned char t_stop;
+ unsigned char t_lnext;
+ unsigned char t_flush;
+ unsigned char t_status;
+} _RL_TTY_CHARS;
+
+#endif /* _RLTTY_H_ */
diff --git a/rltypedefs.h b/rltypedefs.h
new file mode 100644
index 0000000..1636549
--- /dev/null
+++ b/rltypedefs.h
@@ -0,0 +1,100 @@
+/* rltypedefs.h -- Type declarations for readline functions. */
+
+/* Copyright (C) 2000-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _RL_TYPEDEFS_H_
+#define _RL_TYPEDEFS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Old-style, attempt to mark as deprecated in some way people will notice. */
+
+#if !defined (_FUNCTION_DEF)
+# define _FUNCTION_DEF
+
+#if defined(__GNUC__) || defined(__clang__)
+typedef int Function () __attribute__((deprecated));
+typedef void VFunction () __attribute__((deprecated));
+typedef char *CPFunction () __attribute__((deprecated));
+typedef char **CPPFunction () __attribute__((deprecated));
+#else
+typedef int Function ();
+typedef void VFunction ();
+typedef char *CPFunction ();
+typedef char **CPPFunction ();
+#endif
+
+#endif /* _FUNCTION_DEF */
+
+/* New style. */
+
+#if !defined (_RL_FUNCTION_TYPEDEF)
+# define _RL_FUNCTION_TYPEDEF
+
+/* Bindable functions */
+typedef int rl_command_func_t (int, int);
+
+/* Typedefs for the completion system */
+typedef char *rl_compentry_func_t (const char *, int);
+typedef char **rl_completion_func_t (const char *, int, int);
+
+typedef char *rl_quote_func_t (char *, int, char *);
+typedef char *rl_dequote_func_t (char *, int);
+
+typedef int rl_compignore_func_t (char **);
+
+typedef void rl_compdisp_func_t (char **, int, int);
+
+/* Type for input and pre-read hook functions like rl_event_hook */
+typedef int rl_hook_func_t (void);
+
+/* Input function type */
+typedef int rl_getc_func_t (FILE *);
+
+/* Generic function that takes a character buffer (which could be the readline
+ line buffer) and an index into it (which could be rl_point) and returns
+ an int. */
+typedef int rl_linebuf_func_t (char *, int);
+
+/* `Generic' function pointer typedefs */
+typedef int rl_intfunc_t (int);
+#define rl_ivoidfunc_t rl_hook_func_t
+typedef int rl_icpfunc_t (char *);
+typedef int rl_icppfunc_t (char **);
+
+typedef void rl_voidfunc_t (void);
+typedef void rl_vintfunc_t (int);
+typedef void rl_vcpfunc_t (char *);
+typedef void rl_vcppfunc_t (char **);
+
+typedef char *rl_cpvfunc_t (void);
+typedef char *rl_cpifunc_t (int);
+typedef char *rl_cpcpfunc_t (char *);
+typedef char *rl_cpcppfunc_t (char **);
+
+#endif /* _RL_FUNCTION_TYPEDEF */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RL_TYPEDEFS_H_ */
diff --git a/rlwinsize.h b/rlwinsize.h
new file mode 100644
index 0000000..d198fcf
--- /dev/null
+++ b/rlwinsize.h
@@ -0,0 +1,58 @@
+/* rlwinsize.h -- an attempt to isolate some of the system-specific defines
+ for `struct winsize' and TIOCGWINSZ. */
+
+/* Copyright (C) 1997-2009 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_RLWINSIZE_H_)
+#define _RLWINSIZE_H_
+
+#if defined (HAVE_CONFIG_H)
+# include "config.h"
+#endif
+
+/* Try to find the definitions of `struct winsize' and TIOGCWINSZ */
+
+#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ)
+# include <sys/ioctl.h>
+#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */
+
+#if defined (STRUCT_WINSIZE_IN_TERMIOS) && !defined (STRUCT_WINSIZE_IN_SYS_IOCTL)
+# include <termios.h>
+#endif /* STRUCT_WINSIZE_IN_TERMIOS && !STRUCT_WINSIZE_IN_SYS_IOCTL */
+
+/* Not in either of the standard places, look around. */
+#if !defined (STRUCT_WINSIZE_IN_TERMIOS) && !defined (STRUCT_WINSIZE_IN_SYS_IOCTL)
+# if defined (HAVE_SYS_STREAM_H)
+# include <sys/stream.h>
+# endif /* HAVE_SYS_STREAM_H */
+# if defined (HAVE_SYS_PTEM_H) /* SVR4.2, at least, has it here */
+# include <sys/ptem.h>
+# define _IO_PTEM_H /* work around SVR4.2 1.1.4 bug */
+# endif /* HAVE_SYS_PTEM_H */
+# if defined (HAVE_SYS_PTE_H) /* ??? */
+# include <sys/pte.h>
+# endif /* HAVE_SYS_PTE_H */
+#endif /* !STRUCT_WINSIZE_IN_TERMIOS && !STRUCT_WINSIZE_IN_SYS_IOCTL */
+
+#if defined (M_UNIX) && !defined (_SCO_DS) && !defined (tcflow)
+# define tcflow(fd, action) ioctl(fd, TCXONC, action)
+#endif
+
+#endif /* _RL_WINSIZE_H */
diff --git a/savestring.c b/savestring.c
new file mode 100644
index 0000000..f4bb6aa
--- /dev/null
+++ b/savestring.c
@@ -0,0 +1,40 @@
+/* savestring.c - function version of savestring for backwards compatibility */
+
+/* Copyright (C) 1998,2003,2017 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#include <config.h>
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#include "xmalloc.h"
+
+/* Backwards compatibility, now that savestring has been removed from
+ all `public' readline header files. */
+char *
+savestring (const char *s)
+{
+ char *ret;
+
+ ret = (char *)xmalloc (strlen (s) + 1);
+ strcpy (ret, s);
+ return ret;
+}
diff --git a/search.c b/search.c
new file mode 100644
index 0000000..eea2301
--- /dev/null
+++ b/search.c
@@ -0,0 +1,707 @@
+/* search.c - code for non-incremental searching in emacs and vi modes. */
+
+/* Copyright (C) 1992-2022 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <stdio.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif
+
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#include "readline.h"
+#include "history.h"
+#include "histlib.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+#ifdef abs
+# undef abs
+#endif
+#define abs(x) (((x) >= 0) ? (x) : -(x))
+
+_rl_search_cxt *_rl_nscxt = 0;
+
+static char *noninc_search_string = (char *) NULL;
+static int noninc_history_pos;
+
+static char *prev_line_found = (char *) NULL;
+
+static int _rl_history_search_len;
+/*static*/ int _rl_history_search_pos;
+static int _rl_history_search_flags;
+
+static char *history_search_string;
+static int history_string_size;
+
+static void make_history_line_current (HIST_ENTRY *);
+static int noninc_search_from_pos (char *, int, int, int, int *);
+static int noninc_dosearch (char *, int, int);
+static int noninc_search (int, int);
+static int rl_history_search_internal (int, int);
+static void rl_history_search_reinit (int);
+
+static _rl_search_cxt *_rl_nsearch_init (int, int);
+static void _rl_nsearch_abort (_rl_search_cxt *);
+static int _rl_nsearch_dispatch (_rl_search_cxt *, int);
+
+/* Make the data from the history entry ENTRY be the contents of the
+ current line. This doesn't do anything with rl_point; the caller
+ must set it. */
+static void
+make_history_line_current (HIST_ENTRY *entry)
+{
+ UNDO_LIST *xlist;
+
+ xlist = _rl_saved_line_for_history ? (UNDO_LIST *)_rl_saved_line_for_history->data : 0;
+ /* At this point, rl_undo_list points to a private search string list. */
+ if (rl_undo_list && rl_undo_list != (UNDO_LIST *)entry->data && rl_undo_list != xlist)
+ rl_free_undo_list ();
+
+ /* Now we create a new undo list with a single insert for this text.
+ WE DON'T CHANGE THE ORIGINAL HISTORY ENTRY UNDO LIST */
+ _rl_replace_text (entry->line, 0, rl_end);
+ _rl_fix_point (1);
+#if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode)
+ /* POSIX.2 says that the `U' command doesn't affect the copy of any
+ command lines to the edit line. We're going to implement that by
+ making the undo list start after the matching line is copied to the
+ current editing buffer. */
+ rl_free_undo_list ();
+#endif
+
+ /* This will need to free the saved undo list associated with the original
+ (pre-search) line buffer.
+ XXX - look at _rl_free_saved_history_line and consider calling it if
+ rl_undo_list != xlist (or calling rl_free_undo list directly on
+ _rl_saved_line_for_history->data) */
+ if (_rl_saved_line_for_history)
+ _rl_free_history_entry (_rl_saved_line_for_history);
+ _rl_saved_line_for_history = (HIST_ENTRY *)NULL;
+}
+
+/* Search the history list for STRING starting at absolute history position
+ POS. If STRING begins with `^', the search must match STRING at the
+ beginning of a history line, otherwise a full substring match is performed
+ for STRING. DIR < 0 means to search backwards through the history list,
+ DIR >= 0 means to search forward. */
+static int
+noninc_search_from_pos (char *string, int pos, int dir, int flags, int *ncp)
+{
+ int ret, old, sflags;
+ char *s;
+
+ if (pos < 0)
+ return -1;
+
+ old = where_history ();
+ if (history_set_pos (pos) == 0)
+ return -1;
+
+ RL_SETSTATE(RL_STATE_SEARCH);
+ /* These functions return the match offset in the line; history_offset gives
+ the matching line in the history list */
+ if (flags & SF_PATTERN)
+ {
+ s = string;
+ sflags = 0; /* Non-anchored search */
+ if (*s == '^')
+ {
+ sflags |= ANCHORED_SEARCH;
+ s++;
+ }
+ ret = _hs_history_patsearch (s, dir, sflags);
+ }
+ else if (*string == '^')
+ ret = history_search_prefix (string + 1, dir);
+ else
+ ret = history_search (string, dir);
+ RL_UNSETSTATE(RL_STATE_SEARCH);
+
+ if (ncp)
+ *ncp = ret; /* caller will catch -1 to indicate no-op */
+
+ if (ret != -1)
+ ret = where_history ();
+
+ history_set_pos (old);
+ return (ret);
+}
+
+/* Search for a line in the history containing STRING. If DIR is < 0, the
+ search is backwards through previous entries, else through subsequent
+ entries. Returns 1 if the search was successful, 0 otherwise. */
+static int
+noninc_dosearch (char *string, int dir, int flags)
+{
+ int oldpos, pos, ind;
+ HIST_ENTRY *entry;
+
+ if (string == 0 || *string == '\0' || noninc_history_pos < 0)
+ {
+ rl_ding ();
+ return 0;
+ }
+
+ pos = noninc_search_from_pos (string, noninc_history_pos + dir, dir, flags, &ind);
+ if (pos == -1)
+ {
+ /* Search failed, current history position unchanged. */
+ rl_maybe_unsave_line ();
+ rl_clear_message ();
+ rl_point = 0;
+ rl_ding ();
+ return 0;
+ }
+
+ noninc_history_pos = pos;
+
+ oldpos = where_history ();
+ history_set_pos (noninc_history_pos);
+ entry = current_history (); /* will never be NULL after successful search */
+
+#if defined (VI_MODE)
+ if (rl_editing_mode != vi_mode)
+#endif
+ history_set_pos (oldpos);
+
+ make_history_line_current (entry);
+
+ if (_rl_enable_active_region && ((flags & SF_PATTERN) == 0) && ind > 0 && ind < rl_end)
+ {
+ rl_point = ind;
+ rl_mark = ind + strlen (string);
+ if (rl_mark > rl_end)
+ rl_mark = rl_end; /* can't happen? */
+ rl_activate_mark ();
+ }
+ else
+ {
+ rl_point = 0;
+ rl_mark = rl_end;
+ }
+
+ rl_clear_message ();
+ return 1;
+}
+
+static _rl_search_cxt *
+_rl_nsearch_init (int dir, int pchar)
+{
+ _rl_search_cxt *cxt;
+ char *p;
+
+ cxt = _rl_scxt_alloc (RL_SEARCH_NSEARCH, 0);
+ if (dir < 0)
+ cxt->sflags |= SF_REVERSE; /* not strictly needed */
+#if defined (VI_MODE)
+ if (VI_COMMAND_MODE() && (pchar == '?' || pchar == '/'))
+ cxt->sflags |= SF_PATTERN;
+#endif
+
+ cxt->direction = dir;
+ cxt->history_pos = cxt->save_line;
+
+ rl_maybe_save_line ();
+
+ /* Clear the undo list, since reading the search string should create its
+ own undo list, and the whole list will end up being freed when we
+ finish reading the search string. */
+ rl_undo_list = 0;
+
+ /* Use the line buffer to read the search string. */
+ rl_line_buffer[0] = 0;
+ rl_end = rl_point = 0;
+
+ p = _rl_make_prompt_for_search (pchar ? pchar : ':');
+ rl_message ("%s", p);
+ xfree (p);
+
+ RL_SETSTATE(RL_STATE_NSEARCH);
+
+ _rl_nscxt = cxt;
+
+ return cxt;
+}
+
+int
+_rl_nsearch_cleanup (_rl_search_cxt *cxt, int r)
+{
+ _rl_scxt_dispose (cxt, 0);
+ _rl_nscxt = 0;
+
+ RL_UNSETSTATE(RL_STATE_NSEARCH);
+
+ return (r != 1);
+}
+
+static void
+_rl_nsearch_abort (_rl_search_cxt *cxt)
+{
+ rl_maybe_unsave_line ();
+ rl_point = cxt->save_point;
+ rl_mark = cxt->save_mark;
+ rl_restore_prompt ();
+ rl_clear_message ();
+ _rl_fix_point (1);
+
+ RL_UNSETSTATE (RL_STATE_NSEARCH);
+}
+
+/* Process just-read character C according to search context CXT. Return -1
+ if the caller should abort the search, 0 if we should break out of the
+ loop, and 1 if we should continue to read characters. */
+static int
+_rl_nsearch_dispatch (_rl_search_cxt *cxt, int c)
+{
+ int n;
+
+ if (c < 0)
+ c = CTRL ('C');
+
+ switch (c)
+ {
+ case CTRL('W'):
+ rl_unix_word_rubout (1, c);
+ break;
+
+ case CTRL('U'):
+ rl_unix_line_discard (1, c);
+ break;
+
+ case RETURN:
+ case NEWLINE:
+ return 0;
+
+ case CTRL('H'):
+ case RUBOUT:
+ if (rl_point == 0)
+ {
+ _rl_nsearch_abort (cxt);
+ return -1;
+ }
+ _rl_rubout_char (1, c);
+ break;
+
+ case CTRL('C'):
+ case CTRL('G'):
+ rl_ding ();
+ _rl_nsearch_abort (cxt);
+ return -1;
+
+ case ESC:
+ /* XXX - experimental code to allow users to bracketed-paste into the
+ search string. Similar code is in isearch.c:_rl_isearch_dispatch().
+ The difference here is that the bracketed paste sometimes doesn't
+ paste everything, so checking for the prefix and the suffix in the
+ input queue doesn't work well. We just have to check to see if the
+ number of chars in the input queue is enough for the bracketed paste
+ prefix and hope for the best. */
+ if (_rl_enable_bracketed_paste && ((n = _rl_nchars_available ()) >= (BRACK_PASTE_SLEN-1)))
+ {
+ if (_rl_read_bracketed_paste_prefix (c) == 1)
+ rl_bracketed_paste_begin (1, c);
+ else
+ {
+ c = rl_read_key (); /* get the ESC that got pushed back */
+ _rl_insert_char (1, c);
+ }
+ }
+ else
+ _rl_insert_char (1, c);
+ break;
+
+ default:
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ rl_insert_text (cxt->mb);
+ else
+#endif
+ _rl_insert_char (1, c);
+ break;
+ }
+
+ (*rl_redisplay_function) ();
+ rl_deactivate_mark ();
+ return 1;
+}
+
+/* Perform one search according to CXT, using NONINC_SEARCH_STRING. Return
+ -1 if the search should be aborted, any other value means to clean up
+ using _rl_nsearch_cleanup (). Returns 1 if the search was successful,
+ 0 otherwise. */
+static int
+_rl_nsearch_dosearch (_rl_search_cxt *cxt)
+{
+ rl_mark = cxt->save_mark;
+
+ /* If rl_point == 0, we want to re-use the previous search string and
+ start from the saved history position. If there's no previous search
+ string, punt. */
+ if (rl_point == 0)
+ {
+ if (noninc_search_string == 0)
+ {
+ rl_ding ();
+ rl_restore_prompt ();
+ RL_UNSETSTATE (RL_STATE_NSEARCH);
+ return -1;
+ }
+ }
+ else
+ {
+ /* We want to start the search from the current history position. */
+ noninc_history_pos = cxt->save_line;
+ FREE (noninc_search_string);
+ noninc_search_string = savestring (rl_line_buffer);
+
+ /* If we don't want the subsequent undo list generated by the search
+ matching a history line to include the contents of the search string,
+ we need to clear rl_line_buffer here. For now, we just clear the
+ undo list generated by reading the search string. (If the search
+ fails, the old undo list will be restored by rl_maybe_unsave_line.) */
+ rl_free_undo_list ();
+ }
+
+ rl_restore_prompt ();
+ return (noninc_dosearch (noninc_search_string, cxt->direction, cxt->sflags&SF_PATTERN));
+}
+
+/* Search non-interactively through the history list. DIR < 0 means to
+ search backwards through the history of previous commands; otherwise
+ the search is for commands subsequent to the current position in the
+ history list. PCHAR is the character to use for prompting when reading
+ the search string; if not specified (0), it defaults to `:'. */
+static int
+noninc_search (int dir, int pchar)
+{
+ _rl_search_cxt *cxt;
+ int c, r;
+
+ cxt = _rl_nsearch_init (dir, pchar);
+
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ return (0);
+
+ /* Read the search string. */
+ r = 0;
+ while (1)
+ {
+ c = _rl_search_getchar (cxt);
+
+ if (c < 0)
+ {
+ _rl_nsearch_abort (cxt);
+ return 1;
+ }
+
+ if (c == 0)
+ break;
+
+ r = _rl_nsearch_dispatch (cxt, c);
+ if (r < 0)
+ return 1;
+ else if (r == 0)
+ break;
+ }
+
+ r = _rl_nsearch_dosearch (cxt);
+ return ((r >= 0) ? _rl_nsearch_cleanup (cxt, r) : (r != 1));
+}
+
+/* Search forward through the history list for a string. If the vi-mode
+ code calls this, KEY will be `?'. */
+int
+rl_noninc_forward_search (int count, int key)
+{
+ return noninc_search (1, (key == '?') ? '?' : 0);
+}
+
+/* Reverse search the history list for a string. If the vi-mode code
+ calls this, KEY will be `/'. */
+int
+rl_noninc_reverse_search (int count, int key)
+{
+ return noninc_search (-1, (key == '/') ? '/' : 0);
+}
+
+/* Search forward through the history list for the last string searched
+ for. If there is no saved search string, abort. If the vi-mode code
+ calls this, KEY will be `N'. */
+int
+rl_noninc_forward_search_again (int count, int key)
+{
+ int r;
+
+ if (!noninc_search_string)
+ {
+ rl_ding ();
+ return (1);
+ }
+#if defined (VI_MODE)
+ if (VI_COMMAND_MODE() && key == 'N')
+ r = noninc_dosearch (noninc_search_string, 1, SF_PATTERN);
+ else
+#endif
+ r = noninc_dosearch (noninc_search_string, 1, 0);
+ return (r != 1);
+}
+
+/* Reverse search in the history list for the last string searched
+ for. If there is no saved search string, abort. If the vi-mode code
+ calls this, KEY will be `n'. */
+int
+rl_noninc_reverse_search_again (int count, int key)
+{
+ int r;
+
+ if (!noninc_search_string)
+ {
+ rl_ding ();
+ return (1);
+ }
+#if defined (VI_MODE)
+ if (VI_COMMAND_MODE() && key == 'n')
+ r = noninc_dosearch (noninc_search_string, -1, SF_PATTERN);
+ else
+#endif
+ r = noninc_dosearch (noninc_search_string, -1, 0);
+ return (r != 1);
+}
+
+#if defined (READLINE_CALLBACKS)
+int
+_rl_nsearch_callback (_rl_search_cxt *cxt)
+{
+ int c, r;
+
+ c = _rl_search_getchar (cxt);
+ if (c <= 0)
+ {
+ if (c < 0)
+ _rl_nsearch_abort (cxt);
+ return 1;
+ }
+ r = _rl_nsearch_dispatch (cxt, c);
+ if (r != 0)
+ return 1;
+
+ r = _rl_nsearch_dosearch (cxt);
+ return ((r >= 0) ? _rl_nsearch_cleanup (cxt, r) : (r != 1));
+}
+#endif
+
+static int
+rl_history_search_internal (int count, int dir)
+{
+ HIST_ENTRY *temp;
+ int ret, oldpos, newcol;
+ int had_saved_line;
+ char *t;
+
+ had_saved_line = _rl_saved_line_for_history != 0;
+ rl_maybe_save_line ();
+ temp = (HIST_ENTRY *)NULL;
+
+ /* Search COUNT times through the history for a line matching
+ history_search_string. If history_search_string[0] == '^', the
+ line must match from the start; otherwise any substring can match.
+ When this loop finishes, TEMP, if non-null, is the history line to
+ copy into the line buffer. */
+ while (count)
+ {
+ RL_CHECK_SIGNALS ();
+ ret = noninc_search_from_pos (history_search_string, _rl_history_search_pos + dir, dir, 0, &newcol);
+ if (ret == -1)
+ break;
+
+ /* Get the history entry we found. */
+ _rl_history_search_pos = ret;
+ oldpos = where_history ();
+ history_set_pos (_rl_history_search_pos);
+ temp = current_history (); /* will never be NULL after successful search */
+ history_set_pos (oldpos);
+
+ /* Don't find multiple instances of the same line. */
+ if (prev_line_found && STREQ (prev_line_found, temp->line))
+ continue;
+ prev_line_found = temp->line;
+ count--;
+ }
+
+ /* If we didn't find anything at all, return. */
+ if (temp == 0)
+ {
+ /* XXX - check had_saved_line here? */
+ rl_maybe_unsave_line ();
+ rl_ding ();
+ /* If you don't want the saved history line (last match) to show up
+ in the line buffer after the search fails, change the #if 0 to
+ #if 1 */
+#if 0
+ if (rl_point > _rl_history_search_len)
+ {
+ rl_point = rl_end = _rl_history_search_len;
+ rl_line_buffer[rl_end] = '\0';
+ rl_mark = 0;
+ }
+#else
+ rl_point = _rl_history_search_len; /* rl_maybe_unsave_line changes it */
+ rl_mark = rl_end;
+#endif
+ return 1;
+ }
+
+ /* Copy the line we found into the current line buffer. */
+ make_history_line_current (temp);
+
+ /* decide where to put rl_point -- need to change this for pattern search */
+ if (_rl_history_search_flags & ANCHORED_SEARCH)
+ rl_point = _rl_history_search_len; /* easy case */
+ else
+ {
+#if 0
+ t = strstr (rl_line_buffer, history_search_string); /* XXX */
+ rl_point = t ? (int)(t - rl_line_buffer) + _rl_history_search_len : rl_end;
+#else
+ rl_point = (newcol >= 0) ? newcol : rl_end;
+#endif
+ }
+ rl_mark = rl_end;
+
+ return 0;
+}
+
+static void
+rl_history_search_reinit (int flags)
+{
+ int sind;
+
+ _rl_history_search_pos = where_history ();
+ _rl_history_search_len = rl_point;
+ _rl_history_search_flags = flags;
+
+ prev_line_found = (char *)NULL;
+ if (rl_point)
+ {
+ /* Allocate enough space for anchored and non-anchored searches */
+ if (_rl_history_search_len >= history_string_size - 2)
+ {
+ history_string_size = _rl_history_search_len + 2;
+ history_search_string = (char *)xrealloc (history_search_string, history_string_size);
+ }
+ sind = 0;
+ if (flags & ANCHORED_SEARCH)
+ history_search_string[sind++] = '^';
+ strncpy (history_search_string + sind, rl_line_buffer, rl_point);
+ history_search_string[rl_point + sind] = '\0';
+ }
+ _rl_free_saved_history_line (); /* XXX rl_undo_list? */
+}
+
+/* Search forward in the history for the string of characters
+ from the start of the line to rl_point. This is a non-incremental
+ search. The search is anchored to the beginning of the history line. */
+int
+rl_history_search_forward (int count, int ignore)
+{
+ if (count == 0)
+ return (0);
+
+ if (rl_last_func != rl_history_search_forward &&
+ rl_last_func != rl_history_search_backward)
+ rl_history_search_reinit (ANCHORED_SEARCH);
+
+ if (_rl_history_search_len == 0)
+ return (rl_get_next_history (count, ignore));
+ return (rl_history_search_internal (abs (count), (count > 0) ? 1 : -1));
+}
+
+/* Search backward through the history for the string of characters
+ from the start of the line to rl_point. This is a non-incremental
+ search. */
+int
+rl_history_search_backward (int count, int ignore)
+{
+ if (count == 0)
+ return (0);
+
+ if (rl_last_func != rl_history_search_forward &&
+ rl_last_func != rl_history_search_backward)
+ rl_history_search_reinit (ANCHORED_SEARCH);
+
+ if (_rl_history_search_len == 0)
+ return (rl_get_previous_history (count, ignore));
+ return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1));
+}
+
+/* Search forward in the history for the string of characters
+ from the start of the line to rl_point. This is a non-incremental
+ search. The search succeeds if the search string is present anywhere
+ in the history line. */
+int
+rl_history_substr_search_forward (int count, int ignore)
+{
+ if (count == 0)
+ return (0);
+
+ if (rl_last_func != rl_history_substr_search_forward &&
+ rl_last_func != rl_history_substr_search_backward)
+ rl_history_search_reinit (NON_ANCHORED_SEARCH);
+
+ if (_rl_history_search_len == 0)
+ return (rl_get_next_history (count, ignore));
+ return (rl_history_search_internal (abs (count), (count > 0) ? 1 : -1));
+}
+
+/* Search backward through the history for the string of characters
+ from the start of the line to rl_point. This is a non-incremental
+ search. */
+int
+rl_history_substr_search_backward (int count, int ignore)
+{
+ if (count == 0)
+ return (0);
+
+ if (rl_last_func != rl_history_substr_search_forward &&
+ rl_last_func != rl_history_substr_search_backward)
+ rl_history_search_reinit (NON_ANCHORED_SEARCH);
+
+ if (_rl_history_search_len == 0)
+ return (rl_get_previous_history (count, ignore));
+ return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1));
+}
diff --git a/shell.c b/shell.c
new file mode 100644
index 0000000..36c9148
--- /dev/null
+++ b/shell.c
@@ -0,0 +1,214 @@
+/* shell.c -- readline utility functions that are normally provided by
+ bash when readline is linked as part of the shell. */
+
+/* Copyright (C) 1997-2009,2017,2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#if defined (HAVE_LIMITS_H)
+# include <limits.h>
+#endif
+
+#if defined (HAVE_FCNTL_H)
+#include <fcntl.h>
+#endif
+#if defined (HAVE_PWD_H)
+#include <pwd.h>
+#endif
+
+#include <stdio.h>
+
+#include "rlstdc.h"
+#include "rlshell.h"
+#include "rldefs.h"
+
+#include "xmalloc.h"
+
+#if defined (HAVE_GETPWUID) && !defined (HAVE_GETPW_DECLS)
+extern struct passwd *getpwuid (uid_t);
+#endif /* HAVE_GETPWUID && !HAVE_GETPW_DECLS */
+
+#ifndef NULL
+# define NULL 0
+#endif
+
+#ifndef CHAR_BIT
+# define CHAR_BIT 8
+#endif
+
+/* Nonzero if the integer type T is signed. */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* Bound on length of the string representing an integer value of type T.
+ Subtract one for the sign bit if T is signed;
+ 302 / 1000 is log10 (2) rounded up;
+ add one for integer division truncation;
+ add one more for a minus sign if t is signed. */
+#define INT_STRLEN_BOUND(t) \
+ ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 \
+ + 1 + TYPE_SIGNED (t))
+
+/* All of these functions are resolved from bash if we are linking readline
+ as part of bash. */
+
+/* Does shell-like quoting using single quotes. */
+char *
+sh_single_quote (char *string)
+{
+ register int c;
+ char *result, *r, *s;
+
+ result = (char *)xmalloc (3 + (4 * strlen (string)));
+ r = result;
+ *r++ = '\'';
+
+ for (s = string; s && (c = *s); s++)
+ {
+ *r++ = c;
+
+ if (c == '\'')
+ {
+ *r++ = '\\'; /* insert escaped single quote */
+ *r++ = '\'';
+ *r++ = '\''; /* start new quoted string */
+ }
+ }
+
+ *r++ = '\'';
+ *r = '\0';
+
+ return (result);
+}
+
+/* Set the environment variables LINES and COLUMNS to lines and cols,
+ respectively. */
+static char setenv_buf[INT_STRLEN_BOUND (int) + 1];
+static char putenv_buf1[INT_STRLEN_BOUND (int) + 6 + 1]; /* sizeof("LINES=") == 6 */
+static char putenv_buf2[INT_STRLEN_BOUND (int) + 8 + 1]; /* sizeof("COLUMNS=") == 8 */
+
+void
+sh_set_lines_and_columns (int lines, int cols)
+{
+#if defined (HAVE_SETENV)
+ sprintf (setenv_buf, "%d", lines);
+ setenv ("LINES", setenv_buf, 1);
+
+ sprintf (setenv_buf, "%d", cols);
+ setenv ("COLUMNS", setenv_buf, 1);
+#else /* !HAVE_SETENV */
+# if defined (HAVE_PUTENV)
+ sprintf (putenv_buf1, "LINES=%d", lines);
+ putenv (putenv_buf1);
+
+ sprintf (putenv_buf2, "COLUMNS=%d", cols);
+ putenv (putenv_buf2);
+# endif /* HAVE_PUTENV */
+#endif /* !HAVE_SETENV */
+}
+
+char *
+sh_get_env_value (const char *varname)
+{
+ return ((char *)getenv (varname));
+}
+
+char *
+sh_get_home_dir (void)
+{
+ static char *home_dir = (char *)NULL;
+ struct passwd *entry;
+
+ if (home_dir)
+ return (home_dir);
+
+ home_dir = (char *)NULL;
+#if defined (HAVE_GETPWUID)
+# if defined (__TANDEM)
+ entry = getpwnam (getlogin ());
+# else
+ entry = getpwuid (getuid ());
+# endif
+ if (entry)
+ home_dir = savestring (entry->pw_dir);
+#endif
+
+#if defined (HAVE_GETPWENT)
+ endpwent (); /* some systems need this */
+#endif
+
+ return (home_dir);
+}
+
+#if !defined (O_NDELAY)
+# if defined (FNDELAY)
+# define O_NDELAY FNDELAY
+# endif
+#endif
+
+int
+sh_unset_nodelay_mode (int fd)
+{
+#if defined (HAVE_FCNTL)
+ int flags, bflags;
+
+ if ((flags = fcntl (fd, F_GETFL, 0)) < 0)
+ return -1;
+
+ bflags = 0;
+
+#ifdef O_NONBLOCK
+ bflags |= O_NONBLOCK;
+#endif
+
+#ifdef O_NDELAY
+ bflags |= O_NDELAY;
+#endif
+
+ if (flags & bflags)
+ {
+ flags &= ~bflags;
+ return (fcntl (fd, F_SETFL, flags));
+ }
+#endif
+
+ return 0;
+}
diff --git a/shlib/Makefile.in b/shlib/Makefile.in
new file mode 100644
index 0000000..d138524
--- /dev/null
+++ b/shlib/Makefile.in
@@ -0,0 +1,501 @@
+## -*- text -*- ##
+# Makefile for the GNU readline library shared library support.
+#
+# Copyright (C) 1998-2009 Free Software Foundation, Inc.
+
+# 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/>.
+
+PACKAGE = @PACKAGE_NAME@
+VERSION = @PACKAGE_VERSION@
+
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+
+RL_LIBRARY_VERSION = @LIBVERSION@
+RL_LIBRARY_NAME = readline
+
+datarootdir = @datarootdir@
+
+srcdir = @srcdir@
+VPATH = @top_srcdir@
+topdir = @top_srcdir@
+BUILD_DIR = @BUILD_DIR@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+CC = @CC@
+RANLIB = @RANLIB@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+RM = rm -f
+CP = cp
+MV = mv
+LN = ln
+
+SHELL = @MAKE_SHELL@
+
+host_os = @host_os@
+host_vendor = @host_vendor@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+includedir = @includedir@
+bindir = @bindir@
+libdir = @libdir@
+datadir = @datadir@
+localedir = @localedir@
+
+# Support an alternate destination root directory for package building
+DESTDIR =
+
+CFLAGS = @CFLAGS@
+LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' @BRACKETED_PASTE@
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@ @CFLAGS@
+
+DEFS = @DEFS@ @CROSS_COMPILE@
+LOCAL_DEFS = @LOCAL_DEFS@
+
+#
+# These values are generated for configure by ${topdir}/support/shobj-conf.
+# If your system is not supported by that script, but includes facilities for
+# dynamic loading of shared objects, please update the script and send the
+# changes to bash-maintainers@gnu.org.
+#
+SHOBJ_CC = @SHOBJ_CC@
+SHOBJ_CFLAGS = @SHOBJ_CFLAGS@
+SHOBJ_LD = @SHOBJ_LD@
+
+SHOBJ_LDFLAGS = @SHOBJ_LDFLAGS@
+SHOBJ_XLDFLAGS = @SHOBJ_XLDFLAGS@
+SHOBJ_LIBS = @SHOBJ_LIBS@
+
+SHLIB_XLDFLAGS = @LDFLAGS@ @SHLIB_XLDFLAGS@
+SHLIB_LIBS = @SHLIB_LIBS@
+
+SHLIB_DOT = @SHLIB_DOT@
+SHLIB_LIBPREF = @SHLIB_LIBPREF@
+SHLIB_LIBSUFF = @SHLIB_LIBSUFF@
+
+SHLIB_LIBVERSION = @SHLIB_LIBVERSION@
+SHLIB_DLLVERSION = @SHLIB_DLLVERSION@
+
+SHLIB_STATUS = @SHLIB_STATUS@
+
+TERMCAP_LIB = @TERMCAP_LIB@
+
+# shared library versioning
+SHLIB_MAJOR= @SHLIB_MAJOR@
+# shared library systems like SVR4's do not use minor versions
+SHLIB_MINOR= .@SHLIB_MINOR@
+
+# For libraries which include headers from other libraries.
+INCLUDES = -I. -I.. -I$(topdir)
+
+CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(INCLUDES) $(CPPFLAGS) $(LOCAL_CFLAGS) $(CFLAGS)
+
+.SUFFIXES: .so
+
+.c.so:
+ ${RM} $@
+ $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_CFLAGS) -o $*.o $<
+ $(MV) $*.o $@
+
+# The name of the main library target.
+
+SHARED_READLINE = $(SHLIB_LIBPREF)readline$(SHLIB_DOT)$(SHLIB_LIBVERSION)
+SHARED_HISTORY = $(SHLIB_LIBPREF)history$(SHLIB_DOT)$(SHLIB_LIBVERSION)
+SHARED_LIBS = $(SHARED_READLINE) $(SHARED_HISTORY)
+
+# The C code source files for this library.
+CSOURCES = $(topdir)/readline.c $(topdir)/funmap.c $(topdir)/keymaps.c \
+ $(topdir)/vi_mode.c $(topdir)/parens.c $(topdir)/rltty.c \
+ $(topdir)/complete.c $(topdir)/bind.c $(topdir)/isearch.c \
+ $(topdir)/display.c $(topdir)/signals.c $(topdir)/emacs_keymap.c \
+ $(topdir)/vi_keymap.c $(topdir)/util.c $(topdir)/kill.c \
+ $(topdir)/undo.c $(topdir)/macro.c $(topdir)/input.c \
+ $(topdir)/callback.c $(topdir)/terminal.c $(topdir)/xmalloc.c $(topdir)/xfree.c \
+ $(topdir)/history.c $(topdir)/histsearch.c $(topdir)/histexpand.c \
+ $(topdir)/histfile.c $(topdir)/nls.c $(topdir)/search.c \
+ $(topdir)/shell.c $(topdir)/savestring.c $(topdir)/tilde.c \
+ $(topdir)/text.c $(topdir)/misc.c $(topdir)/compat.c \
+ $(topdir)/colors.c $(topdir)/parse-colors.c \
+ $(topdir)/mbutil.c
+
+# The header files for this library.
+HSOURCES = $(topdir)/readline.h $(topdir)/rldefs.h $(topdir)/chardefs.h \
+ $(topdir)/keymaps.h $(topdir)/history.h $(topdir)/histlib.h \
+ $(topdir)/posixstat.h $(topdir)/posixdir.h $(topdir)/posixjmp.h \
+ $(topdir)/tilde.h $(topdir)/rlconf.h $(topdir)/rltty.h \
+ $(topdir)/ansi_stdlib.h $(topdir)/tcap.h $(topdir)/rlstdc.h \
+ $(topdir)/xmalloc.h $(topdir)/rlprivate.h $(topdir)/rlshell.h \
+ $(topdir)/rltypedefs.h $(topdir)/rlmbutil.h \
+ $(topdir)/colors.h $(topdir)/parse-colors.h
+
+SHARED_HISTOBJ = history.so histexpand.so histfile.so histsearch.so shell.so \
+ mbutil.so
+SHARED_TILDEOBJ = tilde.so
+SHARED_COLORSOBJ = colors.so parse-colors.so
+SHARED_OBJ = readline.so vi_mode.so funmap.so keymaps.so parens.so search.so \
+ rltty.so complete.so bind.so isearch.so display.so signals.so \
+ util.so kill.so undo.so macro.so input.so callback.so terminal.so \
+ text.so nls.so misc.so \
+ $(SHARED_HISTOBJ) $(SHARED_TILDEOBJ) $(SHARED_COLORSOBJ) \
+ xmalloc.so xfree.so compat.so
+
+##########################################################################
+
+all: $(SHLIB_STATUS)
+
+supported: $(SHARED_LIBS)
+
+unsupported:
+ @echo "Your system and compiler (${host_os}-${CC}) are not supported by the"
+ @echo "${topdir}/support/shobj-conf script."
+ @echo "If your operating system provides facilities for creating"
+ @echo "shared libraries, please update the script and re-run configure."
+ @echo "Please send the changes you made to bash-maintainers@gnu.org"
+ @echo "for inclusion in future bash and readline releases."
+
+$(SHARED_READLINE): $(SHARED_OBJ)
+ $(RM) $@
+ $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_OBJ) $(SHLIB_LIBS)
+
+$(SHARED_HISTORY): $(SHARED_HISTOBJ) xmalloc.so xfree.so
+ $(RM) $@
+ $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_HISTOBJ) xmalloc.so xfree.so $(SHLIB_LIBS)
+
+# Since tilde.c is shared between readline and bash, make sure we compile
+# it with the right flags when it's built as part of readline
+tilde.so: tilde.c
+ ${RM} $@
+ $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_CFLAGS) -DREADLINE_LIBRARY -c -o tilde.o $(topdir)/tilde.c
+ $(MV) tilde.o $@
+
+installdirs: $(topdir)/support/mkdirs
+ -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(libdir)
+ -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(bindir)
+
+install-supported: installdirs $(SHLIB_STATUS)
+ $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_HISTORY)
+ $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_READLINE)
+ @echo install: you may need to run ldconfig
+
+install-unsupported:
+ @echo install: shared libraries not supported
+
+install: install-$(SHLIB_STATUS)
+
+uninstall-supported:
+ $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -U $(SHARED_HISTORY)
+ $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -U $(SHARED_READLINE)
+ @echo uninstall: you may need to run ldconfig
+
+uninstall-unsupported:
+ @echo uninstall: shared libraries not supported
+
+uninstall: uninstall-$(SHLIB_STATUS)
+
+clean mostlyclean: force
+ $(RM) $(SHARED_OBJ) $(SHARED_LIBS)
+
+distclean maintainer-clean: clean
+ $(RM) Makefile
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+# Dependencies
+bind.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h
+bind.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+bind.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+bind.so: $(topdir)/rltypedefs.h
+bind.so: $(topdir)/tilde.h $(topdir)/history.h
+compat.so: ${BUILD_DIR}/config.h
+compat.so: $(topdir)/rlstdc.h $(topdir)/rltypedefs.h
+callback.so: $(topdir)/rlconf.h
+callback.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h
+callback.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+callback.so: $(topdir)/rltypedefs.h
+callback.so: $(topdir)/tilde.h
+complete.so: $(topdir)/ansi_stdlib.h $(topdir)/posixdir.h $(topdir)/posixstat.h
+complete.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+complete.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+complete.so: $(topdir)/rltypedefs.h
+complete.so: $(topdir)/tilde.h
+display.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h
+display.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+display.so: $(topdir)/tcap.h
+display.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+display.so: $(topdir)/rltypedefs.h
+display.so: $(topdir)/tilde.h $(topdir)/history.h
+funmap.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+funmap.so: $(topdir)/rltypedefs.h
+funmap.so: $(topdir)/rlconf.h $(topdir)/ansi_stdlib.h
+funmap.so: ${BUILD_DIR}/config.h $(topdir)/tilde.h
+histexpand.so: $(topdir)/ansi_stdlib.h
+histexpand.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h
+histexpand.so: ${BUILD_DIR}/config.h
+histfile.so: $(topdir)/ansi_stdlib.h
+histfile.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h
+histfile.so: ${BUILD_DIR}/config.h
+history.so: $(topdir)/ansi_stdlib.h
+history.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h
+history.so: ${BUILD_DIR}/config.h
+histsearch.so: $(topdir)/ansi_stdlib.h
+histsearch.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h
+histsearch.so: ${BUILD_DIR}/config.h
+input.so: $(topdir)/ansi_stdlib.h
+input.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+input.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+input.so: $(topdir)/rltypedefs.h
+input.so: $(topdir)/tilde.h
+isearch.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+isearch.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+isearch.so: $(topdir)/rltypedefs.h
+isearch.so: $(topdir)/ansi_stdlib.h $(topdir)/history.h $(topdir)/tilde.h
+keymaps.so: $(topdir)/keymaps.h $(topdir)/chardefs.h $(topdir)/rlconf.h
+keymaps.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+keymaps.so: $(topdir)/rltypedefs.h
+keymaps.so: ${BUILD_DIR}/config.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h
+kill.so: $(topdir)/ansi_stdlib.h
+kill.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+kill.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+kill.so: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rltypedefs.h
+macro.so: $(topdir)/ansi_stdlib.h
+macro.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+macro.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+macro.so: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rltypedefs.h
+mbutil.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+mbutil.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/rltypedefs.h
+mbutil.so: $(topdir)/chardefs.h $(topdir)/rlstdc.h
+misc.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+misc.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+misc.so: $(topdir)/rltypedefs.h
+misc.so: $(topdir)/history.h $(topdir)/tilde.h $(topdir)/ansi_stdlib.h
+nls.so: $(topdir)/ansi_stdlib.h
+nls.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+nls.o: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+nls.o: $(topdir)/rltypedefs.h
+nls.o: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rlstdc.h
+parens.so: $(topdir)/rlconf.h ${BUILD_DIR}/config.h
+parens.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+parens.so: $(topdir)/rltypedefs.h
+parens.so: $(topdir)/tilde.h
+rltty.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+rltty.so: $(topdir)/rltty.h $(topdir)/tilde.h
+rltty.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+rltty.so: $(topdir)/rltypedefs.h
+savestring.so: ${BUILD_DIR}/config.h
+search.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+search.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+search.so: $(topdir)/ansi_stdlib.h $(topdir)/history.h $(topdir)/tilde.h
+search.so: $(topdir)/rltypedefs.h
+signals.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+signals.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+signals.so: $(topdir)/history.h $(topdir)/tilde.h
+signals.so: $(topdir)/rltypedefs.h
+terminal.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+terminal.so: $(topdir)/tcap.h
+terminal.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+terminal.so: $(topdir)/tilde.h $(topdir)/history.h
+terminal.so: $(topdir)/rltypedefs.h
+text.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+text.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+text.so: $(topdir)/rltypedefs.h
+text.so: $(topdir)/history.h $(topdir)/tilde.h $(topdir)/ansi_stdlib.h
+tilde.so: $(topdir)/ansi_stdlib.h ${BUILD_DIR}/config.h $(topdir)/tilde.h
+undo.so: $(topdir)/ansi_stdlib.h
+undo.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+undo.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+undo.so: $(topdir)/rltypedefs.h
+undo.so: $(topdir)/tilde.h $(topdir)/history.h
+util.so: $(topdir)/posixjmp.h $(topdir)/ansi_stdlib.h
+util.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+util.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+util.so: $(topdir)/rltypedefs.h $(topdir)/tilde.h
+vi_mode.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+vi_mode.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+vi_mode.so: $(topdir)/history.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h
+vi_mode.so: $(topdir)/rltypedefs.h
+xfree.so: ${BUILD_DIR}/config.h
+xfree.so: $(topdir)/ansi_stdlib.h
+xmalloc.so: ${BUILD_DIR}/config.h
+xmalloc.so: $(topdir)/ansi_stdlib.h
+
+bind.so: $(topdir)/rlshell.h
+histfile.so: $(topdir)/rlshell.h
+nls.so: $(topdir)/rlshell.h
+readline.so: $(topdir)/rlshell.h
+shell.so: $(topdir)/rlshell.h
+terminal.so: $(topdir)/rlshell.h
+histexpand.so: $(topdir)/rlshell.h
+
+colors.so: $(BUILD_DIR)/config.h $(topdir)/colors.h
+colors.so: $(topdir)/rlconf.h
+colors.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/rltypedefs.h
+colors.so: $(topdir)/chardefs.h $(topdir)/tilde.h $(topdir)/rlstdc.h
+colors.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h
+parse-colors.so: $(BUILD_DIR)/config.h $(topdir)/colors.h $(topdir)/parse-colors.h
+parse-colors.so: $(topdir)/rldefs.h $(topdir)/rlconf.h
+parse-colors.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/rltypedefs.h
+parse-colors.so: $(topdir)/chardefs.h $(topdir)/tilde.h $(topdir)/rlstdc.h
+
+bind.so: $(topdir)/rlprivate.h
+callback.so: $(topdir)/rlprivate.h
+complete.so: $(topdir)/rlprivate.h
+display.so: $(topdir)/rlprivate.h
+input.so: $(topdir)/rlprivate.h
+isearch.so: $(topdir)/rlprivate.h
+kill.so: $(topdir)/rlprivate.h
+macro.so: $(topdir)/rlprivate.h
+mbutil.so: $(topdir)/rlprivate.h
+misc.so: $(topdir)/rlprivate.h
+nls.so: $(topdir)/rlprivate.h
+parens.so: $(topdir)/rlprivate.h
+readline.so: $(topdir)/rlprivate.h
+rltty.so: $(topdir)/rlprivate.h
+search.so: $(topdir)/rlprivate.h
+signals.so: $(topdir)/rlprivate.h
+terminal.so: $(topdir)/rlprivate.h
+text.so: $(topdir)/rlprivate.h
+undo.so: $(topdir)/rlprivate.h
+util.so: $(topdir)/rlprivate.h
+vi_mode.so: $(topdir)/rlprivate.h
+colors.so: $(topdir)/rlprivate.h
+parse-colors.so: $(topdir)/rlprivate.h
+
+bind.so: $(topdir)/xmalloc.h
+callback.so: $(topdir)/xmalloc.h
+complete.so: $(topdir)/xmalloc.h
+display.so: $(topdir)/xmalloc.h
+funmap.so: $(topdir)/xmalloc.h
+histexpand.so: $(topdir)/xmalloc.h
+histfile.so: $(topdir)/xmalloc.h
+history.so: $(topdir)/xmalloc.h
+input.so: $(topdir)/xmalloc.h
+isearch.so: $(topdir)/xmalloc.h
+keymaps.so: $(topdir)/xmalloc.h
+kill.so: $(topdir)/xmalloc.h
+macro.so: $(topdir)/xmalloc.h
+mbutil.so: $(topdir)/xmalloc.h
+misc.so: $(topdir)/xmalloc.h
+readline.so: $(topdir)/xmalloc.h
+savestring.so: $(topdir)/xmalloc.h
+search.so: $(topdir)/xmalloc.h
+shell.so: $(topdir)/xmalloc.h
+terminal.so: $(topdir)/xmalloc.h
+text.so: $(topdir)/xmalloc.h
+tilde.so: $(topdir)/xmalloc.h
+undo.so: $(topdir)/xmalloc.h
+util.so: $(topdir)/xmalloc.h
+vi_mode.so: $(topdir)/xmalloc.h
+xfree.so: $(topdir)/xmalloc.h
+xmalloc.so: $(topdir)/xmalloc.h
+colors.so: $(topdir)/xmalloc.h
+parse-colors.so: $(topdir)/xmalloc.h
+
+complete.so: $(topdir)/rlmbutil.h
+display.so: $(topdir)/rlmbutil.h
+histexpand.so: $(topdir)/rlmbutil.h
+input.so: $(topdir)/rlmbutil.h
+isearch.so: $(topdir)/rlmbutil.h
+mbutil.so: $(topdir)/rlmbutil.h
+misc.so: $(topdir)/rlmbutil.h
+readline.so: $(topdir)/rlmbutil.h
+search.so: $(topdir)/rlmbutil.h
+text.so: $(topdir)/rlmbutil.h
+vi_mode.so: $(topdir)/rlmbutil.h
+colors.so: $(topdir)/rlmbutil.h
+parse-colors.so: $(topdir)/rlmbutil.h
+
+bind.so: $(topdir)/bind.c
+callback.so: $(topdir)/callback.c
+compat.so: $(topdir)/compat.c
+complete.so: $(topdir)/complete.c
+display.so: $(topdir)/display.c
+funmap.so: $(topdir)/funmap.c
+input.so: $(topdir)/input.c
+isearch.so: $(topdir)/isearch.c
+keymaps.so: $(topdir)/keymaps.c $(topdir)/emacs_keymap.c $(topdir)/vi_keymap.c
+kill.so: $(topdir)/kill.c
+macro.so: $(topdir)/macro.c
+mbutil.so: $(topdir)/mbutil.c
+misc.so: $(topdir)/mbutil.c
+nls.so: $(topdir)/nls.c
+parens.so: $(topdir)/parens.c
+readline.so: $(topdir)/readline.c
+rltty.so: $(topdir)/rltty.c
+savestring.so: $(topdir)/savestring.c
+search.so: $(topdir)/search.c
+shell.so: $(topdir)/shell.c
+signals.so: $(topdir)/signals.c
+terminal.so: $(topdir)/terminal.c
+text.so: $(topdir)/text.c
+tilde.so: $(topdir)/tilde.c
+undo.so: $(topdir)/undo.c
+util.so: $(topdir)/util.c
+vi_mode.so: $(topdir)/vi_mode.c
+xfree.so: $(topdir)/xfree.c
+xmalloc.so: $(topdir)/xmalloc.c
+
+histexpand.so: $(topdir)/histexpand.c
+histfile.so: $(topdir)/histfile.c
+history.so: $(topdir)/history.c
+histsearch.so: $(topdir)/histsearch.c
+
+bind.so: bind.c
+callback.so: callback.c
+comapt.so: compat.c
+complete.so: complete.c
+display.so: display.c
+funmap.so: funmap.c
+input.so: input.c
+isearch.so: isearch.c
+keymaps.so: keymaps.c emacs_keymap.c vi_keymap.c
+kill.so: kill.c
+macro.so: macro.c
+mbutil.so: mbutil.c
+misc.so: misc.c
+nls.so: nls.c
+parens.so: parens.c
+readline.so: readline.c
+rltty.so: rltty.c
+savestring.so: savestring.c
+search.so: search.c
+signals.so: signals.c
+shell.so: shell.c
+terminal.so: terminal.c
+text.so: text.c
+tilde.so: tilde.c
+undo.so: undo.c
+util.so: util.c
+vi_mode.so: vi_mode.c
+xfree.so: xfree.c
+xmalloc.so: xmalloc.c
+
+colors.so: colors.c
+parse-colors.so: parse-colors.c
+
+histexpand.so: histexpand.c
+histfile.so: histfile.c
+history.so: history.c
+histsearch.so: histsearch.c
diff --git a/signals.c b/signals.c
new file mode 100644
index 0000000..9df365e
--- /dev/null
+++ b/signals.c
@@ -0,0 +1,754 @@
+/* signals.c -- signal handling support for readline. */
+
+/* Copyright (C) 1987-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h> /* Just for NULL. Yuck. */
+#include <sys/types.h>
+#include <signal.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+#if defined (GWINSZ_IN_SYS_IOCTL)
+# include <sys/ioctl.h>
+#endif /* GWINSZ_IN_SYS_IOCTL */
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+
+#if defined (HANDLE_SIGNALS)
+
+#define SIGHANDLER_RETURN return
+
+/* This typedef is equivalent to the one for Function; it allows us
+ to say SigHandler *foo = signal (SIGKILL, SIG_IGN); */
+typedef void SigHandler (int);
+
+#if defined (HAVE_POSIX_SIGNALS)
+typedef struct sigaction sighandler_cxt;
+# define rl_sigaction(s, nh, oh) sigaction(s, nh, oh)
+#else
+typedef struct { SigHandler *sa_handler; int sa_mask, sa_flags; } sighandler_cxt;
+# define sigemptyset(m)
+#endif /* !HAVE_POSIX_SIGNALS */
+
+#ifndef SA_RESTART
+# define SA_RESTART 0
+#endif
+
+static SigHandler *rl_set_sighandler (int, SigHandler *, sighandler_cxt *);
+static void rl_maybe_set_sighandler (int, SigHandler *, sighandler_cxt *);
+static void rl_maybe_restore_sighandler (int, sighandler_cxt *);
+
+static void rl_signal_handler (int);
+static void _rl_handle_signal (int);
+
+/* Exported variables for use by applications. */
+
+/* If non-zero, readline will install its own signal handlers for
+ SIGINT, SIGTERM, SIGHUP, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */
+int rl_catch_signals = 1;
+
+/* If non-zero, readline will install a signal handler for SIGWINCH. */
+#ifdef SIGWINCH
+int rl_catch_sigwinch = 1;
+#else
+int rl_catch_sigwinch = 0; /* for the readline state struct in readline.c */
+#endif
+
+/* Private variables. */
+int volatile _rl_caught_signal = 0; /* should be sig_atomic_t, but that requires including <signal.h> everywhere */
+
+/* If non-zero, print characters corresponding to received signals as long as
+ the user has indicated his desire to do so (_rl_echo_control_chars). */
+int _rl_echoctl = 0;
+
+int _rl_intr_char = 0;
+int _rl_quit_char = 0;
+int _rl_susp_char = 0;
+
+static int signals_set_flag;
+static int sigwinch_set_flag;
+
+#if defined (HAVE_POSIX_SIGNALS)
+sigset_t _rl_orig_sigset;
+#endif /* !HAVE_POSIX_SIGNALS */
+
+/* **************************************************************** */
+/* */
+/* Signal Handling */
+/* */
+/* **************************************************************** */
+
+static sighandler_cxt old_int, old_term, old_hup, old_alrm, old_quit;
+#if defined (SIGTSTP)
+static sighandler_cxt old_tstp, old_ttou, old_ttin;
+#endif
+#if defined (SIGWINCH)
+static sighandler_cxt old_winch;
+#endif
+
+_rl_sigcleanup_func_t *_rl_sigcleanup;
+void *_rl_sigcleanarg;
+
+/* Readline signal handler functions. */
+
+/* Called from RL_CHECK_SIGNALS() macro to run signal handling code. */
+void
+_rl_signal_handler (int sig)
+{
+ _rl_caught_signal = 0; /* XXX */
+
+#if defined (SIGWINCH)
+ if (sig == SIGWINCH)
+ {
+ RL_SETSTATE(RL_STATE_SIGHANDLER);
+
+ rl_resize_terminal ();
+ /* XXX - experimental for now */
+ /* Call a signal hook because though we called the original signal handler
+ in rl_sigwinch_handler below, we will not resend the signal to
+ ourselves. */
+ if (rl_signal_event_hook)
+ (*rl_signal_event_hook) ();
+
+ RL_UNSETSTATE(RL_STATE_SIGHANDLER);
+ }
+ else
+#endif
+ _rl_handle_signal (sig);
+
+ SIGHANDLER_RETURN;
+}
+
+static void
+rl_signal_handler (int sig)
+{
+ _rl_caught_signal = sig;
+ SIGHANDLER_RETURN;
+}
+
+/* This is called to handle a signal when it is safe to do so (out of the
+ signal handler execution path). Called by _rl_signal_handler for all the
+ signals readline catches except SIGWINCH. */
+static void
+_rl_handle_signal (int sig)
+{
+ int block_sig;
+
+#if defined (HAVE_POSIX_SIGNALS)
+ sigset_t set, oset;
+#else /* !HAVE_POSIX_SIGNALS */
+# if defined (HAVE_BSD_SIGNALS)
+ long omask;
+# else /* !HAVE_BSD_SIGNALS */
+ sighandler_cxt dummy_cxt; /* needed for rl_set_sighandler call */
+# endif /* !HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+ RL_SETSTATE(RL_STATE_SIGHANDLER);
+
+#if !defined (HAVE_BSD_SIGNALS) && !defined (HAVE_POSIX_SIGNALS)
+ /* Since the signal will not be blocked while we are in the signal
+ handler, ignore it until rl_clear_signals resets the catcher. */
+# if defined (SIGALRM)
+ if (sig == SIGINT || sig == SIGALRM)
+# else
+ if (sig == SIGINT)
+# endif
+ rl_set_sighandler (sig, SIG_IGN, &dummy_cxt);
+#endif /* !HAVE_BSD_SIGNALS && !HAVE_POSIX_SIGNALS */
+
+ /* If there's a sig cleanup function registered, call it and `deregister'
+ the cleanup function to avoid multiple calls */
+ if (_rl_sigcleanup)
+ {
+ (*_rl_sigcleanup) (sig, _rl_sigcleanarg);
+ _rl_sigcleanup = 0;
+ _rl_sigcleanarg = 0;
+ }
+
+#if defined (HAVE_POSIX_SIGNALS)
+ /* Get the current set of blocked signals. If we want to block a signal for
+ the duration of the cleanup functions, make sure to add it to SET and
+ set block_sig = 1 (see the SIGHUP case below). */
+ block_sig = 0; /* sentinel to block signals with sigprocmask */
+ sigemptyset (&set);
+ sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &set);
+#endif
+
+ switch (sig)
+ {
+ case SIGINT:
+ /* We will end up blocking SIGTTOU while we are resetting the tty, so
+ watch out for this if it causes problems. We could prevent this by
+ setting block_sig to 1 without modifying SET. */
+ _rl_reset_completion_state ();
+ rl_free_line_state ();
+#if defined (READLINE_CALLBACKS)
+ rl_callback_sigcleanup ();
+#endif
+
+ /* FALLTHROUGH */
+
+#if defined (SIGTSTP)
+ case SIGTSTP:
+ case SIGTTIN:
+ case SIGTTOU:
+# if defined (HAVE_POSIX_SIGNALS)
+ /* Block SIGTTOU so we can restore the terminal settings to something
+ sane without stopping on SIGTTOU if we have been placed into the
+ background. Even trying to get the current terminal pgrp with
+ tcgetpgrp() will generate SIGTTOU, so we don't bother. We still do
+ this even if we've been stopped on SIGTTOU, since we handle signals
+ when we have returned from the signal handler and the signal is no
+ longer blocked. */
+ if (block_sig == 0)
+ {
+ sigaddset (&set, SIGTTOU);
+ block_sig = 1;
+ }
+# endif
+#endif /* SIGTSTP */
+ /* Any signals that should be blocked during cleanup should go here. */
+#if defined (SIGHUP)
+ case SIGHUP:
+# if defined (_AIX)
+ if (block_sig == 0)
+ {
+ sigaddset (&set, sig);
+ block_sig = 1;
+ }
+# endif // _AIX
+#endif
+ /* Signals that don't require blocking during cleanup should go here. */
+ case SIGTERM:
+#if defined (SIGALRM)
+ case SIGALRM:
+ if (sig == SIGALRM)
+ _rl_timeout_handle_sigalrm ();
+#endif
+#if defined (SIGQUIT)
+ case SIGQUIT:
+#endif
+
+#if defined (HAVE_POSIX_SIGNALS)
+ if (block_sig)
+ sigprocmask (SIG_BLOCK, &set, &oset);
+#endif
+
+ rl_echo_signal_char (sig);
+ rl_cleanup_after_signal ();
+
+ /* At this point, the application's signal handler, if any, is the
+ current handler. */
+
+#if defined (HAVE_POSIX_SIGNALS)
+ /* Unblock any signal(s) blocked above */
+ if (block_sig)
+ sigprocmask (SIG_UNBLOCK, &oset, (sigset_t *)NULL);
+#endif
+
+ /* We don't have to bother unblocking the signal because we are not
+ running in a signal handler context. */
+
+#if defined (__EMX__)
+ signal (sig, SIG_ACK);
+#endif
+
+#if defined (HAVE_KILL)
+ kill (getpid (), sig);
+#else
+ raise (sig); /* assume we have raise */
+#endif
+
+ /* We don't need to modify the signal mask now that this is not run in
+ a signal handler context. */
+
+ rl_reset_after_signal ();
+ }
+
+ RL_UNSETSTATE(RL_STATE_SIGHANDLER);
+ SIGHANDLER_RETURN;
+}
+
+#if defined (SIGWINCH)
+static void
+rl_sigwinch_handler (int sig)
+{
+ SigHandler *oh;
+
+#if defined (MUST_REINSTALL_SIGHANDLERS)
+ sighandler_cxt dummy_winch;
+
+ /* We don't want to change old_winch -- it holds the state of SIGWINCH
+ disposition set by the calling application. We need this state
+ because we call the application's SIGWINCH handler after updating
+ our own idea of the screen size. */
+ rl_set_sighandler (SIGWINCH, rl_sigwinch_handler, &dummy_winch);
+#endif
+
+ RL_SETSTATE(RL_STATE_SIGHANDLER);
+ _rl_caught_signal = sig;
+
+ /* If another sigwinch handler has been installed, call it. */
+ oh = (SigHandler *)old_winch.sa_handler;
+ if (oh && oh != (SigHandler *)SIG_IGN && oh != (SigHandler *)SIG_DFL)
+ (*oh) (sig);
+
+ RL_UNSETSTATE(RL_STATE_SIGHANDLER);
+ SIGHANDLER_RETURN;
+}
+#endif /* SIGWINCH */
+
+/* Functions to manage signal handling. */
+
+#if !defined (HAVE_POSIX_SIGNALS)
+static int
+rl_sigaction (int sig, sighandler_cxt *nh, sighandler_cxt *oh)
+{
+ oh->sa_handler = signal (sig, nh->sa_handler);
+ return 0;
+}
+#endif /* !HAVE_POSIX_SIGNALS */
+
+/* Set up a readline-specific signal handler, saving the old signal
+ information in OHANDLER. Return the old signal handler, like
+ signal(). */
+static SigHandler *
+rl_set_sighandler (int sig, SigHandler *handler, sighandler_cxt *ohandler)
+{
+ sighandler_cxt old_handler;
+#if defined (HAVE_POSIX_SIGNALS)
+ struct sigaction act;
+
+ act.sa_handler = handler;
+# if defined (SIGWINCH)
+ act.sa_flags = (sig == SIGWINCH) ? SA_RESTART : 0;
+# else
+ act.sa_flags = 0;
+# endif /* SIGWINCH */
+ sigemptyset (&act.sa_mask);
+ sigemptyset (&ohandler->sa_mask);
+ sigaction (sig, &act, &old_handler);
+#else
+ old_handler.sa_handler = (SigHandler *)signal (sig, handler);
+#endif /* !HAVE_POSIX_SIGNALS */
+
+ /* XXX -- assume we have memcpy */
+ /* If rl_set_signals is called twice in a row, don't set the old handler to
+ rl_signal_handler, because that would cause infinite recursion. */
+ if (handler != rl_signal_handler || old_handler.sa_handler != rl_signal_handler)
+ memcpy (ohandler, &old_handler, sizeof (sighandler_cxt));
+
+ return (ohandler->sa_handler);
+}
+
+/* Set disposition of SIG to HANDLER, returning old state in OHANDLER. Don't
+ change disposition if OHANDLER indicates the signal was ignored. */
+static void
+rl_maybe_set_sighandler (int sig, SigHandler *handler, sighandler_cxt *ohandler)
+{
+ sighandler_cxt dummy;
+ SigHandler *oh;
+
+ sigemptyset (&dummy.sa_mask);
+ dummy.sa_flags = 0;
+ oh = rl_set_sighandler (sig, handler, ohandler);
+ if (oh == (SigHandler *)SIG_IGN)
+ rl_sigaction (sig, ohandler, &dummy);
+}
+
+/* Set the disposition of SIG to HANDLER, if HANDLER->sa_handler indicates the
+ signal was not being ignored. MUST only be called for signals whose
+ disposition was changed using rl_maybe_set_sighandler or for which the
+ SIG_IGN check was performed inline (e.g., SIGALRM below). */
+static void
+rl_maybe_restore_sighandler (int sig, sighandler_cxt *handler)
+{
+ sighandler_cxt dummy;
+
+ sigemptyset (&dummy.sa_mask);
+ dummy.sa_flags = 0;
+ if (handler->sa_handler != SIG_IGN)
+ rl_sigaction (sig, handler, &dummy);
+}
+
+int
+rl_set_signals (void)
+{
+ sighandler_cxt dummy;
+ SigHandler *oh;
+#if defined (HAVE_POSIX_SIGNALS)
+ static int sigmask_set = 0;
+ static sigset_t bset, oset;
+#endif
+
+#if defined (HAVE_POSIX_SIGNALS)
+ if (rl_catch_signals && sigmask_set == 0)
+ {
+ sigemptyset (&bset);
+
+ sigaddset (&bset, SIGINT);
+ sigaddset (&bset, SIGTERM);
+#if defined (SIGHUP)
+ sigaddset (&bset, SIGHUP);
+#endif
+#if defined (SIGQUIT)
+ sigaddset (&bset, SIGQUIT);
+#endif
+#if defined (SIGALRM)
+ sigaddset (&bset, SIGALRM);
+#endif
+#if defined (SIGTSTP)
+ sigaddset (&bset, SIGTSTP);
+#endif
+#if defined (SIGTTIN)
+ sigaddset (&bset, SIGTTIN);
+#endif
+#if defined (SIGTTOU)
+ sigaddset (&bset, SIGTTOU);
+#endif
+ sigmask_set = 1;
+ }
+#endif /* HAVE_POSIX_SIGNALS */
+
+ if (rl_catch_signals && signals_set_flag == 0)
+ {
+#if defined (HAVE_POSIX_SIGNALS)
+ sigemptyset (&_rl_orig_sigset);
+ sigprocmask (SIG_BLOCK, &bset, &_rl_orig_sigset);
+#endif
+
+ rl_maybe_set_sighandler (SIGINT, rl_signal_handler, &old_int);
+ rl_maybe_set_sighandler (SIGTERM, rl_signal_handler, &old_term);
+#if defined (SIGHUP)
+ rl_maybe_set_sighandler (SIGHUP, rl_signal_handler, &old_hup);
+#endif
+#if defined (SIGQUIT)
+ rl_maybe_set_sighandler (SIGQUIT, rl_signal_handler, &old_quit);
+#endif
+
+#if defined (SIGALRM)
+ oh = rl_set_sighandler (SIGALRM, rl_signal_handler, &old_alrm);
+ if (oh == (SigHandler *)SIG_IGN)
+ rl_sigaction (SIGALRM, &old_alrm, &dummy);
+#if defined (HAVE_POSIX_SIGNALS) && defined (SA_RESTART)
+ /* If the application using readline has already installed a signal
+ handler with SA_RESTART, SIGALRM will cause reads to be restarted
+ automatically, so readline should just get out of the way. Since
+ we tested for SIG_IGN above, we can just test for SIG_DFL here. */
+ if (oh != (SigHandler *)SIG_DFL && (old_alrm.sa_flags & SA_RESTART))
+ rl_sigaction (SIGALRM, &old_alrm, &dummy);
+#endif /* HAVE_POSIX_SIGNALS */
+#endif /* SIGALRM */
+
+#if defined (SIGTSTP)
+ rl_maybe_set_sighandler (SIGTSTP, rl_signal_handler, &old_tstp);
+#endif /* SIGTSTP */
+
+#if defined (SIGTTOU)
+ rl_maybe_set_sighandler (SIGTTOU, rl_signal_handler, &old_ttou);
+#endif /* SIGTTOU */
+
+#if defined (SIGTTIN)
+ rl_maybe_set_sighandler (SIGTTIN, rl_signal_handler, &old_ttin);
+#endif /* SIGTTIN */
+
+ signals_set_flag = 1;
+
+#if defined (HAVE_POSIX_SIGNALS)
+ sigprocmask (SIG_SETMASK, &_rl_orig_sigset, (sigset_t *)NULL);
+#endif
+ }
+ else if (rl_catch_signals == 0)
+ {
+#if defined (HAVE_POSIX_SIGNALS)
+ sigemptyset (&_rl_orig_sigset);
+ sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &_rl_orig_sigset);
+#endif
+ }
+
+#if defined (SIGWINCH)
+ if (rl_catch_sigwinch && sigwinch_set_flag == 0)
+ {
+ rl_maybe_set_sighandler (SIGWINCH, rl_sigwinch_handler, &old_winch);
+ sigwinch_set_flag = 1;
+ }
+#endif /* SIGWINCH */
+
+ return 0;
+}
+
+int
+rl_clear_signals (void)
+{
+ sighandler_cxt dummy;
+
+ if (rl_catch_signals && signals_set_flag == 1)
+ {
+ /* Since rl_maybe_set_sighandler doesn't override a SIG_IGN handler,
+ we should in theory not have to restore a handler where
+ old_xxx.sa_handler == SIG_IGN. That's what rl_maybe_restore_sighandler
+ does. Fewer system calls should reduce readline's per-line
+ overhead */
+ rl_maybe_restore_sighandler (SIGINT, &old_int);
+ rl_maybe_restore_sighandler (SIGTERM, &old_term);
+#if defined (SIGHUP)
+ rl_maybe_restore_sighandler (SIGHUP, &old_hup);
+#endif
+#if defined (SIGQUIT)
+ rl_maybe_restore_sighandler (SIGQUIT, &old_quit);
+#endif
+#if defined (SIGALRM)
+ rl_maybe_restore_sighandler (SIGALRM, &old_alrm);
+#endif
+
+#if defined (SIGTSTP)
+ rl_maybe_restore_sighandler (SIGTSTP, &old_tstp);
+#endif /* SIGTSTP */
+
+#if defined (SIGTTOU)
+ rl_maybe_restore_sighandler (SIGTTOU, &old_ttou);
+#endif /* SIGTTOU */
+
+#if defined (SIGTTIN)
+ rl_maybe_restore_sighandler (SIGTTIN, &old_ttin);
+#endif /* SIGTTIN */
+
+ signals_set_flag = 0;
+ }
+
+#if defined (SIGWINCH)
+ if (rl_catch_sigwinch && sigwinch_set_flag == 1)
+ {
+ sigemptyset (&dummy.sa_mask);
+ rl_sigaction (SIGWINCH, &old_winch, &dummy);
+ sigwinch_set_flag = 0;
+ }
+#endif
+
+ return 0;
+}
+
+/* Clean up the terminal and readline state after catching a signal, before
+ resending it to the calling application. */
+void
+rl_cleanup_after_signal (void)
+{
+ _rl_clean_up_for_exit ();
+ if (rl_deprep_term_function)
+ (*rl_deprep_term_function) ();
+ rl_clear_pending_input ();
+ rl_clear_signals ();
+}
+
+/* Reset the terminal and readline state after a signal handler returns. */
+void
+rl_reset_after_signal (void)
+{
+ if (rl_prep_term_function)
+ (*rl_prep_term_function) (_rl_meta_flag);
+ rl_set_signals ();
+}
+
+/* Free up the readline variable line state for the current line (undo list,
+ any partial history entry, any keyboard macros in progress, and any
+ numeric arguments in process) after catching a signal, before calling
+ rl_cleanup_after_signal(). */
+void
+rl_free_line_state (void)
+{
+ register HIST_ENTRY *entry;
+
+ rl_free_undo_list ();
+
+ entry = current_history ();
+ if (entry)
+ entry->data = (char *)NULL;
+
+ _rl_kill_kbd_macro ();
+ rl_clear_message ();
+ _rl_reset_argument ();
+}
+
+int
+rl_pending_signal (void)
+{
+ return (_rl_caught_signal);
+}
+
+void
+rl_check_signals (void)
+{
+ RL_CHECK_SIGNALS ();
+}
+#endif /* HANDLE_SIGNALS */
+
+/* **************************************************************** */
+/* */
+/* SIGINT Management */
+/* */
+/* **************************************************************** */
+
+#if defined (HAVE_POSIX_SIGNALS)
+static sigset_t sigint_set, sigint_oset;
+static sigset_t sigwinch_set, sigwinch_oset;
+#else /* !HAVE_POSIX_SIGNALS */
+# if defined (HAVE_BSD_SIGNALS)
+static int sigint_oldmask;
+static int sigwinch_oldmask;
+# endif /* HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+static int sigint_blocked;
+static int sigwinch_blocked;
+
+/* Cause SIGINT to not be delivered until the corresponding call to
+ release_sigint(). */
+void
+_rl_block_sigint (void)
+{
+ if (sigint_blocked)
+ return;
+
+ sigint_blocked = 1;
+}
+
+/* Allow SIGINT to be delivered. */
+void
+_rl_release_sigint (void)
+{
+ if (sigint_blocked == 0)
+ return;
+
+ sigint_blocked = 0;
+ RL_CHECK_SIGNALS ();
+}
+
+/* Cause SIGWINCH to not be delivered until the corresponding call to
+ release_sigwinch(). */
+void
+_rl_block_sigwinch (void)
+{
+ if (sigwinch_blocked)
+ return;
+
+#if defined (SIGWINCH)
+
+#if defined (HAVE_POSIX_SIGNALS)
+ sigemptyset (&sigwinch_set);
+ sigemptyset (&sigwinch_oset);
+ sigaddset (&sigwinch_set, SIGWINCH);
+ sigprocmask (SIG_BLOCK, &sigwinch_set, &sigwinch_oset);
+#else /* !HAVE_POSIX_SIGNALS */
+# if defined (HAVE_BSD_SIGNALS)
+ sigwinch_oldmask = sigblock (sigmask (SIGWINCH));
+# else /* !HAVE_BSD_SIGNALS */
+# if defined (HAVE_USG_SIGHOLD)
+ sighold (SIGWINCH);
+# endif /* HAVE_USG_SIGHOLD */
+# endif /* !HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+#endif /* SIGWINCH */
+
+ sigwinch_blocked = 1;
+}
+
+/* Allow SIGWINCH to be delivered. */
+void
+_rl_release_sigwinch (void)
+{
+ if (sigwinch_blocked == 0)
+ return;
+
+#if defined (SIGWINCH)
+
+#if defined (HAVE_POSIX_SIGNALS)
+ sigprocmask (SIG_SETMASK, &sigwinch_oset, (sigset_t *)NULL);
+#else
+# if defined (HAVE_BSD_SIGNALS)
+ sigsetmask (sigwinch_oldmask);
+# else /* !HAVE_BSD_SIGNALS */
+# if defined (HAVE_USG_SIGHOLD)
+ sigrelse (SIGWINCH);
+# endif /* HAVE_USG_SIGHOLD */
+# endif /* !HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+#endif /* SIGWINCH */
+
+ sigwinch_blocked = 0;
+}
+
+/* **************************************************************** */
+/* */
+/* Echoing special control characters */
+/* */
+/* **************************************************************** */
+void
+rl_echo_signal_char (int sig)
+{
+ char cstr[3];
+ int cslen, c;
+
+ if (_rl_echoctl == 0 || _rl_echo_control_chars == 0)
+ return;
+
+ switch (sig)
+ {
+ case SIGINT: c = _rl_intr_char; break;
+#if defined (SIGQUIT)
+ case SIGQUIT: c = _rl_quit_char; break;
+#endif
+#if defined (SIGTSTP)
+ case SIGTSTP: c = _rl_susp_char; break;
+#endif
+ default: return;
+ }
+
+ if (CTRL_CHAR (c) || c == RUBOUT)
+ {
+ cstr[0] = '^';
+ cstr[1] = CTRL_CHAR (c) ? UNCTRL (c) : '?';
+ cstr[cslen = 2] = '\0';
+ }
+ else
+ {
+ cstr[0] = c;
+ cstr[cslen = 1] = '\0';
+ }
+
+ _rl_output_some_chars (cstr, cslen);
+}
diff --git a/support/config.guess b/support/config.guess
new file mode 100644
index 0000000..7f76b62
--- /dev/null
+++ b/support/config.guess
@@ -0,0 +1,1754 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright 1992-2022 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2022-01-09'
+
+# This file 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 <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2022 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+# Just in case it came from the environment.
+GUESS=
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+ # prevent multiple calls if $tmp is already set
+ test "$tmp" && return 0
+ : "${TMPDIR=/tmp}"
+ # shellcheck disable=SC2039,SC3028
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+ dummy=$tmp/dummy
+ case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+ ,,) echo "int x;" > "$dummy.c"
+ for driver in cc gcc c89 c99 ; do
+ if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+ CC_FOR_BUILD=$driver
+ break
+ fi
+ done
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+ esac
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case $UNAME_SYSTEM in
+Linux|GNU|GNU/*)
+ LIBC=unknown
+
+ set_cc_for_build
+ cat <<-EOF > "$dummy.c"
+ #include <features.h>
+ #if defined(__UCLIBC__)
+ LIBC=uclibc
+ #elif defined(__dietlibc__)
+ LIBC=dietlibc
+ #elif defined(__GLIBC__)
+ LIBC=gnu
+ #else
+ #include <stdarg.h>
+ /* First heuristic to detect musl libc. */
+ #ifdef __DEFINED_va_list
+ LIBC=musl
+ #endif
+ #endif
+ EOF
+ cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+ eval "$cc_set_libc"
+
+ # Second heuristic to detect musl libc.
+ if [ "$LIBC" = unknown ] &&
+ command -v ldd >/dev/null &&
+ ldd --version 2>&1 | grep -q ^musl; then
+ LIBC=musl
+ fi
+
+ # If the system lacks a compiler, then just pick glibc.
+ # We could probably try harder.
+ if [ "$LIBC" = unknown ]; then
+ LIBC=gnu
+ fi
+ ;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ echo unknown)`
+ case $UNAME_MACHINE_ARCH in
+ aarch64eb) machine=aarch64_be-unknown ;;
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ earmv*)
+ arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+ endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+ machine=${arch}${endian}-unknown
+ ;;
+ *) machine=$UNAME_MACHINE_ARCH-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently (or will in the future) and ABI.
+ case $UNAME_MACHINE_ARCH in
+ earm*)
+ os=netbsdelf
+ ;;
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # Determine ABI tags.
+ case $UNAME_MACHINE_ARCH in
+ earm*)
+ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+ abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case $UNAME_VERSION in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ GUESS=$machine-${os}${release}${abi-}
+ ;;
+ *:Bitrig:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE
+ ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE
+ ;;
+ *:SecBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE
+ ;;
+ *:LibertyBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE
+ ;;
+ *:MidnightBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE
+ ;;
+ *:ekkoBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE
+ ;;
+ *:SolidBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE
+ ;;
+ *:OS108:*:*)
+ GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE
+ ;;
+ macppc:MirBSD:*:*)
+ GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE
+ ;;
+ *:MirBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE
+ ;;
+ *:Sortix:*:*)
+ GUESS=$UNAME_MACHINE-unknown-sortix
+ ;;
+ *:Twizzler:*:*)
+ GUESS=$UNAME_MACHINE-unknown-twizzler
+ ;;
+ *:Redox:*:*)
+ GUESS=$UNAME_MACHINE-unknown-redox
+ ;;
+ mips:OSF1:*.*)
+ GUESS=mips-dec-osf1
+ ;;
+ alpha:OSF1:*:*)
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ trap '' 0
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case $ALPHA_CPU_TYPE in
+ "EV4 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE=alpha ;;
+ "EV5 (21164)")
+ UNAME_MACHINE=alphaev5 ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE=alphaev56 ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE=alphapca56 ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE=alphapca57 ;;
+ "EV6 (21264)")
+ UNAME_MACHINE=alphaev6 ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE=alphaev67 ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE=alphaev69 ;;
+ "EV7 (21364)")
+ UNAME_MACHINE=alphaev7 ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE=alphaev79 ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ GUESS=$UNAME_MACHINE-dec-osf$OSF_REL
+ ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ GUESS=m68k-unknown-sysv4
+ ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ GUESS=$UNAME_MACHINE-unknown-amigaos
+ ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ GUESS=$UNAME_MACHINE-unknown-morphos
+ ;;
+ *:OS/390:*:*)
+ GUESS=i370-ibm-openedition
+ ;;
+ *:z/VM:*:*)
+ GUESS=s390-ibm-zvmoe
+ ;;
+ *:OS400:*:*)
+ GUESS=powerpc-ibm-os400
+ ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ GUESS=arm-acorn-riscix$UNAME_RELEASE
+ ;;
+ arm*:riscos:*:*|arm*:RISCOS:*:*)
+ GUESS=arm-unknown-riscos
+ ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ GUESS=hppa1.1-hitachi-hiuxmpp
+ ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ case `(/bin/universe) 2>/dev/null` in
+ att) GUESS=pyramid-pyramid-sysv3 ;;
+ *) GUESS=pyramid-pyramid-bsd ;;
+ esac
+ ;;
+ NILE*:*:*:dcosx)
+ GUESS=pyramid-pyramid-svr4
+ ;;
+ DRS?6000:unix:4.0:6*)
+ GUESS=sparc-icl-nx6
+ ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) GUESS=sparc-icl-nx7 ;;
+ esac
+ ;;
+ s390x:SunOS:*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL
+ ;;
+ sun4H:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-hal-solaris2$SUN_REL
+ ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris2$SUN_REL
+ ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ GUESS=i386-pc-auroraux$UNAME_RELEASE
+ ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ set_cc_for_build
+ SUN_ARCH=i386
+ # If there is a compiler, see if it is configured for 64-bit objects.
+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ # This test works for both compilers.
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH=x86_64
+ fi
+ fi
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$SUN_ARCH-pc-solaris2$SUN_REL
+ ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris3$SUN_REL
+ ;;
+ sun4*:SunOS:*:*)
+ case `/usr/bin/arch -k` in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
+ GUESS=sparc-sun-sunos$SUN_REL
+ ;;
+ sun3*:SunOS:*:*)
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+ case `/bin/arch` in
+ sun3)
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
+ sun4)
+ GUESS=sparc-sun-sunos$UNAME_RELEASE
+ ;;
+ esac
+ ;;
+ aushp:SunOS:*:*)
+ GUESS=sparc-auspex-sunos$UNAME_RELEASE
+ ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ GUESS=m68k-milan-mint$UNAME_RELEASE
+ ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ GUESS=m68k-hades-mint$UNAME_RELEASE
+ ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ GUESS=m68k-unknown-mint$UNAME_RELEASE
+ ;;
+ m68k:machten:*:*)
+ GUESS=m68k-apple-machten$UNAME_RELEASE
+ ;;
+ powerpc:machten:*:*)
+ GUESS=powerpc-apple-machten$UNAME_RELEASE
+ ;;
+ RISC*:Mach:*:*)
+ GUESS=mips-dec-mach_bsd4.3
+ ;;
+ RISC*:ULTRIX:*:*)
+ GUESS=mips-dec-ultrix$UNAME_RELEASE
+ ;;
+ VAX*:ULTRIX*:*:*)
+ GUESS=vax-dec-ultrix$UNAME_RELEASE
+ ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ GUESS=clipper-intergraph-clix$UNAME_RELEASE
+ ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+ dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ GUESS=mips-mips-riscos$UNAME_RELEASE
+ ;;
+ Motorola:PowerMAX_OS:*:*)
+ GUESS=powerpc-motorola-powermax
+ ;;
+ Motorola:*:4.3:PL8-*)
+ GUESS=powerpc-harris-powermax
+ ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ GUESS=powerpc-harris-powermax
+ ;;
+ Night_Hawk:Power_UNIX:*:*)
+ GUESS=powerpc-harris-powerunix
+ ;;
+ m88k:CX/UX:7*:*)
+ GUESS=m88k-harris-cxux7
+ ;;
+ m88k:*:4*:R4*)
+ GUESS=m88k-motorola-sysv4
+ ;;
+ m88k:*:3*:R3*)
+ GUESS=m88k-motorola-sysv3
+ ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
+ then
+ if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+ test "$TARGET_BINARY_INTERFACE"x = x
+ then
+ GUESS=m88k-dg-dgux$UNAME_RELEASE
+ else
+ GUESS=m88k-dg-dguxbcs$UNAME_RELEASE
+ fi
+ else
+ GUESS=i586-dg-dgux$UNAME_RELEASE
+ fi
+ ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ GUESS=m88k-dolphin-sysv3
+ ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ GUESS=m88k-motorola-sysv3
+ ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ GUESS=m88k-tektronix-sysv3
+ ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ GUESS=m68k-tektronix-bsd
+ ;;
+ *:IRIX*:*:*)
+ IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'`
+ GUESS=mips-sgi-irix$IRIX_REL
+ ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ GUESS=i386-ibm-aix
+ ;;
+ ia64:AIX:*:*)
+ if test -x /usr/bin/oslevel ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+ fi
+ GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV
+ ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
+ then
+ GUESS=$SYSTEM_NAME
+ else
+ GUESS=rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ GUESS=rs6000-ibm-aix3.2.4
+ else
+ GUESS=rs6000-ibm-aix3.2
+ fi
+ ;;
+ *:AIX:*:[4567])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if test -x /usr/bin/lslpp ; then
+ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+ else
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+ fi
+ GUESS=$IBM_ARCH-ibm-aix$IBM_REV
+ ;;
+ *:AIX:*:*)
+ GUESS=rs6000-ibm-aix
+ ;;
+ ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+ GUESS=romp-ibm-bsd4.4
+ ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to
+ ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ GUESS=rs6000-bull-bosx
+ ;;
+ DPX/2?00:B.O.S.:*:*)
+ GUESS=m68k-bull-sysv3
+ ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ GUESS=m68k-hp-bsd
+ ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ GUESS=m68k-hp-bsd4.4
+ ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ case $UNAME_MACHINE in
+ 9000/31?) HP_ARCH=m68000 ;;
+ 9000/[34]??) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if test -x /usr/bin/getconf; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case $sc_cpu_version in
+ 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case $sc_kernel_bits in
+ 32) HP_ARCH=hppa2.0n ;;
+ 64) HP_ARCH=hppa2.0w ;;
+ '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if test "$HP_ARCH" = ""; then
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if test "$HP_ARCH" = hppa2.0w
+ then
+ set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep -q __LP64__
+ then
+ HP_ARCH=hppa2.0w
+ else
+ HP_ARCH=hppa64
+ fi
+ fi
+ GUESS=$HP_ARCH-hp-hpux$HPUX_REV
+ ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ GUESS=ia64-hp-hpux$HPUX_REV
+ ;;
+ 3050*:HI-UX:*:*)
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ GUESS=unknown-hitachi-hiuxwe2
+ ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+ GUESS=hppa1.1-hp-bsd
+ ;;
+ 9000/8??:4.3bsd:*:*)
+ GUESS=hppa1.0-hp-bsd
+ ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ GUESS=hppa1.0-hp-mpeix
+ ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+ GUESS=hppa1.1-hp-osf
+ ;;
+ hp8??:OSF1:*:*)
+ GUESS=hppa1.0-hp-osf
+ ;;
+ i*86:OSF1:*:*)
+ if test -x /usr/sbin/sysversion ; then
+ GUESS=$UNAME_MACHINE-unknown-osf1mk
+ else
+ GUESS=$UNAME_MACHINE-unknown-osf1
+ fi
+ ;;
+ parisc*:Lites*:*:*)
+ GUESS=hppa1.1-hp-lites
+ ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ GUESS=c1-convex-bsd
+ ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ GUESS=c34-convex-bsd
+ ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ GUESS=c38-convex-bsd
+ ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ GUESS=c4-convex-bsd
+ ;;
+ CRAY*Y-MP:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=ymp-cray-unicos$CRAY_REL
+ ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=t90-cray-unicos$CRAY_REL
+ ;;
+ CRAY*T3E:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=alphaev5-cray-unicosmk$CRAY_REL
+ ;;
+ CRAY*SV1:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=sv1-cray-unicos$CRAY_REL
+ ;;
+ *:UNICOS/mp:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=craynv-cray-unicosmp$CRAY_REL
+ ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+ GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+ GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE
+ ;;
+ sparc*:BSD/OS:*:*)
+ GUESS=sparc-unknown-bsdi$UNAME_RELEASE
+ ;;
+ *:BSD/OS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE
+ ;;
+ arm:FreeBSD:*:*)
+ UNAME_PROCESSOR=`uname -p`
+ set_cc_for_build
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi
+ else
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf
+ fi
+ ;;
+ *:FreeBSD:*:*)
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ case $UNAME_PROCESSOR in
+ amd64)
+ UNAME_PROCESSOR=x86_64 ;;
+ i386)
+ UNAME_PROCESSOR=i586 ;;
+ esac
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL
+ ;;
+ i*:CYGWIN*:*)
+ GUESS=$UNAME_MACHINE-pc-cygwin
+ ;;
+ *:MINGW64*:*)
+ GUESS=$UNAME_MACHINE-pc-mingw64
+ ;;
+ *:MINGW*:*)
+ GUESS=$UNAME_MACHINE-pc-mingw32
+ ;;
+ *:MSYS*:*)
+ GUESS=$UNAME_MACHINE-pc-msys
+ ;;
+ i*:PW*:*)
+ GUESS=$UNAME_MACHINE-pc-pw32
+ ;;
+ *:SerenityOS:*:*)
+ GUESS=$UNAME_MACHINE-pc-serenity
+ ;;
+ *:Interix*:*)
+ case $UNAME_MACHINE in
+ x86)
+ GUESS=i586-pc-interix$UNAME_RELEASE
+ ;;
+ authenticamd | genuineintel | EM64T)
+ GUESS=x86_64-unknown-interix$UNAME_RELEASE
+ ;;
+ IA64)
+ GUESS=ia64-unknown-interix$UNAME_RELEASE
+ ;;
+ esac ;;
+ i*:UWIN*:*)
+ GUESS=$UNAME_MACHINE-pc-uwin
+ ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ GUESS=x86_64-pc-cygwin
+ ;;
+ prep*:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=powerpcle-unknown-solaris2$SUN_REL
+ ;;
+ *:GNU:*:*)
+ # the GNU system
+ GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'`
+ GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL
+ ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
+ ;;
+ *:Minix:*:*)
+ GUESS=$UNAME_MACHINE-unknown-minix
+ ;;
+ aarch64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ aarch64_be:Linux:*:*)
+ UNAME_MACHINE=aarch64_be
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep -q ld.so.1
+ if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arm*:Linux:*:*)
+ set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ else
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi
+ else
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf
+ fi
+ fi
+ ;;
+ avr32*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ cris:Linux:*:*)
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
+ crisv32:Linux:*:*)
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
+ e2k:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ frv:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ hexagon:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ i*86:Linux:*:*)
+ GUESS=$UNAME_MACHINE-pc-linux-$LIBC
+ ;;
+ ia64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ k1om:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ m32r*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ m68*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ set_cc_for_build
+ IS_GLIBC=0
+ test x"${LIBC}" = xgnu && IS_GLIBC=1
+ sed 's/^ //' << EOF > "$dummy.c"
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #undef mips64
+ #undef mips64el
+ #if ${IS_GLIBC} && defined(_ABI64)
+ LIBCABI=gnuabi64
+ #else
+ #if ${IS_GLIBC} && defined(_ABIN32)
+ LIBCABI=gnuabin32
+ #else
+ LIBCABI=${LIBC}
+ #endif
+ #endif
+
+ #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa64r6
+ #else
+ #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa32r6
+ #else
+ #if defined(__mips64)
+ CPU=mips64
+ #else
+ CPU=mips
+ #endif
+ #endif
+ #endif
+
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ MIPS_ENDIAN=el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ MIPS_ENDIAN=
+ #else
+ MIPS_ENDIAN=
+ #endif
+ #endif
+EOF
+ cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`
+ eval "$cc_set_vars"
+ test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+ ;;
+ mips64el:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ openrisc*:Linux:*:*)
+ GUESS=or1k-unknown-linux-$LIBC
+ ;;
+ or32:Linux:*:* | or1k*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ padre:Linux:*:*)
+ GUESS=sparc-unknown-linux-$LIBC
+ ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ GUESS=hppa64-unknown-linux-$LIBC
+ ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;
+ PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;
+ *) GUESS=hppa-unknown-linux-$LIBC ;;
+ esac
+ ;;
+ ppc64:Linux:*:*)
+ GUESS=powerpc64-unknown-linux-$LIBC
+ ;;
+ ppc:Linux:*:*)
+ GUESS=powerpc-unknown-linux-$LIBC
+ ;;
+ ppc64le:Linux:*:*)
+ GUESS=powerpc64le-unknown-linux-$LIBC
+ ;;
+ ppcle:Linux:*:*)
+ GUESS=powerpcle-unknown-linux-$LIBC
+ ;;
+ riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ GUESS=$UNAME_MACHINE-ibm-linux-$LIBC
+ ;;
+ sh64*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ sh*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ tile*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ vax:Linux:*:*)
+ GUESS=$UNAME_MACHINE-dec-linux-$LIBC
+ ;;
+ x86_64:Linux:*:*)
+ set_cc_for_build
+ LIBCABI=$LIBC
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_X32 >/dev/null
+ then
+ LIBCABI=${LIBC}x32
+ fi
+ fi
+ GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI
+ ;;
+ xtensa*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ GUESS=i386-sequent-sysv4
+ ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
+ ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ GUESS=$UNAME_MACHINE-pc-os2-emx
+ ;;
+ i*86:XTS-300:*:STOP)
+ GUESS=$UNAME_MACHINE-unknown-stop
+ ;;
+ i*86:atheos:*:*)
+ GUESS=$UNAME_MACHINE-unknown-atheos
+ ;;
+ i*86:syllable:*:*)
+ GUESS=$UNAME_MACHINE-pc-syllable
+ ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ GUESS=i386-unknown-lynxos$UNAME_RELEASE
+ ;;
+ i*86:*DOS:*:*)
+ GUESS=$UNAME_MACHINE-pc-msdosdjgpp
+ ;;
+ i*86:*:4.*:*)
+ UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL
+ else
+ GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL
+ fi
+ ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ GUESS=$UNAME_MACHINE-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL
+ else
+ GUESS=$UNAME_MACHINE-pc-sysv32
+ fi
+ ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
+ # Note: whatever this is, it MUST be the same as what config.sub
+ # prints for the "djgpp" host, or else GDB configure will decide that
+ # this is a cross-build.
+ GUESS=i586-pc-msdosdjgpp
+ ;;
+ Intel:Mach:3*:*)
+ GUESS=i386-pc-mach3
+ ;;
+ paragon:*:*:*)
+ GUESS=i860-intel-osf1
+ ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4
+ fi
+ ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ GUESS=m68010-convergent-sysv
+ ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ GUESS=m68k-convergent-sysv
+ ;;
+ M680?0:D-NIX:5.3:*)
+ GUESS=m68k-diab-dnix
+ ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+ OS_REL='.3'
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ GUESS=m68k-unknown-lynxos$UNAME_RELEASE
+ ;;
+ mc68030:UNIX_System_V:4.*:*)
+ GUESS=m68k-atari-sysv4
+ ;;
+ TSUNAMI:LynxOS:2.*:*)
+ GUESS=sparc-unknown-lynxos$UNAME_RELEASE
+ ;;
+ rs6000:LynxOS:2.*:*)
+ GUESS=rs6000-unknown-lynxos$UNAME_RELEASE
+ ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ GUESS=powerpc-unknown-lynxos$UNAME_RELEASE
+ ;;
+ SM[BE]S:UNIX_SV:*:*)
+ GUESS=mips-dde-sysv$UNAME_RELEASE
+ ;;
+ RM*:ReliantUNIX-*:*:*)
+ GUESS=mips-sni-sysv4
+ ;;
+ RM*:SINIX-*:*:*)
+ GUESS=mips-sni-sysv4
+ ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ GUESS=$UNAME_MACHINE-sni-sysv4
+ else
+ GUESS=ns32k-sni-sysv
+ fi
+ ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ GUESS=i586-unisys-sysv4
+ ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ GUESS=hppa1.1-stratus-sysv4
+ ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ GUESS=i860-stratus-sysv4
+ ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ GUESS=$UNAME_MACHINE-stratus-vos
+ ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ GUESS=hppa1.1-stratus-vos
+ ;;
+ mc68*:A/UX:*:*)
+ GUESS=m68k-apple-aux$UNAME_RELEASE
+ ;;
+ news*:NEWS-OS:6*:*)
+ GUESS=mips-sony-newsos6
+ ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if test -d /usr/nec; then
+ GUESS=mips-nec-sysv$UNAME_RELEASE
+ else
+ GUESS=mips-unknown-sysv$UNAME_RELEASE
+ fi
+ ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ GUESS=powerpc-be-beos
+ ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ GUESS=powerpc-apple-beos
+ ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ GUESS=i586-pc-beos
+ ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ GUESS=i586-pc-haiku
+ ;;
+ x86_64:Haiku:*:*)
+ GUESS=x86_64-unknown-haiku
+ ;;
+ SX-4:SUPER-UX:*:*)
+ GUESS=sx4-nec-superux$UNAME_RELEASE
+ ;;
+ SX-5:SUPER-UX:*:*)
+ GUESS=sx5-nec-superux$UNAME_RELEASE
+ ;;
+ SX-6:SUPER-UX:*:*)
+ GUESS=sx6-nec-superux$UNAME_RELEASE
+ ;;
+ SX-7:SUPER-UX:*:*)
+ GUESS=sx7-nec-superux$UNAME_RELEASE
+ ;;
+ SX-8:SUPER-UX:*:*)
+ GUESS=sx8-nec-superux$UNAME_RELEASE
+ ;;
+ SX-8R:SUPER-UX:*:*)
+ GUESS=sx8r-nec-superux$UNAME_RELEASE
+ ;;
+ SX-ACE:SUPER-UX:*:*)
+ GUESS=sxace-nec-superux$UNAME_RELEASE
+ ;;
+ Power*:Rhapsody:*:*)
+ GUESS=powerpc-apple-rhapsody$UNAME_RELEASE
+ ;;
+ *:Rhapsody:*:*)
+ GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE
+ ;;
+ arm64:Darwin:*:*)
+ GUESS=aarch64-apple-darwin$UNAME_RELEASE
+ ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p`
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ if command -v xcode-select > /dev/null 2> /dev/null && \
+ ! xcode-select --print-path > /dev/null 2> /dev/null ; then
+ # Avoid executing cc if there is no toolchain installed as
+ # cc will be a stub that puts up a graphical alert
+ # prompting the user to install developer tools.
+ CC_FOR_BUILD=no_compiler_found
+ else
+ set_cc_for_build
+ fi
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
+ # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+ if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_PPC >/dev/null
+ then
+ UNAME_PROCESSOR=powerpc
+ fi
+ elif test "$UNAME_PROCESSOR" = i386 ; then
+ # uname -m returns i386 or x86_64
+ UNAME_PROCESSOR=$UNAME_MACHINE
+ fi
+ GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE
+ ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = x86; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE
+ ;;
+ *:QNX:*:4*)
+ GUESS=i386-pc-qnx
+ ;;
+ NEO-*:NONSTOP_KERNEL:*:*)
+ GUESS=neo-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSE-*:NONSTOP_KERNEL:*:*)
+ GUESS=nse-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSR-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsr-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSV-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsv-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSX-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsx-tandem-nsk$UNAME_RELEASE
+ ;;
+ *:NonStop-UX:*:*)
+ GUESS=mips-compaq-nonstopux
+ ;;
+ BS2000:POSIX*:*:*)
+ GUESS=bs2000-siemens-sysv
+ ;;
+ DS/*:UNIX_System_V:*:*)
+ GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE
+ ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "${cputype-}" = 386; then
+ UNAME_MACHINE=i386
+ elif test "x${cputype-}" != x; then
+ UNAME_MACHINE=$cputype
+ fi
+ GUESS=$UNAME_MACHINE-unknown-plan9
+ ;;
+ *:TOPS-10:*:*)
+ GUESS=pdp10-unknown-tops10
+ ;;
+ *:TENEX:*:*)
+ GUESS=pdp10-unknown-tenex
+ ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ GUESS=pdp10-dec-tops20
+ ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ GUESS=pdp10-xkl-tops20
+ ;;
+ *:TOPS-20:*:*)
+ GUESS=pdp10-unknown-tops20
+ ;;
+ *:ITS:*:*)
+ GUESS=pdp10-unknown-its
+ ;;
+ SEI:*:*:SEIUX)
+ GUESS=mips-sei-seiux$UNAME_RELEASE
+ ;;
+ *:DragonFly:*:*)
+ DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL
+ ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case $UNAME_MACHINE in
+ A*) GUESS=alpha-dec-vms ;;
+ I*) GUESS=ia64-dec-vms ;;
+ V*) GUESS=vax-dec-vms ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ GUESS=i386-pc-xenix
+ ;;
+ i*86:skyos:*:*)
+ SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`
+ GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL
+ ;;
+ i*86:rdos:*:*)
+ GUESS=$UNAME_MACHINE-pc-rdos
+ ;;
+ i*86:Fiwix:*:*)
+ GUESS=$UNAME_MACHINE-pc-fiwix
+ ;;
+ *:AROS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-aros
+ ;;
+ x86_64:VMkernel:*:*)
+ GUESS=$UNAME_MACHINE-unknown-esx
+ ;;
+ amd64:Isilon\ OneFS:*:*)
+ GUESS=x86_64-unknown-onefs
+ ;;
+ *:Unleashed:*:*)
+ GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
+ ;;
+esac
+
+# Do we have a guess based on uname results?
+if test "x$GUESS" != x; then
+ echo "$GUESS"
+ exit
+fi
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+ printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+ printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname un;
+ uname (&un);
+ printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname *un;
+ uname (&un);
+ printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
+echo "$0: unable to guess system type" >&2
+
+case $UNAME_MACHINE:$UNAME_SYSTEM in
+ mips:Linux | mips64:Linux)
+ # If we got here on MIPS GNU/Linux, output extra information.
+ cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+ ;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+and
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
+
+our_year=`echo $timestamp | sed 's,-.*,,'`
+thisyear=`date +%Y`
+# shellcheck disable=SC2003
+script_age=`expr "$thisyear" - "$our_year"`
+if test "$script_age" -lt 3 ; then
+ cat >&2 <<EOF
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+fi
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/support/config.rpath b/support/config.rpath
new file mode 100644
index 0000000..fc5913d
--- /dev/null
+++ b/support/config.rpath
@@ -0,0 +1,684 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+# Copyright 1996-2018 Free Software Foundation, Inc.
+# Taken from GNU libtool, 2001
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+# than 256 bytes, otherwise the compiler driver will dump core. The only
+# known workaround is to choose shorter directory names for the build
+# directory and/or the installation directory.
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's _LT_CC_BASENAME.
+
+for cc_temp in $CC""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
+
+# Code taken from libtool.m4's _LT_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+ wl='-Wl,'
+else
+ case "$host_os" in
+ aix*)
+ wl='-Wl,'
+ ;;
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ wl='-Wl,'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ wl='-Wl,'
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ case $cc_basename in
+ ecc*)
+ wl='-Wl,'
+ ;;
+ icc* | ifort*)
+ wl='-Wl,'
+ ;;
+ lf95*)
+ wl='-Wl,'
+ ;;
+ nagfor*)
+ wl='-Wl,-Wl,,'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ wl='-Wl,'
+ ;;
+ ccc*)
+ wl='-Wl,'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ wl='-Wl,'
+ ;;
+ como)
+ wl='-lopt='
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ F* | *Sun*Fortran*)
+ wl=
+ ;;
+ *Sun\ C*)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ newsos6)
+ ;;
+ *nto* | *qnx*)
+ ;;
+ osf3* | osf4* | osf5*)
+ wl='-Wl,'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ wl='-Qoption ld '
+ ;;
+ *)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ sunos4*)
+ wl='-Qoption ld '
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ wl='-Wl,'
+ ;;
+ sysv4*MP*)
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ wl='-Wl,'
+ ;;
+ unicos*)
+ wl='-Wl,'
+ ;;
+ uts4*)
+ ;;
+ esac
+fi
+
+# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ # Unlike libtool, we use -rpath here, not --rpath, since the documented
+ # option of GNU ld is called -rpath, not --rpath.
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ case "$host_os" in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ fi
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc)
+ ;;
+ m68k)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ haiku*)
+ ;;
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ netbsd*)
+ ;;
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+ sunos4*)
+ hardcode_direct=yes
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ if test "$ld_shlibs" = no; then
+ hardcode_libdir_flag_spec=
+ fi
+else
+ case "$host_os" in
+ aix3*)
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ else
+ aix_use_runtimelinking=no
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+ fi
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ fi
+ # Begin _LT_AC_SYS_LIBPATH_AIX.
+ echo 'int main () { return 0; }' > conftest.c
+ ${CC} ${LDFLAGS} conftest.c -o conftest
+ aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ fi
+ if test -z "$aix_libpath"; then
+ aix_libpath="/usr/lib:/lib"
+ fi
+ rm -f conftest.c conftest
+ # End _LT_AC_SYS_LIBPATH_AIX.
+ if test "$aix_use_runtimelinking" = yes; then
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ else
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ fi
+ fi
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc)
+ ;;
+ m68k)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+ bsdi[45]*)
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ libext=lib
+ ;;
+ darwin* | rhapsody*)
+ hardcode_direct=no
+ if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ dgux*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ freebsd2.[01]*)
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ freebsd* | dragonfly*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ hpux9*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ hpux10*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+ hpux11*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ ;;
+ *)
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+ irix5* | irix6* | nonstopux*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ netbsd*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ newsos6)
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ *nto* | *qnx*)
+ ;;
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ else
+ case "$host_os" in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ osf3*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ osf4* | osf5*)
+ if test "$GCC" = yes; then
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ # Both cc and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+ solaris*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ sunos4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ sysv4)
+ case $host_vendor in
+ sni)
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ hardcode_direct=no
+ ;;
+ motorola)
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ ;;
+ sysv4.3*)
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ ld_shlibs=yes
+ fi
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ ;;
+ sysv5* | sco3.2v5* | sco5v6*)
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator=':'
+ ;;
+ uts4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec= # the last element of library_names_spec in libtool.m4
+libname_spec='lib$name'
+case "$host_os" in
+ aix3*)
+ library_names_spec='$libname.a'
+ ;;
+ aix[4-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc*)
+ library_names_spec='$libname$shrext' ;;
+ m68k)
+ library_names_spec='$libname.a' ;;
+ esac
+ ;;
+ beos*)
+ library_names_spec='$libname$shrext'
+ ;;
+ bsdi[45]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ shrext=.dll
+ library_names_spec='$libname.dll.a $libname.lib'
+ ;;
+ darwin* | rhapsody*)
+ shrext=.dylib
+ library_names_spec='$libname$shrext'
+ ;;
+ dgux*)
+ library_names_spec='$libname$shrext'
+ ;;
+ freebsd[23].*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ freebsd* | dragonfly*)
+ library_names_spec='$libname$shrext'
+ ;;
+ gnu*)
+ library_names_spec='$libname$shrext'
+ ;;
+ haiku*)
+ library_names_spec='$libname$shrext'
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $host_cpu in
+ ia64*)
+ shrext=.so
+ ;;
+ hppa*64*)
+ shrext=.sl
+ ;;
+ *)
+ shrext=.sl
+ ;;
+ esac
+ library_names_spec='$libname$shrext'
+ ;;
+ interix[3-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ library_names_spec='$libname$shrext'
+ case "$host_os" in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+ *) libsuff= shlibsuff= ;;
+ esac
+ ;;
+ esac
+ ;;
+ linux*oldld* | linux*aout* | linux*coff*)
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ knetbsd*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ netbsd*)
+ library_names_spec='$libname$shrext'
+ ;;
+ newsos6)
+ library_names_spec='$libname$shrext'
+ ;;
+ *nto* | *qnx*)
+ library_names_spec='$libname$shrext'
+ ;;
+ openbsd*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ os2*)
+ libname_spec='$name'
+ shrext=.dll
+ library_names_spec='$libname.a'
+ ;;
+ osf3* | osf4* | osf5*)
+ library_names_spec='$libname$shrext'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sunos4*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ sysv4 | sysv4.3*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv4*MP*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ library_names_spec='$libname$shrext'
+ ;;
+ tpf*)
+ library_names_spec='$libname$shrext'
+ ;;
+ uts4*)
+ library_names_spec='$libname$shrext'
+ ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/support/config.sub b/support/config.sub
new file mode 100644
index 0000000..9b62e37
--- /dev/null
+++ b/support/config.sub
@@ -0,0 +1,1890 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright 1992-2021 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2021-12-25'
+
+# This file 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 <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2021 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo "$1"
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Split fields of configuration type
+# shellcheck disable=SC2162
+saved_IFS=$IFS
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+IFS=$saved_IFS
+
+# Separate into logical components for further validation
+case $1 in
+ *-*-*-*-*)
+ echo Invalid configuration \`"$1"\': more than four components >&2
+ exit 1
+ ;;
+ *-*-*-*)
+ basic_machine=$field1-$field2
+ basic_os=$field3-$field4
+ ;;
+ *-*-*)
+ # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+ # parts
+ maybe_os=$field2-$field3
+ case $maybe_os in
+ nto-qnx* | linux-* | uclinux-uclibc* \
+ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+ | storm-chaos* | os2-emx* | rtmk-nova*)
+ basic_machine=$field1
+ basic_os=$maybe_os
+ ;;
+ android-linux)
+ basic_machine=$field1-unknown
+ basic_os=linux-android
+ ;;
+ *)
+ basic_machine=$field1-$field2
+ basic_os=$field3
+ ;;
+ esac
+ ;;
+ *-*)
+ # A lone config we happen to match not fitting any pattern
+ case $field1-$field2 in
+ decstation-3100)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ *-*)
+ # Second component is usually, but not always the OS
+ case $field2 in
+ # Prevent following clause from handling this valid os
+ sun*os*)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ zephyr*)
+ basic_machine=$field1-unknown
+ basic_os=$field2
+ ;;
+ # Manufacturers
+ dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+ | unicom* | ibm* | next | hp | isi* | apollo | altos* \
+ | convergent* | ncr* | news | 32* | 3600* | 3100* \
+ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+ | ultra | tti* | harris | dolphin | highlevel | gould \
+ | cbm | ns | masscomp | apple | axis | knuth | cray \
+ | microblaze* | sim | cisco \
+ | oki | wec | wrs | winbond)
+ basic_machine=$field1-$field2
+ basic_os=
+ ;;
+ *)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ *)
+ # Convert single-component short-hands not valid as part of
+ # multi-component configurations.
+ case $field1 in
+ 386bsd)
+ basic_machine=i386-pc
+ basic_os=bsd
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ basic_os=scout
+ ;;
+ alliant)
+ basic_machine=fx80-alliant
+ basic_os=
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ basic_os=
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ basic_os=bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ basic_os=sysv
+ ;;
+ amiga)
+ basic_machine=m68k-unknown
+ basic_os=
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ basic_os=amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ basic_os=sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ basic_os=sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ basic_os=bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ basic_os=aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ basic_os=aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ basic_os=dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ basic_os=linux
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ basic_os=cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ basic_os=bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ basic_os=bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ basic_os=bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ basic_os=bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ basic_os=bsd
+ ;;
+ cray)
+ basic_machine=j90-cray
+ basic_os=unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ basic_os=
+ ;;
+ da30)
+ basic_machine=m68k-da30
+ basic_os=
+ ;;
+ decstation | pmax | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ basic_os=sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ basic_os=dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ basic_os=msdosdjgpp
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ basic_os=ebmon
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ basic_os=ose
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ basic_os=sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ basic_os=go32
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ basic_os=hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ basic_os=xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ basic_os=hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ basic_os=sysv3
+ ;;
+ hp300 | hp300hpux)
+ basic_machine=m68k-hp
+ basic_os=hpux
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ basic_os=bsd
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ basic_os=osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ basic_os=proelf
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ basic_os=mach
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ basic_os=sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ basic_os=linux
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ basic_os=sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ basic_os=sysv
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ basic_os=mingw64
+ ;;
+ mingw32)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ basic_os=mingw32ce
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ basic_os=morphos
+ ;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ basic_os=moxiebox
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ basic_os=msdos
+ ;;
+ msys)
+ basic_machine=i686-pc
+ basic_os=msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ basic_os=mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ basic_os=nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ basic_os=sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-pc
+ basic_os=netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ basic_os=linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ basic_os=newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ basic_os=newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ basic_os=sysv
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ basic_os=cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ basic_os=cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ basic_os=nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ basic_os=mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ basic_os=nonstopux
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ basic_os=os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ basic_os=ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ basic_os=os68k
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ basic_os=osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ basic_os=linux
+ ;;
+ psp)
+ basic_machine=mipsallegrexel-sony
+ basic_os=psp
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ basic_os=pw32
+ ;;
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ basic_os=rdos
+ ;;
+ rdos32)
+ basic_machine=i386-pc
+ basic_os=rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ sei)
+ basic_machine=mips-sei
+ basic_os=seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ basic_os=
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ basic_os=sysv2
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ basic_os=
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ basic_os=sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ basic_os=
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ basic_os=sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ basic_os=sunos4
+ ;;
+ sun3)
+ basic_machine=m68k-sun
+ basic_os=
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ basic_os=sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ basic_os=sunos4
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ basic_os=
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ basic_os=sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ basic_os=sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ basic_os=solaris2
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ basic_os=
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ basic_os=unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ basic_os=dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ basic_os=unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ basic_os=unicos
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ basic_os=tops20
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ basic_os=tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ basic_os=sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ basic_os=none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ basic_os=sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ basic_os=vms
+ ;;
+ vsta)
+ basic_machine=i386-pc
+ basic_os=vsta
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ basic_os=vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ basic_os=vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ basic_os=vxworks
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ basic_os=unicos
+ ;;
+ *)
+ basic_machine=$1
+ basic_os=
+ ;;
+ esac
+ ;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+ # Here we handle the default manufacturer of certain CPU types. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ cpu=hppa1.1
+ vendor=winbond
+ ;;
+ op50n)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ op60c)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ ibm*)
+ cpu=i370
+ vendor=ibm
+ ;;
+ orion105)
+ cpu=clipper
+ vendor=highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ cpu=m68k
+ vendor=apple
+ ;;
+ pmac | pmac-mpw)
+ cpu=powerpc
+ vendor=apple
+ ;;
+
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ cpu=m68000
+ vendor=att
+ ;;
+ 3b*)
+ cpu=we32k
+ vendor=att
+ ;;
+ bluegene*)
+ cpu=powerpc
+ vendor=ibm
+ basic_os=cnk
+ ;;
+ decsystem10* | dec10*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops10
+ ;;
+ decsystem20* | dec20*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ cpu=m68k
+ vendor=motorola
+ ;;
+ dpx2*)
+ cpu=m68k
+ vendor=bull
+ basic_os=sysv3
+ ;;
+ encore | umax | mmax)
+ cpu=ns32k
+ vendor=encore
+ ;;
+ elxsi)
+ cpu=elxsi
+ vendor=elxsi
+ basic_os=${basic_os:-bsd}
+ ;;
+ fx2800)
+ cpu=i860
+ vendor=alliant
+ ;;
+ genix)
+ cpu=ns32k
+ vendor=ns
+ ;;
+ h3050r* | hiux*)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ cpu=m68000
+ vendor=hp
+ ;;
+ hp9k3[2-9][0-9])
+ cpu=m68k
+ vendor=hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ i*86v32)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv32
+ ;;
+ i*86v4*)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv4
+ ;;
+ i*86v)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv
+ ;;
+ i*86sol2)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=solaris2
+ ;;
+ j90 | j90-cray)
+ cpu=j90
+ vendor=cray
+ basic_os=${basic_os:-unicos}
+ ;;
+ iris | iris4d)
+ cpu=mips
+ vendor=sgi
+ case $basic_os in
+ irix*)
+ ;;
+ *)
+ basic_os=irix4
+ ;;
+ esac
+ ;;
+ miniframe)
+ cpu=m68000
+ vendor=convergent
+ ;;
+ *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ cpu=m68k
+ vendor=atari
+ basic_os=mint
+ ;;
+ news-3600 | risc-news)
+ cpu=mips
+ vendor=sony
+ basic_os=newsos
+ ;;
+ next | m*-next)
+ cpu=m68k
+ vendor=next
+ case $basic_os in
+ openstep*)
+ ;;
+ nextstep*)
+ ;;
+ ns2*)
+ basic_os=nextstep2
+ ;;
+ *)
+ basic_os=nextstep3
+ ;;
+ esac
+ ;;
+ np1)
+ cpu=np1
+ vendor=gould
+ ;;
+ op50n-* | op60c-*)
+ cpu=hppa1.1
+ vendor=oki
+ basic_os=proelf
+ ;;
+ pa-hitachi)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ pbd)
+ cpu=sparc
+ vendor=tti
+ ;;
+ pbb)
+ cpu=m68k
+ vendor=tti
+ ;;
+ pc532)
+ cpu=ns32k
+ vendor=pc532
+ ;;
+ pn)
+ cpu=pn
+ vendor=gould
+ ;;
+ power)
+ cpu=power
+ vendor=ibm
+ ;;
+ ps2)
+ cpu=i386
+ vendor=ibm
+ ;;
+ rm[46]00)
+ cpu=mips
+ vendor=siemens
+ ;;
+ rtpc | rtpc-*)
+ cpu=romp
+ vendor=ibm
+ ;;
+ sde)
+ cpu=mipsisa32
+ vendor=sde
+ basic_os=${basic_os:-elf}
+ ;;
+ simso-wrs)
+ cpu=sparclite
+ vendor=wrs
+ basic_os=vxworks
+ ;;
+ tower | tower-32)
+ cpu=m68k
+ vendor=ncr
+ ;;
+ vpp*|vx|vx-*)
+ cpu=f301
+ vendor=fujitsu
+ ;;
+ w65)
+ cpu=w65
+ vendor=wdc
+ ;;
+ w89k-*)
+ cpu=hppa1.1
+ vendor=winbond
+ basic_os=proelf
+ ;;
+ none)
+ cpu=none
+ vendor=none
+ ;;
+ leon|leon[3-9])
+ cpu=sparc
+ vendor=$basic_machine
+ ;;
+ leon-*|leon[3-9]-*)
+ cpu=sparc
+ vendor=`echo "$basic_machine" | sed 's/-.*//'`
+ ;;
+
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+ IFS=$saved_IFS
+ ;;
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ cpu=$basic_machine
+ vendor=pc
+ ;;
+ # These rules are duplicated from below for sake of the special case above;
+ # i.e. things that normalized to x86 arches should also default to "pc"
+ pc98)
+ cpu=i386
+ vendor=pc
+ ;;
+ x64 | amd64)
+ cpu=x86_64
+ vendor=pc
+ ;;
+ # Recognize the basic CPU types without company name.
+ *)
+ cpu=$basic_machine
+ vendor=unknown
+ ;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+ # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ craynv-unknown)
+ vendor=cray
+ basic_os=${basic_os:-unicosmp}
+ ;;
+ c90-unknown | c90-cray)
+ vendor=cray
+ basic_os=${Basic_os:-unicos}
+ ;;
+ fx80-unknown)
+ vendor=alliant
+ ;;
+ romp-unknown)
+ vendor=ibm
+ ;;
+ mmix-unknown)
+ vendor=knuth
+ ;;
+ microblaze-unknown | microblazeel-unknown)
+ vendor=xilinx
+ ;;
+ rs6000-unknown)
+ vendor=ibm
+ ;;
+ vax-unknown)
+ vendor=dec
+ ;;
+ pdp11-unknown)
+ vendor=dec
+ ;;
+ we32k-unknown)
+ vendor=att
+ ;;
+ cydra-unknown)
+ vendor=cydrome
+ ;;
+ i370-ibm*)
+ vendor=ibm
+ ;;
+ orion-unknown)
+ vendor=highlevel
+ ;;
+ xps-unknown | xps100-unknown)
+ cpu=xps100
+ vendor=honeywell
+ ;;
+
+ # Here we normalize CPU types with a missing or matching vendor
+ armh-unknown | armh-alt)
+ cpu=armv7l
+ vendor=alt
+ basic_os=${basic_os:-linux-gnueabihf}
+ ;;
+ dpx20-unknown | dpx20-bull)
+ cpu=rs6000
+ vendor=bull
+ basic_os=${basic_os:-bosx}
+ ;;
+
+ # Here we normalize CPU types irrespective of the vendor
+ amd64-*)
+ cpu=x86_64
+ ;;
+ blackfin-*)
+ cpu=bfin
+ basic_os=linux
+ ;;
+ c54x-*)
+ cpu=tic54x
+ ;;
+ c55x-*)
+ cpu=tic55x
+ ;;
+ c6x-*)
+ cpu=tic6x
+ ;;
+ e500v[12]-*)
+ cpu=powerpc
+ basic_os=${basic_os}"spe"
+ ;;
+ mips3*-*)
+ cpu=mips64
+ ;;
+ ms1-*)
+ cpu=mt
+ ;;
+ m68knommu-*)
+ cpu=m68k
+ basic_os=linux
+ ;;
+ m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+ cpu=s12z
+ ;;
+ openrisc-*)
+ cpu=or32
+ ;;
+ parisc-*)
+ cpu=hppa
+ basic_os=linux
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ cpu=i586
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+ cpu=i686
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ cpu=i686
+ ;;
+ pentium4-*)
+ cpu=i786
+ ;;
+ pc98-*)
+ cpu=i386
+ ;;
+ ppc-* | ppcbe-*)
+ cpu=powerpc
+ ;;
+ ppcle-* | powerpclittle-*)
+ cpu=powerpcle
+ ;;
+ ppc64-*)
+ cpu=powerpc64
+ ;;
+ ppc64le-* | powerpc64little-*)
+ cpu=powerpc64le
+ ;;
+ sb1-*)
+ cpu=mipsisa64sb1
+ ;;
+ sb1el-*)
+ cpu=mipsisa64sb1el
+ ;;
+ sh5e[lb]-*)
+ cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+ ;;
+ spur-*)
+ cpu=spur
+ ;;
+ strongarm-* | thumb-*)
+ cpu=arm
+ ;;
+ tx39-*)
+ cpu=mipstx39
+ ;;
+ tx39el-*)
+ cpu=mipstx39el
+ ;;
+ x64-*)
+ cpu=x86_64
+ ;;
+ xscale-* | xscalee[bl]-*)
+ cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+ ;;
+ arm64-* | aarch64le-*)
+ cpu=aarch64
+ ;;
+
+ # Recognize the canonical CPU Types that limit and/or modify the
+ # company names they are paired with.
+ cr16-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ crisv32-* | etraxfs*-*)
+ cpu=crisv32
+ vendor=axis
+ ;;
+ cris-* | etrax*-*)
+ cpu=cris
+ vendor=axis
+ ;;
+ crx-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ neo-tandem)
+ cpu=neo
+ vendor=tandem
+ ;;
+ nse-tandem)
+ cpu=nse
+ vendor=tandem
+ ;;
+ nsr-tandem)
+ cpu=nsr
+ vendor=tandem
+ ;;
+ nsv-tandem)
+ cpu=nsv
+ vendor=tandem
+ ;;
+ nsx-tandem)
+ cpu=nsx
+ vendor=tandem
+ ;;
+ mipsallegrexel-sony)
+ cpu=mipsallegrexel
+ vendor=sony
+ ;;
+ tile*-*)
+ basic_os=${basic_os:-linux-gnu}
+ ;;
+
+ *)
+ # Recognize the canonical CPU types that are allowed with any
+ # company name.
+ case $cpu in
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | abacus \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+ | alphapca5[67] | alpha64pca5[67] \
+ | am33_2.0 \
+ | amdgcn \
+ | arc | arceb | arc32 | arc64 \
+ | arm | arm[lb]e | arme[lb] | armv* \
+ | avr | avr32 \
+ | asmjs \
+ | ba \
+ | be32 | be64 \
+ | bfin | bpf | bs2000 \
+ | c[123]* | c30 | [cjt]90 | c4x \
+ | c8051 | clipper | craynv | csky | cydra \
+ | d10v | d30v | dlx | dsp16xx \
+ | e2k | elxsi | epiphany \
+ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+ | h8300 | h8500 \
+ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i*86 | i860 | i960 | ia16 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
+ | loongarch32 | loongarch64 | loongarchx32 \
+ | m32c | m32r | m32rle \
+ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64eb | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r3 | mipsisa32r3el \
+ | mipsisa32r5 | mipsisa32r5el \
+ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r3 | mipsisa64r3el \
+ | mipsisa64r5 | mipsisa64r5el \
+ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mmix \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nfp \
+ | nios | nios2 | nios2eb | nios2el \
+ | none | np1 | ns16k | ns32k | nvptx \
+ | open8 \
+ | or1k* \
+ | or32 \
+ | orion \
+ | picochip \
+ | pdp10 | pdp11 | pj | pjl | pn | power \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+ | pru \
+ | pyramid \
+ | riscv | riscv32 | riscv32be | riscv64 | riscv64be \
+ | rl78 | romp | rs6000 | rx \
+ | s390 | s390x \
+ | score \
+ | sh | shl \
+ | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+ | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+ | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+ | spu \
+ | tahoe \
+ | thumbv7* \
+ | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+ | tron \
+ | ubicom32 \
+ | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+ | vax \
+ | visium \
+ | w65 \
+ | wasm32 | wasm64 \
+ | we32k \
+ | x86 | x86_64 | xc16x | xgate | xps100 \
+ | xstormy16 | xtensa* \
+ | ymp \
+ | z8k | z80)
+ ;;
+
+ *)
+ echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+ exit 1
+ ;;
+ esac
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+ digital*)
+ vendor=dec
+ ;;
+ commodore*)
+ vendor=cbm
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if test x$basic_os != x
+then
+
+# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+ gnu/linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`
+ ;;
+ os2-emx)
+ kernel=os2
+ os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`
+ ;;
+ nto-qnx*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
+ ;;
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+ IFS=$saved_IFS
+ ;;
+ # Default OS when just kernel was specified
+ nto*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
+ ;;
+ linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+ ;;
+ *)
+ kernel=
+ os=$basic_os
+ ;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
+case $os in
+ # First match some system type aliases that might get confused
+ # with valid system types.
+ # solaris* is a basic system type, with this one exception.
+ auroraux)
+ os=auroraux
+ ;;
+ bluegene*)
+ os=cnk
+ ;;
+ solaris1 | solaris1.*)
+ os=`echo "$os" | sed -e 's|solaris1|sunos4|'`
+ ;;
+ solaris)
+ os=solaris2
+ ;;
+ unixware*)
+ os=sysv4.2uw
+ ;;
+ # es1800 is here to avoid being matched by es* (a different OS)
+ es1800*)
+ os=ose
+ ;;
+ # Some version numbers need modification
+ chorusos*)
+ os=chorusos
+ ;;
+ isc)
+ os=isc2.2
+ ;;
+ sco6)
+ os=sco5v6
+ ;;
+ sco5)
+ os=sco3.2v5
+ ;;
+ sco4)
+ os=sco3.2v4
+ ;;
+ sco3.2.[4-9]*)
+ os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`
+ ;;
+ sco*v* | scout)
+ # Don't match below
+ ;;
+ sco*)
+ os=sco3.2v2
+ ;;
+ psos*)
+ os=psos
+ ;;
+ qnx*)
+ os=qnx
+ ;;
+ hiux*)
+ os=hiuxwe2
+ ;;
+ lynx*178)
+ os=lynxos178
+ ;;
+ lynx*5)
+ os=lynxos5
+ ;;
+ lynxos*)
+ # don't get caught up in next wildcard
+ ;;
+ lynx*)
+ os=lynxos
+ ;;
+ mac[0-9]*)
+ os=`echo "$os" | sed -e 's|mac|macos|'`
+ ;;
+ opened*)
+ os=openedition
+ ;;
+ os400*)
+ os=os400
+ ;;
+ sunos5*)
+ os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+ ;;
+ sunos6*)
+ os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+ ;;
+ wince*)
+ os=wince
+ ;;
+ utek*)
+ os=bsd
+ ;;
+ dynix*)
+ os=bsd
+ ;;
+ acis*)
+ os=aos
+ ;;
+ atheos*)
+ os=atheos
+ ;;
+ syllable*)
+ os=syllable
+ ;;
+ 386bsd)
+ os=bsd
+ ;;
+ ctix* | uts*)
+ os=sysv
+ ;;
+ nova*)
+ os=rtmk-nova
+ ;;
+ ns2)
+ os=nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ sinix5.*)
+ os=`echo "$os" | sed -e 's|sinix|sysv|'`
+ ;;
+ sinix*)
+ os=sysv4
+ ;;
+ tpf*)
+ os=tpf
+ ;;
+ triton*)
+ os=sysv3
+ ;;
+ oss*)
+ os=sysv3
+ ;;
+ svr4*)
+ os=sysv4
+ ;;
+ svr3)
+ os=sysv3
+ ;;
+ sysvr4)
+ os=sysv4
+ ;;
+ ose*)
+ os=ose
+ ;;
+ *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+ os=mint
+ ;;
+ dicos*)
+ os=dicos
+ ;;
+ pikeos*)
+ # Until real need of OS specific support for
+ # particular features comes up, bare metal
+ # configurations are quite functional.
+ case $cpu in
+ arm*)
+ os=eabi
+ ;;
+ *)
+ os=elf
+ ;;
+ esac
+ ;;
+ *)
+ # No normalization, but not necessarily accepted, that comes below.
+ ;;
+esac
+
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+kernel=
+case $cpu-$vendor in
+ score-*)
+ os=elf
+ ;;
+ spu-*)
+ os=elf
+ ;;
+ *-acorn)
+ os=riscix1.2
+ ;;
+ arm*-rebel)
+ kernel=linux
+ os=gnu
+ ;;
+ arm*-semi)
+ os=aout
+ ;;
+ c4x-* | tic4x-*)
+ os=coff
+ ;;
+ c8051-*)
+ os=elf
+ ;;
+ clipper-intergraph)
+ os=clix
+ ;;
+ hexagon-*)
+ os=elf
+ ;;
+ tic54x-*)
+ os=coff
+ ;;
+ tic55x-*)
+ os=coff
+ ;;
+ tic6x-*)
+ os=coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=tops20
+ ;;
+ pdp11-*)
+ os=none
+ ;;
+ *-dec | vax-*)
+ os=ultrix4.2
+ ;;
+ m68*-apollo)
+ os=domain
+ ;;
+ i386-sun)
+ os=sunos4.0.2
+ ;;
+ m68000-sun)
+ os=sunos3
+ ;;
+ m68*-cisco)
+ os=aout
+ ;;
+ mep-*)
+ os=elf
+ ;;
+ mips*-cisco)
+ os=elf
+ ;;
+ mips*-*)
+ os=elf
+ ;;
+ or32-*)
+ os=coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=sysv3
+ ;;
+ sparc-* | *-sun)
+ os=sunos4.1.1
+ ;;
+ pru-*)
+ os=elf
+ ;;
+ *-be)
+ os=beos
+ ;;
+ *-ibm)
+ os=aix
+ ;;
+ *-knuth)
+ os=mmixware
+ ;;
+ *-wec)
+ os=proelf
+ ;;
+ *-winbond)
+ os=proelf
+ ;;
+ *-oki)
+ os=proelf
+ ;;
+ *-hp)
+ os=hpux
+ ;;
+ *-hitachi)
+ os=hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=sysv
+ ;;
+ *-cbm)
+ os=amigaos
+ ;;
+ *-dg)
+ os=dgux
+ ;;
+ *-dolphin)
+ os=sysv3
+ ;;
+ m68k-ccur)
+ os=rtu
+ ;;
+ m88k-omron*)
+ os=luna
+ ;;
+ *-next)
+ os=nextstep
+ ;;
+ *-sequent)
+ os=ptx
+ ;;
+ *-crds)
+ os=unos
+ ;;
+ *-ns)
+ os=genix
+ ;;
+ i370-*)
+ os=mvs
+ ;;
+ *-gould)
+ os=sysv
+ ;;
+ *-highlevel)
+ os=bsd
+ ;;
+ *-encore)
+ os=bsd
+ ;;
+ *-sgi)
+ os=irix
+ ;;
+ *-siemens)
+ os=sysv4
+ ;;
+ *-masscomp)
+ os=rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=uxpv
+ ;;
+ *-rom68k)
+ os=coff
+ ;;
+ *-*bug)
+ os=coff
+ ;;
+ *-apple)
+ os=macos
+ ;;
+ *-atari*)
+ os=mint
+ ;;
+ *-wrs)
+ os=vxworks
+ ;;
+ *)
+ os=none
+ ;;
+esac
+
+fi
+
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+ # Sometimes we do "kernel-libc", so those need to count as OSes.
+ musl* | newlib* | relibc* | uclibc*)
+ ;;
+ # Likewise for "kernel-abi"
+ eabi* | gnueabi*)
+ ;;
+ # VxWorks passes extra cpu info in the 4th filed.
+ simlinux | simwindows | spe)
+ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+ gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+ | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
+ | hiux* | abug | nacl* | netware* | windows* \
+ | os9* | macos* | osx* | ios* \
+ | mpw* | magic* | mmixware* | mon960* | lnews* \
+ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+ | aos* | aros* | cloudabi* | sortix* | twizzler* \
+ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+ | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+ | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
+ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+ | udi* | lites* | ieee* | go32* | aux* | hcos* \
+ | chorusrdb* | cegcc* | glidix* | serenity* \
+ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+ | midipix* | mingw32* | mingw64* | mint* \
+ | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+ | interix* | uwin* | mks* | rhapsody* | darwin* \
+ | openstep* | oskit* | conix* | pw32* | nonstopux* \
+ | storm-chaos* | tops10* | tenex* | tops20* | its* \
+ | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+ | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+ | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
+ | fiwix* )
+ ;;
+ # This one is extra strict with allowed versions
+ sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ ;;
+ none)
+ ;;
+ *)
+ echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+ linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
+ | linux-musl* | linux-relibc* | linux-uclibc* )
+ ;;
+ uclinux-uclibc* )
+ ;;
+ -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )
+ # These are just libc implementations, not actual OSes, and thus
+ # require a kernel.
+ echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ kfreebsd*-gnu* | kopensolaris*-gnu*)
+ ;;
+ vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+ ;;
+ nto-qnx*)
+ ;;
+ os2-emx)
+ ;;
+ *-eabi* | *-gnueabi*)
+ ;;
+ -*)
+ # Blank kernel with real OS is always fine.
+ ;;
+ *-*)
+ echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+case $vendor in
+ unknown)
+ case $cpu-$os in
+ *-riscix*)
+ vendor=acorn
+ ;;
+ *-sunos*)
+ vendor=sun
+ ;;
+ *-cnk* | *-aix*)
+ vendor=ibm
+ ;;
+ *-beos*)
+ vendor=be
+ ;;
+ *-hpux*)
+ vendor=hp
+ ;;
+ *-mpeix*)
+ vendor=hp
+ ;;
+ *-hiux*)
+ vendor=hitachi
+ ;;
+ *-unos*)
+ vendor=crds
+ ;;
+ *-dgux*)
+ vendor=dg
+ ;;
+ *-luna*)
+ vendor=omron
+ ;;
+ *-genix*)
+ vendor=ns
+ ;;
+ *-clix*)
+ vendor=intergraph
+ ;;
+ *-mvs* | *-opened*)
+ vendor=ibm
+ ;;
+ *-os400*)
+ vendor=ibm
+ ;;
+ s390-* | s390x-*)
+ vendor=ibm
+ ;;
+ *-ptx*)
+ vendor=sequent
+ ;;
+ *-tpf*)
+ vendor=ibm
+ ;;
+ *-vxsim* | *-vxworks* | *-windiss*)
+ vendor=wrs
+ ;;
+ *-aux*)
+ vendor=apple
+ ;;
+ *-hms*)
+ vendor=hitachi
+ ;;
+ *-mpw* | *-macos*)
+ vendor=apple
+ ;;
+ *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
+ vendor=atari
+ ;;
+ *-vos*)
+ vendor=stratus
+ ;;
+ esac
+ ;;
+esac
+
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/support/install.sh b/support/install.sh
new file mode 100644
index 0000000..0cac004
--- /dev/null
+++ b/support/install.sh
@@ -0,0 +1,247 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+tranformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/support/mkdirs b/support/mkdirs
new file mode 100644
index 0000000..46f656e
--- /dev/null
+++ b/support/mkdirs
@@ -0,0 +1,47 @@
+#! /bin/sh
+#
+# mkdirs - a work-alike for `mkdir -p'
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+# Copyright (C) 1996-2002 Free Software Foundation, Inc.
+#
+# 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/>.
+
+for dir
+do
+
+ test -d "$dir" && continue
+
+ tomake=$dir
+ while test -n "$dir" ; do
+ # dir=${dir%/*}
+ # dir=`expr "$dir" ':' '\(/.*\)/[^/]*'`
+ if dir=`expr "$dir" ':' '\(.*\)/[^/]*'`; then
+ tomake="$dir $tomake"
+ else
+ dir=
+ fi
+ done
+
+ for d in $tomake
+ do
+ test -d "$d" && continue
+ echo mkdir "$d"
+ mkdir "$d"
+ done
+done
+
+exit 0
diff --git a/support/mkdist b/support/mkdist
new file mode 100644
index 0000000..463bdc1
--- /dev/null
+++ b/support/mkdist
@@ -0,0 +1,140 @@
+#! /bin/bash -
+#
+# mkdist - make a distribution directory from a master manifest file
+#
+# usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-t] [-v] version
+#
+# SRCDIR defaults to src
+# MANIFEST defaults to $SRCDIR/MANIFEST
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+# Copyright (C) 1996-2002 Free Software Foundation, Inc.
+#
+# 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/>.
+#
+
+SRCDIR=src
+ROOTNAME=bash
+
+usage()
+{
+ echo usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-t] [-v] version 1>&2
+ exit 2
+}
+
+vmsg()
+{
+ if [ -n "$verbose" ]; then
+ echo mkdist: "$@"
+ fi
+}
+
+while getopts m:s:r:tv name
+do
+ case $name in
+ m) MANIFEST=$OPTARG ;;
+ s) SRCDIR=$OPTARG ;;
+ r) ROOTNAME=$OPTARG ;;
+ t) maketar=yes ;;
+ v) verbose=yes ;;
+ ?) usage ;;
+ esac
+done
+
+: ${MANIFEST:=$SRCDIR/MANIFEST}
+
+vmsg using $MANIFEST
+
+shift $(( $OPTIND - 1 ))
+
+if [ $# -lt 1 ]; then
+ usage
+fi
+
+version=$1
+newdir=${ROOTNAME}-$version
+
+tarfile=${newdir}.tar
+
+vmsg creating distribution for $ROOTNAME version $version in $newdir
+
+if [ ! -d $newdir ]; then
+ mkdir $newdir || { echo $0: cannot make directory $newdir 1>&2 ; exit 1; }
+fi
+
+dirmode=755
+filmode=644
+
+while read fname type mode rest
+do
+ [ -z "$fname" ] && continue
+
+ case "$fname" in
+ \#*) continue ;;
+ esac
+
+ case "$type" in
+ d) mkdir $newdir/$fname ;;
+ f) cp -p $SRCDIR/$fname $newdir/$fname ;;
+ F) cp $SRCDIR/$fname $newdir/$fname ;;
+ s) ln -s $mode $newdir/$fname ; mode= ;; # symlink
+ l) ln $mode $newdir/$fname ; mode= ;; # hard link
+ c) cp $SRCDIR/$mode $newdir/$fname ; mode=$filmode ;; # copy to new name
+ *) echo "unknown file type $type" 1>&2 ;;
+ esac
+
+ # allow trailing comments
+ case "$mode" in
+ \#*) mode= ;;
+ esac
+
+ if [ -n "$mode" ]; then
+ chmod $mode $newdir/$fname
+ elif [ "$type" = "f" ]; then
+ chmod $filmode $newdir/$fname
+ elif [ "$type" = "d" ]; then
+ chmod $dirmode $newdir/$fname
+ fi
+
+done < $MANIFEST
+
+# cut off the `-alpha' in something like `2.0-alpha', leaving just the
+# numeric version
+#version=${version%%-*}
+
+#case "$version" in
+#*.*.*) vers=${version%.*} ;;
+#*.*) vers=${version} ;;
+#esac
+
+#echo $vers > $newdir/.distribution
+
+#case "$version" in
+#*.*.*) plevel=${version##*.} ;;
+#*) plevel=0 ;;
+#esac
+#[ -z "$plevel" ] && plevel=0
+#echo ${plevel} > $newdir/.patchlevel
+
+vmsg $newdir created
+
+if [ -n "$maketar" ]; then
+ tar cf ${tarfile} $newdir
+ gzip $tarfile
+ vmsg ${tarfile}.gz created
+fi
+
+exit 0
diff --git a/support/mkinstalldirs b/support/mkinstalldirs
new file mode 100644
index 0000000..d2d5f21
--- /dev/null
+++ b/support/mkinstalldirs
@@ -0,0 +1,111 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
+
+# process command line arguments
+while test $# -gt 0 ; do
+ case $1 in
+ -h | --help | --h*) # -h for help
+ echo "$usage" 1>&2
+ exit 0
+ ;;
+ -m) # -m PERM arg
+ shift
+ test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+ dirmode=$1
+ shift
+ ;;
+ --) # stop option processing
+ shift
+ break
+ ;;
+ -*) # unknown option
+ echo "$usage" 1>&2
+ exit 1
+ ;;
+ *) # first non-opt arg
+ break
+ ;;
+ esac
+done
+
+for file
+do
+ if test -d "$file"; then
+ shift
+ else
+ break
+ fi
+done
+
+case $# in
+ 0) exit 0 ;;
+esac
+
+case $dirmode in
+ '')
+ if mkdir -p -- . 2>/dev/null; then
+ echo "mkdir -p -- $*"
+ exec mkdir -p -- "$@"
+ fi
+ ;;
+ *)
+ if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
+ echo "mkdir -m $dirmode -p -- $*"
+ exec mkdir -m "$dirmode" -p -- "$@"
+ fi
+ ;;
+esac
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case $pathcomp in
+ -*) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ else
+ if test ! -z "$dirmode"; then
+ echo "chmod $dirmode $pathcomp"
+ lasterr=""
+ chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+ if test ! -z "$lasterr"; then
+ errstatus=$lasterr
+ fi
+ fi
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# End:
+# mkinstalldirs ends here
diff --git a/support/shlib-install b/support/shlib-install
new file mode 100644
index 0000000..661355d
--- /dev/null
+++ b/support/shlib-install
@@ -0,0 +1,174 @@
+#! /bin/sh
+#
+# shlib-install - install a shared library and do any necessary host-specific
+# post-installation configuration (like ldconfig)
+#
+# usage: shlib-install [-D] -O host_os [-V host_vendor] -d installation-dir [-b bin-dir] -i install-prog [-U] library
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+#
+# defaults
+#
+INSTALLDIR=/usr/local/lib
+LDCONFIG=ldconfig
+
+PROGNAME=`basename $0`
+USAGE="$PROGNAME [-D] -O host_os [-V host_vendor] -d installation-dir [-b bin-dir] -i install-prog [-U] library"
+
+# process options - should use getopts
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -O) shift; host_os="$1"; shift ;;
+ -V) shift; host_vendor="$1"; shift ;;
+ -d) shift; INSTALLDIR="$1"; shift ;;
+ -b) shift; BINDIR="$1" ; shift ;;
+ -i) shift; INSTALLPROG="$1" ; shift ;;
+ -D) echo=echo ; shift ;;
+ -U) uninstall=true ; shift ;;
+ -*) echo "$USAGE" >&2 ; exit 2;;
+ *) break ;;
+ esac
+done
+
+# set install target name
+LIBNAME="$1"
+
+if [ -z "$LIBNAME" ]; then
+ echo "$USAGE" >&2
+ exit 2
+fi
+
+OLDSUFF=old
+MV=mv
+RM="rm -f"
+LN="ln -s"
+
+# pre-install
+
+if [ -z "$uninstall" ]; then
+ ${echo} $RM ${INSTALLDIR}/${LIBNAME}.${OLDSUFF}
+ if [ -f "$INSTALLDIR/$LIBNAME" ]; then
+ ${echo} $MV $INSTALLDIR/$LIBNAME ${INSTALLDIR}/${LIBNAME}.${OLDSUFF}
+ fi
+fi
+
+# install/uninstall
+
+if [ -z "$uninstall" ] ; then
+ ${echo} eval ${INSTALLPROG} $LIBNAME ${INSTALLDIR}/${LIBNAME}
+else
+ ${echo} ${RM} ${INSTALLDIR}/${LIBNAME}
+fi
+
+# post-install/uninstall
+
+# HP-UX and Darwin/MacOS X require that a shared library have execute permission
+# Linux does, too, and ldd warns about it. Solaris doesn't seem to mind,
+# but ldd still warns about it.
+# Cygwin installs both a dll (which must go in $BINDIR) and an implicit
+# link library (in $libdir)
+case "$host_os" in
+hpux*|darwin*|macosx*|linux*|solaris2*)
+ if [ -z "$uninstall" ]; then
+ chmod 755 ${INSTALLDIR}/${LIBNAME}
+ fi ;;
+cygwin*|mingw*)
+ IMPLIBNAME=`echo ${LIBNAME} \
+ | sed -e 's,^cyg,lib,' -e 's,[0-9]*.dll$,.dll.a,'`
+ if [ -z "$uninstall" ]; then
+ ${echo} $RM ${BINDIR}/${LIBNAME}.${OLDSUFF}
+ if [ -f "$BINDIR/$LIBNAME" ]; then
+ ${echo} $MV $BINDIR/$LIBNAME $BINDIR/$LIBNAME.$OLDSUFF
+ fi
+ ${echo} $MV ${INSTALLDIR}/${LIBNAME} ${BINDIR}/${LIBNAME}
+ ${echo} chmod a+x ${BINDIR}/${LIBNAME}
+ ${echo} eval ${INSTALLPROG} ${LIBNAME}.a \
+ ${INSTALLDIR}/${IMPLIBNAME}
+ else
+ ${echo} ${RM} ${BINDIR}/${LIBNAME}
+ ${echo} ${RM} ${INSTALLDIR}/${IMPLIBNAME}
+ fi ;;
+
+*) ;;
+esac
+
+case "$LIBNAME" in
+*.*.[0-9].[0-9]) # libname.so.M.N
+ LINK2=`echo $LIBNAME | sed 's:\(.*\..*\.[0-9]\)\.[0-9]:\1:'` # libname.so.M
+ LINK1=`echo $LIBNAME | sed 's:\(.*\..*\)\.[0-9]\.[0-9]:\1:'` # libname.so
+ ;;
+*.*.[0-9]) # libname.so.M
+ LINK1=`echo $LIBNAME | sed 's:\(.*\..*\)\.[0-9]:\1:'` # libname.so
+ ;;
+*.[0-9]) # libname.M
+ LINK1=`echo $LIBNAME | sed 's:\(.*\)\.[0-9]:\1:'` # libname
+ ;;
+*.[0-9].[0-9].dylib) # libname.M.N.dylib
+ LINK2=`echo $LIBNAME | sed 's:\(.*\.[0-9]\)\.[0-9]:\1:'` # libname.M.dylib
+ LINK1=`echo $LIBNAME | sed 's:\(.*\)\.[0-9]\.[0-9]:\1:'` # libname.dylib
+esac
+
+INSTALL_LINK1='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK1'
+INSTALL_LINK2='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK2'
+
+#
+# Create symlinks to the installed library. This section is incomplete.
+#
+case "$host_os-$host_vendor" in
+*linux*|freebsd*|dragonfly*)
+ # libname.so.M -> libname.so.M.N
+ ${echo} ${RM} ${INSTALLDIR}/$LINK2
+ if [ -z "$uninstall" ]; then
+ eval $INSTALL_LINK2
+ fi
+
+ # libname.so -> libname.so.M
+ ${echo} ${RM} ${INSTALLDIR}/$LINK1
+ if [ -z "$uninstall" ]; then
+ ${echo} cd $INSTALLDIR && ${echo} ${LN} $LINK2 $LINK1
+ fi
+ ;;
+
+bsdi4*|*gnu*|darwin*|macosx*|netbsd*|mirbsd*)
+ # libname.so.M -> libname.so.M.N
+ ${echo} ${RM} ${INSTALLDIR}/$LINK2
+ if [ -z "$uninstall" ]; then
+ eval $INSTALL_LINK2
+ fi
+
+ # libname.so -> libname.so.M.N
+ ${echo} ${RM} ${INSTALLDIR}/$LINK1
+ if [ -z "$uninstall" ]; then
+ eval $INSTALL_LINK1
+ fi
+ ;;
+
+solaris2*|aix4.[2-9]*|aix[5-9]*|osf*|irix[56]*|sysv[45]*|dgux*|interix*)
+ # libname.so -> libname.so.M
+ ${echo} ${RM} ${INSTALLDIR}/$LINK1
+ if [ -z "$uninstall" ]; then
+ eval $INSTALL_LINK1
+ fi
+ ;;
+
+hpux1*)
+ # libname.sl -> libname.M
+ ${echo} ${RM} ${INSTALLDIR}/$LINK1.sl
+ if [ -z "$uninstall" ]; then
+ eval $INSTALL_LINK1
+ fi
+ ;;
+
+cygwin*|mingw*)
+ # Links to .dlls don't work. Hence shobj-conf used DLLVERSION.dll
+ # instead of so.SHLIB_MAJOR.SHLIB_MINOR. The postinstall above
+ # took care of everything else.
+ ;;
+
+*) ;;
+esac
+
+exit 0
diff --git a/support/shobj-conf b/support/shobj-conf
new file mode 100644
index 0000000..cd7634d
--- /dev/null
+++ b/support/shobj-conf
@@ -0,0 +1,553 @@
+#! /bin/sh
+#
+# shobj-conf -- output a series of variable assignments to be substituted
+# into a Makefile by configure which specify system-dependent
+# information for creating shared objects that may be loaded
+# into bash with `enable -f'
+#
+# usage: shobj-conf [-C compiler] -c host_cpu -o host_os -v host_vendor
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+#
+# This file is part of GNU Bash, the Bourne Again SHell.
+#
+# 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/>.
+#
+
+#
+# defaults
+#
+SHOBJ_STATUS=supported
+SHLIB_STATUS=supported
+
+SHOBJ_CC=cc
+SHOBJ_CFLAGS=
+SHOBJ_LD=
+SHOBJ_LDFLAGS=
+SHOBJ_XLDFLAGS=
+SHOBJ_LIBS=
+
+SHLIB_XLDFLAGS=
+SHLIB_LIBS=
+
+SHLIB_DOT='.'
+SHLIB_LIBPREF='lib'
+SHLIB_LIBSUFF='so'
+
+SHLIB_LIBVERSION='$(SHLIB_LIBSUFF)'
+SHLIB_DLLVERSION='$(SHLIB_MAJOR)'
+
+PROGNAME=`basename $0`
+USAGE="$PROGNAME [-C compiler] -c host_cpu -o host_os -v host_vendor"
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -C) shift; SHOBJ_CC="$1"; shift ;;
+ -c) shift; host_cpu="$1"; shift ;;
+ -o) shift; host_os="$1"; shift ;;
+ -v) shift; host_vendor="$1"; shift ;;
+ *) echo "$USAGE" >&2 ; exit 2;;
+ esac
+done
+
+case "${host_os}-${SHOBJ_CC}-${host_vendor}" in
+nsk-cc-tandem|nsk-c99-tandem)
+ SHOBJ_CFLAGS=-Wglobalized
+ case `uname -m` in
+ NSR*)
+ SHOBJ_CFLAGS="${SHOBJ_CFLAGS} -Wcall_shared" # default on TNS/E, needed on TNS/R
+ SHOBJ_LD=/usr/bin/ld # for TNS/R
+ ;;
+ NSE*|NEO*)
+ SHOBJ_LD=/usr/bin/eld
+ ;;
+ esac
+ SHOBJ_LDFLAGS='-shared -bglobalized -unres_symbols ignore'
+ ;;
+
+sunos4*-*gcc*)
+ SHOBJ_CFLAGS=-fpic
+ SHOBJ_LD=/usr/bin/ld
+ SHOBJ_LDFLAGS='-assert pure-text'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+ ;;
+
+sunos4*)
+ SHOBJ_CFLAGS=-pic
+ SHOBJ_LD=/usr/bin/ld
+ SHOBJ_LDFLAGS='-assert pure-text'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+ ;;
+
+sunos5*-*gcc*|solaris2*-*gcc*)
+ SHOBJ_LD='${CC}'
+ ld_used=`gcc -print-prog-name=ld`
+ if ${ld_used} -V 2>&1 | grep GNU >/dev/null 2>&1; then
+ # This line works for the GNU ld
+ SHOBJ_LDFLAGS='-shared -Wl,-h,$@'
+ # http://sourceware.org/ml/binutils/2001-08/msg00361.html
+ SHOBJ_CFLAGS=-fPIC
+ else
+ # This line works for the Solaris linker in /usr/ccs/bin/ld
+ SHOBJ_LDFLAGS='-shared -Wl,-i -Wl,-h,$@'
+ SHOBJ_CFLAGS=-fpic
+ fi
+
+# SHLIB_XLDFLAGS='-R $(libdir)'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+sunos5*|solaris2*)
+ SHOBJ_CFLAGS='-K pic'
+ SHOBJ_LD=/usr/ccs/bin/ld
+ SHOBJ_LDFLAGS='-G -dy -z text -i -h $@'
+
+# SHLIB_XLDFLAGS='-R $(libdir)'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+# All versions of Linux (including Gentoo/FreeBSD) or the semi-mythical GNU Hurd.
+linux*-*|gnu*-*|k*bsd*-gnu-*|midnightbsd*|freebsd*|dragonfly*)
+ SHOBJ_CFLAGS=-fPIC
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'
+
+ SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir) -Wl,-soname,`basename $@ $(SHLIB_MINOR)`'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+ ;;
+
+# Darwin/MacOS X
+darwin*)
+ # Common definitions for all darwin/mac os x versions
+ SHOBJ_CFLAGS='-fno-common'
+
+ SHOBJ_LD='${CC}'
+
+ SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)'
+ SHLIB_LIBSUFF='dylib'
+
+ # unused at this time
+ SHLIB_SONAME='$(libdir)/`echo $@ | sed "s:\\..*::"`.$(SHLIB_MAJOR).$(SHLIB_LIBSUFF)'
+
+ case "${host_os}" in
+ # Darwin versions 1, 5, 6, 7 correspond to Mac OS X 10.0, 10.1, 10.2,
+ # and 10.3, respectively.
+ darwin[1-7].*)
+ SHOBJ_STATUS=unsupported
+ SHOBJ_LDFLAGS='-dynamic'
+ SHLIB_XLDFLAGS='-install_name $(libdir)/`echo $@ | sed "s:\\..*::"`.$(SHLIB_MAJOR).$(SHLIB_LIBSUFF) -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -v'
+ ;;
+ # Darwin 8 == Mac OS X 10.4; Mac OS X 10.N == Darwin N+4
+ *)
+ case "${host_os}" in
+ darwin[89]*|darwin1[012]*)
+ SHOBJ_ARCHFLAGS=
+ ;;
+ *) # Mac OS X 10.9 (Mavericks) and later
+ SHOBJ_ARCHFLAGS=
+ # for 32 and 64bit universal library
+ #SHOBJ_ARCHFLAGS='-arch i386 -arch x86_64'
+ #SHOBJ_CFLAGS=${SHOBJ_CFLAGS}' -arch i386 -arch x86_64'
+ ;;
+ esac
+ SHOBJ_LDFLAGS="-dynamiclib -dynamic -undefined dynamic_lookup ${SHOBJ_ARCHFLAGS}"
+ SHLIB_XLDFLAGS="-dynamiclib ${SHOBJ_ARCHFLAGS}"' -install_name $(libdir)/`echo $@ | sed "s:\\..*::"`.$(SHLIB_MAJOR).$(SHLIB_LIBSUFF) -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -v'
+ ;;
+ esac
+
+ SHLIB_LIBS='-lncurses' # see if -lcurses works on MacOS X 10.1
+ ;;
+
+openbsd*|netbsd*|mirbsd*)
+ SHOBJ_CFLAGS=-fPIC
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared'
+
+ SHLIB_XLDFLAGS='-R$(libdir)'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+ ;;
+
+bsdi2*)
+ SHOBJ_CC=shlicc2
+ SHOBJ_CFLAGS=
+ SHOBJ_LD=ld
+ SHOBJ_LDFLAGS=-r
+ SHOBJ_LIBS=-lc_s.2.1.0
+
+ # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in
+ # the ass -- they require changing {/usr/lib,etc}/shlib.map on
+ # each system, and the library creation process is byzantine
+ SHLIB_STATUS=unsupported
+ ;;
+
+bsdi3*)
+ SHOBJ_CC=shlicc2
+ SHOBJ_CFLAGS=
+ SHOBJ_LD=ld
+ SHOBJ_LDFLAGS=-r
+ SHOBJ_LIBS=-lc_s.3.0.0
+
+ # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in
+ # the ass -- they require changing {/usr/lib,etc}/shlib.map on
+ # each system, and the library creation process is byzantine
+ SHLIB_STATUS=unsupported
+ ;;
+
+bsdi4*)
+ # BSD/OS 4.x now supports ELF and SunOS-style dynamically-linked
+ # shared libraries. gcc 2.x is the standard compiler, and the
+ # `normal' gcc options should work as they do in Linux.
+
+ SHOBJ_CFLAGS=-fPIC
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'
+
+ SHLIB_XLDFLAGS='-Wl,-soname,`basename $@ $(SHLIB_MINOR)`'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+ ;;
+
+osf*-*gcc*)
+ # Fix to use gcc linker driver from bfischer@TechFak.Uni-Bielefeld.DE
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'
+
+ SHLIB_XLDFLAGS='-rpath $(libdir)'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+osf*)
+ SHOBJ_LD=ld
+ SHOBJ_LDFLAGS='-shared -soname $@ -expect_unresolved "*"'
+
+ SHLIB_XLDFLAGS='-rpath $(libdir)'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+aix4.[2-9]*-*gcc*|aix[5-9].*-*gcc*) # lightly tested by jik@cisco.com
+ SHOBJ_CFLAGS=-fpic
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-Wl,-bdynamic -Wl,-bnoentry -Wl,-bexpall'
+ SHOBJ_XLDFLAGS='-G'
+
+ SHLIB_XLDFLAGS='-bM:SRE'
+ SHLIB_LIBS='-lcurses -lc'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+aix4.[2-9]*|aix[5-9].*)
+ SHOBJ_CFLAGS=-K
+ SHOBJ_LD='ld'
+ SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall'
+ SHOBJ_XLDFLAGS='-G'
+
+ SHLIB_XLDFLAGS='-bM:SRE'
+ SHLIB_LIBS='-lcurses -lc'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+#
+# THE FOLLOWING ARE UNTESTED -- and some may not support the dlopen interface
+#
+irix[56]*-*gcc*)
+ SHOBJ_CFLAGS='-fpic'
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'
+
+ SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+irix[56]*)
+ SHOBJ_CFLAGS='-K PIC'
+ SHOBJ_LD=ld
+# SHOBJ_LDFLAGS='-call_shared -hidden_symbol -no_unresolved -soname $@'
+# Change from David Kaelbling <drk@sgi.com>. If you have problems,
+# remove the `-no_unresolved'
+ SHOBJ_LDFLAGS='-shared -no_unresolved -soname $@'
+
+ SHLIB_XLDFLAGS='-rpath $(libdir)'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+hpux9*-*gcc*)
+ # must use gcc; the bundled cc cannot compile PIC code
+ SHOBJ_CFLAGS='-fpic'
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s'
+
+ SHLIB_XLDFLAGS='-Wl,+b,$(libdir)'
+ SHLIB_LIBSUFF='sl'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+hpux9*)
+ SHOBJ_STATUS=unsupported
+ SHLIB_STATUS=unsupported
+
+ # If you are using the HP ANSI C compiler, you can uncomment and use
+ # this code (I have not tested it)
+# SHOBJ_STATUS=supported
+# SHLIB_STATUS=supported
+#
+# SHOBJ_CFLAGS='+z'
+# SHOBJ_LD='ld'
+# SHOBJ_LDFLAGS='-b +s'
+#
+# SHLIB_XLDFLAGS='+b $(libdir)'
+# SHLIB_LIBSUFF='sl'
+# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+
+ ;;
+
+hpux10*-*gcc*)
+ # must use gcc; the bundled cc cannot compile PIC code
+ SHOBJ_CFLAGS='-fpic'
+ SHOBJ_LD='${CC}'
+ # if you have problems linking here, moving the `-Wl,+h,$@' from
+ # SHLIB_XLDFLAGS to SHOBJ_LDFLAGS has been reported to work
+ SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s'
+
+ SHLIB_XLDFLAGS='-Wl,+h,$@ -Wl,+b,$(libdir)'
+ SHLIB_LIBSUFF='sl'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+hpux10*)
+ SHOBJ_STATUS=unsupported
+ SHLIB_STATUS=unsupported
+
+ # If you are using the HP ANSI C compiler, you can uncomment and use
+ # this code (I have not tested it)
+# SHOBJ_STATUS=supported
+# SHLIB_STATUS=supported
+#
+# SHOBJ_CFLAGS='+z'
+# SHOBJ_LD='ld'
+# SHOBJ_LDFLAGS='-b +s +h $@'
+#
+# SHLIB_XLDFLAGS='+b $(libdir)'
+# SHLIB_LIBSUFF='sl'
+# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+
+ ;;
+
+hpux11*-*gcc*)
+ # must use gcc; the bundled cc cannot compile PIC code
+ SHOBJ_CFLAGS='-fpic'
+ SHOBJ_LD='${CC}'
+# SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,-B,symbolic -Wl,+s -Wl,+std -Wl,+h,$@'
+ SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s -Wl,+h,$@'
+
+ SHLIB_XLDFLAGS='-Wl,+b,$(libdir)'
+ SHLIB_LIBSUFF='sl'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+hpux11*)
+ SHOBJ_STATUS=unsupported
+ SHLIB_STATUS=unsupported
+
+ # If you are using the HP ANSI C compiler, you can uncomment and use
+ # this code from michael.osipov@siemens.com (I have not tested it)
+# SHOBJ_CFLAGS='+z'
+# SHOBJ_LD='$(CC)'
+# SHOBJ_LDFLAGS='-b -Wl,+s -Wl,+h,$@'
+#
+# SHLIB_XLDFLAGS='-Wl,+b,$(libdir)'
+# SHLIB_LIBSUFF='so'
+# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+# SHLIB_LIBS='$(TERMCAP_LIB)'
+ ;;
+
+sysv4*-*gcc*)
+ SHOBJ_CFLAGS=-shared
+ SHOBJ_LDFLAGS='-shared -h $@'
+ SHOBJ_LD='${CC}'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+sysv4*)
+ SHOBJ_CFLAGS='-K PIC'
+ SHOBJ_LD=ld
+ SHOBJ_LDFLAGS='-dy -z text -G -h $@'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+sco3.2v5*-*gcc*)
+ SHOBJ_CFLAGS='-fpic' # DEFAULTS TO ELF
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+sco3.2v5*)
+ SHOBJ_CFLAGS='-K pic -b elf'
+ SHOBJ_LD=ld
+ SHOBJ_LDFLAGS='-G -b elf -dy -z text -h $@'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+sysv5uw7*-*gcc*)
+ SHOBJ_CFLAGS='-fpic'
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+sysv5uw7*)
+ SHOBJ_CFLAGS='-K PIC'
+ SHOBJ_LD=ld
+ SHOBJ_LDFLAGS='-G -dy -z text -h $@'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+sysv5UnixWare*-*gcc*)
+ SHOBJ_CFLAGS=-fpic
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+sysv5UnixWare*)
+ SHOBJ_CFLAGS='-K PIC'
+ SHOBJ_LD=ld
+ SHOBJ_LDFLAGS='-G -dy -z text -h $@'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+sysv5OpenUNIX*-*gcc*)
+ SHOBJ_CFLAGS=-fpic
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+sysv5OpenUNIX*)
+ SHOBJ_CFLAGS='-K PIC'
+ SHOBJ_LD=ld
+ SHOBJ_LDFLAGS='-G -dy -z text -h $@'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+dgux*-*gcc*)
+ SHOBJ_CFLAGS=-fpic
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+dgux*)
+ SHOBJ_CFLAGS='-K pic'
+ SHOBJ_LD=ld
+ SHOBJ_LDFLAGS='-G -dy -h $@'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+msdos*)
+ SHOBJ_STATUS=unsupported
+ SHLIB_STATUS=unsupported
+ ;;
+
+cygwin*)
+ SHOBJ_LD='$(CC)'
+ SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a'
+ SHLIB_LIBPREF='cyg'
+ SHLIB_LIBSUFF='dll'
+ SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)'
+ SHLIB_LIBS='$(TERMCAP_LIB)'
+
+ SHLIB_DOT=
+ # For official cygwin releases, DLLVERSION will be defined in the
+ # environment of configure, and will be incremented any time the API
+ # changes in a non-backwards compatible manner. Otherwise, it is just
+ # SHLIB_MAJOR.
+ if [ -n "$DLLVERSION" ] ; then
+ SHLIB_DLLVERSION="$DLLVERSION"
+ fi
+ ;;
+
+mingw*)
+ SHOBJ_LD='$(CC)'
+ SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a'
+ SHLIB_LIBSUFF='dll'
+ SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)'
+ SHLIB_LIBS='$(TERMCAP_LIB)'
+
+ SHLIB_DOT=
+ # For official cygwin releases, DLLVERSION will be defined in the
+ # environment of configure, and will be incremented any time the API
+ # changes in a non-backwards compatible manner. Otherwise, it is just
+ # SHLIB_MAJOR.
+ if [ -n "$DLLVERSION" ] ; then
+ SHLIB_DLLVERSION="$DLLVERSION"
+ fi
+ ;;
+
+#
+# Rely on correct gcc configuration for everything else
+#
+*-*gcc*)
+ SHOBJ_CFLAGS=-fpic
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared'
+
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+*)
+ SHOBJ_STATUS=unsupported
+ SHLIB_STATUS=unsupported
+ ;;
+
+esac
+
+echo SHOBJ_CC=\'"$SHOBJ_CC"\'
+echo SHOBJ_CFLAGS=\'"$SHOBJ_CFLAGS"\'
+echo SHOBJ_LD=\'"$SHOBJ_LD"\'
+echo SHOBJ_LDFLAGS=\'"$SHOBJ_LDFLAGS"\'
+echo SHOBJ_XLDFLAGS=\'"$SHOBJ_XLDFLAGS"\'
+echo SHOBJ_LIBS=\'"$SHOBJ_LIBS"\'
+
+echo SHLIB_XLDFLAGS=\'"$SHLIB_XLDFLAGS"\'
+echo SHLIB_LIBS=\'"$SHLIB_LIBS"\'
+
+echo SHLIB_DOT=\'"$SHLIB_DOT"\'
+
+echo SHLIB_LIBPREF=\'"$SHLIB_LIBPREF"\'
+echo SHLIB_LIBSUFF=\'"$SHLIB_LIBSUFF"\'
+
+echo SHLIB_LIBVERSION=\'"$SHLIB_LIBVERSION"\'
+echo SHLIB_DLLVERSION=\'"$SHLIB_DLLVERSION"\'
+
+echo SHOBJ_STATUS=\'"$SHOBJ_STATUS"\'
+echo SHLIB_STATUS=\'"$SHLIB_STATUS"\'
+
+exit 0
diff --git a/support/wcwidth.c b/support/wcwidth.c
new file mode 100644
index 0000000..0f5ec99
--- /dev/null
+++ b/support/wcwidth.c
@@ -0,0 +1,313 @@
+/*
+ * This is an implementation of wcwidth() and wcswidth() (defined in
+ * IEEE Std 1002.1-2001) for Unicode.
+ *
+ * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html
+ * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html
+ *
+ * In fixed-width output devices, Latin characters all occupy a single
+ * "cell" position of equal width, whereas ideographic CJK characters
+ * occupy two such cells. Interoperability between terminal-line
+ * applications and (teletype-style) character terminals using the
+ * UTF-8 encoding requires agreement on which character should advance
+ * the cursor by how many cell positions. No established formal
+ * standards exist at present on which Unicode character shall occupy
+ * how many cell positions on character terminals. These routines are
+ * a first attempt of defining such behavior based on simple rules
+ * applied to data provided by the Unicode Consortium.
+ *
+ * For some graphical characters, the Unicode standard explicitly
+ * defines a character-cell width via the definition of the East Asian
+ * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes.
+ * In all these cases, there is no ambiguity about which width a
+ * terminal shall use. For characters in the East Asian Ambiguous (A)
+ * class, the width choice depends purely on a preference of backward
+ * compatibility with either historic CJK or Western practice.
+ * Choosing single-width for these characters is easy to justify as
+ * the appropriate long-term solution, as the CJK practice of
+ * displaying these characters as double-width comes from historic
+ * implementation simplicity (8-bit encoded characters were displayed
+ * single-width and 16-bit ones double-width, even for Greek,
+ * Cyrillic, etc.) and not any typographic considerations.
+ *
+ * Much less clear is the choice of width for the Not East Asian
+ * (Neutral) class. Existing practice does not dictate a width for any
+ * of these characters. It would nevertheless make sense
+ * typographically to allocate two character cells to characters such
+ * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be
+ * represented adequately with a single-width glyph. The following
+ * routines at present merely assign a single-cell width to all
+ * neutral characters, in the interest of simplicity. This is not
+ * entirely satisfactory and should be reconsidered before
+ * establishing a formal standard in this area. At the moment, the
+ * decision which Not East Asian (Neutral) characters should be
+ * represented by double-width glyphs cannot yet be answered by
+ * applying a simple rule from the Unicode database content. Setting
+ * up a proper standard for the behavior of UTF-8 character terminals
+ * will require a careful analysis not only of each Unicode character,
+ * but also of each presentation form, something the author of these
+ * routines has avoided to do so far.
+ *
+ * http://www.unicode.org/unicode/reports/tr11/
+ *
+ * Markus Kuhn -- 2007-05-26 (Unicode 5.0)
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * for any purpose and without fee is hereby granted. The author
+ * disclaims all warranties with regard to this software.
+ *
+ * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
+ */
+
+#ifdef __GO32__
+# include <wctype.h>
+#endif
+
+#include <wchar.h>
+
+struct interval {
+ int first;
+ int last;
+};
+
+/* auxiliary function for binary search in interval table */
+static int bisearch(wchar_t ucs, const struct interval *table, int max) {
+ int min = 0;
+ int mid;
+
+ if (ucs < table[0].first || ucs > table[max].last)
+ return 0;
+ while (max >= min) {
+ mid = (min + max) / 2;
+ if (ucs > table[mid].last)
+ min = mid + 1;
+ else if (ucs < table[mid].first)
+ max = mid - 1;
+ else
+ return 1;
+ }
+
+ return 0;
+}
+
+
+/* The following two functions define the column width of an ISO 10646
+ * character as follows:
+ *
+ * - The null character (U+0000) has a column width of 0.
+ *
+ * - Other C0/C1 control characters and DEL will lead to a return
+ * value of -1.
+ *
+ * - Non-spacing and enclosing combining characters (general
+ * category code Mn or Me in the Unicode database) have a
+ * column width of 0.
+ *
+ * - SOFT HYPHEN (U+00AD) has a column width of 1.
+ *
+ * - Other format characters (general category code Cf in the Unicode
+ * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0.
+ *
+ * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF)
+ * have a column width of 0.
+ *
+ * - Spacing characters in the East Asian Wide (W) or East Asian
+ * Full-width (F) category as defined in Unicode Technical
+ * Report #11 have a column width of 2.
+ *
+ * - All remaining characters (including all printable
+ * ISO 8859-1 and WGL4 characters, Unicode control characters,
+ * etc.) have a column width of 1.
+ *
+ * This implementation assumes that wchar_t characters are encoded
+ * in ISO 10646.
+ */
+
+int mk_wcwidth(wchar_t ucs)
+{
+ /* sorted list of non-overlapping intervals of non-spacing characters */
+ /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */
+ static const struct interval combining[] = {
+ { 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 },
+ { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 },
+ { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 },
+ { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 },
+ { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED },
+ { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A },
+ { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 },
+ { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D },
+ { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 },
+ { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD },
+ { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C },
+ { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D },
+ { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC },
+ { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD },
+ { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C },
+ { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D },
+ { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 },
+ { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC },
+ { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD },
+ { 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D },
+ { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 },
+ { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E },
+ { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC },
+ { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 },
+ { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E },
+ { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 },
+ { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 },
+ { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 },
+ { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F },
+ { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 },
+ { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD },
+ { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD },
+ { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 },
+ { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B },
+ { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 },
+ { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 },
+ { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF },
+ { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 },
+ { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F },
+ { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B },
+ { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F },
+ { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB },
+ { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F },
+ { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 },
+ { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD },
+ { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F },
+ { 0xE0100, 0xE01EF }
+ };
+
+ /* test for 8-bit control characters */
+ if (ucs == 0)
+ return 0;
+ if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0))
+ return -1;
+
+ /* binary search in table of non-spacing characters */
+ if (bisearch(ucs, combining,
+ sizeof(combining) / sizeof(struct interval) - 1))
+ return 0;
+
+ /* if we arrive here, ucs is not a combining or C0/C1 control character */
+
+ return 1 +
+ (ucs >= 0x1100 &&
+ (ucs <= 0x115f || /* Hangul Jamo init. consonants */
+ ucs == 0x2329 || ucs == 0x232a ||
+ (ucs >= 0x2e80 && ucs <= 0xa4cf &&
+ ucs != 0x303f) || /* CJK ... Yi */
+ (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */
+ (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */
+ (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */
+ (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */
+ (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */
+ (ucs >= 0xffe0 && ucs <= 0xffe6) ||
+ (ucs >= 0x20000 && ucs <= 0x2fffd) ||
+ (ucs >= 0x30000 && ucs <= 0x3fffd)));
+}
+
+
+int mk_wcswidth(const wchar_t *pwcs, size_t n)
+{
+ int w, width = 0;
+
+ for (;*pwcs && n-- > 0; pwcs++)
+ if ((w = mk_wcwidth(*pwcs)) < 0)
+ return -1;
+ else
+ width += w;
+
+ return width;
+}
+
+
+/*
+ * The following functions are the same as mk_wcwidth() and
+ * mk_wcswidth(), except that spacing characters in the East Asian
+ * Ambiguous (A) category as defined in Unicode Technical Report #11
+ * have a column width of 2. This variant might be useful for users of
+ * CJK legacy encodings who want to migrate to UCS without changing
+ * the traditional terminal character-width behaviour. It is not
+ * otherwise recommended for general use.
+ */
+int mk_wcwidth_cjk(wchar_t ucs)
+{
+ /* sorted list of non-overlapping intervals of East Asian Ambiguous
+ * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */
+ static const struct interval ambiguous[] = {
+ { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 },
+ { 0x00AA, 0x00AA }, { 0x00AE, 0x00AE }, { 0x00B0, 0x00B4 },
+ { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 },
+ { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 },
+ { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED },
+ { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA },
+ { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 },
+ { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B },
+ { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 },
+ { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 },
+ { 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 },
+ { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE },
+ { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 },
+ { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA },
+ { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 },
+ { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB },
+ { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB },
+ { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 },
+ { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 },
+ { 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 },
+ { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 },
+ { 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 },
+ { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 },
+ { 0x203B, 0x203B }, { 0x203E, 0x203E }, { 0x2074, 0x2074 },
+ { 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC },
+ { 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 },
+ { 0x2113, 0x2113 }, { 0x2116, 0x2116 }, { 0x2121, 0x2122 },
+ { 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 },
+ { 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 },
+ { 0x2190, 0x2199 }, { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 },
+ { 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 },
+ { 0x2202, 0x2203 }, { 0x2207, 0x2208 }, { 0x220B, 0x220B },
+ { 0x220F, 0x220F }, { 0x2211, 0x2211 }, { 0x2215, 0x2215 },
+ { 0x221A, 0x221A }, { 0x221D, 0x2220 }, { 0x2223, 0x2223 },
+ { 0x2225, 0x2225 }, { 0x2227, 0x222C }, { 0x222E, 0x222E },
+ { 0x2234, 0x2237 }, { 0x223C, 0x223D }, { 0x2248, 0x2248 },
+ { 0x224C, 0x224C }, { 0x2252, 0x2252 }, { 0x2260, 0x2261 },
+ { 0x2264, 0x2267 }, { 0x226A, 0x226B }, { 0x226E, 0x226F },
+ { 0x2282, 0x2283 }, { 0x2286, 0x2287 }, { 0x2295, 0x2295 },
+ { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF },
+ { 0x2312, 0x2312 }, { 0x2460, 0x24E9 }, { 0x24EB, 0x254B },
+ { 0x2550, 0x2573 }, { 0x2580, 0x258F }, { 0x2592, 0x2595 },
+ { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, { 0x25B2, 0x25B3 },
+ { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, { 0x25C0, 0x25C1 },
+ { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, { 0x25CE, 0x25D1 },
+ { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, { 0x2605, 0x2606 },
+ { 0x2609, 0x2609 }, { 0x260E, 0x260F }, { 0x2614, 0x2615 },
+ { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 },
+ { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 },
+ { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F },
+ { 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0xE000, 0xF8FF },
+ { 0xFFFD, 0xFFFD }, { 0xF0000, 0xFFFFD }, { 0x100000, 0x10FFFD }
+ };
+
+ /* binary search in table of non-spacing characters */
+ if (bisearch(ucs, ambiguous,
+ sizeof(ambiguous) / sizeof(struct interval) - 1))
+ return 2;
+
+ return mk_wcwidth(ucs);
+}
+
+
+int mk_wcswidth_cjk(const wchar_t *pwcs, size_t n)
+{
+ int w, width = 0;
+
+ for (;*pwcs && n-- > 0; pwcs++)
+ if ((w = mk_wcwidth_cjk(*pwcs)) < 0)
+ return -1;
+ else
+ width += w;
+
+ return width;
+}
diff --git a/tcap.h b/tcap.h
new file mode 100644
index 0000000..859e6ee
--- /dev/null
+++ b/tcap.h
@@ -0,0 +1,60 @@
+/* tcap.h -- termcap library functions and variables. */
+
+/* Copyright (C) 1996-2015 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_RLTCAP_H_)
+#define _RLTCAP_H_
+
+#if defined (HAVE_CONFIG_H)
+# include "config.h"
+#endif
+
+#if defined (HAVE_TERMCAP_H)
+# if defined (__linux__) && !defined (SPEED_T_IN_SYS_TYPES)
+# include "rltty.h"
+# endif
+# include <termcap.h>
+#elif defined (HAVE_NCURSES_TERMCAP_H)
+# include <ncurses/termcap.h>
+#else
+
+/* On Solaris2, sys/types.h #includes sys/reg.h, which #defines PC.
+ Unfortunately, PC is a global variable used by the termcap library. */
+#ifdef PC
+# undef PC
+#endif
+
+extern char PC;
+extern char *UP, *BC;
+
+extern short ospeed;
+
+extern int tgetent ();
+extern int tgetflag ();
+extern int tgetnum ();
+extern char *tgetstr ();
+
+extern int tputs ();
+
+extern char *tgoto ();
+
+#endif /* HAVE_TERMCAP_H */
+
+#endif /* !_RLTCAP_H_ */
diff --git a/terminal.c b/terminal.c
new file mode 100644
index 0000000..9997161
--- /dev/null
+++ b/terminal.c
@@ -0,0 +1,939 @@
+/* terminal.c -- controlling the terminal with termcap. */
+
+/* Copyright (C) 1996-2022 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include "posixstat.h"
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+# include <sys/file.h>
+#endif /* HAVE_SYS_FILE_H */
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_LOCALE_H)
+# include <locale.h>
+#endif
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+#ifdef __MSDOS__
+# include <pc.h>
+#endif
+
+#include "rltty.h"
+#if defined (HAVE_SYS_IOCTL_H)
+# include <sys/ioctl.h> /* include for declaration of ioctl */
+#endif
+#include "tcap.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#if defined (__MINGW32__)
+# include <windows.h>
+# include <wincon.h>
+
+static void _win_get_screensize (int *, int *);
+#endif
+
+#if defined (__EMX__)
+static void _emx_get_screensize (int *, int *);
+#endif
+
+/* If the calling application sets this to a non-zero value, readline will
+ use the $LINES and $COLUMNS environment variables to set its idea of the
+ window size before interrogating the kernel. */
+int rl_prefer_env_winsize = 0;
+
+/* If this is non-zero, readline will set LINES and COLUMNS in the
+ environment when it handles SIGWINCH. */
+int rl_change_environment = 1;
+
+/* **************************************************************** */
+/* */
+/* Terminal and Termcap */
+/* */
+/* **************************************************************** */
+
+#ifndef __MSDOS__
+static char *term_buffer = (char *)NULL;
+static char *term_string_buffer = (char *)NULL;
+#endif
+
+static int tcap_initialized;
+
+#if !defined (__linux__) && !defined (NCURSES_VERSION)
+# if defined (__EMX__) || defined (NEED_EXTERN_PC)
+extern
+# endif /* __EMX__ || NEED_EXTERN_PC */
+char PC, *BC, *UP;
+#endif /* !__linux__ && !NCURSES_VERSION */
+
+/* Some strings to control terminal actions. These are output by tputs (). */
+char *_rl_term_clreol;
+char *_rl_term_clrpag;
+char *_rl_term_clrscroll;
+char *_rl_term_cr;
+char *_rl_term_backspace;
+char *_rl_term_goto;
+char *_rl_term_pc;
+
+/* Non-zero if we determine that the terminal can do character insertion. */
+int _rl_terminal_can_insert = 0;
+
+/* How to insert characters. */
+char *_rl_term_im;
+char *_rl_term_ei;
+char *_rl_term_ic;
+char *_rl_term_ip;
+char *_rl_term_IC;
+
+/* How to delete characters. */
+char *_rl_term_dc;
+char *_rl_term_DC;
+
+/* How to move forward a char, non-destructively */
+char *_rl_term_forward_char;
+
+/* How to go up a line. */
+char *_rl_term_up;
+
+/* A visible bell; char if the terminal can be made to flash the screen. */
+static char *_rl_visible_bell;
+
+/* Non-zero means the terminal can auto-wrap lines. */
+int _rl_term_autowrap = -1;
+
+/* Non-zero means that this terminal has a meta key. */
+static int term_has_meta;
+
+/* The sequences to write to turn on and off the meta key, if this
+ terminal has one. */
+static char *_rl_term_mm;
+static char *_rl_term_mo;
+
+/* The sequences to enter and exit standout mode. */
+static char *_rl_term_so;
+static char *_rl_term_se;
+
+/* The key sequences output by the arrow keys, if this terminal has any. */
+static char *_rl_term_ku;
+static char *_rl_term_kd;
+static char *_rl_term_kr;
+static char *_rl_term_kl;
+
+/* How to initialize and reset the arrow keys, if this terminal has any. */
+static char *_rl_term_ks;
+static char *_rl_term_ke;
+
+/* The key sequences sent by the Home and End keys, if any. */
+static char *_rl_term_kh;
+static char *_rl_term_kH;
+static char *_rl_term_at7; /* @7 */
+
+/* Delete key */
+static char *_rl_term_kD;
+
+/* Insert key */
+static char *_rl_term_kI;
+
+/* Page up and page down keys */
+static char *_rl_term_kP;
+static char *_rl_term_kN;
+
+/* Cursor control */
+static char *_rl_term_vs; /* very visible */
+static char *_rl_term_ve; /* normal */
+
+/* User-settable color sequences to begin and end the active region. Defaults
+ are rl_term_so and rl_term_se on non-dumb terminals. */
+char *_rl_active_region_start_color = NULL;
+char *_rl_active_region_end_color = NULL;
+
+/* It's not clear how HPUX is so broken here. */
+#ifdef TGETENT_BROKEN
+# define TGETENT_SUCCESS 0
+#else
+# define TGETENT_SUCCESS 1
+#endif
+#ifdef TGETFLAG_BROKEN
+# define TGETFLAG_SUCCESS 0
+#else
+# define TGETFLAG_SUCCESS 1
+#endif
+#define TGETFLAG(cap) (tgetflag (cap) == TGETFLAG_SUCCESS)
+
+static void bind_termcap_arrow_keys (Keymap);
+
+/* Variables that hold the screen dimensions, used by the display code. */
+int _rl_screenwidth, _rl_screenheight, _rl_screenchars;
+
+/* Non-zero means the user wants to enable the keypad. */
+int _rl_enable_keypad;
+
+/* Non-zero means the user wants to enable a meta key. */
+int _rl_enable_meta = 1;
+
+#if defined (__EMX__)
+static void
+_emx_get_screensize (int *swp, int *shp)
+{
+ int sz[2];
+
+ _scrsize (sz);
+
+ if (swp)
+ *swp = sz[0];
+ if (shp)
+ *shp = sz[1];
+}
+#endif
+
+#if defined (__MINGW32__)
+static void
+_win_get_screensize (int *swp, int *shp)
+{
+ HANDLE hConOut;
+ CONSOLE_SCREEN_BUFFER_INFO scr;
+
+ hConOut = GetStdHandle (STD_OUTPUT_HANDLE);
+ if (hConOut != INVALID_HANDLE_VALUE)
+ {
+ if (GetConsoleScreenBufferInfo (hConOut, &scr))
+ {
+ *swp = scr.dwSize.X;
+ *shp = scr.srWindow.Bottom - scr.srWindow.Top + 1;
+ }
+ }
+}
+#endif
+
+/* Get readline's idea of the screen size. TTY is a file descriptor open
+ to the terminal. If IGNORE_ENV is true, we do not pay attention to the
+ values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being
+ non-null serve to check whether or not we have initialized termcap. */
+void
+_rl_get_screen_size (int tty, int ignore_env)
+{
+ char *ss;
+#if defined (TIOCGWINSZ)
+ struct winsize window_size;
+#endif /* TIOCGWINSZ */
+ int wr, wc;
+
+ wr = wc = -1;
+#if defined (TIOCGWINSZ)
+ if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)
+ {
+ wc = (int) window_size.ws_col;
+ wr = (int) window_size.ws_row;
+ }
+#endif /* TIOCGWINSZ */
+
+#if defined (__EMX__)
+ _emx_get_screensize (&wc, &wr);
+#elif defined (__MINGW32__)
+ _win_get_screensize (&wc, &wr);
+#endif
+
+ if (ignore_env || rl_prefer_env_winsize == 0)
+ {
+ _rl_screenwidth = wc;
+ _rl_screenheight = wr;
+ }
+ else
+ _rl_screenwidth = _rl_screenheight = -1;
+
+ /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV
+ is unset. If we prefer the environment, check it first before
+ assigning the value returned by the kernel. */
+ if (_rl_screenwidth <= 0)
+ {
+ if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS")))
+ _rl_screenwidth = atoi (ss);
+
+ if (_rl_screenwidth <= 0)
+ _rl_screenwidth = wc;
+
+#if defined (__DJGPP__)
+ if (_rl_screenwidth <= 0)
+ _rl_screenwidth = ScreenCols ();
+#else
+ if (_rl_screenwidth <= 0 && term_string_buffer)
+ _rl_screenwidth = tgetnum ("co");
+#endif
+ }
+
+ /* Environment variable LINES overrides setting of "li" if IGNORE_ENV
+ is unset. */
+ if (_rl_screenheight <= 0)
+ {
+ if (ignore_env == 0 && (ss = sh_get_env_value ("LINES")))
+ _rl_screenheight = atoi (ss);
+
+ if (_rl_screenheight <= 0)
+ _rl_screenheight = wr;
+
+#if defined (__DJGPP__)
+ if (_rl_screenheight <= 0)
+ _rl_screenheight = ScreenRows ();
+#else
+ if (_rl_screenheight <= 0 && term_string_buffer)
+ _rl_screenheight = tgetnum ("li");
+#endif
+ }
+
+ /* If all else fails, default to 80x24 terminal. */
+ if (_rl_screenwidth <= 1)
+ _rl_screenwidth = 80;
+
+ if (_rl_screenheight <= 0)
+ _rl_screenheight = 24;
+
+ /* If we're being compiled as part of bash, set the environment
+ variables $LINES and $COLUMNS to new values. Otherwise, just
+ do a pair of putenv () or setenv () calls. */
+ if (rl_change_environment)
+ sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth);
+
+ if (_rl_term_autowrap == 0)
+ _rl_screenwidth--;
+
+ _rl_screenchars = _rl_screenwidth * _rl_screenheight;
+}
+
+void
+_rl_set_screen_size (int rows, int cols)
+{
+ if (_rl_term_autowrap == -1)
+ _rl_init_terminal_io (rl_terminal_name);
+
+ if (rows > 0)
+ _rl_screenheight = rows;
+ if (cols > 0)
+ {
+ _rl_screenwidth = cols;
+ if (_rl_term_autowrap == 0)
+ _rl_screenwidth--;
+ }
+
+ if (rows > 0 || cols > 0)
+ _rl_screenchars = _rl_screenwidth * _rl_screenheight;
+}
+
+void
+rl_set_screen_size (int rows, int cols)
+{
+ _rl_set_screen_size (rows, cols);
+}
+
+void
+rl_get_screen_size (int *rows, int *cols)
+{
+ if (rows)
+ *rows = _rl_screenheight;
+ if (cols)
+ *cols = _rl_screenwidth;
+}
+
+void
+rl_reset_screen_size (void)
+{
+ _rl_get_screen_size (fileno (rl_instream), 0);
+}
+
+void
+_rl_sigwinch_resize_terminal (void)
+{
+ _rl_get_screen_size (fileno (rl_instream), 1);
+}
+
+void
+rl_resize_terminal (void)
+{
+ int width, height;
+
+ width = _rl_screenwidth;
+ height = _rl_screenheight;
+ _rl_get_screen_size (fileno (rl_instream), 1);
+ if (_rl_echoing_p && (width != _rl_screenwidth || height != _rl_screenheight))
+ {
+ if (CUSTOM_REDISPLAY_FUNC ())
+ rl_forced_update_display ();
+ else if (RL_ISSTATE(RL_STATE_REDISPLAYING) == 0)
+ _rl_redisplay_after_sigwinch ();
+ }
+}
+
+struct _tc_string {
+ const char * const tc_var;
+ char **tc_value;
+};
+
+/* This should be kept sorted, just in case we decide to change the
+ search algorithm to something smarter. */
+static const struct _tc_string tc_strings[] =
+{
+ { "@7", &_rl_term_at7 },
+ { "DC", &_rl_term_DC },
+ { "E3", &_rl_term_clrscroll },
+ { "IC", &_rl_term_IC },
+ { "ce", &_rl_term_clreol },
+ { "cl", &_rl_term_clrpag },
+ { "cr", &_rl_term_cr },
+ { "dc", &_rl_term_dc },
+ { "ei", &_rl_term_ei },
+ { "ic", &_rl_term_ic },
+ { "im", &_rl_term_im },
+ { "kD", &_rl_term_kD }, /* delete */
+ { "kH", &_rl_term_kH }, /* home down ?? */
+ { "kI", &_rl_term_kI }, /* insert */
+ { "kN", &_rl_term_kN }, /* page down */
+ { "kP", &_rl_term_kP }, /* page up */
+ { "kd", &_rl_term_kd },
+ { "ke", &_rl_term_ke }, /* end keypad mode */
+ { "kh", &_rl_term_kh }, /* home */
+ { "kl", &_rl_term_kl },
+ { "kr", &_rl_term_kr },
+ { "ks", &_rl_term_ks }, /* start keypad mode */
+ { "ku", &_rl_term_ku },
+ { "le", &_rl_term_backspace },
+ { "mm", &_rl_term_mm },
+ { "mo", &_rl_term_mo },
+ { "nd", &_rl_term_forward_char },
+ { "pc", &_rl_term_pc },
+ { "se", &_rl_term_se },
+ { "so", &_rl_term_so },
+ { "up", &_rl_term_up },
+ { "vb", &_rl_visible_bell },
+ { "vs", &_rl_term_vs },
+ { "ve", &_rl_term_ve },
+};
+
+#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string))
+
+/* Read the desired terminal capability strings into BP. The capabilities
+ are described in the TC_STRINGS table. */
+static void
+get_term_capabilities (char **bp)
+{
+#if !defined (__DJGPP__) /* XXX - doesn't DJGPP have a termcap library? */
+ register int i;
+
+ for (i = 0; i < NUM_TC_STRINGS; i++)
+ *(tc_strings[i].tc_value) = tgetstr ((char *)tc_strings[i].tc_var, bp);
+#endif
+ tcap_initialized = 1;
+}
+
+int
+_rl_init_terminal_io (const char *terminal_name)
+{
+ const char *term;
+ char *buffer;
+ int tty, tgetent_ret, dumbterm, reset_region_colors;
+
+ term = terminal_name ? terminal_name : sh_get_env_value ("TERM");
+ _rl_term_clrpag = _rl_term_cr = _rl_term_clreol = _rl_term_clrscroll = (char *)NULL;
+ tty = rl_instream ? fileno (rl_instream) : 0;
+
+ if (term == 0)
+ term = "dumb";
+
+ dumbterm = STREQ (term, "dumb");
+
+ reset_region_colors = 1;
+
+#ifdef __MSDOS__
+ _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL;
+ _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL;
+ _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL;
+ _rl_term_mm = _rl_term_mo = (char *)NULL;
+ _rl_terminal_can_insert = term_has_meta = _rl_term_autowrap = 0;
+ _rl_term_cr = "\r";
+ _rl_term_backspace = (char *)NULL;
+ _rl_term_goto = _rl_term_pc = _rl_term_ip = (char *)NULL;
+ _rl_term_ks = _rl_term_ke =_rl_term_vs = _rl_term_ve = (char *)NULL;
+ _rl_term_kh = _rl_term_kH = _rl_term_at7 = _rl_term_kI = (char *)NULL;
+ _rl_term_kN = _rl_term_kP = (char *)NULL;
+ _rl_term_so = _rl_term_se = (char *)NULL;
+#if defined(HACK_TERMCAP_MOTION)
+ _rl_term_forward_char = (char *)NULL;
+#endif
+
+ _rl_get_screen_size (tty, 0);
+#else /* !__MSDOS__ */
+ /* I've separated this out for later work on not calling tgetent at all
+ if the calling application has supplied a custom redisplay function,
+ (and possibly if the application has supplied a custom input function). */
+ if (CUSTOM_REDISPLAY_FUNC())
+ {
+ tgetent_ret = -1;
+ }
+ else
+ {
+ if (term_string_buffer == 0)
+ term_string_buffer = (char *)xmalloc(2032);
+
+ if (term_buffer == 0)
+ term_buffer = (char *)xmalloc(4080);
+
+ buffer = term_string_buffer;
+
+ tgetent_ret = tgetent (term_buffer, term);
+ }
+
+ if (tgetent_ret != TGETENT_SUCCESS)
+ {
+ FREE (term_string_buffer);
+ FREE (term_buffer);
+ buffer = term_buffer = term_string_buffer = (char *)NULL;
+
+ _rl_term_autowrap = 0; /* used by _rl_get_screen_size */
+
+ /* Allow calling application to set default height and width, using
+ rl_set_screen_size */
+ if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
+ {
+#if defined (__EMX__)
+ _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight);
+ _rl_screenwidth--;
+#else /* !__EMX__ */
+ _rl_get_screen_size (tty, 0);
+#endif /* !__EMX__ */
+ }
+
+ /* Defaults. */
+ if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
+ {
+ _rl_screenwidth = 79;
+ _rl_screenheight = 24;
+ }
+
+ /* Everything below here is used by the redisplay code (tputs). */
+ _rl_screenchars = _rl_screenwidth * _rl_screenheight;
+ _rl_term_cr = "\r";
+ _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL;
+ _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL;
+ _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL;
+ _rl_term_kh = _rl_term_kH = _rl_term_kI = _rl_term_kD = (char *)NULL;
+ _rl_term_ks = _rl_term_ke = _rl_term_at7 = (char *)NULL;
+ _rl_term_kN = _rl_term_kP = (char *)NULL;
+ _rl_term_mm = _rl_term_mo = (char *)NULL;
+ _rl_term_ve = _rl_term_vs = (char *)NULL;
+ _rl_term_forward_char = (char *)NULL;
+ _rl_term_so = _rl_term_se = (char *)NULL;
+ _rl_terminal_can_insert = term_has_meta = 0;
+
+ /* Assume generic unknown terminal can't handle the enable/disable
+ escape sequences */
+ _rl_enable_bracketed_paste = 0;
+
+ /* No terminal so/se capabilities. */
+ _rl_enable_active_region = 0;
+ _rl_reset_region_color (0, NULL);
+ _rl_reset_region_color (1, NULL);
+
+ /* Reasonable defaults for tgoto(). Readline currently only uses
+ tgoto if _rl_term_IC or _rl_term_DC is defined, but just in case we
+ change that later... */
+ PC = '\0';
+ BC = _rl_term_backspace = "\b";
+ UP = _rl_term_up;
+
+ return 0;
+ }
+
+ get_term_capabilities (&buffer);
+
+ /* Set up the variables that the termcap library expects the application
+ to provide. */
+ PC = _rl_term_pc ? *_rl_term_pc : 0;
+ BC = _rl_term_backspace;
+ UP = _rl_term_up;
+
+ if (_rl_term_cr == 0)
+ _rl_term_cr = "\r";
+
+ _rl_term_autowrap = TGETFLAG ("am") && TGETFLAG ("xn");
+
+ /* Allow calling application to set default height and width, using
+ rl_set_screen_size */
+ if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
+ _rl_get_screen_size (tty, 0);
+
+ /* "An application program can assume that the terminal can do
+ character insertion if *any one of* the capabilities `IC',
+ `im', `ic' or `ip' is provided." But we can't do anything if
+ only `ip' is provided, so... */
+ _rl_terminal_can_insert = (_rl_term_IC || _rl_term_im || _rl_term_ic);
+
+ /* Check to see if this terminal has a meta key and clear the capability
+ variables if there is none. */
+ term_has_meta = TGETFLAG ("km");
+ if (term_has_meta == 0)
+ _rl_term_mm = _rl_term_mo = (char *)NULL;
+#endif /* !__MSDOS__ */
+
+ /* Attempt to find and bind the arrow keys. Do not override already
+ bound keys in an overzealous attempt, however. */
+
+ bind_termcap_arrow_keys (emacs_standard_keymap);
+
+#if defined (VI_MODE)
+ bind_termcap_arrow_keys (vi_movement_keymap);
+ bind_termcap_arrow_keys (vi_insertion_keymap);
+#endif /* VI_MODE */
+
+ /* There's no way to determine whether or not a given terminal supports
+ bracketed paste mode, so we assume a terminal named "dumb" does not. */
+ if (dumbterm)
+ _rl_enable_bracketed_paste = _rl_enable_active_region = 0;
+
+ if (reset_region_colors)
+ {
+ _rl_reset_region_color (0, _rl_term_so);
+ _rl_reset_region_color (1, _rl_term_se);
+ }
+
+ return 0;
+}
+
+/* Bind the arrow key sequences from the termcap description in MAP. */
+static void
+bind_termcap_arrow_keys (Keymap map)
+{
+ Keymap xkeymap;
+
+ xkeymap = _rl_keymap;
+ _rl_keymap = map;
+
+ rl_bind_keyseq_if_unbound (_rl_term_ku, rl_get_previous_history);
+ rl_bind_keyseq_if_unbound (_rl_term_kd, rl_get_next_history);
+ rl_bind_keyseq_if_unbound (_rl_term_kr, rl_forward_char);
+ rl_bind_keyseq_if_unbound (_rl_term_kl, rl_backward_char);
+
+ rl_bind_keyseq_if_unbound (_rl_term_kh, rl_beg_of_line); /* Home */
+ rl_bind_keyseq_if_unbound (_rl_term_at7, rl_end_of_line); /* End */
+
+ rl_bind_keyseq_if_unbound (_rl_term_kD, rl_delete);
+ rl_bind_keyseq_if_unbound (_rl_term_kI, rl_overwrite_mode); /* Insert */
+
+ rl_bind_keyseq_if_unbound (_rl_term_kN, rl_history_search_forward); /* Page Down */
+ rl_bind_keyseq_if_unbound (_rl_term_kP, rl_history_search_backward); /* Page Up */
+
+ _rl_keymap = xkeymap;
+}
+
+char *
+rl_get_termcap (const char *cap)
+{
+ register int i;
+
+ if (tcap_initialized == 0)
+ return ((char *)NULL);
+ for (i = 0; i < NUM_TC_STRINGS; i++)
+ {
+ if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0)
+ return *(tc_strings[i].tc_value);
+ }
+ return ((char *)NULL);
+}
+
+/* Re-initialize the terminal considering that the TERM/TERMCAP variable
+ has changed. */
+int
+rl_reset_terminal (const char *terminal_name)
+{
+ _rl_screenwidth = _rl_screenheight = 0;
+ _rl_init_terminal_io (terminal_name);
+ return 0;
+}
+
+/* A function for the use of tputs () */
+#ifdef _MINIX
+void
+_rl_output_character_function (int c)
+{
+ putc (c, _rl_out_stream);
+}
+#else /* !_MINIX */
+int
+_rl_output_character_function (int c)
+{
+ return putc (c, _rl_out_stream);
+}
+#endif /* !_MINIX */
+
+/* Write COUNT characters from STRING to the output stream. */
+void
+_rl_output_some_chars (const char *string, int count)
+{
+ fwrite (string, 1, count, _rl_out_stream);
+}
+
+/* Move the cursor back. */
+int
+_rl_backspace (int count)
+{
+ register int i;
+
+#ifndef __MSDOS__
+ if (_rl_term_backspace)
+ for (i = 0; i < count; i++)
+ tputs (_rl_term_backspace, 1, _rl_output_character_function);
+ else
+#endif
+ for (i = 0; i < count; i++)
+ putc ('\b', _rl_out_stream);
+ return 0;
+}
+
+/* Move to the start of the next line. */
+int
+rl_crlf (void)
+{
+#if defined (NEW_TTY_DRIVER) || defined (__MINT__)
+ if (_rl_term_cr)
+ tputs (_rl_term_cr, 1, _rl_output_character_function);
+#endif /* NEW_TTY_DRIVER || __MINT__ */
+ putc ('\n', _rl_out_stream);
+ return 0;
+}
+
+void
+_rl_cr (void)
+{
+#if defined (__MSDOS__)
+ putc ('\r', rl_outstream);
+#else
+ tputs (_rl_term_cr, 1, _rl_output_character_function);
+#endif
+}
+
+/* Ring the terminal bell. */
+int
+rl_ding (void)
+{
+ if (_rl_echoing_p)
+ {
+ switch (_rl_bell_preference)
+ {
+ case NO_BELL:
+ default:
+ break;
+ case VISIBLE_BELL:
+ if (_rl_visible_bell)
+ {
+#ifdef __DJGPP__
+ ScreenVisualBell ();
+#else
+ tputs (_rl_visible_bell, 1, _rl_output_character_function);
+#endif
+ break;
+ }
+ /* FALLTHROUGH */
+ case AUDIBLE_BELL:
+ fprintf (stderr, "\007");
+ fflush (stderr);
+ break;
+ }
+ return (0);
+ }
+ return (-1);
+}
+
+/* **************************************************************** */
+/* */
+/* Entering and leaving terminal standout mode */
+/* */
+/* **************************************************************** */
+
+void
+_rl_standout_on (void)
+{
+#ifndef __MSDOS__
+ if (_rl_term_so && _rl_term_se)
+ tputs (_rl_term_so, 1, _rl_output_character_function);
+#endif
+}
+
+void
+_rl_standout_off (void)
+{
+#ifndef __MSDOS__
+ if (_rl_term_so && _rl_term_se)
+ tputs (_rl_term_se, 1, _rl_output_character_function);
+#endif
+}
+
+/* **************************************************************** */
+/* */
+/* Controlling color for a portion of the line */
+/* */
+/* **************************************************************** */
+
+/* Reset the region color variables to VALUE depending on WHICH (0 == start,
+ 1 == end). This is where all the memory allocation for the color variable
+ strings is performed. We might want to pass a flag saying whether or not
+ to translate VALUE like a key sequence, but it doesn't really matter. */
+int
+_rl_reset_region_color (int which, const char *value)
+{
+ int len;
+
+ if (which == 0)
+ {
+ xfree (_rl_active_region_start_color);
+ if (value && *value)
+ {
+ _rl_active_region_start_color = (char *)xmalloc (2 * strlen (value) + 1);
+ rl_translate_keyseq (value, _rl_active_region_start_color, &len);
+ _rl_active_region_start_color[len] = '\0';
+ }
+ else
+ _rl_active_region_start_color = NULL;
+ }
+ else
+ {
+ xfree (_rl_active_region_end_color);
+ if (value && *value)
+ {
+ _rl_active_region_end_color = (char *)xmalloc (2 * strlen (value) + 1);
+ rl_translate_keyseq (value, _rl_active_region_end_color, &len);
+ _rl_active_region_end_color[len] = '\0';
+ }
+ else
+ _rl_active_region_end_color = NULL;
+ }
+
+ return 0;
+}
+
+void
+_rl_region_color_on (void)
+{
+#ifndef __MSDOS__
+ if (_rl_active_region_start_color && _rl_active_region_end_color)
+ tputs (_rl_active_region_start_color, 1, _rl_output_character_function);
+#endif
+}
+
+void
+_rl_region_color_off (void)
+{
+#ifndef __MSDOS__
+ if (_rl_active_region_start_color && _rl_active_region_end_color)
+ tputs (_rl_active_region_end_color, 1, _rl_output_character_function);
+#endif
+}
+
+/* **************************************************************** */
+/* */
+/* Controlling the Meta Key and Keypad */
+/* */
+/* **************************************************************** */
+
+static int enabled_meta = 0; /* flag indicating we enabled meta mode */
+
+void
+_rl_enable_meta_key (void)
+{
+#if !defined (__DJGPP__)
+ if (term_has_meta && _rl_term_mm)
+ {
+ tputs (_rl_term_mm, 1, _rl_output_character_function);
+ enabled_meta = 1;
+ }
+#endif
+}
+
+void
+_rl_disable_meta_key (void)
+{
+#if !defined (__DJGPP__)
+ if (term_has_meta && _rl_term_mo && enabled_meta)
+ {
+ tputs (_rl_term_mo, 1, _rl_output_character_function);
+ enabled_meta = 0;
+ }
+#endif
+}
+
+void
+_rl_control_keypad (int on)
+{
+#if !defined (__DJGPP__)
+ if (on && _rl_term_ks)
+ tputs (_rl_term_ks, 1, _rl_output_character_function);
+ else if (!on && _rl_term_ke)
+ tputs (_rl_term_ke, 1, _rl_output_character_function);
+#endif
+}
+
+/* **************************************************************** */
+/* */
+/* Controlling the Cursor */
+/* */
+/* **************************************************************** */
+
+/* Set the cursor appropriately depending on IM, which is one of the
+ insert modes (insert or overwrite). Insert mode gets the normal
+ cursor. Overwrite mode gets a very visible cursor. Only does
+ anything if we have both capabilities. */
+void
+_rl_set_cursor (int im, int force)
+{
+#ifndef __MSDOS__
+ if (_rl_term_ve && _rl_term_vs)
+ {
+ if (force || im != rl_insert_mode)
+ {
+ if (im == RL_IM_OVERWRITE)
+ tputs (_rl_term_vs, 1, _rl_output_character_function);
+ else
+ tputs (_rl_term_ve, 1, _rl_output_character_function);
+ }
+ }
+#endif
+}
diff --git a/text.c b/text.c
new file mode 100644
index 0000000..91c3f33
--- /dev/null
+++ b/text.c
@@ -0,0 +1,1888 @@
+/* text.c -- text handling commands for readline. */
+
+/* Copyright (C) 1987-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_LOCALE_H)
+# include <locale.h>
+#endif
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#if defined (__EMX__)
+# define INCL_DOSPROCESS
+# include <os2.h>
+#endif /* __EMX__ */
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+/* Forward declarations. */
+static int rl_change_case (int, int);
+static int _rl_char_search (int, int, int);
+
+#if defined (READLINE_CALLBACKS)
+static int _rl_insert_next_callback (_rl_callback_generic_arg *);
+static int _rl_char_search_callback (_rl_callback_generic_arg *);
+#endif
+
+/* The largest chunk of text that can be inserted in one call to
+ rl_insert_text. Text blocks larger than this are divided. */
+#define TEXT_COUNT_MAX 1024
+
+int _rl_optimize_typeahead = 1; /* rl_insert tries to read typeahead */
+
+/* **************************************************************** */
+/* */
+/* Insert and Delete */
+/* */
+/* **************************************************************** */
+
+/* Insert a string of text into the line at point. This is the only
+ way that you should do insertion. _rl_insert_char () calls this
+ function. Returns the number of characters inserted. */
+int
+rl_insert_text (const char *string)
+{
+ register int i, l;
+
+ l = (string && *string) ? strlen (string) : 0;
+ if (l == 0)
+ return 0;
+
+ if (rl_end + l >= rl_line_buffer_len)
+ rl_extend_line_buffer (rl_end + l);
+
+ for (i = rl_end; i >= rl_point; i--)
+ rl_line_buffer[i + l] = rl_line_buffer[i];
+
+ strncpy (rl_line_buffer + rl_point, string, l);
+
+ /* Remember how to undo this if we aren't undoing something. */
+ if (_rl_doing_an_undo == 0)
+ {
+ /* If possible and desirable, concatenate the undos. */
+ if ((l == 1) &&
+ rl_undo_list &&
+ (rl_undo_list->what == UNDO_INSERT) &&
+ (rl_undo_list->end == rl_point) &&
+ (rl_undo_list->end - rl_undo_list->start < 20))
+ rl_undo_list->end++;
+ else
+ rl_add_undo (UNDO_INSERT, rl_point, rl_point + l, (char *)NULL);
+ }
+ rl_point += l;
+ rl_end += l;
+ rl_line_buffer[rl_end] = '\0';
+ return l;
+}
+
+/* Delete the string between FROM and TO. FROM is inclusive, TO is not.
+ Returns the number of characters deleted. */
+int
+rl_delete_text (int from, int to)
+{
+ register char *text;
+ register int diff, i;
+
+ /* Fix it if the caller is confused. */
+ if (from > to)
+ SWAP (from, to);
+
+ /* fix boundaries */
+ if (to > rl_end)
+ {
+ to = rl_end;
+ if (from > to)
+ from = to;
+ }
+ if (from < 0)
+ from = 0;
+
+ text = rl_copy_text (from, to);
+
+ /* Some versions of strncpy() can't handle overlapping arguments. */
+ diff = to - from;
+ for (i = from; i < rl_end - diff; i++)
+ rl_line_buffer[i] = rl_line_buffer[i + diff];
+
+ /* Remember how to undo this delete. */
+ if (_rl_doing_an_undo == 0)
+ rl_add_undo (UNDO_DELETE, from, to, text);
+ else
+ xfree (text);
+
+ rl_end -= diff;
+ rl_line_buffer[rl_end] = '\0';
+ _rl_fix_mark ();
+ return (diff);
+}
+
+/* Fix up point so that it is within the line boundaries after killing
+ text. If FIX_MARK_TOO is non-zero, the mark is forced within line
+ boundaries also. */
+
+#define _RL_FIX_POINT(x) \
+ do { \
+ if (x > rl_end) \
+ x = rl_end; \
+ else if (x < 0) \
+ x = 0; \
+ } while (0)
+
+void
+_rl_fix_point (int fix_mark_too)
+{
+ _RL_FIX_POINT (rl_point);
+ if (fix_mark_too)
+ _RL_FIX_POINT (rl_mark);
+}
+
+void
+_rl_fix_mark (void)
+{
+ _RL_FIX_POINT (rl_mark);
+}
+#undef _RL_FIX_POINT
+
+/* Replace the contents of the line buffer between START and END with
+ TEXT. The operation is undoable. To replace the entire line in an
+ undoable mode, use _rl_replace_text(text, 0, rl_end); */
+int
+_rl_replace_text (const char *text, int start, int end)
+{
+ int n;
+
+ n = 0;
+ rl_begin_undo_group ();
+ if (start <= end)
+ rl_delete_text (start, end + 1);
+ rl_point = start;
+ if (*text)
+ n = rl_insert_text (text);
+ rl_end_undo_group ();
+
+ return n;
+}
+
+/* Replace the current line buffer contents with TEXT. If CLEAR_UNDO is
+ non-zero, we free the current undo list. */
+void
+rl_replace_line (const char *text, int clear_undo)
+{
+ int len;
+
+ len = strlen (text);
+ if (len >= rl_line_buffer_len)
+ rl_extend_line_buffer (len);
+ strcpy (rl_line_buffer, text);
+ rl_end = len;
+
+ if (clear_undo)
+ rl_free_undo_list ();
+
+ _rl_fix_point (1);
+}
+
+/* **************************************************************** */
+/* */
+/* Readline character functions */
+/* */
+/* **************************************************************** */
+
+/* This is not a gap editor, just a stupid line input routine. No hair
+ is involved in writing any of the functions, and none should be. */
+
+/* Note that:
+
+ rl_end is the place in the string that we would place '\0';
+ i.e., it is always safe to place '\0' there.
+
+ rl_point is the place in the string where the cursor is. Sometimes
+ this is the same as rl_end.
+
+ Any command that is called interactively receives two arguments.
+ The first is a count: the numeric arg passed to this command.
+ The second is the key which invoked this command.
+*/
+
+/* **************************************************************** */
+/* */
+/* Movement Commands */
+/* */
+/* **************************************************************** */
+
+/* Note that if you `optimize' the display for these functions, you cannot
+ use said functions in other functions which do not do optimizing display.
+ I.e., you will have to update the data base for rl_redisplay, and you
+ might as well let rl_redisplay do that job. */
+
+/* Move forward COUNT bytes. */
+int
+rl_forward_byte (int count, int key)
+{
+ if (count < 0)
+ return (rl_backward_byte (-count, key));
+
+ if (count > 0)
+ {
+ int end, lend;
+
+ end = rl_point + count;
+#if defined (VI_MODE)
+ lend = rl_end > 0 ? rl_end - (VI_COMMAND_MODE()) : rl_end;
+#else
+ lend = rl_end;
+#endif
+
+ if (end > lend)
+ {
+ rl_point = lend;
+ rl_ding ();
+ }
+ else
+ rl_point = end;
+ }
+
+ if (rl_end < 0)
+ rl_end = 0;
+
+ return 0;
+}
+
+int
+_rl_forward_char_internal (int count)
+{
+ int point;
+
+#if defined (HANDLE_MULTIBYTE)
+ point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO);
+
+#if defined (VI_MODE)
+ if (point >= rl_end && VI_COMMAND_MODE())
+ point = _rl_find_prev_mbchar (rl_line_buffer, rl_end, MB_FIND_NONZERO);
+#endif
+
+ if (rl_end < 0)
+ rl_end = 0;
+#else
+ point = rl_point + count;
+#endif
+
+ if (point > rl_end)
+ point = rl_end;
+ return (point);
+}
+
+int
+_rl_backward_char_internal (int count)
+{
+ int point;
+
+ point = rl_point;
+#if defined (HANDLE_MULTIBYTE)
+ if (count > 0)
+ {
+ while (count > 0 && point > 0)
+ {
+ point = _rl_find_prev_mbchar (rl_line_buffer, point, MB_FIND_NONZERO);
+ count--;
+ }
+ if (count > 0)
+ return 0; /* XXX - rl_ding() here? */
+ }
+#else
+ if (count > 0)
+ point -= count;
+#endif
+
+ if (point < 0)
+ point = 0;
+ return (point);
+}
+
+#if defined (HANDLE_MULTIBYTE)
+/* Move forward COUNT characters. */
+int
+rl_forward_char (int count, int key)
+{
+ int point;
+
+ if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ return (rl_forward_byte (count, key));
+
+ if (count < 0)
+ return (rl_backward_char (-count, key));
+
+ if (count > 0)
+ {
+ if (rl_point == rl_end && EMACS_MODE())
+ {
+ rl_ding ();
+ return 0;
+ }
+
+ point = _rl_forward_char_internal (count);
+
+ if (rl_point == point)
+ rl_ding ();
+
+ rl_point = point;
+ }
+
+ return 0;
+}
+#else /* !HANDLE_MULTIBYTE */
+int
+rl_forward_char (int count, int key)
+{
+ return (rl_forward_byte (count, key));
+}
+#endif /* !HANDLE_MULTIBYTE */
+
+/* Backwards compatibility. */
+int
+rl_forward (int count, int key)
+{
+ return (rl_forward_char (count, key));
+}
+
+/* Move backward COUNT bytes. */
+int
+rl_backward_byte (int count, int key)
+{
+ if (count < 0)
+ return (rl_forward_byte (-count, key));
+
+ if (count > 0)
+ {
+ if (rl_point < count)
+ {
+ rl_point = 0;
+ rl_ding ();
+ }
+ else
+ rl_point -= count;
+ }
+
+ if (rl_point < 0)
+ rl_point = 0;
+
+ return 0;
+}
+
+#if defined (HANDLE_MULTIBYTE)
+/* Move backward COUNT characters. */
+int
+rl_backward_char (int count, int key)
+{
+ int point;
+
+ if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ return (rl_backward_byte (count, key));
+
+ if (count < 0)
+ return (rl_forward_char (-count, key));
+
+ if (count > 0)
+ {
+ point = rl_point;
+
+ while (count > 0 && point > 0)
+ {
+ point = _rl_find_prev_mbchar (rl_line_buffer, point, MB_FIND_NONZERO);
+ count--;
+ }
+ if (count > 0)
+ {
+ rl_point = 0;
+ rl_ding ();
+ }
+ else
+ rl_point = point;
+ }
+
+ return 0;
+}
+#else
+int
+rl_backward_char (int count, int key)
+{
+ return (rl_backward_byte (count, key));
+}
+#endif
+
+/* Backwards compatibility. */
+int
+rl_backward (int count, int key)
+{
+ return (rl_backward_char (count, key));
+}
+
+/* Move to the beginning of the line. */
+int
+rl_beg_of_line (int count, int key)
+{
+ rl_point = 0;
+ return 0;
+}
+
+/* Move to the end of the line. */
+int
+rl_end_of_line (int count, int key)
+{
+ rl_point = rl_end;
+ return 0;
+}
+
+/* Move forward a word. We do what Emacs does. Handles multibyte chars. */
+int
+rl_forward_word (int count, int key)
+{
+ int c;
+
+ if (count < 0)
+ return (rl_backward_word (-count, key));
+
+ while (count)
+ {
+ if (rl_point > rl_end)
+ rl_point = rl_end;
+ if (rl_point == rl_end)
+ return 0;
+
+ /* If we are not in a word, move forward until we are in one.
+ Then, move forward until we hit a non-alphabetic character. */
+ c = _rl_char_value (rl_line_buffer, rl_point);
+
+ if (_rl_walphabetic (c) == 0)
+ {
+ rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+ while (rl_point < rl_end)
+ {
+ c = _rl_char_value (rl_line_buffer, rl_point);
+ if (_rl_walphabetic (c))
+ break;
+ rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+ }
+ }
+
+ if (rl_point > rl_end)
+ rl_point = rl_end;
+ if (rl_point == rl_end)
+ return 0;
+
+ rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+ while (rl_point < rl_end)
+ {
+ c = _rl_char_value (rl_line_buffer, rl_point);
+ if (_rl_walphabetic (c) == 0)
+ break;
+ rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+ }
+
+ --count;
+ }
+
+ return 0;
+}
+
+/* Move backward a word. We do what Emacs does. Handles multibyte chars. */
+int
+rl_backward_word (int count, int key)
+{
+ int c, p;
+
+ if (count < 0)
+ return (rl_forward_word (-count, key));
+
+ while (count)
+ {
+ if (rl_point == 0)
+ return 0;
+
+ /* Like rl_forward_word (), except that we look at the characters
+ just before point. */
+
+ p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+ c = _rl_char_value (rl_line_buffer, p);
+
+ if (_rl_walphabetic (c) == 0)
+ {
+ rl_point = p;
+ while (rl_point > 0)
+ {
+ p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+ c = _rl_char_value (rl_line_buffer, p);
+ if (_rl_walphabetic (c))
+ break;
+ rl_point = p;
+ }
+ }
+
+ while (rl_point)
+ {
+ p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+ c = _rl_char_value (rl_line_buffer, p);
+ if (_rl_walphabetic (c) == 0)
+ break;
+ else
+ rl_point = p;
+ }
+
+ --count;
+ }
+
+ return 0;
+}
+
+/* Clear the current line. Numeric argument to C-l does this. */
+int
+rl_refresh_line (int ignore1, int ignore2)
+{
+ _rl_refresh_line ();
+ rl_display_fixed = 1;
+ return 0;
+}
+
+/* C-l typed to a line without quoting clears the screen, and then reprints
+ the prompt and the current input line. Given a numeric arg, redraw only
+ the current line. */
+int
+rl_clear_screen (int count, int key)
+{
+ if (rl_explicit_arg)
+ {
+ rl_refresh_line (count, key);
+ return 0;
+ }
+
+ _rl_clear_screen (0); /* calls termcap function to clear screen */
+ rl_keep_mark_active ();
+ rl_forced_update_display ();
+ rl_display_fixed = 1;
+
+ return 0;
+}
+
+int
+rl_clear_display (int count, int key)
+{
+ _rl_clear_screen (1); /* calls termcap function to clear screen and scrollback buffer */
+ rl_forced_update_display ();
+ rl_display_fixed = 1;
+
+ return 0;
+}
+
+int
+rl_previous_screen_line (int count, int key)
+{
+ int c;
+
+ c = _rl_term_autowrap ? _rl_screenwidth : (_rl_screenwidth + 1);
+ return (rl_backward_char (c, key));
+}
+
+int
+rl_next_screen_line (int count, int key)
+{
+ int c;
+
+ c = _rl_term_autowrap ? _rl_screenwidth : (_rl_screenwidth + 1);
+ return (rl_forward_char (c, key));
+}
+
+int
+rl_skip_csi_sequence (int count, int key)
+{
+ int ch;
+
+ RL_SETSTATE (RL_STATE_MOREINPUT);
+ do
+ ch = rl_read_key ();
+ while (ch >= 0x20 && ch < 0x40);
+ RL_UNSETSTATE (RL_STATE_MOREINPUT);
+
+ return (ch < 0);
+}
+
+int
+rl_arrow_keys (int count, int key)
+{
+ int ch;
+
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ ch = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+ if (ch < 0)
+ return (1);
+
+ switch (_rl_to_upper (ch))
+ {
+ case 'A':
+ rl_get_previous_history (count, ch);
+ break;
+
+ case 'B':
+ rl_get_next_history (count, ch);
+ break;
+
+ case 'C':
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ rl_forward_char (count, ch);
+ else
+ rl_forward_byte (count, ch);
+ break;
+
+ case 'D':
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ rl_backward_char (count, ch);
+ else
+ rl_backward_byte (count, ch);
+ break;
+
+ default:
+ rl_ding ();
+ }
+
+ return 0;
+}
+
+/* **************************************************************** */
+/* */
+/* Text commands */
+/* */
+/* **************************************************************** */
+
+#ifdef HANDLE_MULTIBYTE
+static char pending_bytes[MB_LEN_MAX];
+static int pending_bytes_length = 0;
+static mbstate_t ps = {0};
+#endif
+
+/* Insert the character C at the current location, moving point forward.
+ If C introduces a multibyte sequence, we read the whole sequence and
+ then insert the multibyte char into the line buffer. */
+int
+_rl_insert_char (int count, int c)
+{
+ register int i;
+ char *string;
+#ifdef HANDLE_MULTIBYTE
+ int string_size;
+ char incoming[MB_LEN_MAX + 1];
+ int incoming_length = 0;
+ mbstate_t ps_back;
+ static int stored_count = 0;
+#endif
+
+ if (count <= 0)
+ return 0;
+
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ {
+ incoming[0] = c;
+ incoming[1] = '\0';
+ incoming_length = 1;
+ }
+ else if (_rl_utf8locale && (c & 0x80) == 0)
+ {
+ incoming[0] = c;
+ incoming[1] = '\0';
+ incoming_length = 1;
+ }
+ else
+ {
+ WCHAR_T wc;
+ size_t ret;
+
+ if (stored_count <= 0)
+ stored_count = count;
+ else
+ count = stored_count;
+
+ ps_back = ps;
+ pending_bytes[pending_bytes_length++] = c;
+ ret = MBRTOWC (&wc, pending_bytes, pending_bytes_length, &ps);
+
+ if (ret == (size_t)-2)
+ {
+ /* Bytes too short to compose character, try to wait for next byte.
+ Restore the state of the byte sequence, because in this case the
+ effect of mbstate is undefined. */
+ ps = ps_back;
+ return 1;
+ }
+ else if (ret == (size_t)-1)
+ {
+ /* Invalid byte sequence for the current locale. Treat first byte
+ as a single character. */
+ incoming[0] = pending_bytes[0];
+ incoming[1] = '\0';
+ incoming_length = 1;
+ pending_bytes_length--;
+ memmove (pending_bytes, pending_bytes + 1, pending_bytes_length);
+ /* Clear the state of the byte sequence, because in this case the
+ effect of mbstate is undefined. */
+ memset (&ps, 0, sizeof (mbstate_t));
+ }
+ else if (ret == (size_t)0)
+ {
+ incoming[0] = '\0';
+ incoming_length = 0;
+ pending_bytes_length--;
+ /* Clear the state of the byte sequence, because in this case the
+ effect of mbstate is undefined. */
+ memset (&ps, 0, sizeof (mbstate_t));
+ }
+ else if (ret == 1)
+ {
+ incoming[0] = pending_bytes[0];
+ incoming[incoming_length = 1] = '\0';
+ pending_bytes_length = 0;
+ }
+ else
+ {
+ /* We successfully read a single multibyte character. */
+ memcpy (incoming, pending_bytes, pending_bytes_length);
+ incoming[pending_bytes_length] = '\0';
+ incoming_length = pending_bytes_length;
+ pending_bytes_length = 0;
+ }
+ }
+#endif /* HANDLE_MULTIBYTE */
+
+ /* If we can optimize, then do it. But don't let people crash
+ readline because of extra large arguments. */
+ if (count > 1 && count <= TEXT_COUNT_MAX)
+ {
+#if defined (HANDLE_MULTIBYTE)
+ string_size = count * incoming_length;
+ string = (char *)xmalloc (1 + string_size);
+
+ i = 0;
+ while (i < string_size)
+ {
+ if (incoming_length == 1)
+ string[i++] = *incoming;
+ else
+ {
+ strncpy (string + i, incoming, incoming_length);
+ i += incoming_length;
+ }
+ }
+ incoming_length = 0;
+ stored_count = 0;
+#else /* !HANDLE_MULTIBYTE */
+ string = (char *)xmalloc (1 + count);
+
+ for (i = 0; i < count; i++)
+ string[i] = c;
+#endif /* !HANDLE_MULTIBYTE */
+
+ string[i] = '\0';
+ rl_insert_text (string);
+ xfree (string);
+
+ return 0;
+ }
+
+ if (count > TEXT_COUNT_MAX)
+ {
+ int decreaser;
+#if defined (HANDLE_MULTIBYTE)
+ string_size = incoming_length * TEXT_COUNT_MAX;
+ string = (char *)xmalloc (1 + string_size);
+
+ i = 0;
+ while (i < string_size)
+ {
+ if (incoming_length == 1)
+ string[i++] = *incoming;
+ else
+ {
+ strncpy (string + i, incoming, incoming_length);
+ i += incoming_length;
+ }
+ }
+
+ while (count)
+ {
+ decreaser = (count > TEXT_COUNT_MAX) ? TEXT_COUNT_MAX : count;
+ string[decreaser*incoming_length] = '\0';
+ rl_insert_text (string);
+ count -= decreaser;
+ }
+
+ xfree (string);
+ incoming_length = 0;
+ stored_count = 0;
+#else /* !HANDLE_MULTIBYTE */
+ char str[TEXT_COUNT_MAX+1];
+
+ for (i = 0; i < TEXT_COUNT_MAX; i++)
+ str[i] = c;
+
+ while (count)
+ {
+ decreaser = (count > TEXT_COUNT_MAX ? TEXT_COUNT_MAX : count);
+ str[decreaser] = '\0';
+ rl_insert_text (str);
+ count -= decreaser;
+ }
+#endif /* !HANDLE_MULTIBYTE */
+
+ return 0;
+ }
+
+ if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ {
+ /* We are inserting a single character.
+ If there is pending input, then make a string of all of the
+ pending characters that are bound to rl_insert, and insert
+ them all. Don't do this if we're current reading input from
+ a macro. */
+ if ((RL_ISSTATE (RL_STATE_MACROINPUT) == 0) && _rl_pushed_input_available ())
+ _rl_insert_typein (c);
+ else
+ {
+ /* Inserting a single character. */
+ char str[2];
+
+ str[1] = '\0';
+ str[0] = c;
+ rl_insert_text (str);
+ }
+ }
+#if defined (HANDLE_MULTIBYTE)
+ else
+ {
+ rl_insert_text (incoming);
+ stored_count = 0;
+ }
+#endif
+
+ return 0;
+}
+
+/* Overwrite the character at point (or next COUNT characters) with C.
+ If C introduces a multibyte character sequence, read the entire sequence
+ before starting the overwrite loop. */
+int
+_rl_overwrite_char (int count, int c)
+{
+ int i;
+#if defined (HANDLE_MULTIBYTE)
+ char mbkey[MB_LEN_MAX];
+ int k;
+
+ /* Read an entire multibyte character sequence to insert COUNT times. */
+ k = 1;
+ if (count > 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ k = _rl_read_mbstring (c, mbkey, MB_LEN_MAX);
+ if (k < 0)
+ return 1;
+#endif
+
+ rl_begin_undo_group ();
+
+ for (i = 0; i < count; i++)
+ {
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ rl_insert_text (mbkey);
+ else
+#endif
+ _rl_insert_char (1, c);
+
+ if (rl_point < rl_end)
+ rl_delete (1, c);
+ }
+
+ rl_end_undo_group ();
+
+ return 0;
+}
+
+int
+rl_insert (int count, int c)
+{
+ int r, n, x;
+
+ r = (rl_insert_mode == RL_IM_INSERT) ? _rl_insert_char (count, c) : _rl_overwrite_char (count, c);
+
+ /* XXX -- attempt to batch-insert pending input that maps to self-insert */
+ x = 0;
+ n = (unsigned short)-2;
+ while (_rl_optimize_typeahead &&
+ rl_num_chars_to_read == 0 &&
+ (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) &&
+ _rl_pushed_input_available () == 0 &&
+ _rl_input_queued (0) &&
+ (n = rl_read_key ()) > 0 &&
+ _rl_keymap[(unsigned char)n].type == ISFUNC &&
+ _rl_keymap[(unsigned char)n].function == rl_insert)
+ {
+ r = (rl_insert_mode == RL_IM_INSERT) ? _rl_insert_char (1, n) : _rl_overwrite_char (1, n);
+ /* _rl_insert_char keeps its own set of pending characters to compose a
+ complete multibyte character, and only returns 1 if it sees a character
+ that's part of a multibyte character but too short to complete one. We
+ can try to read another character in the hopes that we will get the
+ next one or just punt. Right now we try to read another character.
+ We don't want to call rl_insert_next if _rl_insert_char has already
+ stored the character in the pending_bytes array because that will
+ result in doubled input. */
+ n = (unsigned short)-2;
+ x++; /* count of bytes of typeahead read, currently unused */
+ if (r == 1) /* read partial multibyte character */
+ continue;
+ if (rl_done || r != 0)
+ break;
+ }
+
+ if (n != (unsigned short)-2) /* -2 = sentinel value for having inserted N */
+ {
+ /* setting rl_pending_input inhibits setting rl_last_func so we do it
+ ourselves here */
+ rl_last_func = rl_insert;
+ _rl_reset_argument ();
+ rl_executing_keyseq[rl_key_sequence_length = 0] = '\0';
+ r = rl_execute_next (n);
+ }
+
+ return r;
+}
+
+/* Insert the next typed character verbatim. */
+static int
+_rl_insert_next (int count)
+{
+ int c;
+
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+ if (c < 0)
+ return 1;
+
+ if (RL_ISSTATE (RL_STATE_MACRODEF))
+ _rl_add_macro_char (c);
+
+#if defined (HANDLE_SIGNALS)
+ if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
+ _rl_restore_tty_signals ();
+#endif
+
+ return (_rl_insert_char (count, c));
+}
+
+#if defined (READLINE_CALLBACKS)
+static int
+_rl_insert_next_callback (_rl_callback_generic_arg *data)
+{
+ int count, r;
+
+ count = data->count;
+ r = 0;
+
+ if (count < 0)
+ {
+ data->count++;
+ r = _rl_insert_next (1);
+ _rl_want_redisplay = 1;
+ /* If we should keep going, leave the callback function installed */
+ if (data->count < 0 && r == 0)
+ return r;
+ count = 0; /* data->count == 0 || r != 0; force break below */
+ }
+
+ /* Deregister function, let rl_callback_read_char deallocate data */
+ _rl_callback_func = 0;
+ _rl_want_redisplay = 1;
+
+ if (count == 0)
+ return r;
+
+ return _rl_insert_next (count);
+}
+#endif
+
+int
+rl_quoted_insert (int count, int key)
+{
+ /* Let's see...should the callback interface futz with signal handling? */
+#if defined (HANDLE_SIGNALS)
+ if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
+ _rl_disable_tty_signals ();
+#endif
+
+#if defined (READLINE_CALLBACKS)
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ _rl_callback_data = _rl_callback_data_alloc (count);
+ _rl_callback_func = _rl_insert_next_callback;
+ return (0);
+ }
+#endif
+
+ /* A negative count means to quote the next -COUNT characters. */
+ if (count < 0)
+ {
+ int r;
+
+ do
+ r = _rl_insert_next (1);
+ while (r == 0 && ++count < 0);
+ return r;
+ }
+
+ return _rl_insert_next (count);
+}
+
+/* Insert a tab character. */
+int
+rl_tab_insert (int count, int key)
+{
+ return (_rl_insert_char (count, '\t'));
+}
+
+/* What to do when a NEWLINE is pressed. We accept the whole line.
+ KEY is the key that invoked this command. I guess it could have
+ meaning in the future. */
+int
+rl_newline (int count, int key)
+{
+ if (rl_mark_active_p ())
+ {
+ rl_deactivate_mark ();
+ (*rl_redisplay_function) ();
+ _rl_want_redisplay = 0;
+ }
+
+ rl_done = 1;
+
+ if (_rl_history_preserve_point)
+ _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point;
+
+ RL_SETSTATE(RL_STATE_DONE);
+
+#if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode)
+ {
+ _rl_vi_done_inserting ();
+ if (_rl_vi_textmod_command (_rl_vi_last_command) == 0) /* XXX */
+ _rl_vi_reset_last ();
+ }
+#endif /* VI_MODE */
+
+ /* If we've been asked to erase empty lines, suppress the final update,
+ since _rl_update_final calls rl_crlf(). */
+ if (rl_erase_empty_line && rl_point == 0 && rl_end == 0)
+ return 0;
+
+ if (_rl_echoing_p)
+ _rl_update_final ();
+ return 0;
+}
+
+/* What to do for some uppercase characters, like meta characters,
+ and some characters appearing in emacs_ctlx_keymap. This function
+ is just a stub, you bind keys to it and the code in _rl_dispatch ()
+ is special cased. */
+int
+rl_do_lowercase_version (int ignore1, int ignore2)
+{
+ return 99999; /* prevent from being combined with _rl_null_function */
+}
+
+/* This is different from what vi does, so the code's not shared. Emacs
+ rubout in overwrite mode has one oddity: it replaces a control
+ character that's displayed as two characters (^X) with two spaces. */
+int
+_rl_overwrite_rubout (int count, int key)
+{
+ int opoint;
+ int i, l;
+
+ if (rl_point == 0)
+ {
+ rl_ding ();
+ return 1;
+ }
+
+ opoint = rl_point;
+
+ /* L == number of spaces to insert */
+ for (i = l = 0; i < count; i++)
+ {
+ rl_backward_char (1, key);
+ l += rl_character_len (rl_line_buffer[rl_point], rl_point); /* not exactly right */
+ }
+
+ rl_begin_undo_group ();
+
+ if (count > 1 || rl_explicit_arg)
+ rl_kill_text (opoint, rl_point);
+ else
+ rl_delete_text (opoint, rl_point);
+
+ /* Emacs puts point at the beginning of the sequence of spaces. */
+ if (rl_point < rl_end)
+ {
+ opoint = rl_point;
+ _rl_insert_char (l, ' ');
+ rl_point = opoint;
+ }
+
+ rl_end_undo_group ();
+
+ return 0;
+}
+
+/* Rubout the character behind point. */
+int
+rl_rubout (int count, int key)
+{
+ if (count < 0)
+ return (rl_delete (-count, key));
+
+ if (!rl_point)
+ {
+ rl_ding ();
+ return 1;
+ }
+
+ if (rl_insert_mode == RL_IM_OVERWRITE)
+ return (_rl_overwrite_rubout (count, key));
+
+ return (_rl_rubout_char (count, key));
+}
+
+int
+_rl_rubout_char (int count, int key)
+{
+ int orig_point;
+ unsigned char c;
+
+ /* Duplicated code because this is called from other parts of the library. */
+ if (count < 0)
+ return (rl_delete (-count, key));
+
+ if (rl_point == 0)
+ {
+ rl_ding ();
+ return 1;
+ }
+
+ orig_point = rl_point;
+ if (count > 1 || rl_explicit_arg)
+ {
+ rl_backward_char (count, key);
+ rl_kill_text (orig_point, rl_point);
+ }
+ else if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ {
+ c = rl_line_buffer[--rl_point];
+ rl_delete_text (rl_point, orig_point);
+ /* The erase-at-end-of-line hack is of questionable merit now. */
+ if (rl_point == rl_end && ISPRINT ((unsigned char)c) && _rl_last_c_pos)
+ {
+ int l;
+ l = rl_character_len (c, rl_point);
+ _rl_erase_at_end_of_line (l);
+ }
+ }
+ else
+ {
+ rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+ rl_delete_text (rl_point, orig_point);
+ }
+
+ return 0;
+}
+
+/* Delete the character under the cursor. Given a numeric argument,
+ kill that many characters instead. */
+int
+rl_delete (int count, int key)
+{
+ int xpoint;
+
+ if (count < 0)
+ return (_rl_rubout_char (-count, key));
+
+ if (rl_point == rl_end)
+ {
+ rl_ding ();
+ return 1;
+ }
+
+ if (count > 1 || rl_explicit_arg)
+ {
+ xpoint = rl_point;
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ rl_forward_char (count, key);
+ else
+ rl_forward_byte (count, key);
+
+ rl_kill_text (xpoint, rl_point);
+ rl_point = xpoint;
+ }
+ else
+ {
+ xpoint = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+ rl_delete_text (rl_point, xpoint);
+ }
+ return 0;
+}
+
+/* Delete the character under the cursor, unless the insertion
+ point is at the end of the line, in which case the character
+ behind the cursor is deleted. COUNT is obeyed and may be used
+ to delete forward or backward that many characters. */
+int
+rl_rubout_or_delete (int count, int key)
+{
+ if (rl_end != 0 && rl_point == rl_end)
+ return (_rl_rubout_char (count, key));
+ else
+ return (rl_delete (count, key));
+}
+
+/* Delete all spaces and tabs around point. */
+int
+rl_delete_horizontal_space (int count, int ignore)
+{
+ int start;
+
+ while (rl_point && whitespace (rl_line_buffer[rl_point - 1]))
+ rl_point--;
+
+ start = rl_point;
+
+ while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+ rl_point++;
+
+ if (start != rl_point)
+ {
+ rl_delete_text (start, rl_point);
+ rl_point = start;
+ }
+
+ if (rl_point < 0)
+ rl_point = 0;
+
+ return 0;
+}
+
+/* Like the tcsh editing function delete-char-or-list. The eof character
+ is caught before this is invoked, so this really does the same thing as
+ delete-char-or-list-or-eof, as long as it's bound to the eof character. */
+int
+rl_delete_or_show_completions (int count, int key)
+{
+ if (rl_end != 0 && rl_point == rl_end)
+ return (rl_possible_completions (count, key));
+ else
+ return (rl_delete (count, key));
+}
+
+#ifndef RL_COMMENT_BEGIN_DEFAULT
+#define RL_COMMENT_BEGIN_DEFAULT "#"
+#endif
+
+/* Turn the current line into a comment in shell history.
+ A K*rn shell style function. */
+int
+rl_insert_comment (int count, int key)
+{
+ char *rl_comment_text;
+ int rl_comment_len;
+
+ rl_beg_of_line (1, key);
+ rl_comment_text = _rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT;
+
+ if (rl_explicit_arg == 0)
+ rl_insert_text (rl_comment_text);
+ else
+ {
+ rl_comment_len = strlen (rl_comment_text);
+ if (STREQN (rl_comment_text, rl_line_buffer, rl_comment_len))
+ rl_delete_text (rl_point, rl_point + rl_comment_len);
+ else
+ rl_insert_text (rl_comment_text);
+ }
+
+ (*rl_redisplay_function) ();
+ rl_newline (1, '\n');
+
+ return (0);
+}
+
+/* **************************************************************** */
+/* */
+/* Changing Case */
+/* */
+/* **************************************************************** */
+
+/* The three kinds of things that we know how to do. */
+#define UpCase 1
+#define DownCase 2
+#define CapCase 3
+
+/* Uppercase the word at point. */
+int
+rl_upcase_word (int count, int key)
+{
+ return (rl_change_case (count, UpCase));
+}
+
+/* Lowercase the word at point. */
+int
+rl_downcase_word (int count, int key)
+{
+ return (rl_change_case (count, DownCase));
+}
+
+/* Upcase the first letter, downcase the rest. */
+int
+rl_capitalize_word (int count, int key)
+{
+ return (rl_change_case (count, CapCase));
+}
+
+/* The meaty function.
+ Change the case of COUNT words, performing OP on them.
+ OP is one of UpCase, DownCase, or CapCase.
+ If a negative argument is given, leave point where it started,
+ otherwise, leave it where it moves to. */
+static int
+rl_change_case (int count, int op)
+{
+ int start, next, end;
+ int inword, nc, nop;
+ WCHAR_T c;
+#if defined (HANDLE_MULTIBYTE)
+ WCHAR_T wc, nwc;
+ char mb[MB_LEN_MAX+1];
+ int mlen;
+ size_t m;
+ mbstate_t mps;
+#endif
+
+ start = rl_point;
+ rl_forward_word (count, 0);
+ end = rl_point;
+
+ if (op != UpCase && op != DownCase && op != CapCase)
+ {
+ rl_ding ();
+ return 1;
+ }
+
+ if (count < 0)
+ SWAP (start, end);
+
+#if defined (HANDLE_MULTIBYTE)
+ memset (&mps, 0, sizeof (mbstate_t));
+#endif
+
+ /* We are going to modify some text, so let's prepare to undo it. */
+ rl_modifying (start, end);
+
+ inword = 0;
+ while (start < end)
+ {
+ c = _rl_char_value (rl_line_buffer, start);
+ /* This assumes that the upper and lower case versions are the same width. */
+ next = MB_NEXTCHAR (rl_line_buffer, start, 1, MB_FIND_NONZERO);
+
+ if (_rl_walphabetic (c) == 0)
+ {
+ inword = 0;
+ start = next;
+ continue;
+ }
+
+ if (op == CapCase)
+ {
+ nop = inword ? DownCase : UpCase;
+ inword = 1;
+ }
+ else
+ nop = op;
+ /* Can't check isascii here; some languages (e.g, Turkish) have
+ multibyte upper and lower case equivalents of single-byte ascii
+ characters */
+ if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ {
+ nc = (nop == UpCase) ? _rl_to_upper (c) : _rl_to_lower (c);
+ rl_line_buffer[start] = nc;
+ }
+#if defined (HANDLE_MULTIBYTE)
+ else
+ {
+ m = MBRTOWC (&wc, rl_line_buffer + start, end - start, &mps);
+ if (MB_INVALIDCH (m))
+ wc = (WCHAR_T)rl_line_buffer[start];
+ else if (MB_NULLWCH (m))
+ wc = L'\0';
+ nwc = (nop == UpCase) ? _rl_to_wupper (wc) : _rl_to_wlower (wc);
+ if (nwc != wc) /* just skip unchanged characters */
+ {
+ char *s, *e;
+ mbstate_t ts;
+
+ memset (&ts, 0, sizeof (mbstate_t));
+ mlen = WCRTOMB (mb, nwc, &ts);
+ if (mlen < 0)
+ {
+ nwc = wc;
+ memset (&ts, 0, sizeof (mbstate_t));
+ mlen = WCRTOMB (mb, nwc, &ts);
+ if (mlen < 0) /* should not happen */
+ strncpy (mb, rl_line_buffer + start, mlen = m);
+ }
+ if (mlen > 0)
+ mb[mlen] = '\0';
+ /* what to do if m != mlen? adjust below */
+ /* m == length of old char, mlen == length of new char */
+ s = rl_line_buffer + start;
+ e = rl_line_buffer + rl_end;
+ if (m == mlen)
+ memcpy (s, mb, mlen);
+ else if (m > mlen)
+ {
+ memcpy (s, mb, mlen);
+ memmove (s + mlen, s + m, (e - s) - m);
+ next -= m - mlen; /* next char changes */
+ end -= m - mlen; /* end of word changes */
+ rl_end -= m - mlen; /* end of line changes */
+ rl_line_buffer[rl_end] = 0;
+ }
+ else if (m < mlen)
+ {
+ rl_extend_line_buffer (rl_end + mlen + (e - s) - m + 2);
+ s = rl_line_buffer + start; /* have to redo this */
+ e = rl_line_buffer + rl_end;
+ memmove (s + mlen, s + m, (e - s) - m);
+ memcpy (s, mb, mlen);
+ next += mlen - m; /* next char changes */
+ end += mlen - m; /* end of word changes */
+ rl_end += mlen - m; /* end of line changes */
+ rl_line_buffer[rl_end] = 0;
+ }
+ }
+ }
+#endif
+
+ start = next;
+ }
+
+ rl_point = end;
+ return 0;
+}
+
+/* **************************************************************** */
+/* */
+/* Transposition */
+/* */
+/* **************************************************************** */
+
+/* Transpose the words at point. If point is at the end of the line,
+ transpose the two words before point. */
+int
+rl_transpose_words (int count, int key)
+{
+ char *word1, *word2;
+ int w1_beg, w1_end, w2_beg, w2_end;
+ int orig_point, orig_end;
+
+ orig_point = rl_point;
+ orig_end = rl_end;
+
+ if (!count)
+ return 0;
+
+ /* Find the two words. */
+ rl_forward_word (count, key);
+ w2_end = rl_point;
+ rl_backward_word (1, key);
+ w2_beg = rl_point;
+ rl_backward_word (count, key);
+ w1_beg = rl_point;
+ rl_forward_word (1, key);
+ w1_end = rl_point;
+
+ /* Do some check to make sure that there really are two words. */
+ if ((w1_beg == w2_beg) || (w2_beg < w1_end))
+ {
+ rl_ding ();
+ rl_point = orig_point;
+ return 1;
+ }
+
+ /* Get the text of the words. */
+ word1 = rl_copy_text (w1_beg, w1_end);
+ word2 = rl_copy_text (w2_beg, w2_end);
+
+ /* We are about to do many insertions and deletions. Remember them
+ as one operation. */
+ rl_begin_undo_group ();
+
+ /* Do the stuff at word2 first, so that we don't have to worry
+ about word1 moving. */
+ rl_point = w2_beg;
+ rl_delete_text (w2_beg, w2_end);
+ rl_insert_text (word1);
+
+ rl_point = w1_beg;
+ rl_delete_text (w1_beg, w1_end);
+ rl_insert_text (word2);
+
+ /* This is exactly correct since the text before this point has not
+ changed in length. */
+ rl_point = w2_end;
+ rl_end = orig_end; /* just make sure */
+
+ /* I think that does it. */
+ rl_end_undo_group ();
+ xfree (word1);
+ xfree (word2);
+
+ return 0;
+}
+
+/* Transpose the characters at point. If point is at the end of the line,
+ then transpose the characters before point. */
+int
+rl_transpose_chars (int count, int key)
+{
+#if defined (HANDLE_MULTIBYTE)
+ char *dummy;
+ int i;
+#else
+ char dummy[2];
+#endif
+ int char_length, prev_point;
+
+ if (count == 0)
+ return 0;
+
+ if (!rl_point || rl_end < 2)
+ {
+ rl_ding ();
+ return 1;
+ }
+
+ rl_begin_undo_group ();
+
+ if (rl_point == rl_end)
+ {
+ rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+ count = 1;
+ }
+
+ prev_point = rl_point;
+ rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+
+#if defined (HANDLE_MULTIBYTE)
+ char_length = prev_point - rl_point;
+ dummy = (char *)xmalloc (char_length + 1);
+ for (i = 0; i < char_length; i++)
+ dummy[i] = rl_line_buffer[rl_point + i];
+ dummy[i] = '\0';
+#else
+ dummy[0] = rl_line_buffer[rl_point];
+ dummy[char_length = 1] = '\0';
+#endif
+
+ rl_delete_text (rl_point, rl_point + char_length);
+
+ rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO);
+
+ _rl_fix_point (0);
+ rl_insert_text (dummy);
+ rl_end_undo_group ();
+
+#if defined (HANDLE_MULTIBYTE)
+ xfree (dummy);
+#endif
+
+ return 0;
+}
+
+/* **************************************************************** */
+/* */
+/* Character Searching */
+/* */
+/* **************************************************************** */
+
+int
+#if defined (HANDLE_MULTIBYTE)
+_rl_char_search_internal (int count, int dir, char *smbchar, int len)
+#else
+_rl_char_search_internal (int count, int dir, int schar)
+#endif
+{
+ int pos, inc;
+#if defined (HANDLE_MULTIBYTE)
+ int prepos;
+#endif
+
+ if (dir == 0)
+ return 1;
+
+ pos = rl_point;
+ inc = (dir < 0) ? -1 : 1;
+ while (count)
+ {
+ if ((dir < 0 && pos <= 0) || (dir > 0 && pos >= rl_end))
+ {
+ rl_ding ();
+ return 1;
+ }
+
+#if defined (HANDLE_MULTIBYTE)
+ pos = (inc > 0) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)
+ : _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY);
+#else
+ pos += inc;
+#endif
+ do
+ {
+#if defined (HANDLE_MULTIBYTE)
+ if (_rl_is_mbchar_matched (rl_line_buffer, pos, rl_end, smbchar, len))
+#else
+ if (rl_line_buffer[pos] == schar)
+#endif
+ {
+ count--;
+ if (dir < 0)
+ rl_point = (dir == BTO) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)
+ : pos;
+ else
+ rl_point = (dir == FTO) ? _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY)
+ : pos;
+ break;
+ }
+#if defined (HANDLE_MULTIBYTE)
+ prepos = pos;
+#endif
+ }
+#if defined (HANDLE_MULTIBYTE)
+ while ((dir < 0) ? (pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY)) != prepos
+ : (pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)) != prepos);
+#else
+ while ((dir < 0) ? pos-- : ++pos < rl_end);
+#endif
+ }
+ return (0);
+}
+
+/* Search COUNT times for a character read from the current input stream.
+ FDIR is the direction to search if COUNT is non-negative; otherwise
+ the search goes in BDIR. So much is dependent on HANDLE_MULTIBYTE
+ that there are two separate versions of this function. */
+#if defined (HANDLE_MULTIBYTE)
+static int
+_rl_char_search (int count, int fdir, int bdir)
+{
+ char mbchar[MB_LEN_MAX];
+ int mb_len;
+
+ mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX);
+
+ if (mb_len <= 0)
+ return 1;
+
+ if (count < 0)
+ return (_rl_char_search_internal (-count, bdir, mbchar, mb_len));
+ else
+ return (_rl_char_search_internal (count, fdir, mbchar, mb_len));
+}
+#else /* !HANDLE_MULTIBYTE */
+static int
+_rl_char_search (int count, int fdir, int bdir)
+{
+ int c;
+
+ c = _rl_bracketed_read_key ();
+ if (c < 0)
+ return 1;
+
+ if (count < 0)
+ return (_rl_char_search_internal (-count, bdir, c));
+ else
+ return (_rl_char_search_internal (count, fdir, c));
+}
+#endif /* !HANDLE_MULTIBYTE */
+
+#if defined (READLINE_CALLBACKS)
+static int
+_rl_char_search_callback (data)
+ _rl_callback_generic_arg *data;
+{
+ _rl_callback_func = 0;
+ _rl_want_redisplay = 1;
+
+ return (_rl_char_search (data->count, data->i1, data->i2));
+}
+#endif
+
+int
+rl_char_search (int count, int key)
+{
+#if defined (READLINE_CALLBACKS)
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ _rl_callback_data = _rl_callback_data_alloc (count);
+ _rl_callback_data->i1 = FFIND;
+ _rl_callback_data->i2 = BFIND;
+ _rl_callback_func = _rl_char_search_callback;
+ return (0);
+ }
+#endif
+
+ return (_rl_char_search (count, FFIND, BFIND));
+}
+
+int
+rl_backward_char_search (int count, int key)
+{
+#if defined (READLINE_CALLBACKS)
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ _rl_callback_data = _rl_callback_data_alloc (count);
+ _rl_callback_data->i1 = BFIND;
+ _rl_callback_data->i2 = FFIND;
+ _rl_callback_func = _rl_char_search_callback;
+ return (0);
+ }
+#endif
+
+ return (_rl_char_search (count, BFIND, FFIND));
+}
+
+/* **************************************************************** */
+/* */
+/* The Mark and the Region. */
+/* */
+/* **************************************************************** */
+
+/* Set the mark at POSITION. */
+int
+_rl_set_mark_at_pos (int position)
+{
+ if (position < 0 || position > rl_end)
+ return 1;
+
+ rl_mark = position;
+ return 0;
+}
+
+/* A bindable command to set the mark. */
+int
+rl_set_mark (int count, int key)
+{
+ return (_rl_set_mark_at_pos (rl_explicit_arg ? count : rl_point));
+}
+
+/* Exchange the position of mark and point. */
+int
+rl_exchange_point_and_mark (int count, int key)
+{
+ if (rl_mark > rl_end)
+ rl_mark = -1;
+
+ if (rl_mark < 0)
+ {
+ rl_ding ();
+ rl_mark = 0; /* like _RL_FIX_POINT */
+ return 1;
+ }
+ else
+ {
+ SWAP (rl_point, rl_mark);
+ rl_activate_mark ();
+ }
+
+ return 0;
+}
+
+/* Active mark support */
+
+/* Is the region active? */
+static int mark_active = 0;
+
+/* Does the current command want the mark to remain active when it completes? */
+int _rl_keep_mark_active;
+
+void
+rl_keep_mark_active (void)
+{
+ _rl_keep_mark_active++;
+}
+
+void
+rl_activate_mark (void)
+{
+ mark_active = 1;
+ rl_keep_mark_active ();
+}
+
+void
+rl_deactivate_mark (void)
+{
+ mark_active = 0;
+}
+
+int
+rl_mark_active_p (void)
+{
+ return (mark_active);
+}
diff --git a/tilde.c b/tilde.c
new file mode 100644
index 0000000..d678a31
--- /dev/null
+++ b/tilde.c
@@ -0,0 +1,493 @@
+/* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */
+
+/* Copyright (C) 1988-2020 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+# ifdef _MINIX
+# include <sys/types.h>
+# endif
+# include <unistd.h>
+#endif
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else /* !HAVE_STRING_H */
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <sys/types.h>
+#if defined (HAVE_PWD_H)
+#include <pwd.h>
+#endif
+
+#include "tilde.h"
+
+#if defined (TEST) || defined (STATIC_MALLOC)
+static void *xmalloc (), *xrealloc ();
+#else
+# include "xmalloc.h"
+#endif /* TEST || STATIC_MALLOC */
+
+#if !defined (HAVE_GETPW_DECLS)
+# if defined (HAVE_GETPWUID)
+extern struct passwd *getpwuid (uid_t);
+# endif
+# if defined (HAVE_GETPWNAM)
+extern struct passwd *getpwnam (const char *);
+# endif
+#endif /* !HAVE_GETPW_DECLS */
+
+#if !defined (savestring)
+#define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x))
+#endif /* !savestring */
+
+#if !defined (NULL)
+# if defined (__STDC__)
+# define NULL ((void *) 0)
+# else
+# define NULL 0x0
+# endif /* !__STDC__ */
+#endif /* !NULL */
+
+/* If being compiled as part of bash, these will be satisfied from
+ variables.o. If being compiled as part of readline, they will
+ be satisfied from shell.o. */
+extern char *sh_get_home_dir (void);
+extern char *sh_get_env_value (const char *);
+
+/* The default value of tilde_additional_prefixes. This is set to
+ whitespace preceding a tilde so that simple programs which do not
+ perform any word separation get desired behaviour. */
+static const char *default_prefixes[] =
+ { " ~", "\t~", (const char *)NULL };
+
+/* The default value of tilde_additional_suffixes. This is set to
+ whitespace or newline so that simple programs which do not
+ perform any word separation get desired behaviour. */
+static const char *default_suffixes[] =
+ { " ", "\n", (const char *)NULL };
+
+/* If non-null, this contains the address of a function that the application
+ wants called before trying the standard tilde expansions. The function
+ is called with the text sans tilde, and returns a malloc()'ed string
+ which is the expansion, or a NULL pointer if the expansion fails. */
+tilde_hook_func_t *tilde_expansion_preexpansion_hook = (tilde_hook_func_t *)NULL;
+
+/* If non-null, this contains the address of a function to call if the
+ standard meaning for expanding a tilde fails. The function is called
+ with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
+ which is the expansion, or a NULL pointer if there is no expansion. */
+tilde_hook_func_t *tilde_expansion_failure_hook = (tilde_hook_func_t *)NULL;
+
+/* When non-null, this is a NULL terminated array of strings which
+ are duplicates for a tilde prefix. Bash uses this to expand
+ `=~' and `:~'. */
+char **tilde_additional_prefixes = (char **)default_prefixes;
+
+/* When non-null, this is a NULL terminated array of strings which match
+ the end of a username, instead of just "/". Bash sets this to
+ `:' and `=~'. */
+char **tilde_additional_suffixes = (char **)default_suffixes;
+
+static int tilde_find_prefix (const char *, int *);
+static int tilde_find_suffix (const char *);
+static char *isolate_tilde_prefix (const char *, int *);
+static char *glue_prefix_and_suffix (char *, const char *, int);
+
+/* Find the start of a tilde expansion in STRING, and return the index of
+ the tilde which starts the expansion. Place the length of the text
+ which identified this tilde starter in LEN, excluding the tilde itself. */
+static int
+tilde_find_prefix (const char *string, int *len)
+{
+ register int i, j, string_len;
+ register char **prefixes;
+
+ prefixes = tilde_additional_prefixes;
+
+ string_len = strlen (string);
+ *len = 0;
+
+ if (*string == '\0' || *string == '~')
+ return (0);
+
+ if (prefixes)
+ {
+ for (i = 0; i < string_len; i++)
+ {
+ for (j = 0; prefixes[j]; j++)
+ {
+ if (strncmp (string + i, prefixes[j], strlen (prefixes[j])) == 0)
+ {
+ *len = strlen (prefixes[j]) - 1;
+ return (i + *len);
+ }
+ }
+ }
+ }
+ return (string_len);
+}
+
+/* Find the end of a tilde expansion in STRING, and return the index of
+ the character which ends the tilde definition. */
+static int
+tilde_find_suffix (const char *string)
+{
+ register int i, j, string_len;
+ register char **suffixes;
+
+ suffixes = tilde_additional_suffixes;
+ string_len = strlen (string);
+
+ for (i = 0; i < string_len; i++)
+ {
+#if defined (__MSDOS__)
+ if (string[i] == '/' || string[i] == '\\' /* || !string[i] */)
+#else
+ if (string[i] == '/' /* || !string[i] */)
+#endif
+ break;
+
+ for (j = 0; suffixes && suffixes[j]; j++)
+ {
+ if (strncmp (string + i, suffixes[j], strlen (suffixes[j])) == 0)
+ return (i);
+ }
+ }
+ return (i);
+}
+
+/* Return a new string which is the result of tilde expanding STRING. */
+char *
+tilde_expand (const char *string)
+{
+ char *result;
+ int result_size, result_index;
+
+ result_index = result_size = 0;
+ if (result = strchr (string, '~'))
+ result = (char *)xmalloc (result_size = (strlen (string) + 16));
+ else
+ result = (char *)xmalloc (result_size = (strlen (string) + 1));
+
+ /* Scan through STRING expanding tildes as we come to them. */
+ while (1)
+ {
+ register int start, end;
+ char *tilde_word, *expansion;
+ int len;
+
+ /* Make START point to the tilde which starts the expansion. */
+ start = tilde_find_prefix (string, &len);
+
+ /* Copy the skipped text into the result. */
+ if ((result_index + start + 1) > result_size)
+ result = (char *)xrealloc (result, 1 + (result_size += (start + 20)));
+
+ strncpy (result + result_index, string, start);
+ result_index += start;
+
+ /* Advance STRING to the starting tilde. */
+ string += start;
+
+ /* Make END be the index of one after the last character of the
+ username. */
+ end = tilde_find_suffix (string);
+
+ /* If both START and END are zero, we are all done. */
+ if (!start && !end)
+ break;
+
+ /* Expand the entire tilde word, and copy it into RESULT. */
+ tilde_word = (char *)xmalloc (1 + end);
+ strncpy (tilde_word, string, end);
+ tilde_word[end] = '\0';
+ string += end;
+
+ expansion = tilde_expand_word (tilde_word);
+
+ if (expansion == 0)
+ expansion = tilde_word;
+ else
+ xfree (tilde_word);
+
+ len = strlen (expansion);
+#ifdef __CYGWIN__
+ /* Fix for Cygwin to prevent ~user/xxx from expanding to //xxx when
+ $HOME for `user' is /. On cygwin, // denotes a network drive. */
+ if (len > 1 || *expansion != '/' || *string != '/')
+#endif
+ {
+ if ((result_index + len + 1) > result_size)
+ result = (char *)xrealloc (result, 1 + (result_size += (len + 20)));
+
+ strcpy (result + result_index, expansion);
+ result_index += len;
+ }
+ xfree (expansion);
+ }
+
+ result[result_index] = '\0';
+
+ return (result);
+}
+
+/* Take FNAME and return the tilde prefix we want expanded. If LENP is
+ non-null, the index of the end of the prefix into FNAME is returned in
+ the location it points to. */
+static char *
+isolate_tilde_prefix (const char *fname, int *lenp)
+{
+ char *ret;
+ int i;
+
+ ret = (char *)xmalloc (strlen (fname));
+#if defined (__MSDOS__)
+ for (i = 1; fname[i] && fname[i] != '/' && fname[i] != '\\'; i++)
+#else
+ for (i = 1; fname[i] && fname[i] != '/'; i++)
+#endif
+ ret[i - 1] = fname[i];
+ ret[i - 1] = '\0';
+ if (lenp)
+ *lenp = i;
+ return ret;
+}
+
+#if 0
+/* Public function to scan a string (FNAME) beginning with a tilde and find
+ the portion of the string that should be passed to the tilde expansion
+ function. Right now, it just calls tilde_find_suffix and allocates new
+ memory, but it can be expanded to do different things later. */
+char *
+tilde_find_word (const char *fname, int flags, int *lenp)
+{
+ int x;
+ char *r;
+
+ x = tilde_find_suffix (fname);
+ if (x == 0)
+ {
+ r = savestring (fname);
+ if (lenp)
+ *lenp = 0;
+ }
+ else
+ {
+ r = (char *)xmalloc (1 + x);
+ strncpy (r, fname, x);
+ r[x] = '\0';
+ if (lenp)
+ *lenp = x;
+ }
+
+ return r;
+}
+#endif
+
+/* Return a string that is PREFIX concatenated with SUFFIX starting at
+ SUFFIND. */
+static char *
+glue_prefix_and_suffix (char *prefix, const char *suffix, int suffind)
+{
+ char *ret;
+ int plen, slen;
+
+ plen = (prefix && *prefix) ? strlen (prefix) : 0;
+ slen = strlen (suffix + suffind);
+ ret = (char *)xmalloc (plen + slen + 1);
+ if (plen)
+ strcpy (ret, prefix);
+ strcpy (ret + plen, suffix + suffind);
+ return ret;
+}
+
+/* Do the work of tilde expansion on FILENAME. FILENAME starts with a
+ tilde. If there is no expansion, call tilde_expansion_failure_hook.
+ This always returns a newly-allocated string, never static storage. */
+char *
+tilde_expand_word (const char *filename)
+{
+ char *dirname, *expansion, *username;
+ int user_len;
+ struct passwd *user_entry;
+
+ if (filename == 0)
+ return ((char *)NULL);
+
+ if (*filename != '~')
+ return (savestring (filename));
+
+ /* A leading `~/' or a bare `~' is *always* translated to the value of
+ $HOME or the home directory of the current user, regardless of any
+ preexpansion hook. */
+ if (filename[1] == '\0' || filename[1] == '/')
+ {
+ /* Prefix $HOME to the rest of the string. */
+ expansion = sh_get_env_value ("HOME");
+#if defined (_WIN32)
+ if (expansion == 0)
+ expansion = sh_get_env_value ("APPDATA");
+#endif
+
+ /* If there is no HOME variable, look up the directory in
+ the password database. */
+ if (expansion == 0)
+ expansion = sh_get_home_dir ();
+
+ return (glue_prefix_and_suffix (expansion, filename, 1));
+ }
+
+ username = isolate_tilde_prefix (filename, &user_len);
+
+ if (tilde_expansion_preexpansion_hook)
+ {
+ expansion = (*tilde_expansion_preexpansion_hook) (username);
+ if (expansion)
+ {
+ dirname = glue_prefix_and_suffix (expansion, filename, user_len);
+ xfree (username);
+ xfree (expansion);
+ return (dirname);
+ }
+ }
+
+ /* No preexpansion hook, or the preexpansion hook failed. Look in the
+ password database. */
+ dirname = (char *)NULL;
+#if defined (HAVE_GETPWNAM)
+ user_entry = getpwnam (username);
+#else
+ user_entry = 0;
+#endif
+ if (user_entry == 0)
+ {
+ /* If the calling program has a special syntax for expanding tildes,
+ and we couldn't find a standard expansion, then let them try. */
+ if (tilde_expansion_failure_hook)
+ {
+ expansion = (*tilde_expansion_failure_hook) (username);
+ if (expansion)
+ {
+ dirname = glue_prefix_and_suffix (expansion, filename, user_len);
+ xfree (expansion);
+ }
+ }
+ /* If we don't have a failure hook, or if the failure hook did not
+ expand the tilde, return a copy of what we were passed. */
+ if (dirname == 0)
+ dirname = savestring (filename);
+ }
+#if defined (HAVE_GETPWENT)
+ else
+ dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
+#endif
+
+ xfree (username);
+#if defined (HAVE_GETPWENT)
+ endpwent ();
+#endif
+ return (dirname);
+}
+
+
+#if defined (TEST)
+#undef NULL
+#include <stdio.h>
+
+main (int argc, char **argv)
+{
+ char *result, line[512];
+ int done = 0;
+
+ while (!done)
+ {
+ printf ("~expand: ");
+ fflush (stdout);
+
+ if (!gets (line))
+ strcpy (line, "done");
+
+ if ((strcmp (line, "done") == 0) ||
+ (strcmp (line, "quit") == 0) ||
+ (strcmp (line, "exit") == 0))
+ {
+ done = 1;
+ break;
+ }
+
+ result = tilde_expand (line);
+ printf (" --> %s\n", result);
+ free (result);
+ }
+ exit (0);
+}
+
+static void memory_error_and_abort (void);
+
+static void *
+xmalloc (size_t bytes)
+{
+ void *temp = (char *)malloc (bytes);
+
+ if (!temp)
+ memory_error_and_abort ();
+ return (temp);
+}
+
+static void *
+xrealloc (void *pointer, int bytes)
+{
+ void *temp;
+
+ if (!pointer)
+ temp = malloc (bytes);
+ else
+ temp = realloc (pointer, bytes);
+
+ if (!temp)
+ memory_error_and_abort ();
+
+ return (temp);
+}
+
+static void
+memory_error_and_abort (void)
+{
+ fprintf (stderr, "readline: out of virtual memory\n");
+ abort ();
+}
+
+/*
+ * Local variables:
+ * compile-command: "gcc -g -DTEST -o tilde tilde.c"
+ * end:
+ */
+#endif /* TEST */
diff --git a/tilde.h b/tilde.h
new file mode 100644
index 0000000..bc8022a
--- /dev/null
+++ b/tilde.h
@@ -0,0 +1,68 @@
+/* tilde.h: Externally available variables and function in libtilde.a. */
+
+/* Copyright (C) 1992-2009,2021 Free Software Foundation, Inc.
+
+ This file contains the Readline Library (Readline), a set of
+ routines for providing Emacs style line input to programs that ask
+ for it.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_TILDE_H_)
+# define _TILDE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef char *tilde_hook_func_t (char *);
+
+/* If non-null, this contains the address of a function that the application
+ wants called before trying the standard tilde expansions. The function
+ is called with the text sans tilde, and returns a malloc()'ed string
+ which is the expansion, or a NULL pointer if the expansion fails. */
+extern tilde_hook_func_t *tilde_expansion_preexpansion_hook;
+
+/* If non-null, this contains the address of a function to call if the
+ standard meaning for expanding a tilde fails. The function is called
+ with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
+ which is the expansion, or a NULL pointer if there is no expansion. */
+extern tilde_hook_func_t *tilde_expansion_failure_hook;
+
+/* When non-null, this is a NULL terminated array of strings which
+ are duplicates for a tilde prefix. Bash uses this to expand
+ `=~' and `:~'. */
+extern char **tilde_additional_prefixes;
+
+/* When non-null, this is a NULL terminated array of strings which match
+ the end of a username, instead of just "/". Bash sets this to
+ `:' and `=~'. */
+extern char **tilde_additional_suffixes;
+
+/* Return a new string which is the result of tilde expanding STRING. */
+extern char *tilde_expand (const char *);
+
+/* Do the work of tilde expansion on FILENAME. FILENAME starts with a
+ tilde. If there is no expansion, call tilde_expansion_failure_hook. */
+extern char *tilde_expand_word (const char *);
+
+/* Find the portion of the string beginning with ~ that should be expanded. */
+extern char *tilde_find_word (const char *, int, int *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _TILDE_H_ */
diff --git a/undo.c b/undo.c
new file mode 100644
index 0000000..e4c457d
--- /dev/null
+++ b/undo.c
@@ -0,0 +1,365 @@
+/* undo.c - manage list of changes to lines, offering opportunity to undo them */
+
+/* Copyright (C) 1987-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h> /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+#include "histlib.h"
+
+/* Non-zero tells rl_delete_text and rl_insert_text to not add to
+ the undo list. */
+int _rl_doing_an_undo = 0;
+
+/* How many unclosed undo groups we currently have. */
+int _rl_undo_group_level = 0;
+
+/* The current undo list for THE_LINE. */
+UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL;
+
+/* **************************************************************** */
+/* */
+/* Undo, and Undoing */
+/* */
+/* **************************************************************** */
+
+static UNDO_LIST *
+alloc_undo_entry (enum undo_code what, int start, int end, char *text)
+{
+ UNDO_LIST *temp;
+
+ temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST));
+ temp->what = what;
+ temp->start = start;
+ temp->end = end;
+ temp->text = text;
+
+ temp->next = (UNDO_LIST *)NULL;
+ return temp;
+}
+
+/* Remember how to undo something. Concatenate some undos if that
+ seems right. */
+void
+rl_add_undo (enum undo_code what, int start, int end, char *text)
+{
+ UNDO_LIST *temp;
+
+ temp = alloc_undo_entry (what, start, end, text);
+ temp->next = rl_undo_list;
+ rl_undo_list = temp;
+}
+
+/* Free an UNDO_LIST */
+void
+_rl_free_undo_list (UNDO_LIST *ul)
+{
+ UNDO_LIST *release;
+
+ while (ul)
+ {
+ release = ul;
+ ul = ul->next;
+
+ if (release->what == UNDO_DELETE)
+ xfree (release->text);
+
+ xfree (release);
+ }
+}
+
+/* Free the existing undo list. */
+void
+rl_free_undo_list (void)
+{
+ UNDO_LIST *release, *orig_list;
+
+ orig_list = rl_undo_list;
+ _rl_free_undo_list (rl_undo_list);
+ rl_undo_list = (UNDO_LIST *)NULL;
+ _hs_replace_history_data (-1, (histdata_t *)orig_list, (histdata_t *)NULL);
+}
+
+UNDO_LIST *
+_rl_copy_undo_entry (UNDO_LIST *entry)
+{
+ UNDO_LIST *new;
+
+ new = alloc_undo_entry (entry->what, entry->start, entry->end, (char *)NULL);
+ new->text = entry->text ? savestring (entry->text) : 0;
+ return new;
+}
+
+UNDO_LIST *
+_rl_copy_undo_list (UNDO_LIST *head)
+{
+ UNDO_LIST *list, *new, *roving, *c;
+
+ if (head == 0)
+ return head;
+
+ list = head;
+ new = 0;
+ while (list)
+ {
+ c = _rl_copy_undo_entry (list);
+ if (new == 0)
+ roving = new = c;
+ else
+ {
+ roving->next = c;
+ roving = roving->next;
+ }
+ list = list->next;
+ }
+
+ roving->next = 0;
+ return new;
+}
+
+/* Undo the next thing in the list. Return 0 if there
+ is nothing to undo, or non-zero if there was. */
+int
+rl_do_undo (void)
+{
+ UNDO_LIST *release, *search;
+ int waiting_for_begin, start, end;
+ HIST_ENTRY *cur, *temp;
+
+#define TRANS(i) ((i) == -1 ? rl_point : ((i) == -2 ? rl_end : (i)))
+
+ start = end = waiting_for_begin = 0;
+ do
+ {
+ if (rl_undo_list == 0)
+ return (0);
+
+ _rl_doing_an_undo = 1;
+ RL_SETSTATE(RL_STATE_UNDOING);
+
+ /* To better support vi-mode, a start or end value of -1 means
+ rl_point, and a value of -2 means rl_end. */
+ if (rl_undo_list->what == UNDO_DELETE || rl_undo_list->what == UNDO_INSERT)
+ {
+ start = TRANS (rl_undo_list->start);
+ end = TRANS (rl_undo_list->end);
+ }
+
+ switch (rl_undo_list->what)
+ {
+ /* Undoing deletes means inserting some text. */
+ case UNDO_DELETE:
+ rl_point = start;
+ _rl_fix_point (1);
+ rl_insert_text (rl_undo_list->text);
+ xfree (rl_undo_list->text);
+ break;
+
+ /* Undoing inserts means deleting some text. */
+ case UNDO_INSERT:
+ rl_delete_text (start, end);
+ rl_point = start;
+ _rl_fix_point (1);
+ break;
+
+ /* Undoing an END means undoing everything 'til we get to a BEGIN. */
+ case UNDO_END:
+ waiting_for_begin++;
+ break;
+
+ /* Undoing a BEGIN means that we are done with this group. */
+ case UNDO_BEGIN:
+ if (waiting_for_begin)
+ waiting_for_begin--;
+ else
+ rl_ding ();
+ break;
+ }
+
+ _rl_doing_an_undo = 0;
+ RL_UNSETSTATE(RL_STATE_UNDOING);
+
+ release = rl_undo_list;
+ rl_undo_list = rl_undo_list->next;
+ release->next = 0; /* XXX */
+
+ /* If we are editing a history entry, make sure the change is replicated
+ in the history entry's line */
+ cur = current_history ();
+ if (cur && cur->data && (UNDO_LIST *)cur->data == release)
+ {
+ temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list);
+ xfree (temp->line);
+ FREE (temp->timestamp);
+ xfree (temp);
+ }
+
+ /* Make sure there aren't any history entries with that undo list */
+ _hs_replace_history_data (-1, (histdata_t *)release, (histdata_t *)rl_undo_list);
+
+ /* And make sure this list isn't anywhere in the saved line for history */
+ if (_rl_saved_line_for_history && _rl_saved_line_for_history->data)
+ {
+ /* Brute force; no finesse here */
+ search = (UNDO_LIST *)_rl_saved_line_for_history->data;
+ if (search == release)
+ _rl_saved_line_for_history->data = rl_undo_list;
+ else
+ {
+ while (search->next)
+ {
+ if (search->next == release)
+ {
+ search->next = rl_undo_list;
+ break;
+ }
+ search = search->next;
+ }
+ }
+ }
+
+ xfree (release);
+ }
+ while (waiting_for_begin);
+
+ return (1);
+}
+#undef TRANS
+
+int
+_rl_fix_last_undo_of_type (int type, int start, int end)
+{
+ UNDO_LIST *rl;
+
+ for (rl = rl_undo_list; rl; rl = rl->next)
+ {
+ if (rl->what == type)
+ {
+ rl->start = start;
+ rl->end = end;
+ return 0;
+ }
+ }
+ return 1;
+}
+
+/* Begin a group. Subsequent undos are undone as an atomic operation. */
+int
+rl_begin_undo_group (void)
+{
+ rl_add_undo (UNDO_BEGIN, 0, 0, 0);
+ _rl_undo_group_level++;
+ return 0;
+}
+
+/* End an undo group started with rl_begin_undo_group (). */
+int
+rl_end_undo_group (void)
+{
+ rl_add_undo (UNDO_END, 0, 0, 0);
+ _rl_undo_group_level--;
+ return 0;
+}
+
+/* Save an undo entry for the text from START to END. */
+int
+rl_modifying (int start, int end)
+{
+ if (start > end)
+ {
+ SWAP (start, end);
+ }
+
+ if (start != end)
+ {
+ char *temp = rl_copy_text (start, end);
+ rl_begin_undo_group ();
+ rl_add_undo (UNDO_DELETE, start, end, temp);
+ rl_add_undo (UNDO_INSERT, start, end, (char *)NULL);
+ rl_end_undo_group ();
+ }
+ return 0;
+}
+
+/* Revert the current line to its previous state. */
+int
+rl_revert_line (int count, int key)
+{
+ if (rl_undo_list == 0)
+ rl_ding ();
+ else
+ {
+ while (rl_undo_list)
+ rl_do_undo ();
+#if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode)
+ rl_point = rl_mark = 0; /* rl_end should be set correctly */
+#endif
+ }
+
+ return 0;
+}
+
+/* Do some undoing of things that were done. */
+int
+rl_undo_command (int count, int key)
+{
+ if (count < 0)
+ return 0; /* Nothing to do. */
+
+ while (count)
+ {
+ if (rl_do_undo ())
+ count--;
+ else
+ {
+ rl_ding ();
+ break;
+ }
+ }
+ return 0;
+}
diff --git a/util.c b/util.c
new file mode 100644
index 0000000..2e986db
--- /dev/null
+++ b/util.c
@@ -0,0 +1,577 @@
+/* util.c -- readline utility functions */
+
+/* Copyright (C) 1987-2017 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include "posixjmp.h"
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h> /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+#include <ctype.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#if defined (TIOCSTAT_IN_SYS_IOCTL)
+# include <sys/ioctl.h>
+#endif /* TIOCSTAT_IN_SYS_IOCTL */
+
+/* Some standard library routines. */
+#include "readline.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+#include "rlshell.h"
+
+/* **************************************************************** */
+/* */
+/* Utility Functions */
+/* */
+/* **************************************************************** */
+
+/* Return 0 if C is not a member of the class of characters that belong
+ in words, or 1 if it is. */
+
+int _rl_allow_pathname_alphabetic_chars = 0;
+static const char * const pathname_alphabetic_chars = "/-_=~.#$";
+
+int
+rl_alphabetic (int c)
+{
+ if (_rl_alphabetic_p (c))
+ return (1);
+
+ return (_rl_allow_pathname_alphabetic_chars &&
+ strchr (pathname_alphabetic_chars, c) != NULL);
+}
+
+#if defined (HANDLE_MULTIBYTE)
+int
+_rl_walphabetic (WCHAR_T wc)
+{
+ int c;
+
+ if (iswalnum (wc))
+ return (1);
+
+ c = wc & 0177;
+ return (_rl_allow_pathname_alphabetic_chars &&
+ strchr (pathname_alphabetic_chars, c) != NULL);
+}
+#endif
+
+/* How to abort things. */
+int
+_rl_abort_internal (void)
+{
+ if (RL_ISSTATE (RL_STATE_TIMEOUT) == 0)
+ rl_ding (); /* Don't ring the bell on a timeout */
+ rl_clear_message ();
+ _rl_reset_argument ();
+ rl_clear_pending_input ();
+ rl_deactivate_mark ();
+
+ while (rl_executing_macro)
+ _rl_pop_executing_macro ();
+ _rl_kill_kbd_macro ();
+
+ RL_UNSETSTATE (RL_STATE_MULTIKEY); /* XXX */
+
+ rl_last_func = (rl_command_func_t *)NULL;
+
+ _rl_longjmp (_rl_top_level, 1);
+ return (0);
+}
+
+int
+rl_abort (int count, int key)
+{
+ return (_rl_abort_internal ());
+}
+
+int
+_rl_null_function (int count, int key)
+{
+ return 0;
+}
+
+int
+rl_tty_status (int count, int key)
+{
+#if defined (TIOCSTAT)
+ ioctl (1, TIOCSTAT, (char *)0);
+ rl_refresh_line (count, key);
+#else
+ rl_ding ();
+#endif
+ return 0;
+}
+
+/* Return a copy of the string between FROM and TO.
+ FROM is inclusive, TO is not. */
+char *
+rl_copy_text (int from, int to)
+{
+ register int length;
+ char *copy;
+
+ /* Fix it if the caller is confused. */
+ if (from > to)
+ SWAP (from, to);
+
+ length = to - from;
+ copy = (char *)xmalloc (1 + length);
+ strncpy (copy, rl_line_buffer + from, length);
+ copy[length] = '\0';
+ return (copy);
+}
+
+/* Increase the size of RL_LINE_BUFFER until it has enough space to hold
+ LEN characters. */
+void
+rl_extend_line_buffer (int len)
+{
+ while (len >= rl_line_buffer_len)
+ {
+ rl_line_buffer_len += DEFAULT_BUFFER_SIZE;
+ rl_line_buffer = (char *)xrealloc (rl_line_buffer, rl_line_buffer_len);
+ }
+
+ _rl_set_the_line ();
+}
+
+
+/* A function for simple tilde expansion. */
+int
+rl_tilde_expand (int ignore, int key)
+{
+ register int start, end;
+ char *homedir, *temp;
+ int len;
+
+ end = rl_point;
+ start = end - 1;
+
+ if (rl_point == rl_end && rl_line_buffer[rl_point] == '~')
+ {
+ homedir = tilde_expand ("~");
+ _rl_replace_text (homedir, start, end);
+ xfree (homedir);
+ return (0);
+ }
+ else if (start >= 0 && rl_line_buffer[start] != '~')
+ {
+ for (; start >= 0 && !whitespace (rl_line_buffer[start]); start--)
+ ;
+ start++;
+ }
+ else if (start < 0)
+ start = 0;
+
+ end = start;
+ do
+ end++;
+ while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end);
+
+ if (whitespace (rl_line_buffer[end]) || end >= rl_end)
+ end--;
+
+ /* If the first character of the current word is a tilde, perform
+ tilde expansion and insert the result. If not a tilde, do
+ nothing. */
+ if (rl_line_buffer[start] == '~')
+ {
+ len = end - start + 1;
+ temp = (char *)xmalloc (len + 1);
+ strncpy (temp, rl_line_buffer + start, len);
+ temp[len] = '\0';
+ homedir = tilde_expand (temp);
+ xfree (temp);
+
+ _rl_replace_text (homedir, start, end);
+ xfree (homedir);
+ }
+
+ return (0);
+}
+
+#if defined (USE_VARARGS)
+void
+#if defined (PREFER_STDARG)
+_rl_ttymsg (const char *format, ...)
+#else
+_rl_ttymsg (va_alist)
+ va_dcl
+#endif
+{
+ va_list args;
+#if defined (PREFER_VARARGS)
+ char *format;
+#endif
+
+#if defined (PREFER_STDARG)
+ va_start (args, format);
+#else
+ va_start (args);
+ format = va_arg (args, char *);
+#endif
+
+ fprintf (stderr, "readline: ");
+ vfprintf (stderr, format, args);
+ fprintf (stderr, "\n");
+ fflush (stderr);
+
+ va_end (args);
+
+ rl_forced_update_display ();
+}
+
+void
+#if defined (PREFER_STDARG)
+_rl_errmsg (const char *format, ...)
+#else
+_rl_errmsg (va_alist)
+ va_dcl
+#endif
+{
+ va_list args;
+#if defined (PREFER_VARARGS)
+ char *format;
+#endif
+
+#if defined (PREFER_STDARG)
+ va_start (args, format);
+#else
+ va_start (args);
+ format = va_arg (args, char *);
+#endif
+
+ fprintf (stderr, "readline: ");
+ vfprintf (stderr, format, args);
+ fprintf (stderr, "\n");
+ fflush (stderr);
+
+ va_end (args);
+}
+
+#else /* !USE_VARARGS */
+void
+_rl_ttymsg (format, arg1, arg2)
+ char *format;
+{
+ fprintf (stderr, "readline: ");
+ fprintf (stderr, format, arg1, arg2);
+ fprintf (stderr, "\n");
+
+ rl_forced_update_display ();
+}
+
+void
+_rl_errmsg (format, arg1, arg2)
+ char *format;
+{
+ fprintf (stderr, "readline: ");
+ fprintf (stderr, format, arg1, arg2);
+ fprintf (stderr, "\n");
+}
+#endif /* !USE_VARARGS */
+
+/* **************************************************************** */
+/* */
+/* String Utility Functions */
+/* */
+/* **************************************************************** */
+
+/* Determine if s2 occurs in s1. If so, return a pointer to the
+ match in s1. The compare is case insensitive. */
+char *
+_rl_strindex (const char *s1, const char *s2)
+{
+ register int i, l, len;
+
+ for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++)
+ if (_rl_strnicmp (s1 + i, s2, l) == 0)
+ return ((char *) (s1 + i));
+ return ((char *)NULL);
+}
+
+#ifndef HAVE_STRPBRK
+/* Find the first occurrence in STRING1 of any character from STRING2.
+ Return a pointer to the character in STRING1. */
+char *
+_rl_strpbrk (const char *string1, const char *string2)
+{
+ register const char *scan;
+#if defined (HANDLE_MULTIBYTE)
+ mbstate_t ps;
+ register int i, v;
+
+ memset (&ps, 0, sizeof (mbstate_t));
+#endif
+
+ for (; *string1; string1++)
+ {
+ for (scan = string2; *scan; scan++)
+ {
+ if (*string1 == *scan)
+ return ((char *)string1);
+ }
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ v = _rl_get_char_len (string1, &ps);
+ if (v > 1)
+ string1 += v - 1; /* -1 to account for auto-increment in loop */
+ }
+#endif
+ }
+ return ((char *)NULL);
+}
+#endif
+
+#if !defined (HAVE_STRCASECMP)
+/* Compare at most COUNT characters from string1 to string2. Case
+ doesn't matter (strncasecmp). */
+int
+_rl_strnicmp (const char *string1, const char *string2, int count)
+{
+ register const char *s1;
+ register const char *s2;
+ register int d;
+
+ if (count <= 0 || (string1 == string2))
+ return 0;
+
+ s1 = string1;
+ s2 = string2;
+ do
+ {
+ d = _rl_to_lower (*s1) - _rl_to_lower (*s2); /* XXX - cast to unsigned char? */
+ if (d != 0)
+ return d;
+ if (*s1++ == '\0')
+ break;
+ s2++;
+ }
+ while (--count != 0);
+
+ return (0);
+}
+
+/* strcmp (), but caseless (strcasecmp). */
+int
+_rl_stricmp (const char *string1, const char *string2)
+{
+ register const char *s1;
+ register const char *s2;
+ register int d;
+
+ s1 = string1;
+ s2 = string2;
+
+ if (s1 == s2)
+ return 0;
+
+ while ((d = _rl_to_lower (*s1) - _rl_to_lower (*s2)) == 0)
+ {
+ if (*s1++ == '\0')
+ return 0;
+ s2++;
+ }
+
+ return (d);
+}
+#endif /* !HAVE_STRCASECMP */
+
+/* Stupid comparison routine for qsort () ing strings. */
+int
+_rl_qsort_string_compare (char **s1, char **s2)
+{
+#if defined (HAVE_STRCOLL)
+ return (strcoll (*s1, *s2));
+#else
+ int result;
+
+ result = **s1 - **s2;
+ if (result == 0)
+ result = strcmp (*s1, *s2);
+
+ return result;
+#endif
+}
+
+/* Function equivalents for the macros defined in chardefs.h. */
+#define FUNCTION_FOR_MACRO(f) int (f) (int c) { return f (c); }
+
+FUNCTION_FOR_MACRO (_rl_digit_p)
+FUNCTION_FOR_MACRO (_rl_digit_value)
+FUNCTION_FOR_MACRO (_rl_lowercase_p)
+FUNCTION_FOR_MACRO (_rl_pure_alphabetic)
+FUNCTION_FOR_MACRO (_rl_to_lower)
+FUNCTION_FOR_MACRO (_rl_to_upper)
+FUNCTION_FOR_MACRO (_rl_uppercase_p)
+
+/* A convenience function, to force memory deallocation to be performed
+ by readline. DLLs on Windows apparently require this. */
+void
+rl_free (void *mem)
+{
+ if (mem)
+ free (mem);
+}
+
+/* Backwards compatibility, now that savestring has been removed from
+ all `public' readline header files. */
+#undef _rl_savestring
+char *
+_rl_savestring (const char *s)
+{
+ return (strcpy ((char *)xmalloc (1 + (int)strlen (s)), (s)));
+}
+
+#if defined (DEBUG)
+#if defined (USE_VARARGS)
+static FILE *_rl_tracefp;
+
+void
+#if defined (PREFER_STDARG)
+_rl_trace (const char *format, ...)
+#else
+_rl_trace (va_alist)
+ va_dcl
+#endif
+{
+ va_list args;
+#if defined (PREFER_VARARGS)
+ char *format;
+#endif
+
+#if defined (PREFER_STDARG)
+ va_start (args, format);
+#else
+ va_start (args);
+ format = va_arg (args, char *);
+#endif
+
+ if (_rl_tracefp == 0)
+ _rl_tropen ();
+ vfprintf (_rl_tracefp, format, args);
+ fprintf (_rl_tracefp, "\n");
+ fflush (_rl_tracefp);
+
+ va_end (args);
+}
+
+int
+_rl_tropen (void)
+{
+ char fnbuf[128], *x;
+
+ if (_rl_tracefp)
+ fclose (_rl_tracefp);
+#if defined (_WIN32) && !defined (__CYGWIN__)
+ x = sh_get_env_value ("TEMP");
+ if (x == 0)
+ x = ".";
+#else
+ x = "/var/tmp";
+#endif
+ snprintf (fnbuf, sizeof (fnbuf), "%s/rltrace.%ld", x, (long)getpid());
+ unlink(fnbuf);
+ _rl_tracefp = fopen (fnbuf, "w+");
+ return _rl_tracefp != 0;
+}
+
+int
+_rl_trclose (void)
+{
+ int r;
+
+ r = fclose (_rl_tracefp);
+ _rl_tracefp = 0;
+ return r;
+}
+
+void
+_rl_settracefp (FILE *fp)
+{
+ _rl_tracefp = fp;
+}
+#endif
+#endif /* DEBUG */
+
+
+#if HAVE_DECL_AUDIT_USER_TTY && defined (HAVE_LIBAUDIT_H) && defined (ENABLE_TTY_AUDIT_SUPPORT)
+#include <sys/socket.h>
+#include <libaudit.h>
+#include <linux/audit.h>
+#include <linux/netlink.h>
+
+/* Report STRING to the audit system. */
+void
+_rl_audit_tty (char *string)
+{
+ struct audit_message req;
+ struct sockaddr_nl addr;
+ size_t size;
+ int fd;
+
+ fd = socket (PF_NETLINK, SOCK_RAW, NETLINK_AUDIT);
+ if (fd < 0)
+ return;
+ size = strlen (string) + 1;
+
+ if (NLMSG_SPACE (size) > MAX_AUDIT_MESSAGE_LENGTH)
+ return;
+
+ memset (&req, 0, sizeof(req));
+ req.nlh.nlmsg_len = NLMSG_SPACE (size);
+ req.nlh.nlmsg_type = AUDIT_USER_TTY;
+ req.nlh.nlmsg_flags = NLM_F_REQUEST;
+ req.nlh.nlmsg_seq = 0;
+ if (size && string)
+ memcpy (NLMSG_DATA(&req.nlh), string, size);
+ memset (&addr, 0, sizeof(addr));
+
+ addr.nl_family = AF_NETLINK;
+ addr.nl_pid = 0;
+ addr.nl_groups = 0;
+
+ sendto (fd, &req, req.nlh.nlmsg_len, 0, (struct sockaddr*)&addr, sizeof(addr));
+ close (fd);
+}
+#endif
diff --git a/vi_keymap.c b/vi_keymap.c
new file mode 100644
index 0000000..045258b
--- /dev/null
+++ b/vi_keymap.c
@@ -0,0 +1,875 @@
+/* vi_keymap.c -- the keymap for vi_mode in readline (). */
+
+/* Copyright (C) 1987-2017 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (BUFSIZ)
+#include <stdio.h>
+#endif /* !BUFSIZ */
+
+#include "readline.h"
+
+#if 0
+extern KEYMAP_ENTRY_ARRAY vi_escape_keymap;
+#endif
+
+/* The keymap arrays for handling vi mode. */
+KEYMAP_ENTRY_ARRAY vi_movement_keymap = {
+ /* The regular control keys come first. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */
+ { ISFUNC, rl_vi_eof_maybe }, /* Control-d */
+ { ISFUNC, rl_emacs_editing_mode }, /* Control-e */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */
+ { ISFUNC, rl_abort }, /* Control-g */
+ { ISFUNC, rl_backward_char }, /* Control-h */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-i */
+ { ISFUNC, rl_newline }, /* Control-j */
+ { ISFUNC, rl_kill_line }, /* Control-k */
+ { ISFUNC, rl_clear_screen }, /* Control-l */
+ { ISFUNC, rl_newline }, /* Control-m */
+ { ISFUNC, rl_get_next_history }, /* Control-n */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */
+ { ISFUNC, rl_get_previous_history }, /* Control-p */
+ { ISFUNC, rl_quoted_insert }, /* Control-q */
+ { ISFUNC, rl_reverse_search_history }, /* Control-r */
+ { ISFUNC, rl_forward_search_history }, /* Control-s */
+ { ISFUNC, rl_transpose_chars }, /* Control-t */
+ { ISFUNC, rl_unix_line_discard }, /* Control-u */
+ { ISFUNC, rl_quoted_insert }, /* Control-v */
+ { ISFUNC, rl_vi_unix_word_rubout }, /* Control-w */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-x */
+ { ISFUNC, rl_yank }, /* Control-y */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */
+
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-[ */ /* vi_escape_keymap */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */
+ { ISFUNC, rl_vi_undo }, /* Control-_ */
+
+ /* The start of printing characters. */
+ { ISFUNC, rl_forward_char }, /* SPACE */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* " */
+ { ISFUNC, rl_insert_comment }, /* # */
+ { ISFUNC, rl_end_of_line }, /* $ */
+ { ISFUNC, rl_vi_match }, /* % */
+ { ISFUNC, rl_vi_tilde_expand }, /* & */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ( */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ) */
+ { ISFUNC, rl_vi_complete }, /* * */
+ { ISFUNC, rl_get_next_history}, /* + */
+ { ISFUNC, rl_vi_char_search }, /* , */
+ { ISFUNC, rl_get_previous_history }, /* - */
+ { ISFUNC, rl_vi_redo }, /* . */
+ { ISFUNC, rl_vi_search }, /* / */
+
+ /* Regular digits. */
+ { ISFUNC, rl_beg_of_line }, /* 0 */
+ { ISFUNC, rl_vi_arg_digit }, /* 1 */
+ { ISFUNC, rl_vi_arg_digit }, /* 2 */
+ { ISFUNC, rl_vi_arg_digit }, /* 3 */
+ { ISFUNC, rl_vi_arg_digit }, /* 4 */
+ { ISFUNC, rl_vi_arg_digit }, /* 5 */
+ { ISFUNC, rl_vi_arg_digit }, /* 6 */
+ { ISFUNC, rl_vi_arg_digit }, /* 7 */
+ { ISFUNC, rl_vi_arg_digit }, /* 8 */
+ { ISFUNC, rl_vi_arg_digit }, /* 9 */
+
+ /* A little more punctuation. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* : */
+ { ISFUNC, rl_vi_char_search }, /* ; */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* < */
+ { ISFUNC, rl_vi_complete }, /* = */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* > */
+ { ISFUNC, rl_vi_search }, /* ? */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */
+
+ /* Uppercase alphabet. */
+ { ISFUNC, rl_vi_append_eol }, /* A */
+ { ISFUNC, rl_vi_prev_word}, /* B */
+ { ISFUNC, rl_vi_change_to }, /* C */
+ { ISFUNC, rl_vi_delete_to }, /* D */
+ { ISFUNC, rl_vi_end_word }, /* E */
+ { ISFUNC, rl_vi_char_search }, /* F */
+ { ISFUNC, rl_vi_fetch_history }, /* G */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* H */
+ { ISFUNC, rl_vi_insert_beg }, /* I */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* J */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* K */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* L */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* M */
+ { ISFUNC, rl_vi_search_again }, /* N */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* O */
+ { ISFUNC, rl_vi_put }, /* P */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Q */
+ { ISFUNC, rl_vi_replace }, /* R */
+ { ISFUNC, rl_vi_subst }, /* S */
+ { ISFUNC, rl_vi_char_search }, /* T */
+ { ISFUNC, rl_revert_line }, /* U */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* V */
+ { ISFUNC, rl_vi_next_word }, /* W */
+ { ISFUNC, rl_vi_rubout }, /* X */
+ { ISFUNC, rl_vi_yank_to }, /* Y */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Z */
+
+ /* Some more punctuation. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* [ */
+ { ISFUNC, rl_vi_complete }, /* \ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */
+ { ISFUNC, rl_vi_first_print }, /* ^ */
+ { ISFUNC, rl_vi_yank_arg }, /* _ */
+ { ISFUNC, rl_vi_goto_mark }, /* ` */
+
+ /* Lowercase alphabet. */
+ { ISFUNC, rl_vi_append_mode }, /* a */
+ { ISFUNC, rl_vi_prev_word }, /* b */
+ { ISFUNC, rl_vi_change_to }, /* c */
+ { ISFUNC, rl_vi_delete_to }, /* d */
+ { ISFUNC, rl_vi_end_word }, /* e */
+ { ISFUNC, rl_vi_char_search }, /* f */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* g */
+ { ISFUNC, rl_backward_char }, /* h */
+ { ISFUNC, rl_vi_insert_mode }, /* i */
+ { ISFUNC, rl_get_next_history }, /* j */
+ { ISFUNC, rl_get_previous_history }, /* k */
+ { ISFUNC, rl_forward_char }, /* l */
+ { ISFUNC, rl_vi_set_mark }, /* m */
+ { ISFUNC, rl_vi_search_again }, /* n */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* o */
+ { ISFUNC, rl_vi_put }, /* p */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* q */
+ { ISFUNC, rl_vi_change_char }, /* r */
+ { ISFUNC, rl_vi_subst }, /* s */
+ { ISFUNC, rl_vi_char_search }, /* t */
+ { ISFUNC, rl_vi_undo }, /* u */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* v */
+ { ISFUNC, rl_vi_next_word }, /* w */
+ { ISFUNC, rl_vi_delete }, /* x */
+ { ISFUNC, rl_vi_yank_to }, /* y */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* z */
+
+ /* Final punctuation. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* { */
+ { ISFUNC, rl_vi_column }, /* | */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* } */
+ { ISFUNC, rl_vi_change_case }, /* ~ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+ /* Undefined keys. */
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 }
+#endif /* KEYMAP_SIZE > 128 */
+};
+
+KEYMAP_ENTRY_ARRAY vi_insertion_keymap = {
+ /* The regular control keys come first. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */
+ { ISFUNC, rl_insert }, /* Control-a */
+ { ISFUNC, rl_insert }, /* Control-b */
+ { ISFUNC, rl_insert }, /* Control-c */
+ { ISFUNC, rl_vi_eof_maybe }, /* Control-d */
+ { ISFUNC, rl_insert }, /* Control-e */
+ { ISFUNC, rl_insert }, /* Control-f */
+ { ISFUNC, rl_insert }, /* Control-g */
+ { ISFUNC, rl_rubout }, /* Control-h */
+ { ISFUNC, rl_complete }, /* Control-i */
+ { ISFUNC, rl_newline }, /* Control-j */
+ { ISFUNC, rl_insert }, /* Control-k */
+ { ISFUNC, rl_insert }, /* Control-l */
+ { ISFUNC, rl_newline }, /* Control-m */
+ { ISFUNC, rl_menu_complete}, /* Control-n */
+ { ISFUNC, rl_insert }, /* Control-o */
+ { ISFUNC, rl_backward_menu_complete }, /* Control-p */
+ { ISFUNC, rl_insert }, /* Control-q */
+ { ISFUNC, rl_reverse_search_history }, /* Control-r */
+ { ISFUNC, rl_forward_search_history }, /* Control-s */
+ { ISFUNC, rl_transpose_chars }, /* Control-t */
+ { ISFUNC, rl_unix_line_discard }, /* Control-u */
+ { ISFUNC, rl_quoted_insert }, /* Control-v */
+ { ISFUNC, rl_vi_unix_word_rubout }, /* Control-w */
+ { ISFUNC, rl_insert }, /* Control-x */
+ { ISFUNC, rl_yank }, /* Control-y */
+ { ISFUNC, rl_insert }, /* Control-z */
+
+ { ISFUNC, rl_vi_movement_mode }, /* Control-[ */
+ { ISFUNC, rl_insert }, /* Control-\ */
+ { ISFUNC, rl_insert }, /* Control-] */
+ { ISFUNC, rl_insert }, /* Control-^ */
+ { ISFUNC, rl_vi_undo }, /* Control-_ */
+
+ /* The start of printing characters. */
+ { ISFUNC, rl_insert }, /* SPACE */
+ { ISFUNC, rl_insert }, /* ! */
+ { ISFUNC, rl_insert }, /* " */
+ { ISFUNC, rl_insert }, /* # */
+ { ISFUNC, rl_insert }, /* $ */
+ { ISFUNC, rl_insert }, /* % */
+ { ISFUNC, rl_insert }, /* & */
+ { ISFUNC, rl_insert }, /* ' */
+ { ISFUNC, rl_insert }, /* ( */
+ { ISFUNC, rl_insert }, /* ) */
+ { ISFUNC, rl_insert }, /* * */
+ { ISFUNC, rl_insert }, /* + */
+ { ISFUNC, rl_insert }, /* , */
+ { ISFUNC, rl_insert }, /* - */
+ { ISFUNC, rl_insert }, /* . */
+ { ISFUNC, rl_insert }, /* / */
+
+ /* Regular digits. */
+ { ISFUNC, rl_insert }, /* 0 */
+ { ISFUNC, rl_insert }, /* 1 */
+ { ISFUNC, rl_insert }, /* 2 */
+ { ISFUNC, rl_insert }, /* 3 */
+ { ISFUNC, rl_insert }, /* 4 */
+ { ISFUNC, rl_insert }, /* 5 */
+ { ISFUNC, rl_insert }, /* 6 */
+ { ISFUNC, rl_insert }, /* 7 */
+ { ISFUNC, rl_insert }, /* 8 */
+ { ISFUNC, rl_insert }, /* 9 */
+
+ /* A little more punctuation. */
+ { ISFUNC, rl_insert }, /* : */
+ { ISFUNC, rl_insert }, /* ; */
+ { ISFUNC, rl_insert }, /* < */
+ { ISFUNC, rl_insert }, /* = */
+ { ISFUNC, rl_insert }, /* > */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* @ */
+
+ /* Uppercase alphabet. */
+ { ISFUNC, rl_insert }, /* A */
+ { ISFUNC, rl_insert }, /* B */
+ { ISFUNC, rl_insert }, /* C */
+ { ISFUNC, rl_insert }, /* D */
+ { ISFUNC, rl_insert }, /* E */
+ { ISFUNC, rl_insert }, /* F */
+ { ISFUNC, rl_insert }, /* G */
+ { ISFUNC, rl_insert }, /* H */
+ { ISFUNC, rl_insert }, /* I */
+ { ISFUNC, rl_insert }, /* J */
+ { ISFUNC, rl_insert }, /* K */
+ { ISFUNC, rl_insert }, /* L */
+ { ISFUNC, rl_insert }, /* M */
+ { ISFUNC, rl_insert }, /* N */
+ { ISFUNC, rl_insert }, /* O */
+ { ISFUNC, rl_insert }, /* P */
+ { ISFUNC, rl_insert }, /* Q */
+ { ISFUNC, rl_insert }, /* R */
+ { ISFUNC, rl_insert }, /* S */
+ { ISFUNC, rl_insert }, /* T */
+ { ISFUNC, rl_insert }, /* U */
+ { ISFUNC, rl_insert }, /* V */
+ { ISFUNC, rl_insert }, /* W */
+ { ISFUNC, rl_insert }, /* X */
+ { ISFUNC, rl_insert }, /* Y */
+ { ISFUNC, rl_insert }, /* Z */
+
+ /* Some more punctuation. */
+ { ISFUNC, rl_insert }, /* [ */
+ { ISFUNC, rl_insert }, /* \ */
+ { ISFUNC, rl_insert }, /* ] */
+ { ISFUNC, rl_insert }, /* ^ */
+ { ISFUNC, rl_insert }, /* _ */
+ { ISFUNC, rl_insert }, /* ` */
+
+ /* Lowercase alphabet. */
+ { ISFUNC, rl_insert }, /* a */
+ { ISFUNC, rl_insert }, /* b */
+ { ISFUNC, rl_insert }, /* c */
+ { ISFUNC, rl_insert }, /* d */
+ { ISFUNC, rl_insert }, /* e */
+ { ISFUNC, rl_insert }, /* f */
+ { ISFUNC, rl_insert }, /* g */
+ { ISFUNC, rl_insert }, /* h */
+ { ISFUNC, rl_insert }, /* i */
+ { ISFUNC, rl_insert }, /* j */
+ { ISFUNC, rl_insert }, /* k */
+ { ISFUNC, rl_insert }, /* l */
+ { ISFUNC, rl_insert }, /* m */
+ { ISFUNC, rl_insert }, /* n */
+ { ISFUNC, rl_insert }, /* o */
+ { ISFUNC, rl_insert }, /* p */
+ { ISFUNC, rl_insert }, /* q */
+ { ISFUNC, rl_insert }, /* r */
+ { ISFUNC, rl_insert }, /* s */
+ { ISFUNC, rl_insert }, /* t */
+ { ISFUNC, rl_insert }, /* u */
+ { ISFUNC, rl_insert }, /* v */
+ { ISFUNC, rl_insert }, /* w */
+ { ISFUNC, rl_insert }, /* x */
+ { ISFUNC, rl_insert }, /* y */
+ { ISFUNC, rl_insert }, /* z */
+
+ /* Final punctuation. */
+ { ISFUNC, rl_insert }, /* { */
+ { ISFUNC, rl_insert }, /* | */
+ { ISFUNC, rl_insert }, /* } */
+ { ISFUNC, rl_insert }, /* ~ */
+ { ISFUNC, rl_rubout }, /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+ /* Pure 8-bit characters (128 - 159).
+ These might be used in some
+ character sets. */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+ { ISFUNC, rl_insert }, /* ? */
+
+ /* ISO Latin-1 characters (160 - 255) */
+ { ISFUNC, rl_insert }, /* No-break space */
+ { ISFUNC, rl_insert }, /* Inverted exclamation mark */
+ { ISFUNC, rl_insert }, /* Cent sign */
+ { ISFUNC, rl_insert }, /* Pound sign */
+ { ISFUNC, rl_insert }, /* Currency sign */
+ { ISFUNC, rl_insert }, /* Yen sign */
+ { ISFUNC, rl_insert }, /* Broken bar */
+ { ISFUNC, rl_insert }, /* Section sign */
+ { ISFUNC, rl_insert }, /* Diaeresis */
+ { ISFUNC, rl_insert }, /* Copyright sign */
+ { ISFUNC, rl_insert }, /* Feminine ordinal indicator */
+ { ISFUNC, rl_insert }, /* Left pointing double angle quotation mark */
+ { ISFUNC, rl_insert }, /* Not sign */
+ { ISFUNC, rl_insert }, /* Soft hyphen */
+ { ISFUNC, rl_insert }, /* Registered sign */
+ { ISFUNC, rl_insert }, /* Macron */
+ { ISFUNC, rl_insert }, /* Degree sign */
+ { ISFUNC, rl_insert }, /* Plus-minus sign */
+ { ISFUNC, rl_insert }, /* Superscript two */
+ { ISFUNC, rl_insert }, /* Superscript three */
+ { ISFUNC, rl_insert }, /* Acute accent */
+ { ISFUNC, rl_insert }, /* Micro sign */
+ { ISFUNC, rl_insert }, /* Pilcrow sign */
+ { ISFUNC, rl_insert }, /* Middle dot */
+ { ISFUNC, rl_insert }, /* Cedilla */
+ { ISFUNC, rl_insert }, /* Superscript one */
+ { ISFUNC, rl_insert }, /* Masculine ordinal indicator */
+ { ISFUNC, rl_insert }, /* Right pointing double angle quotation mark */
+ { ISFUNC, rl_insert }, /* Vulgar fraction one quarter */
+ { ISFUNC, rl_insert }, /* Vulgar fraction one half */
+ { ISFUNC, rl_insert }, /* Vulgar fraction three quarters */
+ { ISFUNC, rl_insert }, /* Inverted questionk mark */
+ { ISFUNC, rl_insert }, /* Latin capital letter a with grave */
+ { ISFUNC, rl_insert }, /* Latin capital letter a with acute */
+ { ISFUNC, rl_insert }, /* Latin capital letter a with circumflex */
+ { ISFUNC, rl_insert }, /* Latin capital letter a with tilde */
+ { ISFUNC, rl_insert }, /* Latin capital letter a with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin capital letter a with ring above */
+ { ISFUNC, rl_insert }, /* Latin capital letter ae */
+ { ISFUNC, rl_insert }, /* Latin capital letter c with cedilla */
+ { ISFUNC, rl_insert }, /* Latin capital letter e with grave */
+ { ISFUNC, rl_insert }, /* Latin capital letter e with acute */
+ { ISFUNC, rl_insert }, /* Latin capital letter e with circumflex */
+ { ISFUNC, rl_insert }, /* Latin capital letter e with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin capital letter i with grave */
+ { ISFUNC, rl_insert }, /* Latin capital letter i with acute */
+ { ISFUNC, rl_insert }, /* Latin capital letter i with circumflex */
+ { ISFUNC, rl_insert }, /* Latin capital letter i with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin capital letter eth (Icelandic) */
+ { ISFUNC, rl_insert }, /* Latin capital letter n with tilde */
+ { ISFUNC, rl_insert }, /* Latin capital letter o with grave */
+ { ISFUNC, rl_insert }, /* Latin capital letter o with acute */
+ { ISFUNC, rl_insert }, /* Latin capital letter o with circumflex */
+ { ISFUNC, rl_insert }, /* Latin capital letter o with tilde */
+ { ISFUNC, rl_insert }, /* Latin capital letter o with diaeresis */
+ { ISFUNC, rl_insert }, /* Multiplication sign */
+ { ISFUNC, rl_insert }, /* Latin capital letter o with stroke */
+ { ISFUNC, rl_insert }, /* Latin capital letter u with grave */
+ { ISFUNC, rl_insert }, /* Latin capital letter u with acute */
+ { ISFUNC, rl_insert }, /* Latin capital letter u with circumflex */
+ { ISFUNC, rl_insert }, /* Latin capital letter u with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin capital letter Y with acute */
+ { ISFUNC, rl_insert }, /* Latin capital letter thorn (Icelandic) */
+ { ISFUNC, rl_insert }, /* Latin small letter sharp s (German) */
+ { ISFUNC, rl_insert }, /* Latin small letter a with grave */
+ { ISFUNC, rl_insert }, /* Latin small letter a with acute */
+ { ISFUNC, rl_insert }, /* Latin small letter a with circumflex */
+ { ISFUNC, rl_insert }, /* Latin small letter a with tilde */
+ { ISFUNC, rl_insert }, /* Latin small letter a with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin small letter a with ring above */
+ { ISFUNC, rl_insert }, /* Latin small letter ae */
+ { ISFUNC, rl_insert }, /* Latin small letter c with cedilla */
+ { ISFUNC, rl_insert }, /* Latin small letter e with grave */
+ { ISFUNC, rl_insert }, /* Latin small letter e with acute */
+ { ISFUNC, rl_insert }, /* Latin small letter e with circumflex */
+ { ISFUNC, rl_insert }, /* Latin small letter e with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin small letter i with grave */
+ { ISFUNC, rl_insert }, /* Latin small letter i with acute */
+ { ISFUNC, rl_insert }, /* Latin small letter i with circumflex */
+ { ISFUNC, rl_insert }, /* Latin small letter i with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin small letter eth (Icelandic) */
+ { ISFUNC, rl_insert }, /* Latin small letter n with tilde */
+ { ISFUNC, rl_insert }, /* Latin small letter o with grave */
+ { ISFUNC, rl_insert }, /* Latin small letter o with acute */
+ { ISFUNC, rl_insert }, /* Latin small letter o with circumflex */
+ { ISFUNC, rl_insert }, /* Latin small letter o with tilde */
+ { ISFUNC, rl_insert }, /* Latin small letter o with diaeresis */
+ { ISFUNC, rl_insert }, /* Division sign */
+ { ISFUNC, rl_insert }, /* Latin small letter o with stroke */
+ { ISFUNC, rl_insert }, /* Latin small letter u with grave */
+ { ISFUNC, rl_insert }, /* Latin small letter u with acute */
+ { ISFUNC, rl_insert }, /* Latin small letter u with circumflex */
+ { ISFUNC, rl_insert }, /* Latin small letter u with diaeresis */
+ { ISFUNC, rl_insert }, /* Latin small letter y with acute */
+ { ISFUNC, rl_insert }, /* Latin small letter thorn (Icelandic) */
+ { ISFUNC, rl_insert } /* Latin small letter y with diaeresis */
+#endif /* KEYMAP_SIZE > 128 */
+};
+
+/* Unused for the time being. */
+#if 0
+KEYMAP_ENTRY_ARRAY vi_escape_keymap = {
+ /* The regular control keys come first. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-d */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-e */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-g */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-h */
+ { ISFUNC, rl_tab_insert}, /* Control-i */
+ { ISFUNC, rl_emacs_editing_mode}, /* Control-j */
+ { ISFUNC, rl_kill_line }, /* Control-k */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-l */
+ { ISFUNC, rl_emacs_editing_mode}, /* Control-m */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-n */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-p */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-q */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-r */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-s */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-t */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-u */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-v */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-w */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-x */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-y */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */
+
+ { ISFUNC, rl_vi_movement_mode }, /* Control-[ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */
+ { ISFUNC, rl_vi_undo }, /* Control-_ */
+
+ /* The start of printing characters. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* SPACE */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* " */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* # */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* $ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* % */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* & */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ( */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ) */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* * */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* + */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* , */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* - */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* . */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* / */
+
+ /* Regular digits. */
+ { ISFUNC, rl_vi_arg_digit }, /* 0 */
+ { ISFUNC, rl_vi_arg_digit }, /* 1 */
+ { ISFUNC, rl_vi_arg_digit }, /* 2 */
+ { ISFUNC, rl_vi_arg_digit }, /* 3 */
+ { ISFUNC, rl_vi_arg_digit }, /* 4 */
+ { ISFUNC, rl_vi_arg_digit }, /* 5 */
+ { ISFUNC, rl_vi_arg_digit }, /* 6 */
+ { ISFUNC, rl_vi_arg_digit }, /* 7 */
+ { ISFUNC, rl_vi_arg_digit }, /* 8 */
+ { ISFUNC, rl_vi_arg_digit }, /* 9 */
+
+ /* A little more punctuation. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* : */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ; */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* < */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* = */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* > */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ? */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */
+
+ /* Uppercase alphabet. */
+ { ISFUNC, rl_do_lowercase_version }, /* A */
+ { ISFUNC, rl_do_lowercase_version }, /* B */
+ { ISFUNC, rl_do_lowercase_version }, /* C */
+ { ISFUNC, rl_do_lowercase_version }, /* D */
+ { ISFUNC, rl_do_lowercase_version }, /* E */
+ { ISFUNC, rl_do_lowercase_version }, /* F */
+ { ISFUNC, rl_do_lowercase_version }, /* G */
+ { ISFUNC, rl_do_lowercase_version }, /* H */
+ { ISFUNC, rl_do_lowercase_version }, /* I */
+ { ISFUNC, rl_do_lowercase_version }, /* J */
+ { ISFUNC, rl_do_lowercase_version }, /* K */
+ { ISFUNC, rl_do_lowercase_version }, /* L */
+ { ISFUNC, rl_do_lowercase_version }, /* M */
+ { ISFUNC, rl_do_lowercase_version }, /* N */
+ { ISFUNC, rl_do_lowercase_version }, /* O */
+ { ISFUNC, rl_do_lowercase_version }, /* P */
+ { ISFUNC, rl_do_lowercase_version }, /* Q */
+ { ISFUNC, rl_do_lowercase_version }, /* R */
+ { ISFUNC, rl_do_lowercase_version }, /* S */
+ { ISFUNC, rl_do_lowercase_version }, /* T */
+ { ISFUNC, rl_do_lowercase_version }, /* U */
+ { ISFUNC, rl_do_lowercase_version }, /* V */
+ { ISFUNC, rl_do_lowercase_version }, /* W */
+ { ISFUNC, rl_do_lowercase_version }, /* X */
+ { ISFUNC, rl_do_lowercase_version }, /* Y */
+ { ISFUNC, rl_do_lowercase_version }, /* Z */
+
+ /* Some more punctuation. */
+ { ISFUNC, rl_arrow_keys }, /* [ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* \ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ^ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* _ */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ` */
+
+ /* Lowercase alphabet. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* a */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* b */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* c */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* d */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* e */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* f */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* g */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* h */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* i */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* j */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* k */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* l */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* m */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* n */
+ { ISFUNC, rl_arrow_keys }, /* o */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* p */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* q */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* r */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* s */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* t */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* u */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* v */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* w */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* x */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* y */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* z */
+
+ /* Final punctuation. */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* { */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* | */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* } */
+ { ISFUNC, (rl_command_func_t *)0x0 }, /* ~ */
+ { ISFUNC, rl_backward_kill_word }, /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+ /* Undefined keys. */
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 },
+ { ISFUNC, (rl_command_func_t *)0x0 }
+#endif /* KEYMAP_SIZE > 128 */
+};
+#endif
diff --git a/vi_mode.c b/vi_mode.c
new file mode 100644
index 0000000..3a033ba
--- /dev/null
+++ b/vi_mode.c
@@ -0,0 +1,2415 @@
+/* vi_mode.c -- A vi emulation mode for Bash.
+ Derived from code written by Jeff Sparkes (jsparkes@bnr.ca). */
+
+/* Copyright (C) 1987-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+/* **************************************************************** */
+/* */
+/* VI Emulation Mode */
+/* */
+/* **************************************************************** */
+#include "rlconf.h"
+
+#if defined (VI_MODE)
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+
+/* Some standard library routines. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+#ifndef member
+#define member(c, s) ((c) ? (char *)strchr ((s), (c)) != (char *)NULL : 0)
+#endif
+
+/* Increment START to the next character in RL_LINE_BUFFER, handling multibyte chars */
+#if defined (HANDLE_MULTIBYTE)
+#define INCREMENT_POS(start) \
+ do { \
+ if (MB_CUR_MAX == 1 || rl_byte_oriented) \
+ start++; \
+ else \
+ start = _rl_find_next_mbchar (rl_line_buffer, start, 1, MB_FIND_ANY); \
+ } while (0)
+#else /* !HANDLE_MULTIBYTE */
+#define INCREMENT_POS(start) (start)++
+#endif /* !HANDLE_MULTIBYTE */
+
+/* This is global so other parts of the code can check whether the last
+ command was a text modification command. */
+int _rl_vi_last_command = 'i'; /* default `.' puts you in insert mode */
+
+_rl_vimotion_cxt *_rl_vimvcxt = 0;
+
+/* Non-zero indicates we are redoing a vi-mode command with `.' */
+int _rl_vi_redoing;
+
+/* Non-zero means enter insertion mode. */
+static int _rl_vi_doing_insert;
+
+/* Command keys which do movement for xxx_to commands. */
+static const char * const vi_motion = " hl^$0ftFT;,%wbeWBE|`";
+
+/* Keymap used for vi replace characters. Created dynamically since
+ rarely used. */
+static Keymap vi_replace_map;
+
+/* The number of characters inserted in the last replace operation. */
+static int vi_replace_count;
+
+/* If non-zero, we have text inserted after a c[motion] command that put
+ us implicitly into insert mode. Some people want this text to be
+ attached to the command so that it is `redoable' with `.'. */
+static int vi_continued_command;
+static char *vi_insert_buffer;
+static int vi_insert_buffer_size;
+
+static int _rl_vi_last_repeat = 1;
+static int _rl_vi_last_arg_sign = 1;
+static int _rl_vi_last_motion;
+#if defined (HANDLE_MULTIBYTE)
+static char _rl_vi_last_search_mbchar[MB_LEN_MAX];
+static int _rl_vi_last_search_mblen;
+#else
+static int _rl_vi_last_search_char;
+#endif
+static char _rl_vi_last_replacement[MB_LEN_MAX+1]; /* reserve for trailing NULL */
+
+static int _rl_vi_last_key_before_insert;
+
+/* Text modification commands. These are the `redoable' commands. */
+static const char * const vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~";
+
+/* Arrays for the saved marks. */
+static int vi_mark_chars['z' - 'a' + 1];
+
+static void _rl_vi_replace_insert (int);
+static void _rl_vi_save_replace (void);
+static void _rl_vi_stuff_insert (int);
+static void _rl_vi_save_insert (UNDO_LIST *);
+
+static void vi_save_insert_buffer (int, int);
+
+static inline void _rl_vi_backup (void);
+
+static int _rl_vi_arg_dispatch (int);
+static int rl_digit_loop1 (void);
+
+static int _rl_vi_set_mark (void);
+static int _rl_vi_goto_mark (void);
+
+static inline int _rl_vi_advance_point (void);
+static inline int _rl_vi_backup_point (void);
+
+static void _rl_vi_append_forward (int);
+
+static int _rl_vi_callback_getchar (char *, int);
+
+#if defined (READLINE_CALLBACKS)
+static int _rl_vi_callback_set_mark (_rl_callback_generic_arg *);
+static int _rl_vi_callback_goto_mark (_rl_callback_generic_arg *);
+static int _rl_vi_callback_change_char (_rl_callback_generic_arg *);
+static int _rl_vi_callback_char_search (_rl_callback_generic_arg *);
+#endif
+
+static int rl_domove_read_callback (_rl_vimotion_cxt *);
+static int rl_domove_motion_callback (_rl_vimotion_cxt *);
+static int rl_vi_domove_getchar (_rl_vimotion_cxt *);
+
+static int vi_change_dispatch (_rl_vimotion_cxt *);
+static int vi_delete_dispatch (_rl_vimotion_cxt *);
+static int vi_yank_dispatch (_rl_vimotion_cxt *);
+
+static int vidomove_dispatch (_rl_vimotion_cxt *);
+
+void
+_rl_vi_initialize_line (void)
+{
+ register int i, n;
+
+ n = sizeof (vi_mark_chars) / sizeof (vi_mark_chars[0]);
+ for (i = 0; i < n; i++)
+ vi_mark_chars[i] = -1;
+
+ RL_UNSETSTATE(RL_STATE_VICMDONCE);
+}
+
+void
+_rl_vi_reset_last (void)
+{
+ _rl_vi_last_command = 'i';
+ _rl_vi_last_repeat = 1;
+ _rl_vi_last_arg_sign = 1;
+ _rl_vi_last_motion = 0;
+}
+
+void
+_rl_vi_set_last (int key, int repeat, int sign)
+{
+ _rl_vi_last_command = key;
+ _rl_vi_last_repeat = repeat;
+ _rl_vi_last_arg_sign = sign;
+}
+
+/* A convenience function that calls _rl_vi_set_last to save the last command
+ information and enters insertion mode. */
+void
+rl_vi_start_inserting (int key, int repeat, int sign)
+{
+ _rl_vi_set_last (key, repeat, sign);
+ rl_begin_undo_group (); /* ensure inserts aren't concatenated */
+ rl_vi_insertion_mode (1, key);
+}
+
+/* Is the command C a VI mode text modification command? */
+int
+_rl_vi_textmod_command (int c)
+{
+ return (member (c, vi_textmod));
+}
+
+int
+_rl_vi_motion_command (int c)
+{
+ return (member (c, vi_motion));
+}
+
+static void
+_rl_vi_replace_insert (int count)
+{
+ int nchars;
+
+ nchars = strlen (vi_insert_buffer);
+
+ rl_begin_undo_group ();
+ while (count--)
+ /* nchars-1 to compensate for _rl_replace_text using `end+1' in call
+ to rl_delete_text */
+ _rl_replace_text (vi_insert_buffer, rl_point, rl_point+nchars-1);
+ rl_end_undo_group ();
+}
+
+static void
+_rl_vi_stuff_insert (int count)
+{
+ rl_begin_undo_group ();
+ while (count--)
+ rl_insert_text (vi_insert_buffer);
+ rl_end_undo_group ();
+}
+
+/* Bound to `.'. Called from command mode, so we know that we have to
+ redo a text modification command. The default for _rl_vi_last_command
+ puts you back into insert mode. */
+int
+rl_vi_redo (int count, int c)
+{
+ int r;
+
+ if (rl_explicit_arg == 0)
+ {
+ rl_numeric_arg = _rl_vi_last_repeat;
+ rl_arg_sign = _rl_vi_last_arg_sign;
+ }
+
+ r = 0;
+ _rl_vi_redoing = 1;
+ /* If we're redoing an insert with `i', stuff in the inserted text
+ and do not go into insertion mode. */
+ if (_rl_vi_last_command == 'i' && vi_insert_buffer && *vi_insert_buffer)
+ {
+ _rl_vi_stuff_insert (count);
+ /* And back up point over the last character inserted. */
+ if (rl_point > 0)
+ _rl_vi_backup ();
+ }
+ else if (_rl_vi_last_command == 'R' && vi_insert_buffer && *vi_insert_buffer)
+ {
+ _rl_vi_replace_insert (count);
+ /* And back up point over the last character inserted. */
+ if (rl_point > 0)
+ _rl_vi_backup ();
+ }
+ /* Ditto for redoing an insert with `I', but move to the beginning of the
+ line like the `I' command does. */
+ else if (_rl_vi_last_command == 'I' && vi_insert_buffer && *vi_insert_buffer)
+ {
+ rl_beg_of_line (1, 'I');
+ _rl_vi_stuff_insert (count);
+ if (rl_point > 0)
+ _rl_vi_backup ();
+ }
+ /* Ditto for redoing an insert with `a', but move forward a character first
+ like the `a' command does. */
+ else if (_rl_vi_last_command == 'a' && vi_insert_buffer && *vi_insert_buffer)
+ {
+ _rl_vi_append_forward ('a');
+ _rl_vi_stuff_insert (count);
+ if (rl_point > 0)
+ _rl_vi_backup ();
+ }
+ /* Ditto for redoing an insert with `A', but move to the end of the line
+ like the `A' command does. */
+ else if (_rl_vi_last_command == 'A' && vi_insert_buffer && *vi_insert_buffer)
+ {
+ rl_end_of_line (1, 'A');
+ _rl_vi_stuff_insert (count);
+ if (rl_point > 0)
+ _rl_vi_backup ();
+ }
+ else if (_rl_vi_last_command == '.' && _rl_keymap == vi_movement_keymap)
+ {
+ rl_ding ();
+ r = 0;
+ }
+ else
+ r = _rl_dispatch (_rl_vi_last_command, _rl_keymap);
+
+ _rl_vi_redoing = 0;
+
+ return (r);
+}
+
+/* A placeholder for further expansion. */
+int
+rl_vi_undo (int count, int key)
+{
+ return (rl_undo_command (count, key));
+}
+
+/* Yank the nth arg from the previous line into this line at point. */
+int
+rl_vi_yank_arg (int count, int key)
+{
+ /* Readline thinks that the first word on a line is the 0th, while vi
+ thinks the first word on a line is the 1st. Compensate. */
+ if (rl_explicit_arg)
+ rl_yank_nth_arg (count - 1, key);
+ else
+ rl_yank_nth_arg ('$', key);
+
+ return (0);
+}
+
+/* With an argument, move back that many history lines, else move to the
+ beginning of history. */
+int
+rl_vi_fetch_history (int count, int c)
+{
+ return (rl_fetch_history (count, c));
+}
+
+/* Search again for the last thing searched for. */
+int
+rl_vi_search_again (int count, int key)
+{
+ switch (key)
+ {
+ case 'n':
+ rl_noninc_reverse_search_again (count, key);
+ break;
+
+ case 'N':
+ rl_noninc_forward_search_again (count, key);
+ break;
+ }
+ return (0);
+}
+
+/* Do a vi style search. */
+int
+rl_vi_search (int count, int key)
+{
+ switch (key)
+ {
+ case '?':
+ _rl_free_saved_history_line ();
+ rl_noninc_forward_search (count, key);
+ break;
+
+ case '/':
+ _rl_free_saved_history_line ();
+ rl_noninc_reverse_search (count, key);
+ break;
+
+ default:
+ rl_ding ();
+ break;
+ }
+ return (0);
+}
+
+/* Completion, from vi's point of view. */
+int
+rl_vi_complete (int ignore, int key)
+{
+ if ((rl_point < rl_end) && (!whitespace (rl_line_buffer[rl_point])))
+ {
+ if (!whitespace (rl_line_buffer[rl_point + 1]))
+ rl_vi_end_word (1, 'E');
+ _rl_vi_advance_point ();
+ }
+
+ if (key == '*')
+ rl_complete_internal ('*'); /* Expansion and replacement. */
+ else if (key == '=')
+ rl_complete_internal ('?'); /* List possible completions. */
+ else if (key == '\\')
+ rl_complete_internal (TAB); /* Standard Readline completion. */
+ else
+ rl_complete (0, key);
+
+ if (key == '*' || key == '\\')
+ rl_vi_start_inserting (key, 1, rl_arg_sign);
+
+ return (0);
+}
+
+/* Tilde expansion for vi mode. */
+int
+rl_vi_tilde_expand (int ignore, int key)
+{
+ rl_tilde_expand (0, key);
+ rl_vi_start_inserting (key, 1, rl_arg_sign);
+ return (0);
+}
+
+/* Previous word in vi mode. */
+int
+rl_vi_prev_word (int count, int key)
+{
+ if (count < 0)
+ return (rl_vi_next_word (-count, key));
+
+ if (rl_point == 0)
+ {
+ rl_ding ();
+ return (0);
+ }
+
+ if (_rl_uppercase_p (key))
+ rl_vi_bWord (count, key);
+ else
+ rl_vi_bword (count, key);
+
+ return (0);
+}
+
+/* Next word in vi mode. */
+int
+rl_vi_next_word (int count, int key)
+{
+ if (count < 0)
+ return (rl_vi_prev_word (-count, key));
+
+ if (rl_point >= (rl_end - 1))
+ {
+ rl_ding ();
+ return (0);
+ }
+
+ if (_rl_uppercase_p (key))
+ rl_vi_fWord (count, key);
+ else
+ rl_vi_fword (count, key);
+ return (0);
+}
+
+static inline int
+_rl_vi_advance_point (void)
+{
+ int point;
+
+ point = rl_point;
+ if (rl_point < rl_end)
+#if defined (HANDLE_MULTIBYTE)
+ {
+ if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ rl_point++;
+ else
+ {
+ point = rl_point;
+ rl_point = _rl_forward_char_internal (1);
+ if (point == rl_point || rl_point > rl_end)
+ rl_point = rl_end;
+ }
+ }
+#else
+ rl_point++;
+#endif
+
+ return point;
+}
+
+/* Move the cursor back one character. */
+static inline void
+_rl_vi_backup (void)
+{
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+ else
+ rl_point--;
+}
+
+/* Move the point back one character, returning the starting value and not
+ doing anything at the beginning of the line */
+static inline int
+_rl_vi_backup_point (void)
+{
+ int point;
+
+ point = rl_point;
+ if (rl_point > 0)
+#if defined (HANDLE_MULTIBYTE)
+ {
+ if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ rl_point--;
+ else
+ {
+ point = rl_point;
+ rl_point = _rl_backward_char_internal (1);
+ if (rl_point < 0)
+ rl_point = 0; /* XXX - not really necessary */
+ }
+ }
+#else
+ rl_point--;
+#endif
+ return point;
+}
+
+/* Move to the end of the ?next? word. */
+int
+rl_vi_end_word (int count, int key)
+{
+ if (count < 0)
+ {
+ rl_ding ();
+ return 1;
+ }
+
+ if (_rl_uppercase_p (key))
+ rl_vi_eWord (count, key);
+ else
+ rl_vi_eword (count, key);
+ return (0);
+}
+
+/* Move forward a word the way that 'W' does. */
+int
+rl_vi_fWord (int count, int ignore)
+{
+ while (count-- && rl_point < (rl_end - 1))
+ {
+ /* Skip until whitespace. */
+ while (!whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
+ _rl_vi_advance_point ();
+
+ /* Now skip whitespace. */
+ while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
+ _rl_vi_advance_point ();
+ }
+ return (0);
+}
+
+int
+rl_vi_bWord (int count, int ignore)
+{
+ while (count-- && rl_point > 0)
+ {
+ /* If we are at the start of a word, move back to whitespace so
+ we will go back to the start of the previous word. */
+ if (!whitespace (rl_line_buffer[rl_point]) &&
+ whitespace (rl_line_buffer[rl_point - 1]))
+ rl_point--;
+
+ while (rl_point > 0 && whitespace (rl_line_buffer[rl_point]))
+ _rl_vi_backup_point ();
+
+ if (rl_point > 0)
+ {
+ do
+ _rl_vi_backup_point ();
+ while (rl_point > 0 && !whitespace (rl_line_buffer[rl_point]));
+ if (rl_point > 0) /* hit whitespace */
+ rl_point++;
+
+ if (rl_point < 0)
+ rl_point = 0;
+ }
+ }
+ return (0);
+}
+
+int
+rl_vi_eWord (int count, int ignore)
+{
+ int opoint;
+
+ while (count-- && rl_point < (rl_end - 1))
+ {
+ if (whitespace (rl_line_buffer[rl_point]) == 0)
+ _rl_vi_advance_point ();
+
+ /* Move to the next non-whitespace character (to the start of the
+ next word). */
+ while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+ _rl_vi_advance_point ();
+
+ if (rl_point && rl_point < rl_end)
+ {
+ opoint = rl_point;
+
+ /* Skip whitespace. */
+ while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+ opoint = _rl_vi_advance_point (); /* XXX - why? */
+
+ /* Skip until whitespace. */
+ while (rl_point < rl_end && !whitespace (rl_line_buffer[rl_point]))
+ opoint = _rl_vi_advance_point ();
+
+ /* Move back to the last character of the word. */
+ rl_point = opoint;
+ }
+ }
+ return (0);
+}
+
+int
+rl_vi_fword (int count, int ignore)
+{
+ int opoint;
+
+ while (count-- && rl_point < (rl_end - 1))
+ {
+ /* Move to white space (really non-identifer). */
+ if (_rl_isident (rl_line_buffer[rl_point]))
+ {
+ while (_rl_isident (rl_line_buffer[rl_point]) && rl_point < rl_end)
+ _rl_vi_advance_point ();
+ }
+ else /* if (!whitespace (rl_line_buffer[rl_point])) */
+ {
+ while (!_rl_isident (rl_line_buffer[rl_point]) &&
+ !whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
+ _rl_vi_advance_point ();
+ }
+
+ opoint = rl_point;
+
+ /* Move past whitespace. */
+ while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
+ opoint = _rl_vi_advance_point ();
+ }
+ return (0);
+}
+
+int
+rl_vi_bword (int count, int ignore)
+{
+ int opoint;
+
+ while (count-- && rl_point > 0)
+ {
+ int prev_is_ident, cur_is_ident;
+
+ /* If we are at the start of a word, move back to whitespace
+ so we will go back to the start of the previous word. */
+ if (!whitespace (rl_line_buffer[rl_point]) &&
+ whitespace (rl_line_buffer[rl_point - 1]))
+ if (--rl_point == 0)
+ break;
+
+ /* If this character and the previous character are `opposite', move
+ back so we don't get messed up by the rl_point++ down there in
+ the while loop. Without this code, words like `l;' screw up the
+ function. */
+ cur_is_ident = _rl_isident (rl_line_buffer[rl_point]);
+ opoint = _rl_vi_backup_point ();
+ prev_is_ident = _rl_isident (rl_line_buffer[rl_point]);
+ if ((cur_is_ident && !prev_is_ident) || (!cur_is_ident && prev_is_ident))
+ ; /* leave point alone, we backed it up one character */
+ else
+ rl_point = opoint;
+
+ while (rl_point > 0 && whitespace (rl_line_buffer[rl_point]))
+ _rl_vi_backup_point ();
+
+ if (rl_point > 0)
+ {
+ opoint = rl_point;
+ if (_rl_isident (rl_line_buffer[rl_point]))
+ do
+ opoint = _rl_vi_backup_point ();
+ while (rl_point > 0 && _rl_isident (rl_line_buffer[rl_point]));
+ else
+ do
+ opoint = _rl_vi_backup_point ();
+ while (rl_point > 0 && !_rl_isident (rl_line_buffer[rl_point]) &&
+ !whitespace (rl_line_buffer[rl_point]));
+
+ if (rl_point > 0)
+ rl_point = opoint;
+
+ if (rl_point < 0)
+ rl_point = 0;
+ }
+ }
+ return (0);
+}
+
+int
+rl_vi_eword (int count, int ignore)
+{
+ int opoint;
+
+ while (count-- && rl_point < (rl_end - 1))
+ {
+ if (whitespace (rl_line_buffer[rl_point]) == 0)
+ _rl_vi_advance_point ();
+
+ while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+ _rl_vi_advance_point ();
+
+ opoint = rl_point;
+ if (rl_point < rl_end)
+ {
+ if (_rl_isident (rl_line_buffer[rl_point]))
+ do
+ {
+ opoint = _rl_vi_advance_point ();
+ }
+ while (rl_point < rl_end && _rl_isident (rl_line_buffer[rl_point]));
+ else
+ do
+ {
+ opoint = _rl_vi_advance_point ();
+ }
+ while (rl_point < rl_end && !_rl_isident (rl_line_buffer[rl_point])
+ && !whitespace (rl_line_buffer[rl_point]));
+ }
+ rl_point = opoint;
+ }
+ return (0);
+}
+
+int
+rl_vi_insert_beg (int count, int key)
+{
+ rl_beg_of_line (1, key);
+ rl_vi_insert_mode (1, key);
+ return (0);
+}
+
+static void
+_rl_vi_append_forward (int key)
+{
+ _rl_vi_advance_point ();
+}
+
+int
+rl_vi_append_mode (int count, int key)
+{
+ _rl_vi_append_forward (key);
+ rl_vi_start_inserting (key, 1, rl_arg_sign);
+ return (0);
+}
+
+int
+rl_vi_append_eol (int count, int key)
+{
+ rl_end_of_line (1, key);
+ rl_vi_append_mode (1, key);
+ return (0);
+}
+
+/* What to do in the case of C-d. */
+int
+rl_vi_eof_maybe (int count, int c)
+{
+ return (rl_newline (1, '\n'));
+}
+
+/* Insertion mode stuff. */
+
+/* Switching from one mode to the other really just involves
+ switching keymaps. */
+int
+rl_vi_insertion_mode (int count, int key)
+{
+ _rl_keymap = vi_insertion_keymap;
+ _rl_vi_last_key_before_insert = key;
+ if (_rl_show_mode_in_prompt)
+ _rl_reset_prompt ();
+ return (0);
+}
+
+int
+rl_vi_insert_mode (int count, int key)
+{
+ rl_vi_start_inserting (key, 1, rl_arg_sign);
+ return (0);
+}
+
+static void
+vi_save_insert_buffer (int start, int len)
+{
+ /* Same code as _rl_vi_save_insert below */
+ if (len >= vi_insert_buffer_size)
+ {
+ vi_insert_buffer_size += (len + 32) - (len % 32);
+ vi_insert_buffer = (char *)xrealloc (vi_insert_buffer, vi_insert_buffer_size);
+ }
+ strncpy (vi_insert_buffer, rl_line_buffer + start, len - 1);
+ vi_insert_buffer[len-1] = '\0';
+}
+
+static void
+_rl_vi_save_replace (void)
+{
+ int len, start, end;
+ UNDO_LIST *up;
+
+ up = rl_undo_list;
+ if (up == 0 || up->what != UNDO_END || vi_replace_count <= 0)
+ {
+ if (vi_insert_buffer_size >= 1)
+ vi_insert_buffer[0] = '\0';
+ return;
+ }
+ /* Let's try it the quick and easy way for now. This should essentially
+ accommodate every UNDO_INSERT and save the inserted text to
+ vi_insert_buffer */
+ end = rl_point;
+ start = end - vi_replace_count + 1;
+ len = vi_replace_count + 1;
+
+ if (start < 0)
+ {
+ len = end + 1;
+ start = 0;
+ }
+
+ vi_save_insert_buffer (start, len);
+}
+
+static void
+_rl_vi_save_insert (UNDO_LIST *up)
+{
+ int len, start, end;
+
+ if (up == 0 || up->what != UNDO_INSERT)
+ {
+ if (vi_insert_buffer_size >= 1)
+ vi_insert_buffer[0] = '\0';
+ return;
+ }
+
+ start = up->start;
+ end = up->end;
+ len = end - start + 1;
+
+ vi_save_insert_buffer (start, len);
+}
+
+void
+_rl_vi_done_inserting (void)
+{
+ if (_rl_vi_doing_insert)
+ {
+ /* The `c', `s', `S', and `R' commands set this. */
+ rl_end_undo_group (); /* for the group in rl_vi_start_inserting */
+ /* Now, the text between rl_undo_list->next->start and
+ rl_undo_list->next->end is what was inserted while in insert
+ mode. It gets copied to VI_INSERT_BUFFER because it depends
+ on absolute indices into the line which may change (though they
+ probably will not). */
+ _rl_vi_doing_insert = 0;
+ if (_rl_vi_last_key_before_insert == 'R')
+ _rl_vi_save_replace (); /* Half the battle */
+ else
+ _rl_vi_save_insert (rl_undo_list->next);
+ /* sanity check, should always be >= 1 here */
+ if (_rl_undo_group_level > 0)
+ rl_end_undo_group (); /* for the group in the command (change or replace) */
+ }
+ else
+ {
+ if (rl_undo_list && (_rl_vi_last_key_before_insert == 'i' ||
+ _rl_vi_last_key_before_insert == 'a' ||
+ _rl_vi_last_key_before_insert == 'I' ||
+ _rl_vi_last_key_before_insert == 'A'))
+ _rl_vi_save_insert (rl_undo_list);
+ /* XXX - Other keys probably need to be checked. */
+ else if (_rl_vi_last_key_before_insert == 'C')
+ rl_end_undo_group ();
+ }
+
+ /* Sanity check, make sure all the undo groups are closed before we leave
+ insert mode */
+ while (_rl_undo_group_level > 0)
+ rl_end_undo_group ();
+}
+
+int
+rl_vi_movement_mode (int count, int key)
+{
+ if (rl_point > 0)
+ rl_backward_char (1, key);
+
+ _rl_keymap = vi_movement_keymap;
+ _rl_vi_done_inserting ();
+
+ /* This is how POSIX.2 says `U' should behave -- everything up until the
+ first time you go into command mode should not be undone. */
+ if (RL_ISSTATE (RL_STATE_VICMDONCE) == 0)
+ rl_free_undo_list ();
+
+ if (_rl_show_mode_in_prompt)
+ _rl_reset_prompt ();
+
+ RL_SETSTATE (RL_STATE_VICMDONCE);
+ return (0);
+}
+
+int
+rl_vi_arg_digit (int count, int c)
+{
+ if (c == '0' && rl_numeric_arg == 1 && !rl_explicit_arg)
+ return (rl_beg_of_line (1, c));
+ else
+ return (rl_digit_argument (count, c));
+}
+
+/* Change the case of the next COUNT characters. */
+#if defined (HANDLE_MULTIBYTE)
+static int
+_rl_vi_change_mbchar_case (int count)
+{
+ WCHAR_T wc;
+ char mb[MB_LEN_MAX+1];
+ int mlen, p;
+ size_t m;
+ mbstate_t ps;
+
+ memset (&ps, 0, sizeof (mbstate_t));
+ if (_rl_adjust_point (rl_line_buffer, rl_point, &ps) > 0)
+ count--;
+ while (count-- && rl_point < rl_end)
+ {
+ m = MBRTOWC (&wc, rl_line_buffer + rl_point, rl_end - rl_point, &ps);
+ if (MB_INVALIDCH (m))
+ wc = (WCHAR_T)rl_line_buffer[rl_point];
+ else if (MB_NULLWCH (m))
+ wc = L'\0';
+ if (iswupper (wc))
+ wc = towlower (wc);
+ else if (iswlower (wc))
+ wc = towupper (wc);
+ else
+ {
+ /* Just skip over chars neither upper nor lower case */
+ rl_forward_char (1, 0);
+ continue;
+ }
+
+ /* Vi is kind of strange here. */
+ if (wc)
+ {
+ p = rl_point;
+ mlen = WCRTOMB (mb, wc, &ps);
+ if (mlen >= 0)
+ mb[mlen] = '\0';
+ rl_begin_undo_group ();
+ rl_vi_delete (1, 0);
+ if (rl_point < p) /* Did we retreat at EOL? */
+ _rl_vi_advance_point ();
+ rl_insert_text (mb);
+ rl_end_undo_group ();
+ rl_vi_check ();
+ }
+ else
+ rl_forward_char (1, 0);
+ }
+
+ return 0;
+}
+#endif
+
+int
+rl_vi_change_case (int count, int ignore)
+{
+ int c, p;
+
+ /* Don't try this on an empty line. */
+ if (rl_point >= rl_end)
+ return (0);
+
+ c = 0;
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ return (_rl_vi_change_mbchar_case (count));
+#endif
+
+ while (count-- && rl_point < rl_end)
+ {
+ if (_rl_uppercase_p (rl_line_buffer[rl_point]))
+ c = _rl_to_lower (rl_line_buffer[rl_point]);
+ else if (_rl_lowercase_p (rl_line_buffer[rl_point]))
+ c = _rl_to_upper (rl_line_buffer[rl_point]);
+ else
+ {
+ /* Just skip over characters neither upper nor lower case. */
+ rl_forward_char (1, c);
+ continue;
+ }
+
+ /* Vi is kind of strange here. */
+ if (c)
+ {
+ p = rl_point;
+ rl_begin_undo_group ();
+ rl_vi_delete (1, c);
+ if (rl_point < p) /* Did we retreat at EOL? */
+ rl_point++;
+ _rl_insert_char (1, c);
+ rl_end_undo_group ();
+ rl_vi_check ();
+ }
+ else
+ rl_forward_char (1, c);
+ }
+ return (0);
+}
+
+int
+rl_vi_put (int count, int key)
+{
+ if (!_rl_uppercase_p (key) && (rl_point + 1 <= rl_end))
+ rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+
+ while (count--)
+ rl_yank (1, key);
+
+ rl_backward_char (1, key);
+ return (0);
+}
+
+/* Move the cursor back one character if you're at the end of the line */
+int
+rl_vi_check (void)
+{
+ if (rl_point && rl_point == rl_end)
+ _rl_vi_backup ();
+ return (0);
+}
+
+/* Move to the character position specified by COUNT */
+int
+rl_vi_column (int count, int key)
+{
+ if (count > rl_end)
+ rl_end_of_line (1, key);
+ else
+ {
+ rl_point = 0;
+ rl_point = _rl_forward_char_internal (count - 1);
+ }
+ return (0);
+}
+
+/* Process C as part of the current numeric argument. Return -1 if the
+ argument should be aborted, 0 if we should not read any more chars, and
+ 1 if we should continue to read chars. */
+static int
+_rl_vi_arg_dispatch (int c)
+{
+ int key;
+
+ key = c;
+ if (c >= 0 && _rl_keymap[c].type == ISFUNC && _rl_keymap[c].function == rl_universal_argument)
+ {
+ rl_numeric_arg *= 4;
+ return 1;
+ }
+
+ c = UNMETA (c);
+
+ if (_rl_digit_p (c))
+ {
+ if (rl_explicit_arg)
+ rl_numeric_arg = (rl_numeric_arg * 10) + _rl_digit_value (c);
+ else
+ rl_numeric_arg = _rl_digit_value (c);
+ rl_explicit_arg = 1;
+ return 1; /* keep going */
+ }
+ else
+ {
+ rl_clear_message ();
+ rl_stuff_char (key);
+ return 0; /* done */
+ }
+}
+
+/* A simplified loop for vi. Don't dispatch key at end.
+ Don't recognize minus sign?
+ Should this do rl_save_prompt/rl_restore_prompt? */
+static int
+rl_digit_loop1 (void)
+{
+ int c, r;
+
+ while (1)
+ {
+ if (_rl_arg_overflow ())
+ return 1;
+
+ c = _rl_arg_getchar ();
+
+ r = _rl_vi_arg_dispatch (c);
+ if (r <= 0)
+ break;
+ }
+
+ RL_UNSETSTATE(RL_STATE_NUMERICARG);
+ return (0);
+}
+
+/* This set of functions is basically to handle the commands that take a
+ motion argument while in callback mode: read the command, read the motion
+ command modifier, find the extent of the text to affect, and dispatch the
+ command for execution. */
+static void
+_rl_mvcxt_init (_rl_vimotion_cxt *m, int op, int key)
+{
+ m->op = op;
+ m->state = m->flags = 0;
+ m->ncxt = 0;
+ m->numeric_arg = -1;
+ m->start = rl_point;
+ m->end = rl_end;
+ m->key = key;
+ m->motion = -1;
+}
+
+static _rl_vimotion_cxt *
+_rl_mvcxt_alloc (int op, int key)
+{
+ _rl_vimotion_cxt *m;
+
+ m = xmalloc (sizeof (_rl_vimotion_cxt));
+ _rl_mvcxt_init (m, op, key);
+ return m;
+}
+
+static void
+_rl_mvcxt_dispose (_rl_vimotion_cxt *m)
+{
+ xfree (m);
+}
+
+static int
+rl_domove_motion_callback (_rl_vimotion_cxt *m)
+{
+ int c;
+
+ _rl_vi_last_motion = c = m->motion;
+
+ /* Append a blank character temporarily so that the motion routines
+ work right at the end of the line. Original value of rl_end is saved
+ as m->end. */
+ rl_extend_line_buffer (rl_end + 1);
+ rl_line_buffer[rl_end++] = ' ';
+ rl_line_buffer[rl_end] = '\0';
+
+ _rl_dispatch (c, _rl_keymap);
+
+#if defined (READLINE_CALLBACKS)
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ /* Messy case where char search can be vi motion command; see rest of
+ details in callback.c. vi_char_search and callback_char_search just
+ set and unset the CHARSEARCH state. This is where any vi motion
+ command that needs to set its own state should be handled, with any
+ corresponding code to manage that state in callback.c */
+ if (RL_ISSTATE (RL_STATE_CHARSEARCH))
+ return 0;
+ else
+ return (_rl_vi_domove_motion_cleanup (c, m));
+ }
+#endif
+
+ return (_rl_vi_domove_motion_cleanup (c, m));
+}
+
+int
+_rl_vi_domove_motion_cleanup (int c, _rl_vimotion_cxt *m)
+{
+ int r;
+
+ /* Remove the blank that we added in rl_domove_motion_callback. */
+ rl_end = m->end;
+ rl_line_buffer[rl_end] = '\0';
+ _rl_fix_point (0);
+
+ /* No change in position means the command failed. */
+ if (rl_mark == rl_point)
+ {
+ /* 'c' and 'C' enter insert mode after the delete even if the motion
+ didn't delete anything, as long as the motion command is valid. */
+ if (_rl_to_upper (m->key) == 'C' && _rl_vi_motion_command (c))
+ return (vidomove_dispatch (m));
+ RL_UNSETSTATE (RL_STATE_VIMOTION);
+ return (-1);
+ }
+
+ /* rl_vi_f[wW]ord () leaves the cursor on the first character of the next
+ word. If we are not at the end of the line, and we are on a
+ non-whitespace character, move back one (presumably to whitespace). */
+ if ((_rl_to_upper (c) == 'W') && rl_point < rl_end && rl_point > rl_mark &&
+ !whitespace (rl_line_buffer[rl_point]))
+ rl_point--; /* XXX */
+
+ /* If cw or cW, back up to the end of a word, so the behaviour of ce
+ or cE is the actual result. Brute-force, no subtlety. */
+ if (m->key == 'c' && rl_point >= rl_mark && (_rl_to_upper (c) == 'W'))
+ {
+ /* Don't move farther back than where we started. */
+ while (rl_point > rl_mark && whitespace (rl_line_buffer[rl_point]))
+ rl_point--;
+
+ /* Posix.2 says that if cw or cW moves the cursor towards the end of
+ the line, the character under the cursor should be deleted. */
+ if (rl_point == rl_mark)
+ _rl_vi_advance_point ();
+ else
+ {
+ /* Move past the end of the word so that the kill doesn't
+ remove the last letter of the previous word. Only do this
+ if we are not at the end of the line. */
+ if (rl_point >= 0 && rl_point < (rl_end - 1) && !whitespace (rl_line_buffer[rl_point]))
+ _rl_vi_advance_point ();
+ }
+ }
+
+ if (rl_mark < rl_point)
+ SWAP (rl_point, rl_mark);
+
+#if defined (READLINE_CALLBACKS)
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ (*rl_redisplay_function)(); /* make sure motion is displayed */
+#endif
+
+ r = vidomove_dispatch (m);
+
+ return (r);
+}
+
+#define RL_VIMOVENUMARG() (RL_ISSTATE (RL_STATE_VIMOTION) && RL_ISSTATE (RL_STATE_NUMERICARG))
+
+static int
+rl_domove_read_callback (_rl_vimotion_cxt *m)
+{
+ int c, save;
+
+ c = m->motion;
+
+ if (member (c, vi_motion))
+ {
+#if defined (READLINE_CALLBACKS)
+ /* If we just read a vi-mode motion command numeric argument, turn off
+ the `reading numeric arg' state */
+ if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_VIMOVENUMARG())
+ RL_UNSETSTATE (RL_STATE_NUMERICARG);
+#endif
+ /* Should do everything, including turning off RL_STATE_VIMOTION */
+ return (rl_domove_motion_callback (m));
+ }
+ else if (m->key == c && (m->key == 'd' || m->key == 'y' || m->key == 'c'))
+ {
+ rl_mark = rl_end;
+ rl_beg_of_line (1, c);
+ _rl_vi_last_motion = c;
+ RL_UNSETSTATE (RL_STATE_VIMOTION);
+ return (vidomove_dispatch (m));
+ }
+#if defined (READLINE_CALLBACKS)
+ /* XXX - these need to handle rl_universal_argument bindings */
+ /* Reading vi motion char continuing numeric argument */
+ else if (_rl_digit_p (c) && RL_ISSTATE (RL_STATE_CALLBACK) && RL_VIMOVENUMARG())
+ {
+ return (_rl_vi_arg_dispatch (c));
+ }
+ /* Readine vi motion char starting numeric argument */
+ else if (_rl_digit_p (c) && RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_VIMOTION) && (RL_ISSTATE (RL_STATE_NUMERICARG) == 0))
+ {
+ RL_SETSTATE (RL_STATE_NUMERICARG);
+ return (_rl_vi_arg_dispatch (c));
+ }
+#endif
+ else if (_rl_digit_p (c))
+ {
+ /* This code path taken when not in callback mode */
+ save = rl_numeric_arg;
+ rl_numeric_arg = _rl_digit_value (c);
+ rl_explicit_arg = 1;
+ RL_SETSTATE (RL_STATE_NUMERICARG);
+ rl_digit_loop1 ();
+ rl_numeric_arg *= save;
+ c = rl_vi_domove_getchar (m);
+ if (c < 0)
+ {
+ m->motion = 0;
+ return -1;
+ }
+ m->motion = c;
+ return (rl_domove_motion_callback (m));
+ }
+ else
+ {
+ RL_UNSETSTATE (RL_STATE_VIMOTION);
+ RL_UNSETSTATE (RL_STATE_NUMERICARG);
+ return (1);
+ }
+}
+
+static int
+rl_vi_domove_getchar (_rl_vimotion_cxt *m)
+{
+ return (_rl_bracketed_read_key ());
+}
+
+#if defined (READLINE_CALLBACKS)
+int
+_rl_vi_domove_callback (_rl_vimotion_cxt *m)
+{
+ int c, r;
+
+ m->motion = c = rl_vi_domove_getchar (m);
+ if (c < 0)
+ return 1; /* EOF */
+ r = rl_domove_read_callback (m);
+
+ return ((r == 0) ? r : 1); /* normalize return values */
+}
+#endif
+
+/* This code path is taken when not in callback mode. */
+int
+rl_vi_domove (int x, int *ignore)
+{
+ int r;
+ _rl_vimotion_cxt *m;
+
+ m = _rl_vimvcxt;
+ *ignore = m->motion = rl_vi_domove_getchar (m);
+
+ if (m->motion < 0)
+ {
+ m->motion = 0;
+ return -1;
+ }
+
+ return (rl_domove_read_callback (m));
+}
+
+static int
+vi_delete_dispatch (_rl_vimotion_cxt *m)
+{
+ /* These are the motion commands that do not require adjusting the
+ mark. */
+ if (((strchr (" l|h^0bBFT`", m->motion) == 0) && (rl_point >= m->start)) &&
+ (rl_mark < rl_end))
+ INCREMENT_POS (rl_mark);
+
+ rl_kill_text (rl_point, rl_mark);
+ return (0);
+}
+
+int
+rl_vi_delete_to (int count, int key)
+{
+ int c, r;
+ _rl_vimotion_cxt *savecxt;
+
+ savecxt = 0;
+ if (_rl_vi_redoing)
+ {
+ savecxt = _rl_vimvcxt;
+ _rl_vimvcxt = _rl_mvcxt_alloc (VIM_DELETE, key);
+ }
+ else if (_rl_vimvcxt)
+ _rl_mvcxt_init (_rl_vimvcxt, VIM_DELETE, key);
+ else
+ _rl_vimvcxt = _rl_mvcxt_alloc (VIM_DELETE, key);
+
+ _rl_vimvcxt->start = rl_point;
+
+ rl_mark = rl_point;
+ if (_rl_uppercase_p (key))
+ {
+ _rl_vimvcxt->motion = '$';
+ r = rl_domove_motion_callback (_rl_vimvcxt);
+ }
+ else if (_rl_vi_redoing && _rl_vi_last_motion != 'd') /* `dd' is special */
+ {
+ _rl_vimvcxt->motion = _rl_vi_last_motion;
+ r = rl_domove_motion_callback (_rl_vimvcxt);
+ }
+ else if (_rl_vi_redoing) /* handle redoing `dd' here */
+ {
+ _rl_vimvcxt->motion = _rl_vi_last_motion;
+ rl_mark = rl_end;
+ rl_beg_of_line (1, key);
+ RL_UNSETSTATE (RL_STATE_VIMOTION);
+ r = vidomove_dispatch (_rl_vimvcxt);
+ }
+#if defined (READLINE_CALLBACKS)
+ else if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ RL_SETSTATE (RL_STATE_VIMOTION);
+ return (0);
+ }
+#endif
+ else
+ r = rl_vi_domove (key, &c);
+
+ if (r < 0)
+ {
+ rl_ding ();
+ r = -1;
+ }
+
+ _rl_mvcxt_dispose (_rl_vimvcxt);
+ _rl_vimvcxt = savecxt;
+
+ return r;
+}
+
+static int
+vi_change_dispatch (_rl_vimotion_cxt *m)
+{
+ /* These are the motion commands that do not require adjusting the
+ mark. c[wW] are handled by special-case code in rl_vi_domove(),
+ and already leave the mark at the correct location. */
+ if (((strchr (" l|hwW^0bBFT`", m->motion) == 0) && (rl_point >= m->start)) &&
+ (rl_mark < rl_end))
+ INCREMENT_POS (rl_mark);
+
+ /* The cursor never moves with c[wW]. */
+ if ((_rl_to_upper (m->motion) == 'W') && rl_point < m->start)
+ rl_point = m->start;
+
+ if (_rl_vi_redoing)
+ {
+ if (vi_insert_buffer && *vi_insert_buffer)
+ rl_begin_undo_group ();
+ rl_delete_text (rl_point, rl_mark);
+ if (vi_insert_buffer && *vi_insert_buffer)
+ {
+ rl_insert_text (vi_insert_buffer);
+ rl_end_undo_group ();
+ }
+ }
+ else
+ {
+ rl_begin_undo_group (); /* to make the `u' command work */
+ rl_kill_text (rl_point, rl_mark);
+ /* `C' does not save the text inserted for undoing or redoing. */
+ if (_rl_uppercase_p (m->key) == 0)
+ _rl_vi_doing_insert = 1;
+ /* XXX -- TODO -- use m->numericarg? */
+ rl_vi_start_inserting (m->key, rl_numeric_arg, rl_arg_sign);
+ }
+
+ return (0);
+}
+
+int
+rl_vi_change_to (int count, int key)
+{
+ int c, r;
+ _rl_vimotion_cxt *savecxt;
+
+ savecxt = 0;
+ if (_rl_vi_redoing)
+ {
+ savecxt = _rl_vimvcxt;
+ _rl_vimvcxt = _rl_mvcxt_alloc (VIM_CHANGE, key);
+ }
+ else if (_rl_vimvcxt)
+ _rl_mvcxt_init (_rl_vimvcxt, VIM_CHANGE, key);
+ else
+ _rl_vimvcxt = _rl_mvcxt_alloc (VIM_CHANGE, key);
+ _rl_vimvcxt->start = rl_point;
+
+ rl_mark = rl_point;
+ if (_rl_uppercase_p (key))
+ {
+ _rl_vimvcxt->motion = '$';
+ r = rl_domove_motion_callback (_rl_vimvcxt);
+ }
+ else if (_rl_vi_redoing && _rl_vi_last_motion != 'c') /* `cc' is special */
+ {
+ _rl_vimvcxt->motion = _rl_vi_last_motion;
+ r = rl_domove_motion_callback (_rl_vimvcxt);
+ }
+ else if (_rl_vi_redoing) /* handle redoing `cc' here */
+ {
+ _rl_vimvcxt->motion = _rl_vi_last_motion;
+ rl_mark = rl_end;
+ rl_beg_of_line (1, key);
+ RL_UNSETSTATE (RL_STATE_VIMOTION);
+ r = vidomove_dispatch (_rl_vimvcxt);
+ }
+#if defined (READLINE_CALLBACKS)
+ else if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ RL_SETSTATE (RL_STATE_VIMOTION);
+ return (0);
+ }
+#endif
+ else
+ r = rl_vi_domove (key, &c);
+
+ if (r < 0)
+ {
+ rl_ding ();
+ r = -1; /* normalize return value */
+ }
+
+ _rl_mvcxt_dispose (_rl_vimvcxt);
+ _rl_vimvcxt = savecxt;
+
+ return r;
+}
+
+static int
+vi_yank_dispatch (_rl_vimotion_cxt *m)
+{
+ /* These are the motion commands that do not require adjusting the
+ mark. */
+ if (((strchr (" l|h^0%bBFT`", m->motion) == 0) && (rl_point >= m->start)) &&
+ (rl_mark < rl_end))
+ INCREMENT_POS (rl_mark);
+
+ rl_begin_undo_group ();
+ rl_kill_text (rl_point, rl_mark);
+ rl_end_undo_group ();
+ rl_do_undo ();
+ rl_point = m->start;
+
+ _rl_fix_point (1);
+
+ return (0);
+}
+
+int
+rl_vi_yank_to (int count, int key)
+{
+ int c, r;
+ _rl_vimotion_cxt *savecxt;
+
+ savecxt = 0;
+ if (_rl_vi_redoing)
+ {
+ savecxt = _rl_vimvcxt;
+ _rl_vimvcxt = _rl_mvcxt_alloc (VIM_YANK, key);
+ }
+ else if (_rl_vimvcxt)
+ _rl_mvcxt_init (_rl_vimvcxt, VIM_YANK, key);
+ else
+ _rl_vimvcxt = _rl_mvcxt_alloc (VIM_YANK, key);
+ _rl_vimvcxt->start = rl_point;
+
+ rl_mark = rl_point;
+ if (_rl_uppercase_p (key))
+ {
+ _rl_vimvcxt->motion = '$';
+ r = rl_domove_motion_callback (_rl_vimvcxt);
+ }
+ else if (_rl_vi_redoing && _rl_vi_last_motion != 'y') /* `yy' is special */
+ {
+ _rl_vimvcxt->motion = _rl_vi_last_motion;
+ r = rl_domove_motion_callback (_rl_vimvcxt);
+ }
+ else if (_rl_vi_redoing) /* handle redoing `yy' here */
+ {
+ _rl_vimvcxt->motion = _rl_vi_last_motion;
+ rl_mark = rl_end;
+ rl_beg_of_line (1, key);
+ RL_UNSETSTATE (RL_STATE_VIMOTION);
+ r = vidomove_dispatch (_rl_vimvcxt);
+ }
+#if defined (READLINE_CALLBACKS)
+ else if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ RL_SETSTATE (RL_STATE_VIMOTION);
+ return (0);
+ }
+#endif
+ else
+ r = rl_vi_domove (key, &c);
+
+ if (r < 0)
+ {
+ rl_ding ();
+ r = -1;
+ }
+
+ _rl_mvcxt_dispose (_rl_vimvcxt);
+ _rl_vimvcxt = savecxt;
+
+ return r;
+}
+
+static int
+vidomove_dispatch (_rl_vimotion_cxt *m)
+{
+ int r;
+
+ switch (m->op)
+ {
+ case VIM_DELETE:
+ r = vi_delete_dispatch (m);
+ break;
+ case VIM_CHANGE:
+ r = vi_change_dispatch (m);
+ break;
+ case VIM_YANK:
+ r = vi_yank_dispatch (m);
+ break;
+ default:
+ _rl_errmsg ("vidomove_dispatch: unknown operator %d", m->op);
+ r = 1;
+ break;
+ }
+
+ RL_UNSETSTATE (RL_STATE_VIMOTION);
+ return r;
+}
+
+int
+rl_vi_rubout (int count, int key)
+{
+ int opoint;
+
+ if (count < 0)
+ return (rl_vi_delete (-count, key));
+
+ if (rl_point == 0)
+ {
+ rl_ding ();
+ return 1;
+ }
+
+ opoint = rl_point;
+ if (count > 1 && MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ rl_backward_char (count, key);
+ else if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+ else
+ rl_point -= count;
+
+ if (rl_point < 0)
+ rl_point = 0;
+
+ rl_kill_text (rl_point, opoint);
+
+ return (0);
+}
+
+int
+rl_vi_delete (int count, int key)
+{
+ int end;
+
+ if (count < 0)
+ return (rl_vi_rubout (-count, key));
+
+ if (rl_end == 0)
+ {
+ rl_ding ();
+ return 1;
+ }
+
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ end = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO);
+ else
+ end = rl_point + count;
+
+ if (end >= rl_end)
+ end = rl_end;
+
+ rl_kill_text (rl_point, end);
+
+ if (rl_point > 0 && rl_point == rl_end)
+ rl_backward_char (1, key);
+
+ return (0);
+}
+
+/* This does what Posix specifies vi-mode C-w to do: using whitespace and
+ punctuation characters as the word boundaries. */
+
+#define vi_unix_word_boundary(c) (whitespace(c) || ispunct(c))
+
+int
+rl_vi_unix_word_rubout (int count, int key)
+{
+ int orig_point;
+
+ if (rl_point == 0)
+ rl_ding ();
+ else
+ {
+ orig_point = rl_point;
+ if (count <= 0)
+ count = 1;
+
+ while (count--)
+ {
+ /* This isn't quite what ksh93 does but it seems to match what the
+ Posix description of sh specifies, with a few accommodations
+ for sequences of whitespace characters between words and at
+ the end of the line. */
+
+ /* Skip over whitespace at the end of the line as a special case */
+ if (rl_point > 0 && (rl_line_buffer[rl_point] == 0) &&
+ whitespace (rl_line_buffer[rl_point - 1]))
+ while (--rl_point > 0 && whitespace (rl_line_buffer[rl_point]))
+ ;
+
+ /* If we're at the start of a word, move back to word boundary so we
+ move back to the `preceding' word */
+ if (rl_point > 0 && (vi_unix_word_boundary (rl_line_buffer[rl_point]) == 0) &&
+ vi_unix_word_boundary (rl_line_buffer[rl_point - 1]))
+ rl_point--;
+
+ /* If we are at a word boundary (whitespace/punct), move backward
+ past a sequence of word boundary characters. If we are at the
+ end of a word (non-word boundary), move back to a word boundary */
+ if (rl_point > 0 && vi_unix_word_boundary (rl_line_buffer[rl_point]))
+ while (rl_point && vi_unix_word_boundary (rl_line_buffer[rl_point - 1]))
+ rl_point--;
+ else if (rl_point > 0 && vi_unix_word_boundary (rl_line_buffer[rl_point]) == 0)
+ while (rl_point > 0 && (vi_unix_word_boundary (rl_line_buffer[rl_point - 1]) == 0))
+ _rl_vi_backup_point ();
+ }
+
+ rl_kill_text (orig_point, rl_point);
+ }
+
+ return 0;
+}
+
+
+int
+rl_vi_back_to_indent (int count, int key)
+{
+ rl_beg_of_line (1, key);
+ while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+ rl_point++;
+ return (0);
+}
+
+int
+rl_vi_first_print (int count, int key)
+{
+ return (rl_vi_back_to_indent (1, key));
+}
+
+static int _rl_cs_dir, _rl_cs_orig_dir;
+
+#if defined (READLINE_CALLBACKS)
+static int
+_rl_vi_callback_char_search (_rl_callback_generic_arg *data)
+{
+ int c;
+#if defined (HANDLE_MULTIBYTE)
+ c = _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+#else
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+#endif
+
+ if (c <= 0)
+ {
+ RL_UNSETSTATE (RL_STATE_CHARSEARCH);
+ return -1;
+ }
+
+#if !defined (HANDLE_MULTIBYTE)
+ _rl_vi_last_search_char = c;
+#endif
+
+ _rl_callback_func = 0;
+ _rl_want_redisplay = 1;
+ RL_UNSETSTATE (RL_STATE_CHARSEARCH);
+
+#if defined (HANDLE_MULTIBYTE)
+ return (_rl_char_search_internal (data->count, _rl_cs_dir, _rl_vi_last_search_mbchar, _rl_vi_last_search_mblen));
+#else
+ return (_rl_char_search_internal (data->count, _rl_cs_dir, _rl_vi_last_search_char));
+#endif
+}
+#endif
+
+int
+rl_vi_char_search (int count, int key)
+{
+ int c;
+#if defined (HANDLE_MULTIBYTE)
+ static char *target;
+ static int tlen;
+#else
+ static char target;
+#endif
+
+ if (key == ';' || key == ',')
+ {
+ if (_rl_cs_orig_dir == 0)
+ return 1;
+#if defined (HANDLE_MULTIBYTE)
+ if (_rl_vi_last_search_mblen == 0)
+ return 1;
+#else
+ if (_rl_vi_last_search_char == 0)
+ return 1;
+#endif
+ _rl_cs_dir = (key == ';') ? _rl_cs_orig_dir : -_rl_cs_orig_dir;
+ }
+ else
+ {
+ switch (key)
+ {
+ case 't':
+ _rl_cs_orig_dir = _rl_cs_dir = FTO;
+ break;
+
+ case 'T':
+ _rl_cs_orig_dir = _rl_cs_dir = BTO;
+ break;
+
+ case 'f':
+ _rl_cs_orig_dir = _rl_cs_dir = FFIND;
+ break;
+
+ case 'F':
+ _rl_cs_orig_dir = _rl_cs_dir = BFIND;
+ break;
+ }
+
+ if (_rl_vi_redoing)
+ {
+ /* set target and tlen below */
+ }
+#if defined (READLINE_CALLBACKS)
+ else if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ _rl_callback_data = _rl_callback_data_alloc (count);
+ _rl_callback_data->i1 = _rl_cs_dir;
+ _rl_callback_data->i2 = key;
+ _rl_callback_func = _rl_vi_callback_char_search;
+ RL_SETSTATE (RL_STATE_CHARSEARCH);
+ return (0);
+ }
+#endif
+ else
+ {
+#if defined (HANDLE_MULTIBYTE)
+ c = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+ if (c <= 0)
+ return -1;
+ _rl_vi_last_search_mblen = c;
+#else
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+ if (c < 0)
+ return -1;
+ _rl_vi_last_search_char = c;
+#endif
+ }
+ }
+
+#if defined (HANDLE_MULTIBYTE)
+ target = _rl_vi_last_search_mbchar;
+ tlen = _rl_vi_last_search_mblen;
+#else
+ target = _rl_vi_last_search_char;
+#endif
+
+#if defined (HANDLE_MULTIBYTE)
+ return (_rl_char_search_internal (count, _rl_cs_dir, target, tlen));
+#else
+ return (_rl_char_search_internal (count, _rl_cs_dir, target));
+#endif
+}
+
+/* Match brackets */
+int
+rl_vi_match (int ignore, int key)
+{
+ int count = 1, brack, pos, tmp, pre;
+
+ pos = rl_point;
+ if ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0)
+ {
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0)
+ {
+ pre = rl_point;
+ rl_forward_char (1, key);
+ if (pre == rl_point)
+ break;
+ }
+ }
+ else
+ while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0 &&
+ rl_point < rl_end - 1)
+ rl_forward_char (1, key);
+
+ if (brack <= 0)
+ {
+ rl_point = pos;
+ rl_ding ();
+ return 1;
+ }
+ }
+
+ pos = rl_point;
+
+ if (brack < 0)
+ {
+ while (count)
+ {
+ tmp = pos;
+ if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ pos--;
+ else
+ {
+ pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY);
+ if (tmp == pos)
+ pos--;
+ }
+ if (pos >= 0)
+ {
+ int b = rl_vi_bracktype (rl_line_buffer[pos]);
+ if (b == -brack)
+ count--;
+ else if (b == brack)
+ count++;
+ }
+ else
+ {
+ rl_ding ();
+ return 1;
+ }
+ }
+ }
+ else
+ { /* brack > 0 */
+ while (count)
+ {
+ if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ pos++;
+ else
+ pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY);
+
+ if (pos < rl_end)
+ {
+ int b = rl_vi_bracktype (rl_line_buffer[pos]);
+ if (b == -brack)
+ count--;
+ else if (b == brack)
+ count++;
+ }
+ else
+ {
+ rl_ding ();
+ return 1;
+ }
+ }
+ }
+ rl_point = pos;
+ return (0);
+}
+
+int
+rl_vi_bracktype (int c)
+{
+ switch (c)
+ {
+ case '(': return 1;
+ case ')': return -1;
+ case '[': return 2;
+ case ']': return -2;
+ case '{': return 3;
+ case '}': return -3;
+ default: return 0;
+ }
+}
+
+static int
+_rl_vi_change_char (int count, int c, char *mb)
+{
+ int p;
+
+ if (c == '\033' || c == CTRL ('C'))
+ return -1;
+
+ rl_begin_undo_group ();
+ while (count-- && rl_point < rl_end)
+ {
+ p = rl_point;
+ rl_vi_delete (1, c);
+ if (rl_point < p) /* Did we retreat at EOL? */
+ _rl_vi_append_forward (c);
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ rl_insert_text (mb);
+ else
+#endif
+ _rl_insert_char (1, c);
+ }
+
+ /* The cursor shall be left on the last character changed. */
+ rl_backward_char (1, c);
+
+ rl_end_undo_group ();
+
+ return (0);
+}
+
+static int
+_rl_vi_callback_getchar (char *mb, int mlen)
+{
+ return (_rl_bracketed_read_mbstring (mb, mlen));
+}
+
+#if defined (READLINE_CALLBACKS)
+static int
+_rl_vi_callback_change_char (_rl_callback_generic_arg *data)
+{
+ int c;
+ char mb[MB_LEN_MAX+1];
+
+ c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
+ if (c < 0)
+ return -1;
+
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ strncpy (_rl_vi_last_replacement, mb, MB_LEN_MAX);
+ else
+#endif
+ _rl_vi_last_replacement[0] = c;
+ _rl_vi_last_replacement[MB_LEN_MAX] = '\0'; /* XXX */
+
+ _rl_callback_func = 0;
+ _rl_want_redisplay = 1;
+
+ return (_rl_vi_change_char (data->count, c, mb));
+}
+#endif
+
+int
+rl_vi_change_char (int count, int key)
+{
+ int c;
+ char mb[MB_LEN_MAX+1];
+
+ if (_rl_vi_redoing)
+ {
+ strncpy (mb, _rl_vi_last_replacement, MB_LEN_MAX);
+ c = (unsigned char)_rl_vi_last_replacement[0]; /* XXX */
+ mb[MB_LEN_MAX] = '\0';
+ }
+#if defined (READLINE_CALLBACKS)
+ else if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ _rl_callback_data = _rl_callback_data_alloc (count);
+ _rl_callback_func = _rl_vi_callback_change_char;
+ return (0);
+ }
+#endif
+ else
+ {
+ c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
+ if (c < 0)
+ return -1;
+#ifdef HANDLE_MULTIBYTE
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ strncpy (_rl_vi_last_replacement, mb, MB_LEN_MAX);
+ else
+#endif
+ _rl_vi_last_replacement[0] = c;
+ _rl_vi_last_replacement[MB_LEN_MAX] = '\0'; /* just in case */
+ }
+
+ if (c < 0)
+ return -1;
+
+ return (_rl_vi_change_char (count, c, mb));
+}
+
+int
+rl_vi_subst (int count, int key)
+{
+ /* If we are redoing, rl_vi_change_to will stuff the last motion char */
+ if (_rl_vi_redoing == 0)
+ rl_stuff_char ((key == 'S') ? 'c' : 'l'); /* `S' == `cc', `s' == `cl' */
+
+ return (rl_vi_change_to (count, 'c'));
+}
+
+int
+rl_vi_overstrike (int count, int key)
+{
+ if (_rl_vi_doing_insert == 0)
+ {
+ _rl_vi_doing_insert = 1;
+ rl_begin_undo_group ();
+ }
+
+ if (count > 0)
+ {
+ if (_rl_overwrite_char (count, key) != 0)
+ return (1);
+ vi_replace_count += count;
+ }
+
+ return (0);
+}
+
+int
+rl_vi_overstrike_delete (int count, int key)
+{
+ int i, s;
+
+ for (i = 0; i < count; i++)
+ {
+ if (vi_replace_count == 0)
+ {
+ rl_ding ();
+ break;
+ }
+ s = rl_point;
+
+ if (rl_do_undo ())
+ vi_replace_count--; /* XXX */
+
+ if (rl_point == s)
+ rl_backward_char (1, key);
+ }
+
+ if (vi_replace_count == 0 && _rl_vi_doing_insert)
+ {
+ rl_end_undo_group ();
+ rl_do_undo ();
+ _rl_vi_doing_insert = 0;
+ }
+ return (0);
+}
+
+static int
+rl_vi_overstrike_kill_line (int count, int key)
+{
+ int r, end;
+
+ end = rl_end;
+ r = rl_unix_line_discard (count, key);
+ vi_replace_count -= end - rl_end;
+ return r;
+}
+
+static int
+rl_vi_overstrike_kill_word (int count, int key)
+{
+ int r, end;
+
+ end = rl_end;
+ r = rl_vi_unix_word_rubout (count, key);
+ vi_replace_count -= end - rl_end;
+ return r;
+}
+
+static int
+rl_vi_overstrike_yank (int count, int key)
+{
+ int r, end;
+
+ end = rl_end;
+ r = rl_yank (count, key);
+ vi_replace_count += rl_end - end;
+ return r;
+}
+
+/* Read bracketed paste mode pasted text and insert it in overwrite mode */
+static int
+rl_vi_overstrike_bracketed_paste (int count, int key)
+{
+ int r;
+ char *pbuf;
+ size_t pblen;
+
+ pbuf = _rl_bracketed_text (&pblen);
+ if (pblen == 0)
+ {
+ xfree (pbuf);
+ return 0;
+ }
+ r = pblen;
+ while (--r >= 0)
+ _rl_unget_char ((unsigned char)pbuf[r]);
+ xfree (pbuf);
+
+ while (_rl_pushed_input_available ())
+ {
+ key = rl_read_key ();
+ r = rl_vi_overstrike (1, key);
+ }
+
+ return r;
+}
+
+int
+rl_vi_replace (int count, int key)
+{
+ int i;
+
+ vi_replace_count = 0;
+
+ if (vi_replace_map == 0)
+ {
+ vi_replace_map = rl_make_bare_keymap ();
+
+ for (i = 0; i < ' '; i++)
+ if (vi_insertion_keymap[i].type == ISFUNC)
+ vi_replace_map[i].function = vi_insertion_keymap[i].function;
+
+ for (i = ' '; i < KEYMAP_SIZE; i++)
+ vi_replace_map[i].function = rl_vi_overstrike;
+
+ vi_replace_map[RUBOUT].function = rl_vi_overstrike_delete;
+
+ /* Make sure these are what we want. */
+ vi_replace_map[ESC].function = rl_vi_movement_mode;
+ vi_replace_map[RETURN].function = rl_newline;
+ vi_replace_map[NEWLINE].function = rl_newline;
+
+ /* If the normal vi insertion keymap has ^H bound to erase, do the
+ same here. Probably should remove the assignment to RUBOUT up
+ there, but I don't think it will make a difference in real life. */
+ if (vi_insertion_keymap[CTRL ('H')].type == ISFUNC &&
+ vi_insertion_keymap[CTRL ('H')].function == rl_rubout)
+ vi_replace_map[CTRL ('H')].function = rl_vi_overstrike_delete;
+
+ /* Same for ^U and unix-line-discard. */
+ if (vi_insertion_keymap[CTRL ('U')].type == ISFUNC &&
+ vi_insertion_keymap[CTRL ('U')].function == rl_unix_line_discard)
+ vi_replace_map[CTRL ('U')].function = rl_vi_overstrike_kill_line;
+
+ /* And for ^W and unix-word-rubout. */
+ if (vi_insertion_keymap[CTRL ('W')].type == ISFUNC &&
+ vi_insertion_keymap[CTRL ('W')].function == rl_vi_unix_word_rubout)
+ vi_replace_map[CTRL ('W')].function = rl_vi_overstrike_kill_word;
+
+ /* And finally for ^Y and yank. */
+ if (vi_insertion_keymap[CTRL ('Y')].type == ISFUNC &&
+ vi_insertion_keymap[CTRL ('Y')].function == rl_yank)
+ vi_replace_map[CTRL ('Y')].function = rl_vi_overstrike_yank;
+
+ /* Make sure this is the value we need. */
+ vi_replace_map[ANYOTHERKEY].type = ISFUNC;
+ vi_replace_map[ANYOTHERKEY].function = (rl_command_func_t *)NULL;
+ }
+
+ rl_vi_start_inserting (key, 1, rl_arg_sign);
+
+ _rl_vi_last_key_before_insert = 'R'; /* in case someone rebinds it */
+ _rl_keymap = vi_replace_map;
+
+ if (_rl_enable_bracketed_paste)
+ rl_bind_keyseq_if_unbound (BRACK_PASTE_PREF, rl_vi_overstrike_bracketed_paste);
+
+ return (0);
+}
+
+#if 0
+/* Try to complete the word we are standing on or the word that ends with
+ the previous character. A space matches everything. Word delimiters are
+ space and ;. */
+int
+rl_vi_possible_completions (void)
+{
+ int save_pos = rl_point;
+
+ if (rl_line_buffer[rl_point] != ' ' && rl_line_buffer[rl_point] != ';')
+ {
+ while (rl_point < rl_end && rl_line_buffer[rl_point] != ' ' &&
+ rl_line_buffer[rl_point] != ';')
+ _rl_vi_advance_point ();
+ }
+ else if (rl_line_buffer[rl_point - 1] == ';')
+ {
+ rl_ding ();
+ return (0);
+ }
+
+ rl_possible_completions ();
+ rl_point = save_pos;
+
+ return (0);
+}
+#endif
+
+/* Functions to save and restore marks. */
+static int
+_rl_vi_set_mark (void)
+{
+ int ch;
+
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ ch = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+ if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */
+ {
+ rl_ding ();
+ return 1;
+ }
+ ch -= 'a';
+ vi_mark_chars[ch] = rl_point;
+ return 0;
+}
+
+#if defined (READLINE_CALLBACKS)
+static int
+_rl_vi_callback_set_mark (_rl_callback_generic_arg *data)
+{
+ _rl_callback_func = 0;
+ _rl_want_redisplay = 1;
+
+ return (_rl_vi_set_mark ());
+}
+#endif
+
+int
+rl_vi_set_mark (int count, int key)
+{
+#if defined (READLINE_CALLBACKS)
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ _rl_callback_data = 0;
+ _rl_callback_func = _rl_vi_callback_set_mark;
+ return (0);
+ }
+#endif
+
+ return (_rl_vi_set_mark ());
+}
+
+static int
+_rl_vi_goto_mark (void)
+{
+ int ch;
+
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ ch = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+ if (ch == '`')
+ {
+ rl_point = rl_mark;
+ _rl_fix_point (1);
+ return 0;
+ }
+ else if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */
+ {
+ rl_ding ();
+ return 1;
+ }
+
+ ch -= 'a';
+ if (vi_mark_chars[ch] == -1)
+ {
+ rl_ding ();
+ return 1;
+ }
+ rl_point = vi_mark_chars[ch];
+ _rl_fix_point (1);
+ return 0;
+}
+
+#if defined (READLINE_CALLBACKS)
+static int
+_rl_vi_callback_goto_mark (_rl_callback_generic_arg *data)
+{
+ _rl_callback_func = 0;
+ _rl_want_redisplay = 1;
+
+ return (_rl_vi_goto_mark ());
+}
+#endif
+
+int
+rl_vi_goto_mark (int count, int key)
+{
+#if defined (READLINE_CALLBACKS)
+ if (RL_ISSTATE (RL_STATE_CALLBACK))
+ {
+ _rl_callback_data = 0;
+ _rl_callback_func = _rl_vi_callback_goto_mark;
+ return (0);
+ }
+#endif
+
+ return (_rl_vi_goto_mark ());
+}
+#endif /* VI_MODE */
diff --git a/xfree.c b/xfree.c
new file mode 100644
index 0000000..c199b29
--- /dev/null
+++ b/xfree.c
@@ -0,0 +1,49 @@
+/* xfree.c -- safe version of free that ignores attempts to free NUL */
+
+/* Copyright (C) 1991-2010,2017 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include "xmalloc.h"
+
+/* **************************************************************** */
+/* */
+/* Memory Deallocation. */
+/* */
+/* **************************************************************** */
+
+/* Use this as the function to call when adding unwind protects so we
+ don't need to know what free() returns. */
+void
+xfree (PTR_T string)
+{
+ if (string)
+ free (string);
+}
diff --git a/xmalloc.c b/xmalloc.c
new file mode 100644
index 0000000..5d01d75
--- /dev/null
+++ b/xmalloc.c
@@ -0,0 +1,75 @@
+/* xmalloc.c -- safe versions of malloc and realloc */
+
+/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include "xmalloc.h"
+
+/* **************************************************************** */
+/* */
+/* Memory Allocation and Deallocation. */
+/* */
+/* **************************************************************** */
+
+static void
+memory_error_and_abort (char *fname)
+{
+ fprintf (stderr, "%s: out of virtual memory\n", fname);
+ exit (2);
+}
+
+/* Return a pointer to free()able block of memory large enough
+ to hold BYTES number of bytes. If the memory cannot be allocated,
+ print an error message and abort. */
+PTR_T
+xmalloc (size_t bytes)
+{
+ PTR_T temp;
+
+ temp = malloc (bytes);
+ if (temp == 0)
+ memory_error_and_abort ("xmalloc");
+ return (temp);
+}
+
+PTR_T
+xrealloc (PTR_T pointer, size_t bytes)
+{
+ PTR_T temp;
+
+ temp = pointer ? realloc (pointer, bytes) : malloc (bytes);
+
+ if (temp == 0)
+ memory_error_and_abort ("xrealloc");
+ return (temp);
+}
diff --git a/xmalloc.h b/xmalloc.h
new file mode 100644
index 0000000..0fb9df9
--- /dev/null
+++ b/xmalloc.h
@@ -0,0 +1,45 @@
+/* xmalloc.h -- memory allocation that aborts on errors. */
+
+/* Copyright (C) 1999-2009,2010-2021 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library (Readline), a library
+ for reading lines of text with interactive input and history editing.
+
+ Readline 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.
+
+ Readline 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 Readline. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#if !defined (_XMALLOC_H_)
+#define _XMALLOC_H_
+
+#if defined (READLINE_LIBRARY)
+# include "rlstdc.h"
+#else
+# include <readline/rlstdc.h>
+#endif
+
+#ifndef PTR_T
+
+#ifdef __STDC__
+# define PTR_T void *
+#else
+# define PTR_T char *
+#endif
+
+#endif /* !PTR_T */
+
+extern PTR_T xmalloc (size_t);
+extern PTR_T xrealloc (void *, size_t);
+extern void xfree (void *);
+
+#endif /* _XMALLOC_H_ */